c语言循环结构.docx
《c语言循环结构.docx》由会员分享,可在线阅读,更多相关《c语言循环结构.docx(30页珍藏版)》请在冰点文库上搜索。
c语言循环结构
实验八循环结构
1.下面是一个计算e的近似值(使误差小于给定的δ)的程序。
main()
{
doublee=1.0,x=1.0,y,detax;
inti=1;
printf("\npleaseinputenteradata:
");
scanf("%lf",&detax);
y=1/x;
while(y>=detax)
{
x=x*I;//未定义变量I
y=1/x;
e=e+y;
++i;
}
printf("%12.10lf",e);
}
2.实验步骤
(1)阅读上面的程序,写出程序所依据的计算公式。
(2)当输入的detax各是什么值时,能分别使程序按下面的要求运行:
不进入循环;
只循环一次;
只循环两次;
进入死循环(程序将永远循环下去)。
为了能知道程序循环了多少次,应该在程序中增加一条什么样的语句?
(3)原程序中while语句中的y>=detax,分别换成y>detax,y=detax,y(4)把原程序中while语句之前的y=1/x语句去掉,观察程序的运行将会发生什么样的变化。
假如不知道机器内的程序实际上是怎么写的,输入什么样的detax就能测试出少了上述这条语句。
(5)若把原程序中的++i换成i++,观察程序的运行发生了什么变化?
(6)把原程序中的while结构改写成do—while结构,再分别按上述的
(2)、(3)两步进行实验。
3.验证程序输出结果
(1)#include
main()
{intm,n,sign,t;
scanf("%d%d",&m,&n);
while(m*n)
{
if(m>=0&&n>=0||m<=0&&n<=0)sign=0;
elsesign=1;
m=m>0?
m:
-m;n=n>0?
n:
-n;
t=0;
while(n--)t+=m;
printf("\nTheresultis:
");
if(sign)printf("-");
printf("%d\n",t);
scanf("%d%d",&m,&n);
}
}
(2)main()
{intk=1;
while(k<=20)
if(++k%4!
=2)continue;
elseprintf(‘%d”,k);
printf(“\n”);
}
(3)main()
{intn=4;
while(n--)printf("%d",--n);
}
4.输入两个正整数分别赋给m和n,求他们的最大公约数和最小公倍数。
5.北京市体育彩票采用整数1、2、3、……、36表示36种体育运动,一张彩票可选择7种运动。
编写程序,选择一张彩票的号码,使得这张彩票的7个号码之和是105且相邻两个号码之差按顺序依次是1、2、3、4、5、6。
如果第一个号码是1,则后续号码应是2、4、7、11、16、22。
6.编写程序实现输入整数n,输出如下所示由数字组成的菱形。
(图中n=5)
1
121
12321
1234321
123454321
1234321
12321
121
1
7.(选做题)已知2001年1月1日是星期一,编写程序,在屏幕上输出2000年的年历。
关于闰年的计算方法:
如果某年的年号能被400除尽,或能被4除尽但不能被100除尽,则这一年就是闰年。
8.运行程序,分析并观察运行结果
main()
{
inti;
clrscr();
for(i=1;i<=20;i++)
if(i%4==0)printf(“%d\n”,i);
}
9.验证程序输出结果
(1)main()
{inti;
for(i=1;i<6;i++)
{if(i%2){printf("#");continue;}
printf("*");
}
printf("\n");
}
(2)main()
{intx,i;
for(i=1;i<=100;i++)
{x=i;
if(++x%2==0)/*当x==28的时候,这句等价于if(29%2==0)吗?
*/
if(++x%3==0)/*当x==70的时候,这句等价于if(72%2==0)吗?
*/
if(++x%7==0)
printf("%d",x);
}
}
(3)main()
{inta=1,b;
for(b=1;b<=10;b++)
{if(a>=8)break;
f(a%2==1){a+=5;continue;}
a-=3;
}
printf("%d\n",b);
10.下列程序计算SUM的值。
调试该程序,使之能正确地计算SUM。
写出调试过程。
计算公式如下:
SUM=1+2-3+4-5+……-n
main()
{intt,s,i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
t=1/i;
s=s+t;
printf("s=%f\n",s);
}
在调试过程中,用单步执行的方法观察变量s和t的值的变化,找到程序中存在的问题,加以改正。
11.下面程序的功能是计算n!
。
main()
{inti,n,s=1;
printf("Pleaseentern:
");
scanf("%d",&n);
for(i=1;i<=n;i++)
s=s*i;
printf("%d!
=%d",n,s);
}
首次运行先输入n=4,输出结果为4!
=24,这时正确的。
为了检验程序的正确性,再输入n=10,输出为10!
=24320,这显然是错误的。
为了找到程序的错误,可以通过单步执行来观察变量的变化。
分析产生这种现象的原因,把程序改正过来,再用n=20进行实验,分析所得到的结果。
12.完善程序:
打印乘法表。
main()
{
intI,j;
clrscr();
for(______________;I<=9;I++)
{for(j=1;___________;j++)
printf(“____________=%2d”,I,j,I*j);
______________________;
}
}
运行结果:
1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81
13.下面是一个用以计算和的C程序。
#include
voidmain()
{
inti,j;
longsum=0;
for(i=1,i<=20,i++)//查查错误
for(j=1;j<=3;j++)
sum=sum+(i+1)*(i+1)*(j+2);
printf("sumis:
%d\n",sum);
}
实验步骤
(1)将上述程序中的和分别做什么样修改,能使程序按如下要求运行:
.不循环;
.外循环1次,不进入内循环;
.外循环,内循环各1次;
.外循环1次,内循环2次;
.外循环2次,内循环1次;
.外循环19次,内循环3次;
.外循环20次,内循环2次;
.外循环21次,内循环3次。
注:
控制循环次数可通过控制i,j的值以及循环终止条件来进行。
(2)试修改程序,以便能知道控制表达式
i=1;j<=20;i++
和
j=1;j<3;j+=
各执行了多少次?
(3)内循环与外循环的控制表达式进行对换,观察程序的执行结果有无变化,并且观察对
换后的外循环与内循环控制表达式执行的总次数有无变化?
(4)将(3)中程序写为
#include
main()
{
inti,j,k;
longsum=0;
for(j=1;j<=3;j++)
{
k=j+2;
for(i=1.i<=20.i++)//有错误
sum=sum+(i+1)*(i+1)**k;//有错误
}
printf("sumis:
%d\n",sum);
}
观察程序的执行结果有无变化?
(5)将(3)中程序改写为
#include
main()
{
intI,j,m,n;
longsum=0;
for(j=1;j<=3;j++)
{
m=j+2;
for(I=1;j<=20;I++)//循环会终止吗,为什么,注意观察j的变化。
{
n=I+1;
sum=sum+m*m*n;
}
}
printf("sumis:
%d\n",sum);
}
观察程序的执行结果有无变化?
(6)在(5)的程序中,若将外循环控制表达式分别做如下修改:
.j=1;j<3;j++
.j=1;j=3;j++
.j=1;j>=3;j++
.j=1;j>3;j++
.j=1;j<=3;j--
.j=1;j>3;j--
.j=1;j<3;j++
.j=0;j<=3;j+=1
.j=0;j<3;j++
j=1;j<=3;j++j=1;j<3;++j
观察程序的执行结果有无变化?
思考如何退出死循环。
一)选择题
1.设有程序段
intk=10;
while(k=0)k=k-1;
这下面描述中正确的是_________.
a)while循环执行10次 b)循环是无限循环
c)循环体语句以此也不执行 d)循环体语句执行一次
2.语句while(!
E);中的表达式!
E等价于________.
a)E==0 b)E!
=1 c)E!
=0 d)E==1
3.下面程序段的运行结果是__________.
intn=0;
while(n++<=2);printf("%d",n);
a)2 b)3 c)4 d)有语法错
4.下面程序的运行结果是____.
#include
main()
{
intnum=0;
while(num<=2)
{
num++;
printf("%d\n",num);
}
}
a)1 b)1 c)1 d)1
2 2 2
3 3
4
5.以下程序段________.
x=-1;
do{
x=x*x;
}while(!
x);
a)是死循环 b)循环执行二次
c)循环执行一次 d)有语法错误
6.若有如下语句
intx=3;
do{printf(""%d\n",x-=2);}while(!
(--x));
则上面程序段______.
a)输出的是1 b)输出的是1和-2 c)输出的是3和0 d)是死循环
7.下面程序的运行结果是______.
#include
main()
{
inty=10;
do{y--;}while(--y);
printf("%d\n",y--);
}
a)-1 b)1 c)8 d)0
8.若i为整型变量,则以下循环执行次数是_____.
for(i=2;i==0;)printf("%d",i--);
a)无限次 b)0次 c)1次 d)2次
9.执行语句for(i=1;i++<4;);后变量i的值是______.
a)3 b)4 c)5 d)不定
10.以下正确的描述是_______.
a)continue语句的作用是结束整个循环的执行
b)只能在循环体内和switch语句体内使用break语句
c)在循环体内使用break语句或continue语句的作用相同
d)从多层循环嵌套中退出时,只能使用goto语句
(二)、填空题
1.下面程序段是从键盘输入的字符中统计数字字符的个数,用换行符结束
循环。
请填空。
intn=0,c;
c=getchar();
while(____)
{
if(_____)n++;
c=getchar();
}
2.下面程序的功能是用"辗转相除法"求两个正整数的最大公约数。
请填空。
#include
main()
{intr,m,n;
scanf("%d%d",&m,&n);
if(m r=m%n;
while(r){m=n;n=r;r=______;}
printf("%d\n",n);
}
3.下面程序的运行结果是_________.
#include
main()
{
inta,s,n,count;
a=2;s=0;n=1;count=1;
while(count<=7){n=n*a;s=s+n;++count;}
printf("s=%d",s);
}
4.下面程序段的运行结果是_________.
i=1;a=0;s=1;
do{a=a+s*i;s=-s;i++;}while(i<=10);
printf("a=%d",a);
5.下面程序段的运行结果是_______.
i=1;s=3;
do{s+=i++;
if(s%7==0)continue;
else++i;
}while(s<15);
printf("%d",i);
(24)main0
{intn=9;
while(n>6){n--;printf(“%d”,n);}
}
该程序段的输出结果是
A)987
B)876
C)8765
D)9876
(25)以下循环体的执行次数是
A)3B)2C)1D)0
main()
{inti,j;
for(i=0,j=1;i<=j+1;i+=2,j--)printf("%d\n",i);
}
(26)以下叙述正确的是
A)do-while语句构成的循环不能用其它语句构成的循环来代替。
B)do-while语句构成的循环只能用break语句退出。
C)用do-while语句构成的循环,在while后的表达式为非零时结束循环。
D)用do-while语句构成的循环,在while后的表达式为零时结束循环。
(27)以下程序段的执行结果是
A)a=12y=12B)a=12y=12
a=14y=16 a=16y=28
a=16y=20
a=18y=24
C)a=12y=12D)a=12y=12
a=14y=26
a=14y=44
inta,y;
a=10;y=0;
do
{a+=2;y+=a;
printf("a=%dy=%d\n",a,y);
if(y>20)break;
{while(a=14);
(28)以下程序的输出结果是
A)10192
B)9876
C)10990
D)101091
main()
{intx=10,y=10,欢迎光临学网,点击这里查看更多文章教程[1][2][3][4][5][6][7][8]
I;
for(i=0;x>8;y=++i)
printf("%d,%d",x--,y);
}
(29)以下程序的输出结果是
A)20
B)31
C)321
D)210
main()
{intn=4;
while(n--)printf("%d",--n);
}
(30)以下程序的输出结果是
A)#*#*#
B)#####
C)*****
D)*#*#*
main()
{inti;
for(i=1;i<6;i++)
{if(i%2){printf("#");continue;}
printf("*");
}
printf("\n");
}
(31)执行以下程序段时
A)循环体将执行一次
B)循环体将执行两次
C)循环体将执行无限次
D)系统将提示有语法错误
X=-1;
do{x=x*x;}while(!
x);
(32)执行以下程序后,输出的结果是
A)-1B)1C)8D)0
main()
{inty=10;
do{y--;}while(--y);
printf("%d\n",y--);
}
(33)在下列选项中,没有构成死循环的程序段是
A)inti=100 B)for(;;);
while
(1)
{i=i%100+1;
if(i>100)break;
}
C)intk=1000; D)ints=36;
do{++k;}while(k>=10000);while(s);--s;
(34)执行语句:
for(i=l:
i++<4:
);后,变量i的值是
A)3
B)4
C)5
D)不定
(35)以下程序的输出结果是
A)x=4B)x=8C)x=6D)x=12
main()
{inti,j,x=0;
for(i=0;i<2;i++)
{x++;
for(j=0;j<=3;j++)
{if(j%2)continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
(36)运行以下程序后,如果从键盘上输入6514<回车>,则输出结果为:
A)m=3B)m=2C)m=1 D)m=1
main()
{intm,n;
printf("Enterm,n;");scanf("%d%d",&m,&n):
while(m!
=n)
{while(m>n)m-=n;
while(n>m)n-=m;
}
printf("m=%d\n",m);
}
(37)设x和y均为int型变量,则执行下的循环后,y值为
for(y=1,x=1;y<=50;y++)
{if(x>=10))break;
if(x%2==1)
{x+=5;continue;}
x-=3;
}
A)2 B)4 C)6 D)8
(38)假定a和b为int型变量,则执行以下语句后b的值为
a=1;b=10;
do
{b-=a;a++;}
while(b--<0);
A)9B)-2C)-1D)8
(39)设j为int型变量,则下面for循环语句的执行结果是
for(j=10;j>3;j--)
{if(j%3)j--;
--j;--j;
printf("%d",j);
}
A)63
B)74
C)62
D)73
(40)若ij已定义为int类型,则以下程序段中内循环体的总的执行次数是
for(i=5;i;i--)
for(j=0;j<4;j++){...}
A)20
B)25
C)24
D)30
(41)执行下面的程序后,a的值为
main()
{inta,b;
for(a=1,b=1;a<=100;a++)
{if(b>=20)break;
if(b%3==1){b+=3;continue;}
b-=5;}}
A)7
B)8
C)9
D)10
(42)以下程序段的输出结果是
intx=3;
do{printf("%3d",x-=2);}while(!
(--x));
A)1
B)30
C)1-2
D)死循环
(43)定义如下变量:
intn=10;则下列循环的输出结果是
while(n>7)
{n--;
printf("%d\n",n);}
A)10B)9C)10D)9
9898
8787
76
(44)下面的程序
A)输出的是1
B)输出的是1和-2
C)输出的是3和0
D)是死循环
main()
{intx=3;
do{
printf("%d\n",X-=2);
}while(!
(--x));}
(45)下面程序的输出是
A)741
B)852
C)963
D)875421
main()
{inty=9;
for(;