1、C语言程序设计第3版何钦铭 颜 晖 第4章 循环结构第4章 循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为什么?如果将精度改为 10-3,运行结果有变化吗?为什么?解答:如果对 item 赋初值 0,则程序运行结果是 pi=0,因为 item 为 0 时不满足 while 循环的执行条件,即不执行循环,故 pi 值为 0。如果将精度改为 10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得 while 循环次数减少,必然影响到的值。【练习 4-2】 运行例 4-2 程序时,如果将最后一个输入数据改为-2,运行结
2、果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。如果第一个输入数据是-1,运行结果是:Grade averageis 0,因为第一个输入就是-1,则 while 循环条件不成立,不执行循环体。【练习 4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+):输入一个正实数 eps,计算序列1-1/4+1/7-1/10+1/13-1/16+的值,精确到最后一项的绝对值小于eps(保留6位小数)。试编写相应程序。解答:#include #includ
3、e int main(void) int denominator, flag; double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1; denominator = 1 ;item = 1.0; s = 0; while(fabs (item) = eps) item = flag * 1.0 / denominator; s = s + item; flag = -flag; denominator = denominator +3; printf ( “s = %fn”, s); return 0;【练习 4-4
4、】如果将例 4-3 程序中的 do-while 语句改为下列 while 语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0) number = number / 10; count +;解答:会有影响,因为当输入数据 number 为 0 时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。可增加一条 if 语句来解决上面的问题,在 while 循环前加上语句“if ( number=0) count=1; ”。【练习 4-5】例 4-4 程序中的第 915 行可以用下列 for 语句替代吗?为
5、什么?for( i = 2; i = m/2; i+) if( m%i = 0 ) printf(No!n); else printf(%d is prime number!n,m);解答:不能代替,因为只用一个数来除不足以判断该数是否是素数。【练习4-6】猜数字游戏:先输入2个不超过100的正整数,分别是被猜数mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进行比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系,最多允许猜n次。如果1次就猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3
6、次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,则提示“Game Over”;如果在到达n次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。试编写相应程序。解答:#includeint main(void) int mynumber,n,yournumber,i; printf(Input mynumber:); scanf(%d,&mynumber); printf(Input n:); scanf(%d,&n); for(i=1;i3&i=n)&yournumber=mynumber) printf(Good Guess!);break
7、; if(i=n&mynumber!=yournumber)|mynumber0|yournumber0) printf(Game Over!);break; return 0; 【练习 4-7】求e的值:输入 1 个正整数 n,计算下式求出 e 的值(保留 2 位小数),要求使用嵌套循环。试编写相应程序。e = 1 + 1/1!+1/ 2!+1/ 3!+1/n!解答:#includeint main(void) int i, j, n;double e, t;printf(Input n: );scanf(%d, &n);e = 1;for (i = 1; i = n; i+)t=1;for
8、(j=1;j=i;j+) t = t * j;e = e + 1.0/t; printf(e = %0.2fn, e);return 0;【练习 4-8】运行例 4-8 的源程序 1 时,如果先输入 0,即输入数据个数 n=0,表示不再输入任何成绩,运行结果是什么?如何修改程序以应对这种情况?解答:当输入数据个数 n0 时,由于在 for 循环外首先得输入一个成绩,故程序仍将等待输入第一个人的成绩,这与输入个数 n0 矛盾,可修改如下:#include int main(void) int i, mark, max, n; printf(Enter n: ); scanf (%d, &n);
9、if (n0) printf(Enter %d marks: , n);scanf (%d, &mark); /* 读入第一个成绩 */max = mark; /* 假设第一个成绩是最高分 */for (i = 1; i n; i+ ) scanf (%d, &mark); if (max mark)max = mark; printf(Max = %dn, max); return 0;【练习 4-9】运行例 4-8 的源程序 2 时,如果输入的第一个数就是负数,表示不再输入任何成绩,运行结果是什么?如何修改程序以应对这种情况?解答:当输入的第一个数就是负数时,将不执行 while 循环,程
10、序运行结果就是输出所输入的负数。【练习 4-10】找出最小的值:输入一个正整数 n, 再输入 n 个整数,输出最小值。试编写相应程序。解答:#include int main(void) int i , min, n, x; printf(inputr n: );scanf(%d, &n); printf(input numbers: );scanf(%d, &x);min = x;for (i = 1; i x) min = x; printf(min = %dn, min);return 0;【练习 4-11】统计素数并求和:输入2个正整数m和n(1mn500),统计并输出m和n之间素数的
11、个数以及这些素数的和。素数就是只能被 1 和自身整除的正整数,1 不是素数,2 是素数。试编写相应程序。解答:#include#include int main(void) int i,m,n,j,count; double sum; printf(Enter m:); scanf(%d,&m); printf(Enter n:); scanf(%d,&n); count=0; sum=0; for(;m=n;m+) j=sqrt(m); for(i=2;ij&m!=1) sum=sum+m; count+; printf(count=%dnsum=%.0lf,count,sum); retu
12、rn 0;习题4一选择题1C 语言中 while 和 do-while 循环的主要区别是 A 。Ado-while 的循环体至少无条件执行一次Bwhile 的循环控制条件比 do-while 的循环控制条件严格Cdo-while 允许从外部转到循环体内Ddo-while 的循环体不能是复合语句2下列叙述中正确的是 C 。Abreak语句只能用于switch语句体中Bcontinue语句的作用是使程序的执行流程跳出包含它的所有循环Cbreak语句只能用在循环体内和switch语句体内D在循环体内使用break语句和continue语句的作用相同3下列叙述中正确的是 D 。Ado-while语句构
13、成的循环不能用其它语句构成的循环来代替。Bdo-while语句构成的循环只能用 break 语句退出。C用do-while语句构成的循环,在 while 后的表达式为非零时结束循环。D用do-while语句构成的循环,在 while 后的表达式为零时结束循环。4执行 x=-1; do x=x*x; while (!x); 循环时,下列说法正确的是 A 。A循环体将执行一次C循环体将执行无限次B循环体将执行两次D系统将提示有语法错误5假设变量 s、a、b、c 均已定义为整型变量,且 a、c 均已赋值(c 大于 0),则与以下程序段 s=a; for(b=1;b=c;b+) s=s+1; 功能等价
14、的赋值语句是 B 。As=a+b; Bs=a+c; Cs=s+c; Ds=b+c;6以下程序段的输出结果是 B 。int main(void) int num=0,s=0; while(num=2) num+; s+=num; printf(%dn,s); return 0;A10 B6 C3 D17运行以下程序后,如果从键盘上输入 65 14,则输出结果为 C 。int main(void) int m, n;printf(Enter m,n;); scanf(%d%d, &m,&n): while (m!=n) while (mn) m=m-n; while (nm) n=n-m; pri
15、ntf(m=%dn,m); return 0;Am=3 Bm=2 Cm=1 D.m=0 8下列程序段的输出结果是 A 。int main(viod) int i; for(int i=1;i6;i+) if(i%2!=0) printf(#); continue; printf(*); printf(n); return 0;A#*#*# B# C* D*#*#*二、填空题1若 s0,执行循环语句for(i=1; i=10; i=i+3) s=s+i; 后,i 的值为 13 。2下列程序段的输出结果是 * 。int x=2;do printf(“*”); x-; while (!x=0);3下
16、列程序段的功能是计算:s=1+12+123+1234+12345。则划线处应填 t*10 。int t=0,s=0,i;for(i=1;i=5;i+) t=i+_ ; s=s+t; printf(s=%dn,s); 4以下程序的输出结果是 12 。int main(void) int num=0;while(num6) num+;if(num=3) break;printf(%d,num); return 0;5阅读下列程序并回答问题。int main(void) int i, j, k=0, m=0; for(i=0; i2; i+) ; /*第 5 行*/ for(j=0; j3; j+)
17、 k+; m+; /*第 9 行*/ printf(k=%d, m=%dn, k, m); (1)程序的输出是 k=6,m=2 。(2)将第8行改为 m=m+k; ,程序的输出是 k=6,m=9 。(3)将第5行改为k=0; ,将第8行改为 m=m+k; ,程序的输出是k=3,m=6 。6.下列程序运行时输入62pay!,则结果是62ufd!。int main(void) char c; int i; for(i=1;i=a&c=v&c=z) c=a+c-v; putchar(c); return 0;三程序设计题1求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相应程
18、序。解答:#include int main(void) int x, sum; printf(Input integers: );scanf(%d, &x);sum = 0; while(x0)if(x%2!=0) sum = sum + x;scanf(%d, &x);printf(The sum of the odd numbers is %dn, sum);return 0;2展开式求和:输入1个实数x,计算并输出下式的值,直到最后一项的绝对值小于0.00001,计算结果保留2位小数。要求定义和调用函数 fact(n)计算n的阶乘,可以调用 pow( )函数求幂。试编写相应程序。 s=
19、x+x/2!+x/3!+x4/4!+解答:#include#includedouble fact(int n);int main(void) int i; double x,s,item; printf(Input x:); scanf(%lf,&x); s=0; item=1.0; i=1; while(fabs(item)=1e-5) item=pow(x,i)/fact(i); s=s+item; i+; printf(s=%.2lf,s); return 0; double fact(int n) int i; double result; for(result=1,i=1;i=n;i
20、+) result=result*i; return result; 3.求序列和:输入一个正整数 n,输出2/1+3/2+5/3+8/5 +的前 n 项之和,保留 2 位小数。该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。试编写相应程序。解答:#includeint main(void) int n,i,s1=2,s2=3,s,p1=1,p2=2,p; double sum,item; printf(Input n:); scanf(%d,&n); if(n=3) for(i=1;i=n-2;i+) s=s1+s2; p=p1+p2; item=1.0*s/p;
21、sum+=item; s1=s2;s2=s; p1=p2;p2=p; else if(n=1)sum=2; else if(n=2)sum=3.5; printf(sum=%.2lfn,sum); return 0; 4.求序列和:输入 2 个正整数a和n,求 a+aa+aaa+aaa(n个a)之和。例如,输入2和3,输出246(2+22+222)。试编写相应程序。解答:#includeint main(void) int a,n,i; double sum,temp; printf(Input a,n:); scanf(%d%d,&a,&n); sum=temp=0; for(i=1;i=n
22、;i+) temp=temp*10+a; sum=sum+temp; printf(sum=%.0lf,sum); return 0;5换硬币。将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分和1分的硬币,每种硬币至少有一枚。输入金额,问有哪几种换法?针对每一种换法,输出各种面额硬币的数量和硬币的总数量。试编写相应程序。解答:#includeint main(void) int money,money1,money2,sum; printf(Input money:); scanf(%d,&money); sum=0; for(money1=1;money1=8;money1+) fo
23、r(money2=1;money2money1)printf(money5=1,money1=%d,money2=%dnsum=%dn,money1,money2,sum);elseprintf(money5=1,money2=%d,money1=%dnsum=%dn,money2,money1,sum); return 0;6输出水仙花数。输入一个正整数n(3n7)输出所有n位水仙花数。水仙花数是指一个n位正整数,它各位数字的n次幂之和等于它本身。例如 153 的各位数字的立方和是 :1+5+3=153。试编写相应程序。解答:#include#includeint main(void) in
24、t n,i,t,m,sum,j,k; printf(Input n:); scanf(%d,&n); for(j=0,i=1;i=n;i+) j=j*10+9; for(k=1,i=1;in;i+) k=k*10; for(;k=j;k+) t=k; sum=0; while(k!=0) m=k; k=k%10; sum=sum+pow(k,n); k=m/10; k=t; if(sum=t) printf(%dn,t); return 0;7求最大公约数和最小公倍数。输入两个正整数m和n(m1000,n1000),求其最大公约数和最小公倍数。试编写相应程序。解答:#includeint ma
25、in(void) int m,n,j,k; do printf(Input m:); scanf(%d,&m); printf(Input n:); scanf(%d,&n); while(m0|n0); j=m; while(j%n!=0) j=j+m; k=(m*n)/j; printf(最小公倍数是%d,最大公约数是%dn,j,k); return 0;8高空坠球。皮球从height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?输出保留1位小数。试编写相应程序。解答:#includeint main(void) int n,i; double height,distance,height1,height2; printf(Input height:); scanf(%lf,&height); printf(Input n:); scanf(%d,&n); if(n=1) distance=height; else if(n1) height2=height; for(distance=0,i=2;i=n;i+) height=height/2; distance=distance+height*2; height1=height;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1