循环结构程序设计习题及答案.docx

上传人:b****8 文档编号:9436966 上传时间:2023-02-04 格式:DOCX 页数:15 大小:21.75KB
下载 相关 举报
循环结构程序设计习题及答案.docx_第1页
第1页 / 共15页
循环结构程序设计习题及答案.docx_第2页
第2页 / 共15页
循环结构程序设计习题及答案.docx_第3页
第3页 / 共15页
循环结构程序设计习题及答案.docx_第4页
第4页 / 共15页
循环结构程序设计习题及答案.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

循环结构程序设计习题及答案.docx

《循环结构程序设计习题及答案.docx》由会员分享,可在线阅读,更多相关《循环结构程序设计习题及答案.docx(15页珍藏版)》请在冰豆网上搜索。

循环结构程序设计习题及答案.docx

循环结构程序设计习题及答案

第6章循环结构程序设计

6-1.比较while语句、do–while语句和for语句的异同。

答:

(1)while语句、do-while语句用于条件循环,for语句用于计数循环。

(2)while语句、for语句是先判断循环条件,后执行循环体,如果循环条件一开始就不成立,则循环体一次也不被执行;而do-while语句是是先执行循环体,后判断循环条件,所以循环体至少被执行一次。

   

(3)知道循环的次数可选用for语句实现循环,不知道循环的次数可选用while语句或do-while语句实现循环.

(4)一般而言,三种循环语句可等价实现.

6-2仔细阅读下面的程序,指出程序的运行结果.

#include<>

voidmain()

{inti;

for(i=0;++i;i<5)

{if(i==3)

{printf("%d\n",++i);

break;

}

printf("%d\n",++i);

}

}

答:

2

4

思考:

语句“for(“i=0;++i;i<5”)在编译时为何会给出语法警告错误当将其改为“for(i=0;i<5;++i)”时,运行结果又将如何

6-3仔细阅读下面的语的程序,指出程序的运行结果。

#include""

voidmain()

{inti,a=0;

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

{do

{i++;

a++;

}while(i<3);

}

i++;

printf("a=%d,i=%d",a,i);

}

答:

a=3,i=7

思考:

在for循环中嵌套着do-while循环,那么do-while循环中对i的修改会对for循环产生影响吗

6-4编写程序,用1000个单词”computer”填充屏幕,每行60个.

解:

#include<>

voidmain()

{inti;

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

{printf("computer.");

if(i%60==0)printf("\n");

}

}

思考:

在for循环中,”if(i%60==0)printf(“\n”);”语句的作用是什么没有此语句将会是什么状况

6-5输入一行字符(以$结束),统计其中的数字字符、空格字符出现的次数。

解:

#include<>

voidmain()

