c语言程序设计第3版何钦铭颜晖第4章循环结构.docx

上传人:b****3 文档编号:5705590 上传时间:2023-05-09 格式:DOCX 页数:24 大小:21.40KB
下载 相关 举报
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第1页
第1页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第2页
第2页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第3页
第3页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第4页
第4页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第5页
第5页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第6页
第6页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第7页
第7页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第8页
第8页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第9页
第9页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第10页
第10页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第11页
第11页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第12页
第12页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第13页
第13页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第14页
第14页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第15页
第15页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第16页
第16页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第17页
第17页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第18页
第18页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第19页
第19页 / 共24页
c语言程序设计第3版何钦铭颜晖第4章循环结构.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

c语言程序设计第3版何钦铭颜晖第4章循环结构.docx

《c语言程序设计第3版何钦铭颜晖第4章循环结构.docx》由会员分享,可在线阅读,更多相关《c语言程序设计第3版何钦铭颜晖第4章循环结构.docx(24页珍藏版)》请在冰点文库上搜索。

c语言程序设计第3版何钦铭颜晖第4章循环结构.docx

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.打菱形星号“*”图案。

输入一个正整数n(n为奇数),打印一个高度为n的“*”菱形图案。

例如,当n为7时,打印出以下图案。

试编写相应程序。

*

***

*****

*******

*****

***

*

解答:

#include

intmain(void)

{

inti,j,n;

printf("Inputn:

");

scanf("%d",&n);

for(i=1;i<=n;i=i+2){

for(j=1;j<=n-i;j++)

printf("");

for(j=1;j<=i;j++)

printf("*");

putchar('\n');

}

for(i=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2