第五章循环结构
- 格式:doc
- 大小:95.50 KB
- 文档页数:12
第五章循环结构程序设计循环结构是结构化程序设计的三种基本结构之一,也是最重要、最常用的一种基本结构。
其特点是:在给定条件成立时,反复执行某程序段,直到给定条件不成立时为止。
给定的条件称为循环条件,反复执行的程序段称为循环体。
根据开始或结束循环的条件不同,在C 语言中可以用如下语句实现循环:1. 用goto语句和if语句构成循环。
2. 用while循环语句。
3. 用do-while循环语句。
4. 用for循环语句。
5.1 语句标号、goto语句及用goto语句构成的循环1.语句标号语句标号就是给程序中的某一个语句定义的标识符,标号可以是任意合法的标识符,但在语句标号和它所标识的语句之间必须加一个冒号作为分隔符。
C程序中的任何一个可执行语句之前都可以加上语句标号。
例如:stop:printf(“END\n”);通常,语句标号只是用作goto 语句的转向目标。
如:goto stop;如果程序中没有用goto语句改变程序的执行顺序,也就没有必要出现语句标号。
2.goto语句goto语句称为无条件转向语句,goto语句的一般形式为:goto 语句标号;goto语句的作用是把程序的执行转移到语句标号所在的位置,但这个语句标号必须与此goto语句在同一个函数之内。
goto语句不符合结构化程序设计的原则,因为无条件转向使得程序的结构没有规律、可读性差。
对于初学者来说应尽量避免使用goto语句,但如果使用goto语句能够大大地提高程序的执行效率,也可以使用。
3.用goto语句构成的循环结构goto语句通常与if语句配合构成条件转移语句,用来实现构成循环或跳出循环等功能。
例5.1统计从键盘输入的一行字符的个数。
#include <stdio.h>main(){int n= 0;char ch;printf("input a string\n");loop: ch= getchar();n++;if(ch!='\n') /*字符'\n'是结束从键盘输入字符串的标志*/goto loop;n=n-1; /*不要统计字符'\n'*/printf("%d",n);}当用户从键盘上输入一个字符后,先执行n++进行计数,然后判断该字符是否为'\n'字符,若该字符不是'\n'字符,则转移至loop构成循环;否则不执行goto语句,程序在输出n的值后结束。
C语言程序设计课件教案第五章循环结构教学目的掌握循环结构中的while语句、dowhile语句、for语句的用法,掌握中断语句中break和continue语句的用法。
教学要求1.熟练掌握while语句、dowhile语句、for语句2.熟练掌握break语句、continue语句重点和难点1.while语句、dowhile语句、for语句的使用2.break语句、continue语句的使用教学支撑环境与教学资源:1.笔记本电脑2.VC20103.投影仪教学方法讲授法、练习法、讨论法授课课时6课时教学过程AM一、课程引入计算1+2+3+...+n有几种方法,需要多少步骤?、循环结构语句什么时候用到循环结构:处理重复的问题的时候。
循环结构的三大语句:while语句、dowhile语句、for语句。
1.while语句while(循环条件表达式)循环体语句;执行过程:只有循环条件表达式的值为真就执行循环体语句,先判断后执行。
1.输出1---n之间的数intmain(void){inti=1;intn=0;printf("请输入n的值:");scanf("%d",&n);//1015while(i<=n)15printf("%d\n",i);i++;}return0;}2.计算m+...+n 的值intmain(void){inti=1;intn=0;intm=0;intsum=0;printf("请依次输入m 和n 的值:");scanf("%d%d",&m,&n);//m+...n10while(m<=n){sum=sum+m ;m++;}printf("sum=%d\n",sum);return0;}2.do...while 语句do循环体语句;}while(循环条件表达式);执行过程:先执行循环体语句,再检查循环条件表达式的值是否为真,如果为真则继续执行循环体语句,否则结束循环。
第5章循环结构1、有以下程序#include <stdio.h>main(){ int y=10;while(y--); printf("y=%d\n", y);}程序执行后的输出结果是A) y=0B) y=-1C) y=1D) while构成无限循环参考答案:B【解析】执行y - -直到值为0,由于y - -是先用再减,所以退出循环时,y的值为-1。2、有以下程序#include <stdio.h>main(){ int k=5;while(--k) printf("%d",k -= 3);printf("\n");}执行后的输出结果是A) 1B) 2C) 4D) 死循环参考答案:A【解析】--k先自减在使用,所以第一次判断条件即为while(4),条件为真执行打印k的值k=4-3,结果为1,第二次判断条件即为while(0),条件为假,结束循环,打印回车换行符。所以选择A选项。3、关于"while(条件表达式)循环体",以下叙述正确的是A) 循环体的执行次数总是比条件表达式的执行次数多一次B) 条件表达式的执行次数总是比循环体的执行次数多一次C) 条件表达式的执行次数与循环体的执行次数一样D) 条件表达式的执行次数与循环体的执行次数无关参考答案:B【解析】while循环是先判断条件,满足条件后执行循环体,执行完后接着判断条件,执行,直到最后一次判断条件后不成立,跳出循环,所以最后一次执行了条件表达式,但是没有执行循环体,所以选择B选项。4、设有以下代码do {while (条件表达式1)循环体A;} while (条件表达式2);while (条件表达式1){do {循环体B;} while (条件表达式2);}其中,循环体A与循环体B相同,以下叙述正确的是A) 循环体A与循环体B的执行次数相同B) 循环体A比循环体B的执行次数多一次C) 循环体A比循环体B的执行次数少一次D) 循环体A与循环体B的执行次数不确定参考答案:A【解析】while循环语句一般形式为:while(表达式){循环体},执行过程为:首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。
第五章循环结构程序设计1.用for循环语句编程输出1~20之间的所有整数,两数之间以空格分隔。
#include<stdio.h>void main(){int i;for(i=1;i<=20;i++)printf("%d ",i);printf("\n");}2.用for循环语句编程输出20~1之间的所有整数,两数之间以空格分隔。
#include<stdio.h>void main(){int i;for(i=20;i>=1;i--)printf("%d ",i);printf("\n");}3.用for循环语句编程输出A~Z之间的所有字符,两字母之间以空格分隔,要求一行输出8个字符。
#include<stdio.h>void main(){char c;for(c='A';c<='A'+25;c++){putchar(c);}}4.输出100~200之间所有能被3和7整除的数(每行输出4个数)。
#include<stdio.h>void main(){int i,j=0;for(i=100;i<=200;i++){if(i%21==0){ j++;printf("%12d",i);if(j%4==0) printf("\n");}}}5.输出1至1000之间所有满足用3除余2、用5除余3、用7除余2的数(要求每行只输出5个数)。
#include<stdio.h>void main(){for(i=1;i<=1000;i++){if((i%3==2)&&(i%5==3)&&(i%7==2)){ j++;printf("%12d",i);if(j%5==0) printf("\n");}}}6.先读入一个正整数n,然后计算并显示前n个偶数的和。
第五章循环结构一、选择题1.C语言中while和do_while循环的主要区别是( )。
A.do_while的循环体至少无条件执行一次B.while的循环控制条件比do_while的循环控制条件严格C.do_while允许从外部转到循环体内D.do_while的循环体不能是复合语句2.以下描述中正确的是( )。
A.由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句B.do-while循环由do开始,用while结束,在while(表达式)后面不能写分号C.在do-while循环体中,是先执行一次循环,再进行判断D.do-while循环中,根据情况可以省略while3.语句while (!E); 括号中的表达式!E等价于( ) 。
A.E==0B.E!=1C.E!=0D.E==14.以下程序的功能是计算:s= 1+1/2+1/3+……+1/10main(){ int n; float ss=1.0;for(n=10;n>1;n--)s=s+1/n;printf("%6.4f\n",s);}程序运行后输出结果错误,导致错误结果的程序行是( )。
A.s=1.0;B.for(n=10;n>1;n--)C.s=s+1/n;D.printf("%6.4f\n",s);5.下面程序段的运行结果是( )。
a=1;b=2;c=2;while(a<b<c) { t=a;a=b;b=t;c--;}printf("%d,%d,%d",a,b,c);A. 1,2,0B. 2,1,0C. 1,2,1D. 2,1,16.下面程序的功能是在输入的一批正整数中求出最大者,输入0•结束循环,①应选择( )。
main(){ int a,max=0;scanf("%d",&a);while(①){ if(max<a) max=a;scanf("%d",&a);}printf("%d",max);}A. a==0B. aC.!a==1D. !a7.下述循环的循环次数( ) 。
int k=2;while(k=0){ printf(“%d”,k);k--;printf(“\n”);}A.无限次B.0次C.1次D.2次8.有以下程序段int x=1;do{x=x*x;}while(!x);则循环执行的次数是( )。
A. 1次B.2次C.循环条件不全D.死循环9.以下程序段,说法正确的是( )。
int x=-1;do{x=x*x;}while(!x);A.是死循环B.循环执行二次C.循环执行一次D.有语法错误10.下面程序的运行结果是( ):main(){ int num=0;while(num<=2){num++;printf("%d\n",num);}}A. 1B.1C. 1D. 12 2 23 34 11.下面程序的输出结果是( )。
main ( ){ char c=’A’;int k=0;do {switch (c++) {case ‘A’ : k++ ; break ;case ‘B’ : k-- ;case ‘C’ : k+=2 ; break ;case ‘D’ : k%=2 ; continue ;case ‘E’ : k*=10 ; break ;default : k/=3 ;}k++;} while (c<’G’) ;printf (“k=%d”,k) ;}A.k=3B.k=4C.k=2D.k=012.若变量已正确定义,有以下程序段int i=-1;do{ printf(“%d,”,i);}while(i++);printf(“%d\n”,i);其输出结果是( )。
A.-1,0,0B.-1,0,1C.-1,0D.程序进入无限循环13.下面程序的输出是( )main(){ int y=0;while(y--);printf("y=%d\n",y);}A. y=0B. while 构成无限循环C. y=-1D. y=114.若运行以下程序时,输入2473↙,则程序的运行结果是( )。
main ( ){ int c;while ((c=getchar( )) ! =’\n’)switch (c-‘2’) {case 0 :case 1 : putchar (c+4) ;case 2 : putchar (c+4) ; break ;case 3 : putchar (c+3) ;default : putchar (c+2) ; break ;}printf(“\n”);}A.668977B.668966C.66778777D.668876615.下面有关for循环的正确描述是( ) 。
A.for循环只能用于循环次数已经确定的情况B.for循环是先执行循环体语句,后判断表达式C.在for循环中,不能用break语句跳出循环体D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来16.对for(表达式1;;表达式3)可以理解为( )。
A.for(表达式1;0;表达式3)B.for(表达式1;表达式1;表达式3)C.for(表达式1;1;表达式3)D.for(表达式1;表达式3;表达式3)17.若i为整型变量,则以下循环执行次数是( )。
for(i=2;i==0;) printf(“%d”,i--);A.无限次B.0次C.1次D.2次18.对下Ⅰ,Ⅱ两个语句描述正确的是( )。
Ⅰ.while(1) Ⅱ.for(;;)A. 都是无限循环B.Ⅰ是无限循环,Ⅱ错误C.Ⅰ循环一次,Ⅱ错误D.以上答案都错19.下列程序段中,功能与其它程序段不同的是( )。
A.for(i=1,p=1;i<=5;i++) p*=i;B.for(i=1;i<=5;) { p=1;p*=i;i++;}C.i=1;p=1;while(i<=5) { p*=i;i++;}D.i=1;p=1;do { p*=i;i++;} while(i<=5)20.有如下程序main(){ int i, sum=0;for(i=1;i<=3;sum++) sum+=i;printf("%d\n",sum);}该程序的执行结果是( )。
A. 6B. 3C. 死循环D. 021.下面for循环语句( )。
int i,k;for (i=0, k=-1; k=1; i++, k++)printf(“***”);A.判断循环结束的条件非法B.是无限循环C.只循环一次D.一次也不循环22.执行语句for (i=1;i++<4;) ; 后变量i的值是( )。
A.3B.4C.5D.不定23.以下for循环的执行次数是( )。
for (x=0,y=0; (y=123) && (x<4) ; x++) ;A.无限循环B.循环次数不定C.4次D.3次24. 以下正确的描述是( )。
A.continue语句的作用是结束整个循环的执行B.只能在循环体内和switch语句体内使用break语句C.在循环体内使用break语句或continue语句的作用相同D.goto语句只能用于退出多层循环25.下列程序段不是死循环的是( )。
A. int i=100; while(1){i=i%100+1;if(i>100)break;}B. for(;;)C. int k=0; do{++k;} while(k==0);D. int s=36;while(s);--s;26.以下程序的运行结果为( )。
main( ){ int n;for( n=1;n<=10;n++){ if( n%3==0) continue; printf(“%d”,n); }}A.12457810B.369C.12D.1234567891027.与以下程序段等价的是( )。
while(a){ if (b) continue;c;}A. while(a){ if(!b) c;}B. while(a){ if(!b) break; c;}C. while(a){ if(b) c;}D. while(a){ if(b) break; c;}28.以下的程序输出的结果是( )。
void main( ){ int i;for(i=0; i<=5 ;i++){ if( i%2) putchar('<');else continue;putchar('>'); }putchar('#'); }A. < > < > < > #B. > < > < > < #C. < > < > #D. > < > < #29.下面程序段,以下关于程序段执行情况的叙述,正确的是( )。
for(t=1;t<=100;t++){scanf("%d",&x);if(x<0) continue;printf("%3d",t); }A.当x<0时整个循环结束B.x>=0时什么也不输出C.printf函数永远也不执行D.最多允许输出100个非负整数30.有以下程序段int i,n;for(i=0;i<8;i++){ n=rand()%5;switch (n){ case 1:case 3:printf("%d\n",n); break;case 2:case 4:printf("%d\n",n); continue;case 0:exit(0);}printf("%d\n",n);}以下关于程序段执行情况的叙述,正确的是( )。
A.for循环语句固定执行8次B.当产生的随机数n为4时结束循环操作C.当产生的随机数n为1和2时不做任何操作D.当产生的随机数n为0时结束程序运行二、程序填空题1.求100的阶乘100!(100!=1*2*……*100)。
#include<stdio.h>void main(){ int i;; /*定义累乘器fact并初始化为1*/for(____________ __)____________ __; /*实现累乘*/printf( ); /*输出最终结果*/}2.计算并输出1!+2!+3!+…+10!。