{charc;

intd=0,s=0;

printf("请输入字符(当输入$时结束):

");

while((c=getchar())!

='$')

{

if(c>='0'&&c<='9')s++;

if(c=='')d++;

}

printf("数字字符出现的次数为%d\n",d);

printf("空格字符出现的次数为%d\n",s);

}

若输入字符:

12345abcd678xyz$

则运行结果为:

数字字符出现的次数为8

空格字符出现的次数为4

思考:

此题中的循环次数是如何控制的有何特点

6-6编写程序,求1000以内的奇数之和及偶数之和。

解:

#include<>

voidmain()

{longn=0,m=0;

inti;

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

{if(i%2==0)n=n+i;

elsem=m+i;

}

printf("奇数之和为%ld\n",m);

printf("偶数之和为%ld\n",n);

}

运行结果:

奇数之和为250000

偶数之和为249500

思考:

在此题中为何选用for循环进行控制用while循环或do-while循环是否也可以

6-7计算π,计算公式π/4=1-1/3+1/5-1/7+…直到最后一项的绝对值小于

为止。

解:

#include<>

#include<>

voidmain()

{ints=1;

floatn=,t=1,pi=0;

while(fabs(t)>1e-6)

{pi=pi+t*s;

n=n+2;

s=-s;

t=1/n;

}

pi=pi*4;

printf("pi=%f\n",pi);

}

运行结果:

pi=

思考:

在此题中为何不选用for循环进行控制,而选用while循环呢

6-8编写程序,求任意两个整数之间的所有素数。

解:

#include<>

#include<>

voidmain()

{intn,m,i,j,k,p=0;

printf("请输入两个整数m,n(m

");

scanf("%d,%d",&m,&n);

for(i=m;i<=n;i++);

{k=sqrt(n);

for(j=2;j<=k;j++)

if(i%j==0)break;

if(j>=k+1){printf("%d",i);p=p+1;}

if(p%10==0)printf("\n");

}

printf("\n");

}

运行结果:

请输入两个整数m,n(m

10,20

11131719

思考:

此题中若输入的两个整数m,n分别为13,100时,13这个素数是否被输出,为什么

6-9编写程序,求任意两个整数之间的所有能被3、4、5同时整除的数。

解:

#include<>

voidmain()

{intn,m,i;

printf("请输入两个整数m,n(m

");

scanf("%d,%d",&m,&n);

for(i=m;i<=n;i++)

if((i%3==0)&&(i%4==0)&&(i%5==0))解:

#include<>

voidmain()

{intn,i,j;

for(i=1000;i<=9999;i=i+1000)

{for(j=0;j<=9;j++)

{n=i+j*100+j*10+i/1000;

printf("%d",n);

}

printf("\n");

}

}

运行结果:

1001111112211331144115511661177118811991

2002211222222332244225522662277228822992

3003311332233333344335533663377338833993

4004411442244334444445544664477448844994

5005511552255335544555555665577558855995

6006611662266336644665566666677668866996

7007711772277337744775577667777778877997

8008811882288338844885588668888888888998

9009911992299339944995599669999999999999

思考:

在此题中,内、外循环各起什么作用是否可以交换如果用if语句设计程序,数据的各位数(个位、十位、百位、千位)应该如何分离

6-11 编写程序,判断某一个整数是否为完数。

完数是指其因子之和等于自身的整数,如6=1+2+3请进一步考虑,求任意两个整数之间的所有完数。

解:

#include<>

voidmain()

{intn,i,k=0;

printf("请输入整数:

");

scanf("%d",&n);

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

if(n%i==0)k=k+i;

if(n==k)printf("%d是完数\n",n);

elseprintf("%d不是完数\n",n);

}

运行结果:

请输入整数:

28

28是完数

思考:

变量k在此题中起什么作用初值为何要被赋0循环语句“for(i=1;i<=n;i++)”中的判断式”i

注:

1000以内的完数有6=1+2+3,28=1+2+4+7+14,496=1+2+4+8+16+31+62+124+248.

6-12编写程序,以上三角形式输出九九乘法表。

解:

#include<>

voidmain()

{intj,i;

printf("%4c",'*');

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

{for(j=1;j<=9;j++)

printf("%4d",i*j);

printf("\n");

}

}

运行结果:

*123456789

1123456789

24681012141618

39121518212427

4162024283236

52530354045

636424854

7495663

86472

981

思考:

如果希望输出下三角形式的九九乘法表,程序应如何改动

*123456789

11

224

3369

4481216

5510152025

661218243036

77142128354249

8816243240485664

991827364554637281

6-13 编写程序,计算1!

+2!

+3!

+…+n!

的值,n从键盘输入。

解:

#include<>

voidmain()

{longsum=0,t=1;

intn,i;

printf("请输入整数n:

");

scanf("%d",&n);

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

{

t=t*i;

sum=sum+t;

}

printf("总和=%ld\n",sum);

}

6-14编写程序,求1!

+2!

+…+n!

小于1000的项数n。

解:

#include<>

voidmain()

{intsum=0,t=1;

intn=0;

do

{n=n+1;

t=t*n;

sum=sum+t;

}while(sum<1000);

printf(“项数为%d\n”,n-1);

}

运行结果:

项数为6

思考:

此题为何要选用do-while循环结构最后输出变量的值为何要减1另请改为while循环实现。

6-15某门课程有n个同学参加考试,编写程序计算这门课程的最高分、最低分及平均分。

解:

#include<>

voidmain()

{

floataver,max,min,a;

intn,i;

printf("请输入学生的人数n的值:

");

scanf("%d",&n);

aver=max=0;

min=100;

for(i=0;i

{

printf("请输入第%d位同学的成绩:

",i+1);

scanf("%f",&a);

aver+=a;猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,还多吃了一个。

以后每天如此,至第十天,只剩下一个桃子。

编写程序计算第一天猴子摘得桃子个数。

解:

#include<>

voidmain()

{

intday,n1,n2;

day=9;

n2=1;

while(day>0)

{

n1=(n2+1)*2;/*第一天的桃子数是第二天桃子数加1后的2倍*/

n2=n1;

day--;

}

printf("第一天摘的桃子数为%d\n",n1);

}

运行结果:

第一天摘的桃子数为1534

思考:

此题可假设第一天共摘桃子x颗,可否用递归算法求解(只描述计算过程)

6-19百鸡问题。

百元买百鸡,公鸡8元钱1只,母鸡6元钱1只,鸡仔2元钱4只。

编写程序,计算百元所买的公鸡,母鸡,鸡仔数。

解:

#include<>

voidmain()

{

intx,y,z,j;

for(x=0;x<=12;x++)

for(y=0;y<=16;y++)

{

z=100-x-y;

if(8*x+6*y+z*==100)

printf("%2d:

cock=%-2dhen=%-2dchicken=%-2d\n",++j,x,y,z);

}

}

运行结果:

1:

cock=8hen=11chicken=81

2:

cock=11hen=4chicken=84

思考:

如何理解条件式x<=12,y<=16与计算式z=100-x-y的含义。

6-20将十元钱兑换成一元,五角,一角的硬币,共计40枚,计算有多少种兑换方法。

解:

#include<>

voidmain()

{

intx,y,z,j=0;/*x表示一元的枚数,y表示五角的/*

/*枚数,z表示一角的枚数*/

for(x=0;x<=10;x++)

for(y=0;y<=20;y++)

{

z=40-x-y;

if(10*x+5*y+z==100)

{

j=j+1;

printf("第%d种兑换方法:

1元%d枚,5角%d枚,1角%d枚\n",j,x,y,z);

}

}

printf("共有%d种兑换方法\n",j);

}

思考:

对于任意数额的钱数,有100元、50元、20元、10元、5元、2元、1元、5角、2角、1角、5分、2分、1分等面额,如何找出张钱最少的组合

6-21两个乒乓球队进行比赛,各出三人。

甲队为A,B,C三人,乙队为X,Y,Z三人。

有人打听比赛对阵安排,A说他不和X比,C说他不和X,Z比。

编写程序,找出三队赛手名单。

解:

#include<>

voidmain()

{

chari,j,k;/*i是A的对手;j是B对手;K是C的对手*/

for(i='X';i<='Z';i++)

for(j='X';j<='Z';j++)

if(i!

=j)

for(k='K';k<='Z';k++)

{

if(i!

=k&&j!

=k)

{

if(i!

='X'&&k!

='X'&&k!

='Z')

printf("顺序为:

\nA--%C\tB--%C\n",i,j,k);

}

}

}

运行结果:

顺序为:

A—ZB—XC—Y

思考:

此题为何要用

for(i='X';i<='Z';i++)

for(j='X';j<='Z';j++)

两层的'X'到'Z'的循环

6-22阶梯问题。

有一阶梯,若每步跨2阶,最后余1阶;若每步跨3阶,最后余2阶;若每步跨5阶,最后余4阶;若每步跨6阶,最后余5阶;若每步跨7阶,刚好到达阶梯顶部。

编写程序,求最后的阶梯数。

解:

#include<>

voidmain()

{

inti=7;

do

{

if((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))

break;

i=i+7;

}while

(1);

printf("N=%d\n",i);

}

运行结果:

N=119

思考:

循环结构“do-while

(1);”这种形式具有什么特性此题中的“break;”语句起什么作用

6-23编写程序,用牛顿迭代法求

算法提示:

牛顿迭代公式为

可用两次结果之差的绝对值小于某个很小的数作为循环控制条件,而用此时的结果值作为近似值。

解:

#include<>

#include<>

voidmain()

{

floata,x1,x2;

scanf("%f",&a);

x1=a/2;

x2=(x1+a/x1)/2;

do

{

x1=x2;

x2=(x1+a/x1)/2;

}while(fabs(x1-x2)>1e-5);

printf("%5.2f的平方根=%8.5f\n",a,x2);

}

运行结果:

2

2的平方根=

思考:

迭代算法是一个重要的算法,一般根据起精度要求进行循环控制,此题哪个表达式起精度循环控制作用如果出现迭代不收敛的情况,应如何再进行迭代次数的控制

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1