C语言程序设计第3版何钦铭颜晖第4章循环结构Word文档格式.docx
《C语言程序设计第3版何钦铭颜晖第4章循环结构Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭颜晖第4章循环结构Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
![C语言程序设计第3版何钦铭颜晖第4章循环结构Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/1/c3d11a6f-0d85-493b-8422-ee0922e06a7f/c3d11a6f-0d85-493b-8422-ee0922e06a7f1.gif)
【练习4-5】例4-4程序中的第9~15行可以用以下for语句替代吗?
for(i=2;
i<
=m/2;
i++)
if(m%i==0)printf("
No!
\n"
);
elseprintf("
%disprimenumber!
m);
不能代替,因为只用一个数来除缺乏以判断该数是否是素数。
【练习4-6】猜数字游戏:
先输入2个不超过100的正整数,分别是被猜数mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进展比较,假设相等,显示猜中,;
假设不等,显示与被猜数的大小关系,最多允许猜n次。
如果1次就猜出该数,提示“Bingo!
〞;
如果3次以内猜到该数,那么提示“LuckyYou!
〞;
如果超过3次但不超过n次猜到该数,那么提示“GoodGuess!
如果超过n次都没有猜到,那么提示“GameOver〞;
如果在到达n次之前,用户输入了一个负数,也输出“GameOver〞,并完毕程序。
#include<
intmynumber,n,yournumber,i;
printf("
Inputmynumber:
"
scanf("
%d"
&
mynumber);
Inputn:
n);
for(i=1;
i<
=n;
i++){
Inputyournumber:
yournumber);
if(i==1&
&
yournumber==mynumber){
Bingo!
break;
if((i==2||i==3)&
Luckyyou!
if((i>
3&
=n)&
GoodGuess!
if((i==n&
mynumber!
=yournumber)||mynumber<
0||yournumber<
0){
printf("
GameOver!
}
return0;
}
【练习4-7】求e的值:
输入1个正整数n,计算下式求出e的值〔保存2位小数〕,要求使用嵌套循环。
e=1+1/1!
+1/2!
+1/3!
+…+1/n!
>
inti,j,n;
doublee,t;
printf("
"
scanf("
&
e=1;
for(i=1;
=n;
i++){
t=1;
for(j=1;
j<
=i;
j++)
t=t*j;
e=e+1.0/t;
e=%0.2f\n"
e);
return0;
【练习4-8】运行例4-8的源程序1时,如果先输入0,即输入数据个数n=0,表示不再输入任何成绩,运行结果是什么?
如何修改程序以应对这种情况?
当输入数据个数n=0时,由于在for循环外首先得输入一个成绩,故程序仍将等待输入第一个人的成绩,这与输入个数n=0矛盾,可修改如下:
{
inti,mark,max,n;
Entern:
scanf("
if(n>
0){
Enter%dmarks:
n);
mark);
/*读入第一个成绩*/
max=mark;
/*假设第一个成绩是最高分*/
n;
i++){
if(max<
mark)
}
Max=%d\n"
max);
【练习4-9】运行例4-8的源程序2时,如果输入的第一个数就是负数,表示不再输入任何成绩,运行结果是什么?
当输入的第一个数就是负数时,将不执行while循环,程序运行结果就是输出所输入的负数。
【练习4-10】找出最小的值:
输入一个正整数n,再输入n个整数,输出最小值。
inti,min,n,x;
inputrn:
inputnumbers:
x);
min=x;
if(min>
x)
min=x;
min=%d\n"
min);
【练习4-11】统计素数并求和:
输入2个正整数m和n〔1≤m≤n≤500〕,统计并输出m和n之间素数的个数以及这些素数的和。
素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
inti,m,n,j,count;
doublesum;
Enterm:
m);
count=0;
sum=0;
for(;
m<
m++){
j=sqrt(m);
for(i=2;
=j;
i++)
if(m%i==0)
break;
if(i>
j&
m!
=1){
sum=sum+m;
count++;
count=%d\nsum=%.0lf"
count,sum);
习题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(!
循环时,以下说法正确的选项是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。
intnum=0,s=0;
while(num<
=2){
num++;
s+=num;
%d\n"
s);
A.10B.6C.3D.1
7.运行以下程序后,如果从键盘上输入6514<
回车>
,那么输出结果为C。
intm,n;
Enterm,n;
%d%d"
m,&
n):
while(m!
=n)
{while(m>
n)m=m-n;
while(n>
m)n=n-m;
printf("
m=%d\n"
return0;
A.m=3B.m=2C.m=1D.m=0
8.以下程序段的输出结果是A。
intmain(viod)
inti;
for(inti=1;
6;
if(i%2!
=0){
#"
continue;
*"
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;
=5;
i++){
t=i+_____;
s=s+t;
s=%d\n"
4.以下程序的输出结果是12。
{intnum=0;
while(num<
6){
num++;
if(num==3)break;
%d,"
num);
5.阅读以下程序并答复以下问题。
{inti,j,k=0,m=0;
for(i=0;
2;
{
;
/*第5行*/
for(j=0;
j<
3;
j++)
k++;
m++;
/*第9行*/
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行改为"
,程序的输出是k=3,m=6。
6.以下程序运行时输入62pay!
,那么结果是62ufd!
。
{charc;
for(i=1;
=6;
ii++){
c=getchar();
if(c>
='
a'
c<
=’u’)c=c+5;
elseif(c>
v'
z'
)c='
+c-'
putchar(c);
三.程序设计题
1.求奇数和:
输入一批正整数(以零或负数为完毕标志),求其中的奇数和。
intx,sum;
Inputintegers:
sum=0;
while(x>
if(x%2!
=0)
sum=sum+x;
Thesumoftheoddnumbersis%d\n"
sum);
2.展开式求和:
输入1个实数x,计算并输出下式的值,直到最后一项的绝对值小于0.00001,计算结果保存2位小数。
要求定义和调用函数fact(n)计算n的阶乘,可以调用pow()函数求幂。
s=x+x²
/2!
+x³
/3!
+x4/4!
+…
doublefact(intn);
inti;
doublex,s,item;
Inputx:
%lf"
s=0;
item=1.0;
i=1;
while(fabs(item)>
=1e-5){
item=pow(x,i)/fact(i);
s=s+item;
i++;
s=%.2lf"
doublefact(intn)
doubleresult;
for(result=1,i=1;
result=result*i;
returnresult;
3.求序列和:
输入一个正整数n,输出2/1+3/2+5/3+8/5+…的前n项之和,保存2位小数。
该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
intn,i,s1=2,s2=3,s,p1=1,p2=2,p;
doublesum,item;
if(n>
=3){
=n-2;
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;
sum=%.2lf\n"
sum);
}
4.求序列和:
输入2个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。
例如,输入2和3,输出246(2+22+222)。
inta,n,i;
doublesum,temp;
Inputa,n:
a,&
sum=temp=0;
temp=temp*10+a;
sum=sum+temp;
sum=%.0lf"
5.换硬币。
将一笔零钱〔大于8分,小于1元,准确到分)换成5分、2分和1分的硬币,每种硬币至少有一枚。
输入金额,问有哪几种换法?
针对每一种换法,输出各种面额硬币的数量和硬币的总数量。
intmoney,money1,money2,sum;
Inputmoney:
money);
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)
money5=1,money1=%d,money2=%d\nsum=%d\n"
money1,money2,sum);
else
money5=1,money2=%d,money1=%d\nsum=%d\n"
money2,money1,sum);
6.输出水仙花数。
输入一个正整数n〔3≤n≤7〕输出所有n位水仙花数。
水仙花数是指一个n位正整数,它各位数字的n次幂之和等于它本身。
例如153的各位数字的立方和是:
1³
+5³
+3³
=153。
intn,i,t,m,sum,j,k;
for(j=0,i=1;
j=j*10+9;
for(k=1,i=1;
n;
k=k*10;
k<
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)
t);
7.求最大公约数和最小公倍数。
输入两个正整数m和n〔m≤1000,n≤1000〕,求其最大公约数和最小公倍数。
intm,n,j,k;
do{
Inputm:
scanf("
}while(m<
0||n<
0);
j=m;
while(j%n!
=0)
j=j+m;
k=(m*n)/j;
最小公倍数是%d,最大公约数是%d\n"
j,k);
8.高空坠球。
皮球从height〔米〕高度自由落下,触地后反弹到原高度的一半,再落下,再反弹……如此反复。
问皮球在第n次落地时,在空中一共经过多少距离?
第n次反弹的高度是多少?
输出保存1位小数。
doubledistance,height;
inti,n;
Inputheight:
scanf("
height);
if(n==0)
distance=0;
else
for(inti=1;
height=height/2;
distance+=3*height;
第%d次落地时,共经过距离为%0.1lf.\n"
n,distance);
第%d次落