大学教材《C语言程序设计》(浙大版)课后习题解析 | 第三、四章

概述

      本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析,如想了解更多,请持续关注该专栏。

专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客icon-default.png?t=N7T8http://t.csdnimg.cn/ZtcgY

一.第三章(分支结构)

选择题

[3-1]

有一函数 以下程序段中错误的是( )。

A.

if(x>0)y=1;
else if(x==0)y=0;
else y=-1;

B.

y=0;
if(x>0)y=1;
else if(x<0)y=-1;

C.

y=0;
if(x>=0);
if(x>0)y=1;
else y=-1;

D.

if(x>=0)if(x>0)y=1;else y=0;
else y=-1;

答:C

解析:根据函数, x 大于 0 ,y 的值为 1 。x 等于 0,y 的值为 0,x 小于 0,y 的值为 -1。选项 A,B,D 代码均正确。

[3-2]

对于变量定义: int a, b=0; 下列叙述中正确的是( )。

A. a 的初始值是 0,b 的初始值不确定

B. a 的初始值不确定,b 的初始值是 0

C. a 和 b 的初始值都是 0

D.a 和 b 的初始值都不确定

答:B

解析:定义变量时,没有给a赋值,所以 a 的初始值不确定。b 的值赋值为 0 。

[3-3]

下列程序段的输出结果是( )。

int a=3,b=5;
if(a=b)printf("%d=%d",a,b);
else printf( "%d!=%d",a,b);

A.5=5

B.3=3

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. a>=10 or a<=0

B. >=0 | a<= 10

C. a>=10 && a<=0

D. a>=10lla<=0

答:D

解析:a 大于等于 10,表示为 a>=10,a 小于等于 0,表示为 a<=0,使用的是关系运算符。中间的或使用逻辑运算符||,所以答案为选项D。

[3-5]

下列叙述中正确的是( )。
A. break 语句只能用于 switch 语句

B.在 switch 语句中必须使用 default

C. break 语句必须与 switch 语句中的 case 配对使用

D.在 switch 语句中,不一定使用 break 语句

答:D

解析:

选项 A 中,break 语句还可以用于循环语句中,表示强制结束循环。

选项 B 中,在 switch 语句中,default 是可选的,可以有,也可以没有。

选项 C 中,break 语句可以用于循环语句,for,while,do-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 a=2, b=-1, c=2;
if(a<b)if(b<0) c≈0;else c++;
printf( "%d\n", c);

A.2

B.1

C.0

D.3

答:A

解析:

a 的初始值为 2,b 的初始值为 -1,c 的初始值为 2。外层 if 语句的条件为 a<b ,这里条件不成立,那么直接结束这个 if 语句,执行最后的打印语句,打印 c 的值为 2。

[3-8]

在执行以下程序段时,为使输出结果为 t=4,则给 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. a>b

B. 0<a<b

C. 0>a>b

D. a<b<0

答:B

解析:

按照选项B为条件,a 大于 0,那么会执行第一个 if 语句,那么执行 s=s+1 后,s 的值为 2 。而下面的为 t 赋值的语句,我们执行最后 else 中的就可以让 t 的值为 4 ,就需要让前面的 if 语句以及 else if 语句的条件都不成立,那么 a < b 即可。

填空题

[3-1]

执行以下程序段,若输入32,则输出( );若输入58,则输出( )。

int a;
scanf("%d", &a);
if(a>50) printf("%d", a);
if(a>40) printf("%d", a);
if(a>30) printf("%d", a);

答:32,585858

解析:

如果输入 32,那么 a 的值为 32,前面两个 if 语句条件不成立,最后一个成立,打印 32。

如果输入 58,那么 a 的值为 58,3 个 if 语句条件都成立,打印了 3 次 a 的值,所以 585858。

[3-2]

表示条件10<x<100或者x<0的C语言表达式是( )。


答:(x>10&&x<100)||x<0

解析:x 大于 10 并且小于 100。可以表示成 x>10 ,x<100 ,因为是并且的关系,所以中间使用逻辑运算符 与&& 来链接。和 x<0 的关系是或者,那么使用 或|| 来链接。

