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;

}


本文标签: 输入 循环 语句 程序