c语言程序设计循环结构程序设计.docx
《c语言程序设计循环结构程序设计.docx》由会员分享,可在线阅读,更多相关《c语言程序设计循环结构程序设计.docx(40页珍藏版)》请在冰豆网上搜索。
c语言程序设计循环结构程序设计
第一章CH5循环结构程序设计
5.1读程序
1.有如下程序
#include
main()
{intnum=0;
while(num<=2){num++;printf("%d\n",num);}
}
运行结果为:
1
2
3
详见教材循环结构
当循环条件num<=2成立的时候,执行循环体{num++;printf("%d\n",num);}中的语句。
循环初值num为0;
循环条件num<=2成立
第1次循环:
执行num++;即将num中的值加1,执行后num为1;
执行printf("%d\n",num);在屏幕上输出num中的值,即输出1,之后换行
此时num中的值为1,循环条件num<=2成立
第2此循环:
执行num++;即将num中的值加1,执行后num为2;
执行printf("%d\n",num);在屏幕上输出num中的值,即输出2,之后换行
此时num中的值为2,循环条件num<=2成立
第3此循环:
执行num++;即将num中的值加1,执行后num为3;
执行printf("%d\n",num);在屏幕上输出num中的值,即输出3,之后换行
此时num中的值为3,循环条件num<=2不成立,结束循环。
2.有如下程序
#include
main()
{intsum=10,n=1;
while(n<3){sum=sum-n;n++;}
printf(“%d,%d”,n,sum);
}
运行结果为:
3,7
当循环条件n<3成立的时候,执行循环体{sum=sum-n;n++;}中的语句。
循环初值sum为10,n为1;
循环条件n<3成立
第1次循环:
执行sum=sum-n=10-1=9;
执行n++,即将n中的值加1,执行后n为2;
此时n中的值为2,sum中的值为9,循环条件n<3成立,继续执行循环
第2次循环:
执行sum=sum-n=9-2=7;
执行n++,即将n中的值加1,执行后n为3;
输出此时n,sum中的值,即为3,7。
需要注意,在printf(“%d,%d”,n,sum);中要求输出的数据彼此间用逗号间隔,因此结果的两个数据间一定要有逗号
3.有如下程序
#include
main()
{intnum,c;
scanf("%d",&num);
do{c=num%10;printf("%d",c);}while((num/=10)>0);
printf("\n");
}
从键盘输入23,则运行结果为:
32
详见教材循环结构;复合的赋值运算符
do{}while(表达式);
先无条件执行循环体,再判断循环条件。
注意while(表达式)后有分号
定义整型变量num,c;
为num赋一个整型值;
执行{c=num%10;printf("%d",c);}直到循环条件(num/=10)>0不成立;
输出换行
已知为num赋值23
第1次执行循环体
执行c=num%10=23%10=3;
执行printf("%d",c);输出3
判断循环条件num/=10等价于num=num/10;因此num=23/10=2,2大于0,因此循环条件(num/=10)>0成立,继续执行循环体。
执行完第1次循环时,num为2,c为3
第2次执行循环体
执行c=2%10=2;
执行printf("%d",c);再输出2
判断循环条件num=2/10=0,0等于0,因此循环条件(num/=10)>0不成立。
结束循环
4.有如下程序
#include
main()
{ints=0,a=5,n;
scanf("%d",&n);
do{s+=1;a=a-2;}while(a!
=n);
printf("%d,%d\n",s,a);
}
若输入的值1,运行结果为:
2,1
详见教材循环结构;复合的赋值运算符
执行{s+=1;a=a-2;}直到循环条件a!
=n不成立;
已知为n赋值1,s为0,a为5
第1次执行循环体
执行s+=1;等价于s=s+1=0+1
执行a=a-2;a=5-2=3
判断循环条件,3不等于1,因此循环条件a!
=n成立,继续执行循环体。
执行完第1次循环时,s为1,a为3
第2次执行循环体
执行s+=1;等价于s=s+1=1+1=2
执行a=a-2;a=3-2=1
判断循环条件,1等于1,因此循环条件a!
=n不成立,结束循环。
执行完第2次循环时,s为2,a为1
输出此时s,a中的值,结果为2,1
5.有如下程序
#include
main()
{intx,y=0;
for(x=1;x<=10;x++)
{if(y>=10)
break;
y=y+x;
}
printf(“%d%d”,y,x);
}
运行结果为:
105
详见教材for语句
详见教材break,continue语句
for( 表达式1;表达式2;表达式3)
{
}
(1)先求解表达式1
(2)求解表达式2,若其值为真,执行循环体,然后执行(3).若为假,则结束循环,转到(5)
(3)求解表达式3
(4)转回上面
(2)继续执行
(5)循环结束,执行for语句下面的一个语句
break ,跳出循环体;continue,结束本次循环(第i次循环),继续执行下一次循环(第i+1次循环)
此题表达式1为x=1,表达式2(循环条件)为x<=10,表达式3为x++
初值x为1,y为0,循环条件(即表达式2)x<=10成立,进入循环体
第1次循环
执行if语句。
0小于10,if语句的条件表达式不成立,不执行break;
执行y=y+x;y=0+1=1
转向表达式3,执行x++,x=x+1=1+1=2。
循环条件x<=10成立,进入第2次循环
第2次循环
执行if语句。
1小于10,if语句的条件表达式不成立,不执行break;
执行y=y+x;y=1+2=3
转向表达式3,执行x++,x=x+1=2+1=3。
循环条件x<=10成立,进入第3次循环
第3次循环
执行if语句。
3小于10,if语句的条件表达式不成立,不执行break;
执行y=y+x;y=3+3=6
转向表达式3,执行x++,x=x+1=3+1=4。
循环条件x<=10成立,进入第4次循环
第4次循环
执行if语句。
6小于10,if语句的条件表达式不成立,不执行break;
执行y=y+x;y=6+4=10
转向表达式3,执行x++,x=x+1=4+1=5。
循环条件x<=10成立,进入第5次循环
第5次循环
执行if语句。
10等于10,if语句的条件表达式成立,执行break,跳出循环。
从break跳出至for语句的下一条语句。
执行printf(“%d%d”,y,x);
输出当前的y与x.结果为105
6.有如下程序
#include
main()
{inty=9;
for(;y>0;y--)
if(y%3==0)
{printf(%d”,--y);
}
}
运行结果为:
852
详见教材,自增自减符号
此题表达式1被省略,表达式2(循环条件)为y>0,表达式3为y--
初值y为9,循环条件(即表达式2)y>0成立,进入循环体
第1次循环
执行if语句。
9%3==0,if语句的条件表达式成立,执行printf(%d”,--y),即y先自减1变为8,然后在输出,因此屏幕上输出8
转向表达式3,执行y--,y=y-1=8-1=7。
循环条件y>0成立,进入第2次循环
第2次循环
执行if语句。
7%3不为0,if语句的条件表达式不成立,不执行printf(%d”,--y)
转向表达式3,执行y--,y=y-1=7-1=6。
循环条件y>0成立,进入第3次循环
第3次循环
执行if语句。
6%3==0,if语句的条件表达式成立,执行printf(%d”,--y),即y先自减1变为5,然后在输出,因此屏幕上输出5
转向表达式3,执行y--,y=y-1=5-1=4。
循环条件y>0成立,进入第4次循环
第4次循环
执行if语句。
4%3不为0,if语句的条件表达式不成立,不执行printf(%d”,--y)
转向表达式3,执行y--,y=4-1=3。
循环条件y>0成立,进入第5次循环
第5次循环
执行if语句。
3%3==0,if语句的条件表达式成立,执行printf(%d”,--y),即y先自减1变为2,然后在输出,因此屏幕上输出2
转向表达式3,执行y--,y=y-1=2-1=1。
循环条件y>0成立,进入第5次循环
第6次循环
执行if语句。
1%3不为0,if语句的条件表达式不成立,不执行printf(%d”,--y)
转向表达式3,执行y--,y=1-1=0。
循环条件y>0不成立,循环结束。
7.有如下程序
#include
main()
{inti,sum=0;i=1;
do{sum=sum+i;i++;}while(i<=10);
printf(“%d”,sum);
}
运行结果为:
55
8.有如下程序
#include
#defineN4
main()
{inti;
intx1=1,x2=2;
printf("\n");
for(i=1;i<=N;i++)
{printf("%4d%4d",x1,x2);
if(i%2==0)
printf("\n");
x1=x1+x2;
x2=x2+x1;
}
}
运行结果为:
1235
8132134
此题首先为整型变量赋初值x1=1,x2=2
表达式1为i=1,表达式2(循环条件)为i<=N即i<=4,表达式3为i++
循环变量初值i为1,循环条件(即表达式2)i<=4成立,进入第1次循环
第1次循环
执行printf("%4d%4d",x1,x2);因此屏幕上输出12
执行if语句。
1%2不为0,if语句的条件表达式不成立,不执行printf("\n");
执行x1=x1+x2=1+2=3;此时x1中的值已变为3
执行x2=x2+x1=2+3=5。
转向表达式3,执行i++,i为2。
循环条件i<=4成立,进入第2次循环
第2次循环
执行printf("%4d%4d",x1,x2);因此屏幕上输出35
执行if语句。
2%2==0,if语句的条件表达式成立,执行printf("\n");换行
执行x1=x1+x2=3+5=8;此时x1中的值已变为8
执行x2=x2+x1=5+8=13。
转向表达式3,执行i++,i为3。
循环条件i<=4成立,进入第3次循环
第3次循环
执行printf("%4d%4d",x1,x2);因此屏幕上输出813
执行if语句。
3%2不为0,if语句的条件表达式不成立,不执行printf("\n");
执行x1=x1+x2=8+13=21;此时x1中的值已变为21
执行x2=x2+x1=21+13=34。
转向表达式3,执行i++,i为4。
循环条件i<=4成立,进入第4次循环
第2次循环
执行printf("%4d%4d",x1,x2);因此屏幕上输出2134
执行if语句。
4%2==0,if语句的条件表达式成立,执行printf("\n");换行
执行x1=x1+x2=21+34=55;此时x1中的值已变为55
执行x2=x2+x1=34+55=89。
转向表达式3,执行i++,i为5。
循环条件i<=4不成立,结束循环
9.有如下程序
#include
main()
{intx,y;
for(x=30,y=0;x>=10,y<10;x--,y++)
x/=2,y+=2;
printf(“x=%d,y=%d\n”,x,y);
}
运行结果为:
x=0,y=12
10.有如下程序
#include
#defineN4
main()
{inti,j;
for(i=1;i<=N;i++)
{for(j=1;j
printf("");
printf("*");
printf("\n");
}}
运行结果为:
*
*
*
*
详见教材符号常量
用宏处理指令定义符号常量N为4,在编译过程中,遇到N即视为整数4。
外层for循环,表达式1为i=1,表达式2(循环条件)为i<=N,表达式3为i++
内层for循环,表达式1为j=1,表达式2(循环条件)为j
首先计算外层循环的表达式1,i为1,使得循环条件i<=4成立,进入外层for循环体
外层for循环第1次此时i为1
内层循环j=1,使得循环条件j
执行printf("*");
执行printf("\n");换行
至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为2.使得循环条件i<=4
成立,再次进入外层for循环体
外层for循环第2次此时i为2
内层循环j=1,使得循环条件j
第1次执行内层循环体printf("");
执行内层循环表达式3,j++为2,j
执行printf("*");
执行printf("\n");换行
至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为3.使得循环条件i<=4
成立,进入外层for循环体
外层for循环第3次此时i为3
内层循环j=1,使得循环条件j
第1次执行内层循环体printf("");
执行内层循环表达式3,j++为2,j
第2次执行内层循环体printf("");
执行内层循环表达式3,j++为3,j
执行printf("*");
执行printf("\n");换行
至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为4.使得循环条件i<=4
成立,进入外层for循环体
外层for循环第4次此时i为4
内层循环j=1,使得循环条件j
第1次执行内层循环体printf("");
执行内层循环表达式3,j++为2,j
第2次执行内层循环体printf("");
执行内层循环表达式3,j++为3,j
第3次执行内层循环体printf("");
执行内层循环表达式3,j++为4,j
执行printf("*");
执行printf("\n");换行
至此外层循环体执行完,计算外层循环的表达式3,i++,此时i为5.使得循环条件i<=4
不成立,跳出外层for循环体
11.有如下程序
main()
{
inti;
for(i=1;i<40;i++)
{
if(i++%5==0)
if(++i%8==0)
printf("%d",i);
}
printf("\n");
}
执行后的输出结果是___C___。
A、5B、24C、32D、40
12.请读程序:
#include
#include
main()
{floatx,y,z;
scanf("%f%f",&x,&y);
z=x/y;
while(z)
{if(fabs(z)>1.0)
{x=y;y=z;z=x/y;}
elsebreak;
}
printf("%f\n",y);
}
若运行时从键盘上输入3.62.4(表示回车),则输出的结果是___B___。
A、1.500000B、1.600000C、2.000000D、2.400000
13.有以下程序
main()
{
intk=4,n=0;
for(;n{
n++;
if(n%3!
=0)continue;
k--;
}
printf("%d,%d\n",k,n);
}
程序运行后的输出结果是___C___。
A、1,1B、2,2C、3,3D、4,4
14.有如下程序
main()
{
intx=23;
do
{
printf("%d",x--);
}
while(!
x);
}
该程序的执行结果是__B____。
A、321B、23C、不输出任何内容D、陷入死循环
15.有以下程序
main()
{ints=0,a=1,n;
scanf("%d",&n);
do
{
s+=1;
a=a-2;
}
while(a!
=n);
printf("%d\n",s);
}
若要使程序的输出值为2,则应该从健盘给n输入的值是___B___。
A、-1B、-3C、-5D、0
16.有以下程序段
intn,t=1,s=0;
scanf("%d",&n);
do
{
s=s+t;
t=t-2;
}
while(t!
=n);
为使此程序不陷入死循环,从键盘输入的数据应该是___D___。
A、任意正奇数B、任意负偶数C、任意正偶数D、任意负奇数
17.有以下程序
main()
{inti=0,s=0;
do
{
if(i%2){i++;continue;}
i++;
s+=i;
}
while(i<7);
printf("%d\n",s);
}
执行后输出结果是__A____。
A、16B、12C、28D、21
18.下面的程序的运行结果是___B___。
main()
{
intx=3;
do
{
printf("%d\n",x-=2);
}
while(!
(--x));
}
A、输出的是1B、输出的是1和-2C、输出的是3和0D、是死循环
19.以下叙述正确的是___D___。
A、do-while语句构成的循环不能用其它语句构成的循环来代替
B、do-while语句构成的循环只能用break语句退出
C、用do-while语句构成的循环,在while后的表达式为非零时结束循环
D、用do-while语句构成的循环,在while后的表达式为零时结束循环
20.以下程序的输出结果是___D___。
main()
{intx=10,y=10,i;
for(i=0;x>8;y=++i)
printf("%d%d",x--,y);
}
A、10192B、9876C、10990D、101091
21.以下程序的输出结果是___B___。
main()
{inti,k,a[10],p[3];
k=5;
for(i=0;i<10;i++)a[i]=i;
for(i=0;i<3;i++)p[i]=a[i*(i+1)];
for(i=0;i<3;i++)k+=p[i]*2;
printf("%d\n",k);
}
A、20B、21C、22D、23
22.设变量已正确定义,则以下能正确计算f=n!
的程序段是___D___。
A、f=0;for(i=1;i<=n;i++)f*i;
B、f=1;for(i=1;iC、f=1;for(i=n;i>1;i++)f*i;
D、f=1;for(i=n;i>=2;i--)f*=i;
23.若有如下程序段,其中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;
24.有以下程序
main()
{
inti,s=0;
for(i=1;i<10;i+=2)s+=i+1;
printf("%d\n",s);
}
程序执行后的输出结果是___D___。
A、自然数1~9的累加和B、自然数1~10的累加和
C、自然数1~9中奇数之和D、自然数1~10中偶数之和
25.有如下程序
main()
{inti,sum;
for(i=1;i<=3;sum++)sum+=i;
printf("%d\n",sum);
}
该程序的执行结果是___C___。
A、6B、3C、死循环D、0
26.若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是___A___。
for(i=5;i;i--)
for(j=0;j<4;j++){……}
A、20B、25C、24D、30
27.有以下程序
main()
{
intk=5;
while(--k)printf("%d",k-=3);
printf("\n");
}
执行后的输出结果是___A___。
A、1B、2C、4D、死循环
28.以下程序中,while循环的循环次数是___D___。
main()
{inti=0;
while(i<10)
{
if(i<1)continue;
if(i==5)break;
i++;
}
……
}
A、1B、10C、6D、死循环,不能确定次数
29.t为int类型,进入下面的循环之前,t的值为0
while(t=1)
{……}
则以下叙述中正确的是___B___。
A、循环控制表达式的值为0B、循环控制表达式的值为1
C、循环控制表达式不合法D、以上说法都不对
30.有如下程序
main()
{intn=9;
while(n>6)
{n--;
printf("%d",n);
}
}
该程序段的输出结果是___B___。
A、987B、876C、8765D、9876
31.有以下程序
main()
{intp[7]={11,13,14,15,16,17,18};inti=0,k=0;
while(i<7&&p[i]%2)
{
k=k+p[i];
i++;
}
printf("%d\n",k);
}
执行后输出结果是___D___。
A、58B、56C、45D、24
32.要求通过while循环不断读入字符,当读入字母N时结束循环。
若变量已正确定义,以下正确的程序段是___A___。
A、while((ch=getchar())!
='N'printf("%c",ch);
B、while(ch=getchar()!
='N'printf("%c",ch);
C、while(ch=getchar())=='N'printf("%c",ch);
D、while((ch=getchar())=='N'printf("%c",ch);
33.