[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 k=16;
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(a>b){if(a>c)    __________;else    __________;
}else {if(__________)    max=b;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;}// 按照a,b,c的顺序打印即可。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;
}


运行结果:

WX20220406-174642@2x

WX20220406-174650@2x

[3-3]

出租车计价:某城市普通出租车收费标准如下:起步里程为 3公里,起步费 10 元; 超过起步里程后 10 公里内,每公里 2 元; 超过 10 公里以上的部分加收 50% 的空驶补贴费,即每公里 3 元; 营运过程中,因路阻及乘客要求临时停车的,按每 5 分钟 2 元计收(不足 5 分钟则不收费)。运价计费尾数四舍五入,保留到元。编写程序,输入行驶里程(公里)与等待时间(分钟),计算并输出乘客应支付的车费(元)。


答案代码:

#include <stdio.h>
int main()
{double x, y=0.0;int t; //等待时间printf("输入行驶公里x(x>0),临时停车时间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 = (a+b+c)/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 = 1+2+...+n-1。
A.

int i, n, s=0;
scanf("%d", &n);
for(i=1; i<n; i++){s=s+i;
}

B.

int i,n,s=0;
scanf("%d",&n);
for(i=1; i<=n-1;++i){s=s+i;
}

C.

int i,n, s≈0;
scanf("%d", &n);
for(i=n-1;i>0;i--){s=s+i;
}

D.

int i,n,s=0;
scanf("%d",&n);
for(i=n-1;i>0;++i){s=s+i;
}

答:D

解析:

选项 A、B、C 的代码都可以实现题目要求。但是选项 D 的代码执行起来是个死循环,i 的值从 n-1 开始,然后++i,循环的结束条件是 i>0,i 的值越加越大,一直大于 0,条件永远成立。实现的并不是从 1 累加到 n-1。

[4-2]

输入65 14 `<Enter>`,以下程序段的输出结果为( )。

int m, n;
scanf("%d%d", &m,&n);
while(m!=n) {while(m>n)    m=m-n;while(n>m)    n=n-m;
}
printf( "m=%d\n", m);

A. m=3

B. m=2

C. m=1

D. m=0

答:C

解析:

m 的初始值为 65,n 的初始值为 14。第一个while 的条件 m!=n,是成立的。执行里面的循环体。

第二个while 的条件 m >n,此时也是成立的,执行里面的循环体 m=m-n;执行后 m 的值为 51,因为是循环语句,要再次判断条件是否成立,m>n 依然成立,再执行一次循环体 m=m-n;执行后 m 的值为37。再次判断条件 m>n 依然成立,再一次执行循环体 m=m-n;执行后 m 的值为23。再次判断条件 m>n 依然成立,再一次执行循环体 m=m-n;执行后 m 的值为 9 。再次判断条件 m>n不成立,结束这个循环。

程序继续执行到第三个 while 循环,条件是 n>m,此时 m 的值为 9,n 的值为 14,条件成立,执行里面的循环体 n=n-m,执行后 n 的值为 5。再来判断循环条件 n>m,已经不成立了。结束这个循环。

此时里面的两个循环作为最外层的循环的循环体,结束这次执行之后,要再来判断最外层循环的条件 m!=n,此时 m 的值为 9,n 的值为 5。条件成立,要再次执行里面的循环体,就是两个里层循环。先看第二个循环条件 m>n,成立的,那吗执行里面的循环体 m=m-n,执行后 m 的值为 4,再来判断条件 m>n,已经不成立了,结束这个循环。

程序继续执行到第三个循环,条件是 n>m,此时 m 的值为 4,n 的值为 5,条件成立,执行里面的循环体 n=n-m,执行后 n 的值为 1。再来判断循环条件 n>m,已经不成立了。结束这个循环。

这两个循环执行结束后,要继续判断最外层的循环条件 m!=n,此时 m 的值为 4,n 的值为 1,条件成立,再次进去执行里面的两个内层循环。先来判断第二个循环条件 m>n,成立的,执行里面的循环体 m=m-n,执行后,m 的值为 3,再来判断条件 m>n,依然成立,执行里面的循环体 m=m-n,执行后,m 的值为2,再来判断条件 m>n,依然成立,执行里面的循环体 m=m-n,执行后,m 的值为 1。再来判断条件 m>n,此时已经不成立了。结束这个循环。

程序继续执行到第三个while循环,条件是 n >m,此时 m 的值为 1,n 的值也为 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 语言中的三种循环语句 for,while 和 do-while ,其实是可以互相替代的,只是写法不同。有些情况使用 for 循环比较方便,有些情况使用 while 比较方便,有些时候使用 do-while 比较方便。这三种循环的成立条件,都是非零,就会执行循环体。所以此题目的正确答案是选项 D。

[4-6]

下列程序段的输出结果是( )。

int i;
for(i=1; i<6; i++){if(i%2!=0){printf("#");continue;}printf("*");
}

A. #*#*#

B. #####

C. *****

D. *#*#*

答:A

解析:

此代码实现的是判断变量 i 的值,如果为奇数,打印 # , 如果为偶数,打印 * 。

变量 i 的初始值为1,循环条件为 i<6,成立里面的循环体,是一个 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, s=0;
for(i=1; i<=10: i=i+3)s=s+i;

答:13,22

解析:

变量 i 的初始值为 1,s 的初始值为 0。for 循环的条件是 i <= 10,

第一次循环:i 的值为 1,s 的值为 0,执行循环体的内容后,s 的值为 1。然后执行 i=i+3,然后 i 的值为 4。

第二次循环:i 的值为 4,s 的值为 1,执行循环体的内容后,s 的值为 5。然后执行 i=i+3,然后 i 的值为 7。

第三次循环:i 的值为 7,s 的值为 5,执行循环体的内容后,s 的值为12 。然后执行 i=i+3,然后 i 的值为 10。

第四次循环:i 的值为 10,s 的值为 12,执行循环体的内容后,s 的值为 22。然后执行 i=i+3,然后 i 的值为 13。

不再满足循环的条件了,循环结束。

[4-2]

下列程序段的输出结果是( )。

for(int i=14; i>1; i/=3)printf("%d#",i);

答:14#4#

解析:

变量 i 的初始值是 14,for 循环的条件是 i>1,

第一次循环:i 的值为 14,执行循环体的内容后,打印 14# 。然后执行 i/=3,然后 i 的值为 4。

第二次循环:i 的值为 4,执行循环体的内容后,打印 4# 。然后执行 i/=3,然后 i 的值为 1。

不再满足循环的条件了,循环结束。

[4-3]

以下程序段 A 的输出结果是( ),程序段 B 的输出结果是( )。
程序段 A

int num=0,s1=0;
while(num<=2) {num++;s1=s1+num;
}    
printf("s1=%d\n", s1);

程序段B

int num=0,s2=0;
while( num<=2) {s2=s2+num;num++;
}
printf("s2=%d\n",s2);

答:s1=6,s2=3

解析:

程序段 A:

变量 num 的初始值是0,s1 的初始值也是 0,while 循环的条件是 num<=2,

第一次循环,num 的值为 0,执行 num++ 后,num 的值为 1,然后执行 s1=s1+num 后,s1 的值为1,

第二次循环,num 的值为 1,执行 num++ 后,num 的值为 2,然后执行 s1=s1+num 后,s1 的值为3,

第三次循环,num 的值为 2,执行 num++ 后,num 的值为 3,然后执行 s1=s1+num 后,s1 的值为6,

再判断 while 循环的条件,不成立了,循环结束。

程序段 B:

变量 num 的初始值是0,s2 的初始值也是 0,while 循环的条件是 num<=2,

第一次循环,num 的值为 0,执行 s2=s2+num 后,s2 的值为 0 ,执行 num++ 后,num 的值为 1,

第二次循环,num 的值为 1,执行 s2=s2+num 后,s2 的值为 1 ,执行 num++ 后,num 的值为 2,

第三次循环,num 的值为 2,执行 s2=s2+num 后,s2 的值为 3 ,执行 num++ 后,num 的值为 3,

再判断 while 循环的条件,不成立了,循环结束。

[4-4]

求序列和。计算并输出 s=1+12+ 123+ 1234+12345 的值。请填空。

int i,s=0, t=0;
for(i=1; i<=5; i++){t=__________+i;s=s+t;
}
printf("s=%d\n", s);

答:t*10

解析:

循环中 i 的值是从 1 到 5。只要让 t 的值分别为 1,12,123,1234,12345即可。所以思考 t = ? 加 i。每次 ? 的值就该是 0,10,120,1230,12340 即可。

[4-5]

以下程序段A的输出结果是( ),程序段B的输出结果是( )。
程序段 A

int num=0;
while(num<6){num++;if(num==3) break;printf("%d#",num);
}

程序段 B

int num=0;
while(num<6) {num++;if(num==3) 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(i=1; i<=6; i++){ch=getchar(); if(ch>='a' && ch<='z') ch=(ch+5-'a')%26+'a';else 1f(ch>='0' & ch<='9') ch=(ch+2-'0')%10+'0';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行改为"m=m+k;", 程序段的输出是( )

(3) 将第3行改为"k=0;", 将第6行改为"m=m+k;",程序段的输出是( )

答:(1) k=6 m=2 (2) k=6 m=9 (3) k=3 m=6

解析:

(1)

变量 i 的初始值为 0,外层循环条件 i < 2,

外层循环第一次:i = 0,

​ 内层循环 j 的初始值为 0,内层循环条件 j<3,

​ 内层循环第一次:j = 0,满足条件,执行 k++ 后,k 的值为 1。然后执行 j++,j 的值为 1。

​ 内层循环第二次:j = 1,满足条件,执行 k++ 后,k 的值为 2。然后执行 j++,j 的值为 2。

​ 内层循环第三次:j = 2,满足条件,执行 k++ 后,k 的值为 3。然后执行 j++,j 的值为 3。

​ 不满足条件,结束内层循环。

​ 继续向下执行,到 m++,执行后,m 的值为 1。

​ 然后执行 i++,i 的值为 1。

外层循环第二次:i = 1,

​ 内层循环 重新执行 1 次。j 的值从 0 到 3。k 的值累加到 6。然后结束内层循环。继续向下执行,到 m++,执行后,m 的值为 2。然后执行 i++,i 的值为 2。

外层循环也结束了。最终 k 的值为 6,m 的值为 2。

(2) (3) 的分析同 (1) 一样。

[4-8]

输出方阵。输入一个正整数 n(1≤n≤10),打印一个 n 行 n 列的方阵。当 n=4 时,输出如下方阵。请填空。

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");}


答:i=n-1, i-- , 4*i+j

[4-9]

输出等腰三角形。输入一个正整数 n(1≤n≤9),打印一个高度为 n 且由`“*”`组成的等腰三角形图案。当 n=3 时,输出如下等腰三角形图案。请填空。

  ****
*****
  int i, j, n;scanf("%nd", &n);for (i = 1; i <= n; i++){for (________;  ________; ________){printf(" ");}for (________;  ________; ________){printf("*");}________;}


答:j=1;j<=n-i;j++ j=1;j<=2*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/1+3/2+5/3+8/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,求 a+aa+aaa+aa...a ( n 个 a ) 之和。例如,输入 2 和 3 ,输出246 ( 2+22+222 )。试编写相应程序。

答案代码:

#include <stdio.h>
int main()
{int i,a,b=0,n,sum =0;printf("input a,n:");scanf("%d%d", &a, &n);for(i=1;i<=n;i++){b = b*10+a;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^3+5^3+3^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 且由`“*”`组成的等腰三角形图案。当 n=3 时,输出如下等腰三角形图案。请填空。
 

  ****
*****
  int i, j, n;scanf("%nd", &n);for (i = 1; i <= n; i++){for (________;  ________; ________){printf(" ");}for (________;  ________; ________){printf("*");}________;}


答:j=1;j<=n-i;j++ j=1;j<=2*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 (n<=10000):");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)icon-default.png?t=N7T8https://www.chengxuka.cn/#/mooc/outline?_id=39&title=C%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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件IO的方式读取jpeg图片的分辨率

1、读取jpeg图片分辨率的两种方式 1.1 使用libjpeg库 可以使用libjpeg库读取JPEG图像文件&#xff0c;并获取图像的分辨率&#xff08;宽度和高度&#xff09;&#xff0c;简单demo示例如下&#xff1a; #include <stdio.h> #include <jpeglib.h>int main() {st…

接口测试、postman、测试点提取【主】

接口测试是测试系统组件间接口的一种测试 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 文章目录 HTTP接口 & Web Service接口RESTful接口…

sentinel热点参数流控

1、概念 热点参数限流会统计传入参数中的热点参数&#xff0c;并根据配置的限流阈值与模式&#xff0c;对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制&#xff0c;仅对包含热点参数的资源调用生效。 2、示例 2.1、目的 对于如下的/get接口的参…

what is apache?

Apache 通常指 Apache Software Foundation (ASF) 或 Apache HTTP Server&#xff0c;两者都是计算机软件领域的重要实体。 Apache 软件基金会 (ASF)&#xff1a;Apache 软件基金会是一个开发开源软件项目的非营利组织。它为涵盖软件开发各个方面的广泛项目提供支持&#xff0c…

Redis 教程系列之Redis PHP 使用 Redis(十二)

PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前&#xff0c; 我们需要确保已经安装了 redis 服务及 PHP redis 驱动&#xff0c;且你的机器上能正常使用 PHP。 接下来让我们安装 PHP redis 驱动&#xff1a;下载地址为:https://github.com/phpredis/phpredis/releases。 P…

使用启智OpenI平台体验Open-Sora笔记

OpenI准备部分 镜像代码仓 创建云脑任务 新建调试任务 镜像选择 如果不想体验整个安装配置过程的话&#xff0c;我准备了一个Open-Sora的环境镜像应该可以直接开箱即用 地址&#xff1a; 192.168.204.22:5000/default-workspace/99280a9940ae44ca8f5892134386fddb/image:Open…

sql注入五-WEB攻防-注入工具SQLMAPTamper编写指纹修改高权限操作目录架构

演示案例&#xff1a; 数据猜解-库表列数据&字典权限操作-文件&命令&交互式提交方法-POST&HEAD&JSON绕过模块-Tamper脚本-使用&开发分析拓展-代理&调试&指纹&风险&等级 #参考&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.…

PMBOK第八版、项目管理AI标准...PMI标准今年有这些进展

项目管理实践标准不断在演变&#xff0c;PMI作为项目管理领域的权威机构&#xff0c;一直致力于与全球各行各业的项目实践者一同探索和研究最新的行业标准&#xff0c;确保PMI标准符合全球项目专业人士当前能力建设与职业发展的需要。 今年以来&#xff0c;我们发布了一系列PM…

NetSuite学习笔记 - 人工成本字段如何按员工所属公司货币显示

在员工档案中输入了人工成本1000&#xff0c;在列表中显示的跟详情中显示的不一样&#xff1f;为什么&#xff1f;怎么办&#xff1f; 详情页中维护人工成本为1000 列表中显示为140.77 1. 开始我以为是因为用的中文环境&#xff0c;可能选了两个不同的字段&#xff0c;切换到英…

学习笔记:MYSQL数据库基础知识

MYSQL数据库基础知识学习笔记 MYSQL基础学习数据库相关概念现主流数据库排名数据模型SQL分类SQL数据库基础操作 2024/3/27 学习资料&#xff1a;黑马程序员:MYSQL MYSQL基础学习 数据库和数据库管理系统(DBMS) 数据库: 是存储数据的集合&#xff0c;包括表、视图、索引等对象…

client-go中ListAndWatch机制,informer源码详解

文章首发地址&#xff1a; 学一下 (suxueit.com)https://suxueit.com/article_detail/s9UMb44BWZdDRfKqFv22 先上一张&#xff0c;不知道是那个大佬画的图 简单描述一下流程 client-go封装部分 以pod为例 、先List所有的Pod资源&#xff0c;然后通过已经获取的pod资源的最大版…

阿里云 -- 连接云服务器ECS、管理云服务器ECS、WordPress 页面配置

连接云服务器ECS 1. 远程连接云服务器ECS&#xff0c;点击实例最右侧操作列的远程连接按钮&#xff0c;并在弹出的对话框中点击立即登录 2. 登录云服务器ECS&#xff0c;通过密码认证方式&#xff0c;输入用户名和密码 提示&#xff1a;新创建的ECS实例状态即使为运行中&#…

微信投票小程序源码系统:创建新活动+多模板一键切换 带完整的安装代码包以及搭建教程

随着社交媒体的普及&#xff0c;投票活动已经成为人们表达意见、参与决策的重要方式。微信小程序作为一种新兴的应用形态&#xff0c;具有用户基数大、使用门槛低的特点&#xff0c;非常适合举办投票活动。然而&#xff0c;对于普通用户来说&#xff0c;开发一个功能完善的投票…

xilinx的高速接口构成原理和连接结构

本文来源&#xff1a; V3学院 尤老师的培训班笔记【高速收发器】xilinx高速收发器学习记录Xilinx-7Series-FPGA高速收发器使用学习—概述与参考时钟GT Transceiver的总体架构梳理 文章目录 一、概述&#xff1a;二、高速收发器结构&#xff1a;2.1 QUAD2.1.1 时钟2.1.2 CHANNEL…

前端html常用标签 笔记

一、基础 开始标签 结束标签 大部分是成对出现的标签&#xff0c;这个是空标签(/放在最后&#xff0c;/可以省掉) 缩进 向后Tab 、前向ShiftTab 红的就是元素属性 标签可以使内容有一些特殊的表现: 给body颜色后&#xff1a; h1 span(连起来) 标签&#xff1a; 标题h1 h2 h3 …

介绍部署esxi8.0产品的方式

什么是esxi esxi的中文叫裸机虚拟机管理器 ESXi是由VMware公司开发的一种裸机虚拟机管理器&#xff0c;全称为VMware ESXi。 ESXi是一种虚拟化技术&#xff0c;专门设计用于在物理服务器上运行虚拟机&#xff0c;它的主要特点是能够最大限度地降低硬件配置要求并简化部署过程…

Android 性能优化实例分享-内存优化 兼顾效率与性能

背景 项目上线一段时间后,回顾重要页面 保证更好用户体验及生产效率&#xff0c;做了内存优化和下载导出优化&#xff0c;具体效果如最后的一节的表格所示。 下面针对拍摄流程的两个页面 预览页 导出页优化实例进行介绍&#xff1a; 一.拍摄前预览页面优化 预览效果问题 存在…

tcp 协议详解

什么是 TCP 协议 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。TCP 是一个传输层的协议。 如下图&#xff1a; 我们接下来在讲解 TCP/IP 协议栈的下三层时都会先解决这两个问题&#xff1a; 报头与有效载荷如何…

EtherCAT转RS232网关在风电领域的应用

开疆智能EtherCAT转RS232网关在风电领域的应用主要体现在以下几个方面&#xff1a; 1.数据采集与传输&#xff1a;在风力发电设备中&#xff0c;传感器和执行器的数据采集和传输至关重要。EtherCAT转RS232网关可以将风力发电设备中的RS232通信协议转换为EtherCAT协议&#xff0…

何恺明重提十年之争——模型表现好是源于能力提升还是捕获数据集偏置?

想象一下&#xff0c;如果把世界上所有的图片都找来&#xff0c;给它们放到一块巨大的空地上&#xff0c;其中内容相似的图片放得近一些&#xff0c;内容不相似的图片放得远一些&#xff08;类比向量嵌入&#xff09;。然后&#xff0c;我随机地向这片空地撒一把豆子&#xff0…