第三章:顺序程序设计,按照顺序执行的程序设计。
友情提示:有的题目可能没写,因为我感觉没必要,还有就是下面的所有回答专业性的名词解释使用人工智能或Baidu的,程序是完全自己写的,主要是用来记笔记方便以后复习用的,希望对大家有帮助,共勉!
题目1:假如我国国民生产总值的年增长率为7%,计算 10年后我国国民生产总值与现在相比增长多少百分比。
计算公式为p = (1+r)^n
其中参数r为年增长率,n为年数,p为与现在相比的倍数。
分析:
根据题目给的计算公式计算就行了,有个幂运算可以借助math.h头文件中的pow(double _X,double _Y);函数即可,值得注意的是题目求的是增长了多少百分比而不是简单地求倍数。
#include<stdio.h>
#include<math.h>//包含幂运算的函数pow()的头文件
int main(){
double r = 0.07;//年增长率
int n = 10;//年数
double p;//增长的倍数
double grow_percentage;//增长的百分比
//根据题目计算增长的倍数
p = pow(1 + r,n);
//计算增长的百分比
//减1操作是为了从倍数中移除基础值(即1倍),从而得到实际的增长部分
//因为p是未来的值(比如是10年后的国民生产总值)与现在的值相比的倍数。
//由于现在的值被视为1倍(即没有增长的情况)
//所以减去1就代表了真正的增长的倍数
grow_percentage = (p - 1) * 100;
//.2表示保留两位小数
printf("增长的倍数为:%.2f\n",p);
printf("增长了:%.2f的百分比\n",grow_percentage);
return 0;
}
题目2:存款利息的计算。有1000元,想存5年,可按以下5种办法存:
(1)一次存5年期
(2)先存2年期,到期后将本息再存3年期
(3)先存3年期,到期后将本息再存2年期
(4)存1年期,到期后将本息再存1年期,连续存5次
(5)存活期存款,活期利息每一季度结算一次
2017年银行存款利息如下:
1年期定期存款利息为1.5%;
2年期定期存款利息为2.1%;
3年期定期存款利息为2.75%;
5年期定期存款利息为3%;
活期存款利息为0.35%(活期存款每一季度结算一次利息)
如果r为年利率,n为存款年数,则计算本息的公式如下:
1年期本息和: P= 1000* (1+r);
n年期本息和: P= 1000* (1+n* r);
存n次1年期的本息和: P=1000* (1+r)^n
活期存款本息和: P= 1000 *(1+r /4) ^4
说明: 1000 * (1+r /4)是一个季度的本息和。
#include<stdio.h>
#include<math.h>
int main(){
double deposit = 1000.0; //存款金额
//年利率
double rate1 = 0.015;//1年期定期存款利息
double rate2 = 0.021;
double rate3 = 0.0275;
double rate5 = 0.03;
double liverate = 0.0035;//活期存款利息
//本息和
double P1, P2, P3, P4, P5;
//(1)一次存5年期
P1 = deposit * (1 + 5 * rate5);
printf("一次存5年期的本息和为:%.2f\n", P1);
//(2)先存2年期,到期后将本息再存3年期
P2 = deposit * (1 + 2 * rate2);
//要使用2年期过后的本息进行再次计算
P2 = P2 * (1 + 3 * rate3);
printf("先存2年期,到期后将本息再存3年期的本息和为:%.2f\n", P2);
//(3)先存3年期,到期后将本息再存2年期
P3 = deposit * (1 + 3 * rate3);
P3 = P3 * (1 + 2 * rate2);
printf("先存3年期,到期后将本息再存2年期的本息和为:%.2f\n", P3);
//(5)存1年期,到期后将本息再存1年期,连续存5次
P4 = deposit * pow((1 + rate1), 5);
printf("存1年期,到期后将本息再存1年期,连续存5次的本息和为:%.2f\n", P4);
//存活期存款,活期利息每一季度结算一次
P5 = deposit * pow((1 + rateCurrent / 4), 4 * 5);
printf("存活期存款,活期利息每一季度结算一次的本息和为:%.2f\n", P5);
return 0;
}
题目3:购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。设d为300000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五人处理。
提示:
#include<stdio.h>
#include<math.h>
int main(){
//贷款d
double d = 300000.0;
//每月还款额
double p = 6000;
//月利率
double r = 0.01;
//还清月数
double m;
m = log10(p / (p - d * r)) / log10(1 + r);
//%.1f 格式说明符会自动进行四舍五入,保留一位小数。
printf("还款月数为:%.1f",m);
return 0;
}
题目4:分析下面的程序:
#include<stdio.h>
int main()
{
char c1, c2;
c1 = 97;
c2 = 98;
printf("c1=%c, c2=%c\n", c1, c2);
printf("c1=%d, c2=%d\n", c1, c2);
return 0;
}
(1)运行时会输出什么信息?为什么?
会输出:
原因:
在ASCII编码中,97和98分别对应字符'a'和'b'。
所以当使用%c
格式化输出字符时,会打印出'a'和'b'。
而当使用%d
来格式化输出时,会打印出它们的整数值,即97和98。
(2)如果将程序第4,5行改为c1 = 197;c2 = 198;运行时会输出什么信息?为什么?
会输出:
原因:
第一行的输出是因为打印 char
类型的值时,超出范围的值并不能在 ASCII 表中找到对应的字符,所以打印出来的字符可能会有所不同,取决于各自电脑系统和编码设置。
第二行的输出是因为char
类型通常是有符号的,它的取值范围通常是-128到127。这是因为char
类型占用一个字节,也就是8位,可以表示的整数范围是0到255 (2^8),但是当我们把它作为有符号整数处理时,取值范围就变成了-128到127。然后输出197和198的话会溢出,在这种情况下,C语言会进行所谓的"模运算",结果将是这些值减去256(也就是2的8次方,因为char
类型是8位的)。所以,197变成了-59(197-256),198变成了-58(198-256)。
(3)如果将程序第3行改为int c1, c2;运行时会输出什么信息?为什么?
会输出:
原因:
第一行输出的两个字符可能会是乱码或者空白,因为197和198在ASCII表中并没有对应的字符。
然而,当你使用%d
格式输出时,c1
和c2
的值将被正确地显示为197和198,因为现在它们是int
类型,可以完全支持这个范围内的值。
题目5:用下面的scanf 函数输人数据,使a=3,b=7,x=8.5,y=71. 82,cl=‘A’,c2=‘a’。在键盘上应如何输入?
#include<stdio.h>
int main()
{
int a, b;
float x, y;
char c1, c2;
scanf("a=%db=%d", &a, &b);
scanf("%f%e",&x, &y);
scanf("%c%c",&c1, &c2);
return 0;
}
分析:
首先,对于整数a和b,需要按照 "a=3b=7" 的格式进行输入,注意,这里没有空格。
其次,对于浮点数x和y,%e确实代表科学记数法的输入。所以,需要将71.82转换为科学记数法,即7.182E1。所以输入 "8.57.182E1"(没有空格)。
最后,对于字符c1和c2的输入,我们需要确保输入的两个字符之间没有任何空格,因为scanf会自动将空格作为字符串的结束。输入Aa.
输出:
题目6:请编程序将“China"译成密码
密码规律是:
用原来的字母后面第4个字母代替原来的字母。
例如:
字母“A”后面第4个字母是“E”,用“E”代替 “A”。因此,“China"应译为“Glmre”。
请编一程序:
用赋初值的方法使cl,c2,c3,c4,c5这5个变量的值分别为’C’,‘h’,‘i’,‘n’,‘a’ ,经过运算,使c1,c2,c3,c4,c5 分别变为’G’,‘l’,‘m’,‘r’,‘e’。分别用putchar函数和printf函数输出这5个字符。
分析:
赋初值之后,直接对相应的字符+4即可实现本题的要求,但是这个方法有个不足之处可以看下面的注意。
#include<stdio.h>
int main()
{
char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
c1 += 4;
c2 += 4;
c3 += 4;
c4 += 4;
c5 += 4;
//使用putchar输出
printf("使用putchar输出: ");
putchar(c1);
putchar(c2);
putchar(c3);
putchar(c4);
putchar(c5);
printf("\n");
//使用printf输出
printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);
return 0;
}
注意:但是有没有注意一个问题,上面这个程序如果是W、w、X、x、Y、y、Z、z怎么办呢,当然不会报错,只是会得到你不想得到的东西。比如如下程序可能会输出的值。
char c1 = 'C', c2 = 'W', c3 = 'x', c4 = 'y', c5 = 'z';
c1 += 4;
c2 += 4;
c3 += 4;
c4 += 4;
c5 += 4;
输出:(注意:第二行是使用printf输出的,写错了)
原因:
因为W的ASCII码为87,所以单纯的+4之后会变成左括号,因为左括号[的ASCII码为91,其余的也是一样的。
解决方法:像数据结构中的”循环队列”一样(数据结构可以看我后面关于数据结构的章节,后面会抽空更新)
#include <stdio.h>
int main() {
char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
//法一(不推荐):比较复杂的方法(就是下面法二的分开写的版本),
//很麻烦,不使用for循环就得为每一个字符写下面这4份代码
//1.首先将要转换的字符转成0-25之间的数字
// int offset = c1 - 'A';
//2.然后将数字向后移动4位
// offset += 4;
//3.如果移动位数超过26,就从0开始
// offset %= 26;
//4.最后将数字转回字母
// c1 = offset + 'A';
//法二(推荐):一步到胃
//c1 - 'A':这个操作是为了将字符转换成一个从0开始的数字,以便我们可以在0到25的范围内进行计算。
//+ 4:这是将字符向后移动4位。
//% 26:这个操作是为了在移动位数超过26(字母表的长度)时,能够从头开始计算,也就是循环队列的概念。
//+ 'A':最后再加上 'A',是为了把计算结果转换回字母。
c1 = (c1 - 'A' + 4) % 26 + 'A';
//同上
c2 = (c2 - 'a' + 4) % 26 + 'a';
c3 = (c3 - 'a' + 4) % 26 + 'a';
c4 = (c4 - 'a' + 4) % 26 + 'a';
c5 = (c5 - 'a' + 4) % 26 + 'a';
printf("使用putchar输出: ");
putchar(c1);
putchar(c2);
putchar(c3);
putchar(c4);
putchar(c5);
putchar('\n');
printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);
return 0;
}
题目7:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输人数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。
基础题,不多说了,知道公式就行
#include <stdio.h>
#define PI 3.14159
int main() {
float r, h;
printf("请输入圆的半径和圆柱的高:");
scanf("%f %f", &r, &h);
float circumference = 2 * PI * r;
float area = PI * r * r;
float sphereSurfaceArea = 4 * PI * r * r;
float sphereVolume = (4.0 / 3) * PI * r * r * r;
float cylinderVolume = PI * r * r * h;
printf("圆的周长是:%.2f\n", circumference);
printf("圆的面积是:%.2f\n", area);
printf("圆球的表面积是:%.2f\n", sphereSurfaceArea);
printf("圆球的体积是:%.2f\n", sphereVolume);
printf("圆柱的体积是:%.2f\n", cylinderVolume);
return 0;
}
题目8:编程序,用getchar函数读人两个字符给c1和c2,然后分别用putchar函数和printf函数输出这两个字符。思考以下问题:
这里要注意:题目说的是将getchar的返回值给c1和c2
(1) 变量cl和c2应定义为字符型、整型还是二者皆可?
答:
应定义为整型(int),确保能够存储getchar
函数返回的所有可能值(因为getchar函数返回的是一个整型),包括字符和特殊的EOF
标志,从而避免潜在的符号和范围问题(如果getchar的返回值为1000,完全超过了char所能表示的范围就会造成范围问题)。
(2)输出cl和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?
要输出 c1
和 c2
值的 ASCII 码,可以使用 printf
函数,因为它允许你以多种格式输出数据,包括整数(ASCII 码值)。使用%c可输出字符本身,使用%d可输出字符的ASCII码。
然而 putchar
函数通常用于输出字符本身,而不是它们的 ASCII 码值。
#include <stdio.h>
int main() {
int c1;
c1 = getchar();
//输出c1的ASCII码
printf("The ASCII code of c1 is: %d\n", c1);
//如果你还想输出字符本身,可以这样做
printf("The character of c1 is: %c\n", c1);
//使用putchar输出字符本身
printf("Use putchar output the c1 is:\n");
putchar(c1);
putchar('\n');
return 0;
}
(3)型变量与字符变量是否在任何情况下都可以互相代替?如:char c1,c2;与int cl,c2;是否无条件地等价?
并不是
在存储大小上,char通常占用1个字节,而int类型根据操作系统的不同可能是2字节或4字节
表示范围的角度来看,int
能够表示的范围通常比 char
要大得多
用途上也不同,char
主要用于存储字符数据,而 int
用于存储整数数据