C语言程序设计第3版何钦铭颜晖第4章循环结构.docx
- 文档编号:10084183
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:24
- 大小:22.58KB
C语言程序设计第3版何钦铭颜晖第4章循环结构.docx
《C语言程序设计第3版何钦铭颜晖第4章循环结构.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭颜晖第4章循环结构.docx(24页珍藏版)》请在冰点文库上搜索。
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,运行结果有变化吗?
如果第一个输入数据是-1,运行结果是什么?
为什么?
解答:
如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据是-1,运行结果是:
Gradeaverageis0,因为第一个输入就是-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
#include
intmain(void)
{
intdenominator,flag;
doubleitem,s,eps;
printf(“Inputeps:
”);
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=%f\n”,s);
return0;
}
【练习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程序中的第9~15行可以用下列for语句替代吗?
为什么?
for(i=2;i<=m/2;i++)
if(m%i==0)printf("No!
\n");
elseprintf("%disprimenumber!
\n",m);
解答:
不能代替,因为只用一个数来除不足以判断该数是否是素数。
【练习4-6】猜数字游戏:
先输入2个不超过100的正整数,分别是被猜数mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进行比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系,最多允许猜n次。
如果1次就猜出该数,提示“Bingo!
”;如果3次以内猜到该数,则提示“LuckyYou!
”;如果超过3次但不超过n次猜到该数,则提示“GoodGuess!
”;如果超过n次都没有猜到,则提示“GameOver”;如果在到达n次之前,用户输入了一个负数,也输出“GameOver”,并结束程序。
试编写相应程序。
解答:
#include
intmain(void)
{
intmynumber,n,yournumber,i;
printf("Inputmynumber:
");
scanf("%d",&mynumber);
printf("Inputn:
");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("Inputyournumber:
");
scanf("%d",&yournumber);
if(i==1&&yournumber==mynumber){
printf("Bingo!
");break;}
if((i==2||i==3)&&yournumber==mynumber){
printf("Luckyyou!
");break;}
if((i>3&&i<=n)&&yournumber==mynumber){
printf("GoodGuess!
");break;}
if((i==n&&mynumber!
=yournumber)||mynumber<0||yournumber<0){
printf("GameOver!
");break;}
}
return0;
}
【练习4-7】求e的值:
输入1个正整数n,计算下式求出e的值(保留2位小数),要求使用嵌套循环。
试编写相应程序。
e=1+1/1!
+1/2!
+1/3!
+…+1/n!
解答:
#include
intmain(void)
{
inti,j,n;
doublee,t;
printf("Inputn:
");
scanf("%d",&n);
e=1;
for(i=1;i<=n;i++){
t=1;
for(j=1;j<=i;j++)
t=t*j;
e=e+1.0/t;
}
printf("e=%0.2f\n",e);
return0;
}
【练习4-8】运行例4-8的源程序1时,如果先输入0,即输入数据个数n=0,表示不再输入任何成绩,运行结果是什么?
如何修改程序以应对这种情况?
解答:
当输入数据个数n=0时,由于在for循环外首先得输入一个成绩,故程序仍将等待输入第一个人的成绩,这与输入个数n=0矛盾,可修改如下:
#include
intmain(void)
{
inti,mark,max,n;
printf("Entern:
");
scanf("%d",&n);
if(n>0){
printf("Enter%dmarks:
",n);
scanf("%d",&mark);/*读入第一个成绩*/
max=mark;/*假设第一个成绩是最高分*/
for(i=1;i scanf("%d",&mark); if(max max=mark; } printf("Max=%d\n",max); } return0; } 【练习4-9】运行例4-8的源程序2时,如果输入的第一个数就是负数,表示不再输入任何成绩,运行结果是什么? 如何修改程序以应对这种情况? 解答: 当输入的第一个数就是负数时,将不执行while循环,程序运行结果就是输出所输入的负数。 【练习4-10】找出最小的值: 输入一个正整数n,再输入n个整数,输出最小值。 试编写相应程序。 解答: #include intmain(void) { inti,min,n,x; printf("inputrn: "); scanf("%d",&n); printf("inputnumbers: "); scanf("%d",&x); min=x; for(i=1;i scanf("%d",&x); if(min>x) min=x; } printf("min=%d\n",min); return0; } 【练习4-11】统计素数并求和: 输入2个正整数m和n(1≤m≤n≤500),统计并输出m和n之间素数的个数以及这些素数的和。 素数就是只能被1和自身整除的正整数,1不是素数,2是素数。 试编写相应程序。 解答: #include #include intmain(void) { inti,m,n,j,count; doublesum; printf("Enterm: "); scanf("%d",&m); printf("Entern: "); scanf("%d",&n); count=0; sum=0; for(;m<=n;m++){ j=sqrt(m); for(i=2;i<=j;i++) if(m%i==0) break; if(i>j&&m! =1){ sum=sum+m; count++;} } printf("count=%d\nsum=%.0lf",count,sum); return0; } 习题4 一.选择题 1.C语言中while和do-while循环的主要区别是A。 A.do-while的循环体至少无条件执行一次 B.while的循环控制条件比do-while的循环控制条件严格 C.do-while允许从外部转到循环体内 D.do-while的循环体不能是复合语句 2.下列叙述中正确的是C。 A.break语句只能用于switch语句体中 B.continue语句的作用是使程序的执行流程跳出包含它的所有循环 C.break语句只能用在循环体内和switch语句体内 D.在循环体内使用break语句和continue语句的作用相同 3.下列叙述中正确的是D。 A.do-while语句构成的循环不能用其它语句构成的循环来代替。 B.do-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; 功能等价的赋值语句是B。 A.s=a+b;B.s=a+c;C.s=s+c;D.s=b+c; 6.以下程序段的输出结果是B。 intmain(void) { intnum=0,s=0; while(num<=2){ num++; s+=num; } printf("%d\n",s); return0; } A.10B.6C.3D.1 7.运行以下程序后,如果从键盘上输入6514<回车>,则输出结果为C。 intmain(void) { intm,n; printf("Enterm,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); return0; } A.m=3B.m=2C.m=1D.m=0 8.下列程序段的输出结果是A。 intmain(viod) { inti; for(inti=1;i<6;i++){ if(i%2! =0){ printf("#"); continue; } printf("*"); } printf("\n"); return0; } A.#*#*#B.#####C.*****D.*#*#* 二、填空题 1.若s=0,执行循环语句"for(i=1;i<=10;i=i+3)s=s+i;"后,i的值为13。 2.下列程序段的输出结果是**。 intx=2; do{ printf(“*”); x--; }while(! x==0); 3.下列程序段的功能是计算: s=1+12+123+1234+12345。 则划线处应填t*10。 intt=0,s=0,i; for(i=1;i<=5;i++){ t=i+_____; s=s+t; } printf("s=%d\n",s); 4.以下程序的输出结果是12。 intmain(void) {intnum=0; while(num<6){ num++; if(num==3)break; printf("%d,",num);} return0; } 5.阅读下列程序并回答问题。 intmain(void) {inti,j,k=0,m=0; for(i=0;i<2;i++) { ;/*第5行*/ for(j=0;j<3;j++) k++; m++;/*第9行*/ } printf("k=%d,m=%d\n",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! 。 intmain(void) {charc; inti; for(i=1;i<=6;ii++){ c=getchar(); if(c>='a'&&c<=’u’)c=c+5; elseif(c>='v'&&c<='z')c='a'+c-'v'; putchar(c); } return0; } 三.程序设计题 1.求奇数和: 输入一批正整数(以零或负数为结束标志),求其中的奇数和。 试编写相应程序。 解答: #include intmain(void) { intx,sum; printf("Inputintegers: "); scanf("%d",&x); sum=0; while(x>0){ if(x%2! =0) sum=sum+x; scanf("%d",&x); } printf("Thesumoftheoddnumbersis%d\n",sum); return0; } 2.展开式求和: 输入1个实数x,计算并输出下式的值,直到最后一项的绝对值小于0.00001,计算结果保留2位小数。 要求定义和调用函数fact(n)计算n的阶乘,可以调用pow()函数求幂。 试编写相应程序。 s=x+x²/2! +x³/3! +x4/4! +… 解答: #include #include doublefact(intn); intmain(void) { inti; doublex,s,item; printf("Inputx: "); 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); return0; } doublefact(intn) { inti; doubleresult; for(result=1,i=1;i<=n;i++) result=result*i; returnresult; } 3.求序列和: 输入一个正整数n,输出2/1+3/2+5/3+8/5+…的前n项之和,保留2位小数。 该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。 试编写相应程序。 解答: #include intmain(void) { intn,i,s1=2,s2=3,s,p1=1,p2=2,p; doublesum,item; printf("Inputn: "); scanf("%d",&n); if(n>=3){ for(i=1;i<=n-2;i++){ s=s1+s2; p=p1+p2; item=1.0*s/p; sum+=item; s1=s2;s2=s; p1=p2;p2=p; } } elseif(n==1)sum=2; elseif(n==2)sum=3.5; printf("sum=%.2lf\n",sum); return0; } 4.求序列和: 输入2个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。 例如,输入2和3,输出246(2+22+222)。 试编写相应程序。 解答: #include intmain(void) { inta,n,i; doublesum,temp; printf("Inputa,n: "); scanf("%d%d",&a,&n); sum=temp=0; for(i=1;i<=n;i++){ temp=temp*10+a; sum=sum+temp; } printf("sum=%.0lf",sum); return0; } 5.换硬币。 将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分和1分的硬币,每种硬币至少有一枚。 输入金额,问有哪几种换法? 针对每一种换法,输出各种面额硬币的数量和硬币的总数量。 试编写相应程序。 解答: #include intmain(void) { intmoney,money1,money2,sum; printf("Inputmoney: "); scanf("%d",&money); sum=0; for(money1=1;money1<=8;money1++) for(money2=1;money2<=3;money2++) if(money1+money2*2+5==money){ sum=money1+money2+1; if(money2>money1) printf("money5=1,money1=%d,money2=%d\nsum=%d\n",money1,money2,sum); else printf("money5=1,money2=%d,money1=%d\nsum=%d\n",money2,money1,sum); } return0; } 6.输出水仙花数。 输入一个正整数n(3≤n≤7)输出所有n位水仙花数。 水仙花数是指一个n位正整数,它各位数字的n次幂之和等于它本身。 例如153的各位数字的立方和是: 1³+5³+3³=153。 试编写相应程序。 解答: #include #include intmain(void) { intn,i,t,m,sum,j,k; printf("Inputn: "); scanf("%d",&n); for(j=0,i=1;i<=n;i++) j=j*10+9; for(k=1,i=1;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("%d\n",t); } return0; } 7.求最大公约数和最小公倍数。 输入两个正整数m和n(m≤1000,n≤1000),求其最大公约数和最小公倍数。 试编写相应程序。 解答: #include intmain(void) { intm,n,j,k; do{ printf("Inputm: "); scanf("%d",&m); printf("Inputn: "); scanf("%d",&n); }while(m<0||n<0); j=m; while(j%n! =0) j=j+m; k=(m*n)/j; printf("最小公倍数是%d,最大公约数是%d\n",j,k); return0; } 8.高空坠球。 皮球从height(米)高度自由落下,触地后反弹到原高度的一半,再落下,再反弹……如此反复。 问皮球在第n次落地时,在空中一共经过多少距离? 第n次反弹的高度是多少? 输出保留1位小数。 试编写相应程序。 解答: #include intmain(void) { doubledistance,height; inti,n; printf("Inputheight: "); scanf("%lf",&height); printf("Inputn: "); scanf("%d",&n); if(n==0) distance=0; else { for(inti=1;i<=n;i++){ height=height/2; distance+=3*height; } } printf("第%d次落地时,共经过距离为%0.1lf.\n",n,distance); printf("第%d次落地后的反弹高度为%0.1lf.\n",n,height); return0; } 9.打菱形星号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 钦铭颜晖第 循环 结构