北京建站公司,免费域名申请地址,东营小程序开发制作,做软件的叫什么职业概述 本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析#xff0c;以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析#xff0c;如想了解更多#xff0c;请持续关注该专栏。
专栏直达链接#xff1a;《C语言程序设计》(浙大版)_孟…概述 本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析如想了解更多请持续关注该专栏。
专栏直达链接《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客http://t.csdnimg.cn/ZtcgY
一.第三章分支结构
选择题
[3-1]
有一函数 以下程序段中错误的是 。
A.
if(x0)y1;
else if(x0)y0;
else y-1;
B.
y0;
if(x0)y1;
else if(x0)y-1;C.
y0;
if(x0);
if(x0)y1;
else y-1;
D.
if(x0)if(x0)y1;else y0;
else y-1;
答C
解析根据函数 x 大于 0 y 的值为 1 。x 等于 0y 的值为 0x 小于 0y 的值为 -1。选项 ABD 代码均正确。
[3-2]
对于变量定义: int a, b0; 下列叙述中正确的是 。
A. a 的初始值是 0b 的初始值不确定
B. a 的初始值不确定b 的初始值是 0
C. a 和 b 的初始值都是 0
D.a 和 b 的初始值都不确定
答B
解析定义变量时没有给a赋值所以 a 的初始值不确定。b 的值赋值为 0 。
[3-3]
下列程序段的输出结果是 。
int a3,b5;
if(ab)printf(%d%d,a,b);
else printf( %d!%d,a,b);
A.55
B.33
C.3!5
D.5!3
答A
解析a 的初始值为 3 b 的值为 5 。执行 if 语句的条件为赋值语句。赋值语句作为判断条件是什么意思呢它并不是以是否赋值成功作为 true 和 false 的判断机制而是看赋值的值是多少如果为 0 自动就作为 false了。这里赋值为 5 。执行 if 里的语句。所以答案为选项A。
[3-4]
能正确表示逻辑关系“a≥10或a≤0的C语言表达式是 。
A. a10 or a0
B. 0 | a 10
C. a10 a0
D. a10lla0
答D
解析a 大于等于 10表示为 a10a 小于等于 0表示为 a0使用的是关系运算符。中间的或使用逻辑运算符||所以答案为选项D。
[3-5]
下列叙述中正确的是 。 A. break 语句只能用于 switch 语句
B.在 switch 语句中必须使用 default
C. break 语句必须与 switch 语句中的 case 配对使用
D.在 switch 语句中不一定使用 break 语句
答D
解析
选项 A 中break 语句还可以用于循环语句中表示强制结束循环。
选项 B 中在 switch 语句中default 是可选的可以有也可以没有。
选项 C 中break 语句可以用于循环语句forwhiledo-while 等语句中。
选项 D 正确。
[3-6]
在嵌套使用 if 语句时C 语言规定 else 总是 。 A.和之前与其具有相同缩进位置的 if 配对
B.和之前与其最近的 if 配对
C.和之前与其最近的且不带 else 的if配对
D.和之前的第一个 if 配对
答C
解析
else 和 if 的匹配准则else 与最靠近它的而且没有与别的 else 匹配过的 if 相匹配。所以答案选择C。
[3-7]
下列程序段的输出结果是 。
int a2, b-1, c2;
if(ab)if(b0) c≈0;else c;
printf( %d\n, c);
A.2
B.1
C.0
D.3
答A
解析
a 的初始值为 2b 的初始值为 -1c 的初始值为 2。外层 if 语句的条件为 ab 这里条件不成立那么直接结束这个 if 语句执行最后的打印语句打印 c 的值为 2。
[3-8]
在执行以下程序段时为使输出结果为 t4则给 a 和 b 输入的值应满足的条件是 。
int a, b, s, t;
scanf(%d,%d, a, b);
s 1;t 1;
if (a 0) s s 1;
if (a b) t s t;
else if (a b) t 5;
else t 2 * s;
printf(t%d\n, t);
A. ab
B. 0ab
C. 0ab
D. ab0
答B
解析
按照选项B为条件a 大于 0那么会执行第一个 if 语句那么执行 ss1 后s 的值为 2 。而下面的为 t 赋值的语句我们执行最后 else 中的就可以让 t 的值为 4 就需要让前面的 if 语句以及 else if 语句的条件都不成立那么 a b 即可。
填空题
[3-1]
执行以下程序段若输入32则输出 ;若输入58则输出 。
int a;
scanf(%d, a);
if(a50) printf(%d, a);
if(a40) printf(%d, a);
if(a30) printf(%d, a);
答32585858
解析
如果输入 32那么 a 的值为 32前面两个 if 语句条件不成立最后一个成立打印 32。
如果输入 58那么 a 的值为 583 个 if 语句条件都成立打印了 3 次 a 的值所以 585858。
[3-2]
表示条件10x100或者x0的C语言表达式是 。
答(x10x100)||x0
解析x 大于 10 并且小于 100。可以表示成 x10 x100 因为是并且的关系所以中间使用逻辑运算符 与 来链接。和 x0 的关系是或者那么使用 或|| 来链接。
[3-3]
输出偶数。输入一个正整数 n 再输入 n 个整数输出其中的偶数。要求相邻偶数中间用一个空格分开行末不得有多余空格。请填空。
char ch;
int first 1, k, n, x;
scanf(%d, n);
for (k 1; k n; k){scanf(%d, x);if(__________){if(__________){printf(%d, x);__________;}else {__________;}}
}
答
x % 2 0first 1first 0;printf( %d, x);
[3-4]
以下程序段的运行结果是 。
int k16;
switch(k%3) {case 0: print(zero);case 1: printf(one); case 2: printf(two);}
答onetwo
解析siwtch 作用的数据是k%3结果为 1 。那么会匹配 case 1打印 one 没有 break 语句后面的 case 2 的内容直接穿透执行继续打印 two 。
[3-5]
找出 3 个整数中最大的数。输入3个整数输出其中最大的数。请填空。
int a, b, c, max;
scanf(%d %d %d, a, b, c);
if(ab){if(ac) __________;else __________;
}else {if(__________) maxb;else __________;
}
printf(The max is %d\n, max);
答
max a;max c;b cmax c;
程序设计题
[3-1]
比较大小输入 3 个整数按从小到大的顺序输出。试编写相应程序。(上)
方法一答案代码
#include stdio.h
int main()
{// 课后习题3.3.1/*比较大小输入 3 个整数按从小到大的顺序输出。*/int a, b, c;printf(input a,b,c:);scanf(%d%d%d, a, b, c);if (a b){if (b c){printf(%d %d %d\n, c, b, a);}else{if (a c)printf(%d %d %d\n, b, c, a);elseprintf(%d %d %d\n, b, a, c);}}else{if (a c){printf(%d %d %d\n, c, a, b);}else{if (b c)printf(%d %d %d\n, a, b, c);elseprintf(%d %d %d\n, a, c, b);}}return 0;
}
运行结果 比较大小输入 3 个整数按从小到大的顺序输出。试编写相应程序。(下)
方法二答案代码
#include stdio.h
int main()
{// 课后习题3.3.1/*比较大小输入 3 个整数按从小到大的顺序输出。*/int a, b, c;int temp;printf(input a,b,c:);scanf(%d%d%d, a, b, c);// 先比较a和b让a中存储比较小的b中存储较大的。if (a b){ // 所以判断如果a大于b就交换a和b的值temp a;a b;b temp;}// 然后比较a和c如果a大于c就交换a和c的值此操作结束后a存储3个数中最小值。if (a c){temp a;a c;c temp;}// 最后比较b和cif (b c){temp b;b c;c temp;}// 按照abc的顺序打印即可。printf(%d %d %d\n, a, b, c);return 0;
}
运行结果 [3-2]
高速公路超速处罚按照规定在高速公路上行驶的机动车超出本车道限速的 10% 则处 200 元罚款; 超出 50%就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
答案代码
#include stdio.h
int main()
{// 课后习题3.3.2/*高速公路超速处罚按照规定在高速公路上行驶的机动车超出本车道限速的 10% 则处 200 元罚款; 超出 50%就要吊销驾驶证。*/double n 120, x;printf(input x(为车辆实际速度):);scanf(%lf, x);if (x n * 1.1 x n * 1.5)printf(您已超速10%%,处罚款200元 \n);else if (x n * 1.5)printf(您已超速50%%,已吊销驾驶证 \n);elseprintf(您没有超速\n);return 0;
}
运行结果 [3-3]
出租车计价某城市普通出租车收费标准如下起步里程为 3公里起步费 10 元; 超过起步里程后 10 公里内每公里 2 元; 超过 10 公里以上的部分加收 50% 的空驶补贴费即每公里 3 元; 营运过程中因路阻及乘客要求临时停车的按每 5 分钟 2 元计收(不足 5 分钟则不收费)。运价计费尾数四舍五入保留到元。编写程序输入行驶里程(公里)与等待时间(分钟)计算并输出乘客应支付的车费(元)。
答案代码
#include stdio.h
int main()
{double x, y0.0;int t; //等待时间printf(输入行驶公里x(x0),临时停车时间t:);scanf(%lf%d, x, t);if (x 3.0){y 10.0;if (x 13.0) //超过起步里程后10公里y 10.0 * 2.0 (x - 13.0) * 3.0;else //大于3公里但不超过13公里y (x - 3.0) * 2.0;}else //不足三公里的按照起步价收费y 10.0;// 加上等待时间if (t 5)y t / 5.0 * 2;printf(金额 %f 元\n, y);y (int)(y 0.5);printf(乘客应支付的车费为%.2lf 元\n, y);return 0;
}
运行结果
[3-4]
统计学生成绩输入一个正整数 n 再输入 n 个学生的成绩统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则大于或等于 90 分为 A 小于 90 分且大于或等于 80 分为 B小于 80 分且大于或等于 70 为 C小于 70 分且大于或等于 60 为D小于 60 分为E。试编写相应程序。
答案代码
#include stdio.h
int main()
{int score, n, i, A 0, B 0, C 0, D 0, E 0;printf(input n:);scanf(%d, n);printf(输入 %d 个score(1~100):\n, n);for (i 1; i n; i){scanf(%d, score);printf(输入百分制成绩 %d 对应的五分制成绩为:, score);if (score 90){putchar(A);putchar(\n);A;}else if (score 80){putchar(B);putchar(\n);B;}else if (score 70){putchar(C);putchar(\n);C;}else if (score 60){putchar(D);putchar(\n);D;}else{putchar(E);putchar(\n);E;}}printf(等级占比:A%d, B%d, C%d, D%d, E%d\n, A, B, C, D, E);return 0;
}
运行结果
[3-5]
三角形判断输入平面上任意三个点的坐标(x1, y1)、(x2, y2)、(x3, y3)检验它们能否构成三角形。如果这 3 个点能构成一个三角形输出周长和面积(保留 2 位小数); 否则输出 “Impossible”。试编写相应程序。 提示在一个三角形中任意两边之和大于第三边。三角形面积计算公式如下:
其中 s (abc)/2。 答案代码
#include stdio.h
#include math.h
int main()
{double x1, y1, x2, y2, x3, y3, S, C, area, a, b, c;printf(输入三个点的坐标(x1,y1),(x2,y2),(x3,y3):);scanf(%lf%lf%lf%lf%lf%lf, x1, y1, x2, y2, x3, y3);a sqrt(pow(x2 - x1, 2) pow(y2 - y1, 2));b sqrt(pow(x3 - x2, 2) pow(y3 - y2, 2));c sqrt(pow(x1 - x3, 2) pow(y1 - y3, 2));if ((a b c) (a c b) (b c a) (a - b c) (a - c b) (b - c a)){C a b c;S (a b c) / 2.0;area sqrt(S * (S - a) * (S - b) * (S - c));printf(此三角形的周长为 %.2lf, 面积为 %.2lf \n, C, area);}elseprintf(Impossible \n);return 0;
}
运行结果
二.第四章循环结构
选择题
[4-1]
以下程序段 不能实现求 s 12...n-1。 A.
int i, n, s0;
scanf(%d, n);
for(i1; in; i){ssi;
}
B.
int i,n,s0;
scanf(%d,n);
for(i1; in-1;i){ssi;
}
C.
int i,n, s≈0;
scanf(%d, n);
for(in-1;i0;i--){ssi;
}
D.
int i,n,s0;
scanf(%d,n);
for(in-1;i0;i){ssi;
}
答D
解析
选项 A、B、C 的代码都可以实现题目要求。但是选项 D 的代码执行起来是个死循环i 的值从 n-1 开始然后i循环的结束条件是 i0i 的值越加越大一直大于 0条件永远成立。实现的并不是从 1 累加到 n-1。
[4-2]
输入65 14 Enter以下程序段的输出结果为 。
int m, n;
scanf(%d%d, m,n);
while(m!n) {while(mn) mm-n;while(nm) nn-m;
}
printf( m%d\n, m);
A. m3
B. m2
C. m1
D. m0
答C
解析
m 的初始值为 65n 的初始值为 14。第一个while 的条件 m!n是成立的。执行里面的循环体。
第二个while 的条件 m n此时也是成立的执行里面的循环体 mm-n执行后 m 的值为 51因为是循环语句要再次判断条件是否成立mn 依然成立再执行一次循环体 mm-n执行后 m 的值为37。再次判断条件 mn 依然成立再一次执行循环体 mm-n执行后 m 的值为23。再次判断条件 mn 依然成立再一次执行循环体 mm-n执行后 m 的值为 9 。再次判断条件 mn不成立结束这个循环。
程序继续执行到第三个 while 循环条件是 nm此时 m 的值为 9n 的值为 14条件成立执行里面的循环体 nn-m执行后 n 的值为 5。再来判断循环条件 nm已经不成立了。结束这个循环。
此时里面的两个循环作为最外层的循环的循环体结束这次执行之后要再来判断最外层循环的条件 m!n此时 m 的值为 9n 的值为 5。条件成立要再次执行里面的循环体就是两个里层循环。先看第二个循环条件 mn成立的那吗执行里面的循环体 mm-n执行后 m 的值为 4再来判断条件 mn已经不成立了结束这个循环。
程序继续执行到第三个循环条件是 nm此时 m 的值为 4n 的值为 5条件成立执行里面的循环体 nn-m执行后 n 的值为 1。再来判断循环条件 nm已经不成立了。结束这个循环。
这两个循环执行结束后要继续判断最外层的循环条件 m!n此时 m 的值为 4n 的值为 1条件成立再次进去执行里面的两个内层循环。先来判断第二个循环条件 mn成立的执行里面的循环体 mm-n执行后m 的值为 3再来判断条件 mn依然成立执行里面的循环体 mm-n执行后m 的值为2再来判断条件 mn依然成立执行里面的循环体 mm-n执行后m 的值为 1。再来判断条件 mn此时已经不成立了。结束这个循环。
程序继续执行到第三个while循环条件是 n m此时 m 的值为 1n 的值也为 1。条件不成立结束这个循环。
然后要再来判断外层循环的条件 m!n此时 m 的值为 1 n 的值也为 1。条件不成立结束这个外层循环。
程序继续向下执行打印输出语句m 的值为 1。
[4-3]
C语言中 while 和 do-while 循环的主要区别是 。 A. do-while 的循环体至少无条件执行一次
B. while 的循环控制条件比 do-while 的循环控制条件严格
C. do-while 允许从外部转到循环体内
D. do-while 的循环体不能是复合语句
答A
解析
while 循环是先判断条件条件成立再执行循环体。
do-while 循环是先执行循环体再判断条件是否成立。即使条件不成立也已经执行一次循环体了。
[4-4]
下列叙述中正确的是 。 A. break 语句只能用于 switch 语句体中
B. continue 语句的作用是使程序的执行流程跳出包含它的所有循环
C. break 语句只能用在循环体内和 switch 语句体内
D. 在循环体内使用 break 语句和 continue 语句的作用相同
答C
解析
break 语句可以使用在 switch 中。也可以使用在循环中表示强制结束循环。
break 语句用在循环中表示强制结束循环无论循环条件是否成立循环都彻底的结束了。而 continue 语句也是用于强制结束循环但只是结束这一次循环循环下次继续执行。
[4-5]
下列叙述中正确的是 。 A. do-while 语句构成的循环不能用其他语句构成的循环来代替
B. do-while 语句构成的循环只能用 break 语句退出
C. 用 do-while 语句构成的循环在 while 后的表达式为非零时结束循环
D. 用 do-while 语句构成的循环在 while 后的表达式为零时结束循环
答D
解析
C 语言中的三种循环语句 forwhile 和 do-while 其实是可以互相替代的只是写法不同。有些情况使用 for 循环比较方便有些情况使用 while 比较方便有些时候使用 do-while 比较方便。这三种循环的成立条件都是非零就会执行循环体。所以此题目的正确答案是选项 D。
[4-6]
下列程序段的输出结果是 。
int i;
for(i1; i6; i){if(i%2!0){printf(#);continue;}printf(*);
}
A. #*#*#
B. #####
C. *****
D. *#*#*
答A
解析
此代码实现的是判断变量 i 的值如果为奇数打印 # 如果为偶数打印 * 。
变量 i 的初始值为1循环条件为 i6成立里面的循环体是一个 if 语句继续判断 if 语句的条件i%2!0也是成立的打印一个 # 然后执行 continue 语句结束本次循环不打印 *
然后执行 i此时 i 的值为 2 循环条件依然成立判断 if 语句的条件不成立那么不执行 if 里的代码跳过 if 语句执行后面的打印语句打印出 *
然后执行 i此时 i 的值为 3循环条件依然成立判断 if 语句的条件成立的执行 if 语句里的内容打印 #然后执行 continue结束这次循环。
然后执行 i此时 i 的值为 4循环条件依然成立判断 if 语句的条件不成立那吗不执行 if 里的代码跳过 if 语句执行后面的打印语句打印出 *
然后执行 i此时 i 的值为 5循环条件依然成立判断 if 语句的条件成立的执行 if 语句里的内容打印 #然后执行 continue结束这次循环。
然后执行 i此时 i 的值为 6循环条件不成立了结束 for 循环。
填空题
[4-1]
执行以下程序段后变量 i 的值是 s 的值是 。
int i, s0;
for(i1; i10: ii3)ssi;
答1322
解析
变量 i 的初始值为 1s 的初始值为 0。for 循环的条件是 i 10
第一次循环i 的值为 1s 的值为 0执行循环体的内容后s 的值为 1。然后执行 ii3然后 i 的值为 4。
第二次循环i 的值为 4s 的值为 1执行循环体的内容后s 的值为 5。然后执行 ii3然后 i 的值为 7。
第三次循环i 的值为 7s 的值为 5执行循环体的内容后s 的值为12 。然后执行 ii3然后 i 的值为 10。
第四次循环i 的值为 10s 的值为 12执行循环体的内容后s 的值为 22。然后执行 ii3然后 i 的值为 13。
不再满足循环的条件了循环结束。
[4-2]
下列程序段的输出结果是 。
for(int i14; i1; i/3)printf(%d#i);
答14#4#
解析
变量 i 的初始值是 14for 循环的条件是 i1
第一次循环i 的值为 14执行循环体的内容后打印 14# 。然后执行 i/3然后 i 的值为 4。
第二次循环i 的值为 4执行循环体的内容后打印 4# 。然后执行 i/3然后 i 的值为 1。
不再满足循环的条件了循环结束。
[4-3]
以下程序段 A 的输出结果是 程序段 B 的输出结果是 。 程序段 A
int num0,s10;
while(num2) {num;s1s1num;
}
printf(s1%d\n, s1);
程序段B
int num0,s20;
while( num2) {s2s2num;num;
}
printf(s2%d\ns2);
答s16s23
解析
程序段 A
变量 num 的初始值是0s1 的初始值也是 0while 循环的条件是 num2
第一次循环num 的值为 0执行 num 后num 的值为 1然后执行 s1s1num 后s1 的值为1
第二次循环num 的值为 1执行 num 后num 的值为 2然后执行 s1s1num 后s1 的值为3
第三次循环num 的值为 2执行 num 后num 的值为 3然后执行 s1s1num 后s1 的值为6
再判断 while 循环的条件不成立了循环结束。
程序段 B
变量 num 的初始值是0s2 的初始值也是 0while 循环的条件是 num2
第一次循环num 的值为 0执行 s2s2num 后s2 的值为 0 执行 num 后num 的值为 1
第二次循环num 的值为 1执行 s2s2num 后s2 的值为 1 执行 num 后num 的值为 2
第三次循环num 的值为 2执行 s2s2num 后s2 的值为 3 执行 num 后num 的值为 3
再判断 while 循环的条件不成立了循环结束。
[4-4]
求序列和。计算并输出 s112 123 123412345 的值。请填空。
int i,s0, t0;
for(i1; i5; i){t__________i;sst;
}
printf(s%d\n, s);
答t*10
解析
循环中 i 的值是从 1 到 5。只要让 t 的值分别为 112123123412345即可。所以思考 t 加 i。每次 的值就该是 010120123012340 即可。
[4-5]
以下程序段A的输出结果是 程序段B的输出结果是 。 程序段 A
int num0;
while(num6){num;if(num3) break;printf(%d#num);
}
程序段 B
int num0;
while(num6) {num;if(num3) continue;printf(%d#num);
}
答1#2#1#2#4#5#6#
解析
这两段代码考察的是 break 和 continue 的用法的区别。
break 执行后会彻底的结束循环。所以 num 的值为 3满足条件后整个循环就结束了哪怕循环条件依然成立。打印到 num 的值为2。
continue 执行后结束这次循环但是循环还是会继续。所以 num 的值为 3满足条件后只是结束了这次循环所以打印的时候只是跳过了 3后面的继续。
[4-6]
输入82pay Enter, 以下程序段的输出结果为 。
char ch;
int i;
for(i1; i6; i){chgetchar(); if(cha chz) ch(ch5-a)%26a;else 1f(ch0 ch9) ch(ch2-0)%100;putchar(ch);
}
答04ufd!
解析
这段代码实现的是将输入的自负如果是数字后移 2 位。如果是字母后移 5 位。其他字符原样输出。
输入 8输出 0。输入 2输出 4。
输入 p输出 u。输入 a输出 f。输入 y输出 d。输入 !输出还是 。
[4-7]
阅读下列程序段并回答问题。 int i, j, k 0, m 0;for (i 0; i 2; i){; /*第3行*/for (j 0; j 3; j)k;m; /*第6行*/}printf(k%d, m%d\n, k, m);
(1) 程序段的输出是
(2) 将第6行改为mmk; 程序段的输出是
(3) 将第3行改为k0;, 将第6行改为mmk;程序段的输出是 答(1) k6 m2 (2) k6 m9 (3) k3 m6
解析
(1)
变量 i 的初始值为 0外层循环条件 i 2
外层循环第一次i 0
内层循环 j 的初始值为 0内层循环条件 j3
内层循环第一次j 0满足条件执行 k 后k 的值为 1。然后执行 jj 的值为 1。
内层循环第二次j 1满足条件执行 k 后k 的值为 2。然后执行 jj 的值为 2。
内层循环第三次j 2满足条件执行 k 后k 的值为 3。然后执行 jj 的值为 3。
不满足条件结束内层循环。
继续向下执行到 m执行后m 的值为 1。
然后执行 ii 的值为 1。
外层循环第二次i 1
内层循环 重新执行 1 次。j 的值从 0 到 3。k 的值累加到 6。然后结束内层循环。继续向下执行到 m执行后m 的值为 2。然后执行 ii 的值为 2。
外层循环也结束了。最终 k 的值为 6m 的值为 2。
(2) (3) 的分析同 (1) 一样。
[4-8]
输出方阵。输入一个正整数 n(1≤n≤10)打印一个 n 行 n 列的方阵。当 n4 时输出如下方阵。请填空。
13 14 15 169 10 11 125 6 7 81 2 3 4 int i, j, n;scanf(%d, n);for (________; i 0; ________){for (j 1; j n; j){printf(%4d, ________);}printf(\n);}
答in-1 i-- 4*ij
[4-9]
输出等腰三角形。输入一个正整数 n(1≤n≤9)打印一个高度为 n 且由“*”组成的等腰三角形图案。当 n3 时输出如下等腰三角形图案。请填空。 ****
***** int i, j, n;scanf(%nd, n);for (i 1; i n; i){for (________; ________; ________){printf( );}for (________; ________; ________){printf(*);}________;}
答j1;jn-i;j j1;j2*i-1;j printf(\n)
[4-10]
顺序输出整数的各位数字。输入一个非负整数从高位开始逐位分割并输出它的各位数字。例如输入9837输出 9 8 3 7。请填空。 int digit, number, pow, t_number;scanf(%d, number);t_number number;pow 1;while (________){pow pow * 10;t_number t_number / 10;}while (pow 1){digit ________;number ________;pow pow / 10;printf(%d , digit);}printf(\n);
答t_number/10!0 number/pow number%pow
解析
这里先将接收到的 number 的值复制一份到 t_number 中。
第一个循环中获取的 pow 是为了获取 number的最大的权重(就是最高位的权重值)。比如123最高位是 1在百位上权重就是 100。
第二个循环中digit 是为了获取每个位上的数字。 程序设计题
[4-1]
求奇数和。输入一批正整数(以零或负数为结束标志)求其中的奇数和。试编写相应程序。 答案代码
#include stdio.h
int main()
{int n, sum;printf(input n:\n);sum 0;while (1){scanf(%d, n);if (n 0){if (n % 2 ! 0){sum n; // 累加奇数}}else{break;}}printf(奇数和为%d\n, sum);return 0;
} 运行结果 [4-2]
展开式求和。输入一个实数 x计算并输出下式的和直到最后一项的绝对值小于 0.000 01 计算结果保留 4 位小数。要求定义和调用函数 fact(n) 计算 n 的阶乘可以调用 pow() 函数求幂。试编写相应程序。
答案代码
#include stdio.h
#include math.h
double fact(int n);
int main()
{int n;double eps, x, s, item;eps 0.00001;printf(input x:);scanf(%lf, x);s 0;item 1;n 1;while (fabs(item) eps){s item;item pow(x, n) / fact(n);n;}s s item;printf(结果为:%.4lf\n, s);return 0;
}
double fact(int n)
{int i;double result 1;for (i 1; i n; i){result * i;}return result;
} 运行结果 [4-3]
求序列和。输入一个正整数 n输出 2/13/25/38/5... 的前 n 项之和保留 2 位小数。该序列从第 2 项起每项的分子是前一项分子与分母的和分母是前项的分子。试编写相应程序。 答案代码
#include stdio.h
int main()
{int i,n;double x,x1,x2,sum 0;x1 2;//分子x2 1;//分母printf(input n:);scanf(%d, n);for( i 1;i n; i){sum x1 / x2;x x1 x2; // 临时存储分子分母就是下一次的分子x2 x1; // 下一次的分母就是上次的分子x1 x; // 下一次的分子} printf(sum %.2lf\n,sum);return 0;
}
运行结果 [4-4]
和求序列和。输入两个正整数 a 和 n求 aaaaaaaa...a ( n 个 a ) 之和。例如输入 2 和 3 输出246 ( 222222 )。试编写相应程序。 答案代码
#include stdio.h
int main()
{int i,a,b0,n,sum 0;printf(input a,n:);scanf(%d%d, a, n);for(i1;in;i){b b*10a;sum b;}printf(sum %d\n,sum);return 0;
}
运行结果 [4-5]
换硬币。将一笔零钱(大于 8 分小于 1 元精确到分 ) 换成 5 分2 分和 1 分的硬币每种硬币至少有一枚。输入金额问有几种换法? 针对每种换法 输出各种面额硬币的数量和硬币的总数量。试编写相应程序。 答案代码
#include stdio.h
int main()
{int m, n1, n2, n5, total 0, count 0;printf(input m:);scanf(%d, m);if (m 8 || m 100){printf(Invalid!\n);}else{for (n5 1; n5 m; n5){for (n2 1; n2 m; n2){for (n1 1; n1 m; n1){if (n5 * 5 n2 * 2 n1 m){count;printf(5分有 %d 个,2分有 %d 个,1分有 %d 个,总共有 %d 个\n, n5, n2, n1, n5 n2 n1);}}}}printf(共有 %d 种算法\n, count);}return 0;
}
运行结果 [4-6]
输出水仙花数。输入一个正整数 n ( 3≤n≤7 ) 输出所有的 n 位水仙花数。水仙花数是指一个 n 位正整数它的各位数字的 n 次幕之和等于它本身。 例如 153 的各位数字的立方和是1^35^33^3 153。试编写相应程序。 答案代码
#include stdio.h
#include math.h
int main()
{int n;do{printf(input n (3≤n≤7):);scanf(%d, n);} while (n 7 || n 3);printf(水仙花数有\n);int i pow(10, n) - 1;int limit pow(10,n-1);int digit, sum, s, m;while (i limit) {sum 0;s i; m n;//循环获取每个位上的数字while (s ! 0){digit s / (int)(pow(10, m - 1));s % (int)(pow(10, m - 1));sum pow(digit, n); // 每个位上的数字的n次方和m--;}if (sum i){printf(%d\t, i);}i--;}printf(\n);return 0;
}
运行结果
[4-7]
求最大公约数和最小公倍数。输入两个正整数 m 和 n (m≤1000 n≤1000 )求其最大公约数和最小公倍数。试编写相应程序。 答案代码
#include stdio.h
int main()
{int m, n, i, j;printf(input m,n:);scanf(%d%d, m, n);if (m 0 || n 0 || m 1000 || n 1000){printf(Invalid!\n);}for (i m n ? m : n; i 1; i--){if (m % i 0 n % i 0){printf(gcd %d\n, i); // 最大公约数break;}}j m / i * n;printf(lcm %d\n, j); // 最小公倍数return 0;
}
运行结果 [4-8]
打印菱形星号 * 图案。输入一个正整数 n (n 为奇数)打印一个高度为 n 的 * 菱形图案。例如当 n 为 7 时打印出以下图案。试编写相应程序。 ** * ** * * * *
* * * * * * ** * * * ** * **
答案代码
#include stdio.h
#include math.h
int main()
{int i, j, n, k;printf(input odd number n:);scanf(%d, n);k (n 1) / 2; // 计算菱形的边长// 上三角for (i 1; i k; i){for (j 1; j n - 2 * i 1; j) // 循环打印空格{printf( );}for (j 1; j 2 * i - 1; j){printf(* ); // 循环打印*}printf(\n);}// 下三角for (i 1; i k; i){for (j 1; j i * 2; j) // 打印空格{printf( );}for (j 1; j n - 2 * i; j){printf(* );}printf(\n);}return 0;
}
运行结果 [4-9]
输出等腰三角形。输入一个正整数 n(1≤n≤9)打印一个高度为 n 且由“*”组成的等腰三角形图案。当 n3 时输出如下等腰三角形图案。请填空。 ****
***** int i, j, n;scanf(%nd, n);for (i 1; i n; i){for (________; ________; ________){printf( );}for (________; ________; ________){printf(*);}________;}
答j1;jn-i;j j1;j2*i-1;j printf(\n)
[4-10]
猴子吃桃问题。一只猴子第一天摘下若干个桃子当即吃了一半还不过瘾又多吃了一个; 第二天早上又将剩下的桃子吃掉一半又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第 n 天早上想再吃时只剩下一个桃子了。问第一天共摘了多少个桃子? 试编写相应程序。(提示采取逆向思维的方法从后往前推断)
答案代码
#include stdio.h
int main()
{int i, n, sum;printf(input n:);scanf(%d, n);sum 1;//最后一天的for (i 1; i n; i) //循环n-1天{ sum (sum 1) * 2; //前一天的桃子数第一天的吃剩下的第2天的桃子数1*2}printf(第一天摘桃 %d 个\n, sum);return 0;
}
运行结果 [4-11]
兔子繁衍问题。一对兔子从出生后第 3 个月起每个月都生一对兔子。小兔子长到第 3 个月后每个月又生一对兔子。假如兔子都不死请问第 1 个月出生的一对兔子至少需要繁衔到第几个月时兔子总数才可以达到 n 对? 输入一个不超过10 000的正整数 n 输出兔子总数达到 n 最少需要的月数。试编写相应程序。
答案代码
#include stdio.h
int main()
{int n, m, c;int f1 1, f2 1;printf(input n (n10000):);scanf(%d, n);if (n 2){printf(想要 %d 对兔子,至少 1 个月,可以产出 1 对兔子 \n, n);}else{m 2; //月份c 0; //当前月的兔子数while (c n){m;// 3月c f1 f2; // 3月的兔子数// 为下一个月做准备改变f1和f2的值f1 f2;f2 c;}printf(想要 %d 对兔子,至少 %d 个月,可以产出 %d 对兔子 \n, n, m, c);}return 0;
}
运行结果 总结 以上为本篇文章的所有内容后续将更新各个章节课后习题解析如想了解更多请持续关注该专栏。如有疑问或提供意见请指出谢谢 文章内容参考 程序咖 如想观看讲解视频或解析请参考C语言程序设计第4版(浙大版)何钦铭颜晖著 (chengxuka.cn)https://www.chengxuka.cn/#/mooc/outline?_id39titleC%25E8%25AF%25AD%25E8%25A8%2580%25E7%25A8%258B%25E5%25BA%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25AC%25AC4%25E7%2589%2588(%25E6%25B5%2599%25E5%25A4%25A7%25E7%2589%2588)%25E4%25BD%2595%25E9%2592%25A6%25E9%2593%25AD%25E9%25A2%259C%25E6%2599%2596%25E8%2591%2597