admin 管理员组文章数量: 1086019
2024年4月27日发(作者:运城网站制作公司)
第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,运行结果是: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
#include
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-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");
else printf("%d is prime number!n",m);
解答:
不能代替,因为只用一个数来除不足以判断该数是否是素数。
【练习4-6】猜数字游戏:先输入2个不超过100的正整数,分别是被猜数mynumber
和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进行
比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系,最多允许猜n次。如果1
次就猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果
超过3次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,
则提示“Game Over”;如果在到达n次之前,用户输入了一个负数,也输出“Game Over”,
并结束程序。试编写相应程序。
解答:
#include
int main(void)
{
int mynumber,n,yournumber,i;
printf("Input mynumber:");
scanf("%d",&mynumber);
printf("Input n:");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("Input yournumber:");
scanf("%d",&yournumber);
if(i==1&&yournumber==mynumber){
printf("Bingo!");break; }
if((i==2||i==3)&&yournumber==mynumber){
printf("Lucky you!");break;}
if((i>3&&i<=n)&&yournumber==mynumber){
printf("Good Guess!");break;}
if((i==n&&mynumber!=yournumber)||mynumber<0||yournumber<0){
printf("Game Over!");break;}
}
return 0;
}
【练习 4-7】求e的值:输入 1 个正整数 n,计算下式求出 e 的值(保留 2 位小
数),要求使用嵌套循环。试编写相应程序。
e =1 + 1/1!+1/ 2!+1/ 3!+…+1/n!
解答:
#include
int 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(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,
表示不再输入任何成绩,运行结果是什么?如何修改程序以应对这种情况?
解答:
当输入数据个数 n=0 时,由于在 for 循环外首先得输入一个成绩,故程序仍将等待
输入第一个人的成绩,这与输入个数 n=0 矛盾,可修改如下:
#include
int main(void)
{
int i, mark, max, n;
printf("Enter n: ");
scanf ("%d", &n);
if (n>0) {
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 循环,程序运行结果就是输出所输入
的负数。
【练习 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 < n; i++){
scanf("%d", &x);
if (min > x)
min = x;
}
printf("min = %dn", min);
return 0;
}
【练习 4-11】统计素数并求和:输入2个正整数m和n(1≤m≤n≤500),统计并
输出m和n之间素数的个数以及这些素数的和。素数就是只能被 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;i<=j;i++)
if(m%i==0)
break;
if(i>j&&m!=1){
sum=sum+m;
count++;}
}
printf("count=%dnsum=%.0lf",count,sum);
return 0;
}
习题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;
6.以下程序段的输出结果是
int main(void)
{
int num=0,s=0;
while(num<=2){
num++;
s+=num;
}
。
C.s=s+c;
B 。
.s=b+c;
D
printf("%dn",s);
return 0;
}
A.10 B.6 C.3
7.运行以下程序后,如果从键盘上输入 65
int main(void)
{
int m, n;
printf("Enter m,n;");
scanf("%d%d", &m,&n):
while (m!=n)
{ while (m>n) m=m-n;
while (n>m) n=n-m;
D.1
回车>,则输出结果为C 。
14<
}
printf("m=%dn",m);
return 0;
}
A.m=3 B.m=2
8.下列程序段的输出结果是
int main(viod)
{
int i;
for(int i=1;i<6;i++){
if(i%2!=0){
printf("#");
continue;
C.m=1
A 。
D.m=0
}
printf("*");
}
printf("n");
return 0;
}
A.#*#*# B.##### C.***** D.*#*#*
二、填空题
1.若 s=0,执行循环语句"for(i=1; i<=10; i=i+3) s=s+i; "后,i 的值为
2.下列程序段的输出结果是 ** 。
int x=2;
do {
printf(“*”);
。 13
x--;
} while (!x==0);
3.下列程序段的功能是计算: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.以下程序的输出结果是
int main(void)
{ int num=0;
while(num<6) {
12 。
num++;
if(num==3) break;
printf("%d,",num); }
return 0;
}
5.阅读下列程序并回答问题。
int main(void)
{ int i, j, k=0, m=0;
for(i=0; i<2; i++)
{
;
for(j=0; j<3; j++)
k++;
/*第 5 行*/
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<=6;ii++){
c=getchar( );
if (c>='a'&&c<=’u’) c=c+5;
else if (c>='v'&&c<='z') c='a'+c-'v';
putchar(c);
}
return 0;
}
三.程序设计题
1.求奇数和:输入一批正整数(以零或负数为结束标志),求其中的奇数和。试编写相
应程序。
解答:
#include
int main(void)
{
int x, sum;
printf("Input integers: ");
scanf("%d", &x);
sum = 0;
while(x>0){
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=x+x²/2!+x³/3!+x
4
/4!+…
解答:
#include
#include
double 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++)
result=result*i;
return result;
}
3.求序列和:输入一个正整数 n,输出2/1+3/2+5/3+8/5 +…的前 n 项之和,保留
2 位小数。该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的
分子。试编写相应程序。
解答:
#include
int 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;
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+aa…a(n个a)之和。例如,输
入2和3,输出246(2+22+222)。试编写相应程序。
解答:
#include
int 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;i++){
temp=temp*10+a;
sum=sum+temp;
}
printf("sum=%.0lf",sum);
return 0;
}
5.换硬币。将一笔零钱(大于8分,小于1元,精确到分)换成5分、2分和1分的
硬币,每种硬币至少有一枚。输入金额,问有哪几种换法?针对每一种换法,输出各种面
额硬币的数量和硬币的总数量。试编写相应程序。
解答:
#include
int main(void)
{
int money,money1,money2,sum;
printf("Input money:");
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=%dnsum=%dn",money1,money2,s
um);
else
printf("money5=1,money2=%d,money1=%dnsum=%dn",money2,money1,s
um);
}
return 0;
}
6.输出水仙花数。输入一个正整数n(3≤n≤7)输出所有n位水仙花数。水仙花数
是指一个n位正整数,它各位数字的n次幂之和等于它本身。例如 153 的各位数字的立
方和是 :1³+5³+3³=153。试编写相应程序。
解答:
#include
#include
int main(void)
{
int 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;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(m≤1000,n≤1000),求 其最大公约数和最小公倍数。试编写相应程序。 解答: #include int main(void) { int m,n,j,k; do{ printf("Input m:"); scanf("%d",&m); printf("Input n:"); scanf("%d",&n); }while(m<0||n<0); 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位小数。试编写相应程序。 解答: #include int main(void) { double distance, height; int i, n; printf("Input height:"); scanf("%lf",&height); printf("Input n:"); scanf("%d",&n); if(n == 0) distance = 0; else { for(int i = 1; i <= n; i++){ height = height/2; distance += 3*height; } } printf("第%d次落地时,共经过距离为%0.1lf.n", n, distance); printf("第%d次落地后的反弹高度为%0.1lf.n", n, height); return 0; } 9.打菱形星号“*”图案。输入一个正整数n(n为奇数),打印一个高度为n的“*” 菱形图案。例如,当n为7时,打印出以下图案。试编写相应程序。 * * * * * * * * * * * * * * * * * * * * * * * * * 解答: #include int main(void) { int i,j,n; printf("Input n:"); 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=1;i<=n-2;i=i+2){ for(j=1;j<=i+1;j++) printf(" "); for(j=1;j<=n-i-1;j++) printf("* "); putchar('n'); } return 0; } 或 #include #include int main(void) { int i,j,n; printf("Input n:"); scanf("%d",&n); for(i=1;i<=n;i++){ for(j=1;j<=fabs(n+1-2*i)/2;j++) printf(" "); for(j=1;j<=n-fabs(n+1-2*i);j++) printf("* "); putchar('n'); } return 0; } 10.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃 了一个;第二天早上将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天 剩下的一半加一个。到第n天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多 少桃子?试编写相应程序。(提示:采取逆向思维的方法,从后往前推断。) 解答: #include int main(void) { int i, peach; peach = 1; for(i = 1; i < n; i++){ peach = 2 * peach + 1; } printf("%dn", peach); return 0; } 11. 兔子繁衍问题。一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到 第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少 需要繁衍到第几个月时兔子总数才可以达到n对?输入一个不超过10000的正整数n,输 出兔子总数达到n最少需要的月数。试编写相应程序。 解答: #include int main(void) { int n,mouth,x1=1,x2=1,x; printf("Input n:"); scanf("%d",&n); mouth=1; x=0; while(x<=n){ x=x1+x2; x1=x2; x2=x; mouth++; } printf("mouths=%d",mouth); return 0; }
版权声明:本文标题:C语言程序设计(第3版)何钦铭-颜-晖-第4章-循环结构 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714182915a668693.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论