《循环控制结构》PPT课件.ppt_第1页
《循环控制结构》PPT课件.ppt_第2页
《循环控制结构》PPT课件.ppt_第3页
《循环控制结构》PPT课件.ppt_第4页
《循环控制结构》PPT课件.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,第6章,循环控制,循环是计算机解题的一个重要特征。由于计算机运 算速度快,最适宜做重复性的工作。当我们在进行程序 设计时,总是要把复杂的不易理解的求解过程转换为容 易理解的操作的多次重复,从而降低了问题的复杂度, 同时也减少程序书写及输入的工作量。,sum=1+2+3+4+100 输出如下: 输出所有210000的素数.,* * *,循环结构程序设计,循环是在循环条件为真时计算机反复执行的一组指令(循环体)。 循环控制通常有两种方式: 计数控制 事先能够准确知道循环次数时用之 用专门的循环变量来计算循环的次数,循环变量的值在每次执行完循环体各语句后递增,达到预定循环次数时则终止循环,继续执行循环结构后的语句。 标记控制 事先不知道准确的循环次数时用之 由专门的标记变量控制循环是否继续进行。当标记变量的值达到指定的标记值时,循环终止,继续执行循环结构后的语句。,实现循环结构的语句,C语言中可用以下语句构成循环: if goto while do while for 其中if goto是通过编程技巧(if语句和goto语句组合)构成循环功能。而且goto语句将影响程序流程的模块化,使程序可读性变差,所以结构化程序设计主张限制goto语句的使用。 其他三种语句是C语言提供的循环结构专用语句。,6.1 if /goto 语句,语句功能:,语句格式:,语句标号:语句; if (表达式) goto 语句标号; ,当(表达式)的值为非零时则重复 执行“语句标号”后面的语句。,标识程序中某 个语句的位置,EXAMPLE6-1:,请用C语言实现右侧程序 流程图所描述的算法: 即:sum=1+2+3+4+100,设:i 计数器:i=i+1,sum 为累加器:sum=sum+i,main( ) ,int sum=0, i=1;,sum=sum+i;,sum+=i;,i=i+1;,if (i=100),printf(“%dn”, sum);,goto aa;,aa:,i+;,语句标号:语句; if (表达式) goto 语句标号;,EXERCISES6-1:,从键盘输入100个有符号整数,请 分别统计其中正整数和负整数的个数。,Begin,i=0 p=0 n=0,i+,输出p n,End,p+,F,X0,T,输入 x,n+,i100,F,1,1,1、设计算法,X0,2、实现算法,main( ) ,Int p,n,i, x;,scanf(“%d”, ,i+;,if (x0),printf(“%d,%dn”,p,n);,goto bb;,bb:,p+;,p=n=i=0;,else,If (x0) n+;,if (i100),5.2 while 语句,语句功能:,语句格式:,while(表达式) statements; ,当表达式的值为非零时,重复statements。,关系、逻辑 赋值表达式,body of loop,请用while实现 sum=1+2+3+4+100,main( ) ,int sum=0, i=1;,sum+=i;,While (i=100),printf(“%dn”, sum);,i+;,while (表达式) ,main() int n=0; while (n3) printf(“%d,”, n ); n+; printf(“%dn”, n); ,0,main( ) int n=3; while (n) printf(“%d,”, n-); n=-3; printf(“n”); while (n) printf(“%d,”, n+); ,1,2,3,3,2,1,-3,-2,-1,EXAMPLE6-2:,n,0,1,2,3,2,1,0,-3,-2,-1,0,main( ) int a=1,b=2,c=2,t=0; while (ab) t=a; a=b; b=t; c+; printf( “%d,%d,%d”,a,b,c ) ; ,EXERCISES6-2:,a,0,2,2,1,b,c,t,1,2,1,3,main() int x=0, s=0; while(!x!=0) s+=+x; printf(“%d n”, s); ,EXERCISES6-3:,x,0,s=s+(+x);,s,0,1,1,!x,从键盘输入100条整型数据,请找出 其中最大的数,并指出这个最大的数是 从键盘第几次输入的。 要求:1、用N-S图设计算法; 2、用C语言实现算法。,HOMEWORK6-1:,请分别统计在输入的字符串中 字母、数字和其它字符的个数。 要求:1、用N-S图设计算法; 2、用C语言实现算法。,HOMEWORK6-2:,book12pen5%*#( ) &,字母:,7,数字:,3,字符:,8,语句功能:,6.3 do-while 语句,语句格式:,do statements; while(表达式);,当表达式的值为非零时,重复statements 。,body of loop,1+2+3+4+5+ +100,main() int i, sum; ,do,printf(“%dn”, sum);,sum=0; i=1;,i+;, while( );, sum+=i;, while(i=100);,EXAMPLE6-3:,main( ) int x; x=-1; do x=x*x; while( !x ); ,EXERCISES6-4:,A) 是死循环 B) 循环执行三次 C) 循环执行一次 D) 有语法错误,x=0;,main() int x=3; do printf(“%d,”,x-=2); while( !(-x) ); ,EXERCISES6-5:,A) 1 B) 1,-2 C) 3,0 D) 0,x,3,1,0,-2,-3,x=x-2;,main() int s; s=7; do s=2; while(s0); printf(“s=%dn”,s); ,EXERCISES6-6:,请写出 右侧程 序的运 行结果,main() int x,y; x=y=0; while(x20) y+,x+=3; printf(“y=%d x=%dn”,y,x); ,EXERCISES6-7:,写出右侧 程序段的 运行结果 以及循环 体中的语 句共执行 了几次。,为了使电文保密,往往按一定规律将其转换成 密码,收报人再按约定的规律将其译回原文。 例如,可以按以下规律将电文变成密码: 将字母A变成字母E(a变e,即将变成其后的第4 个字母)W变成字母A,X变成字母B,Y变成字母C,Z 变成字母D。 要求:字母按上述规律转换,非字母字符不变。 如,“China” 应转换为 “Glmre” 。 请输入一行字符,要求输出其相应的密码。,请设计一个 译密码 的程序,HOMEWORK6-3:,main( ) int x,y; x=y=0; do y+; x*=x; while(x0) ,请程序的运行结果及循环次数,HOMEWORK6-4:,while语句和用do-while语句的比较: 在一般情况下,用while语句和用do-while语句处理同一问题 时,若二者的循环体部分是一样的,它们的结果也一样。 但是如果while后面的表达式一开始就为假(0值)时,两种循 环的结果是不同的。,例 while和do-while循环的比较 (1) #include (2) #include void main ( ) void main( ) int sum=0,i; int sum=0,i; scanf(“%d, ,运行结果: 1 sum=55 再运行一次: 11 sum=0,运行结果: 1 sum=55 再运行一次: 11 sum=11,说明:(1)当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,语句功能:,6.4 for 语句,语句格式:,for(表达式1;表达式2;表达式3) statements; ,当表达式2的值为非零时,重复执行statements 。,for(表达式1;表达式2;表达式3) statements; ,表达式1 循环初始表达式,用于进入循环体前为循环变量赋初值 由算术、赋值、逻辑和逗号表达式构成。,表达式2 循环控制表达式,用于控制循环体语句的执行次数由关 系表达式或逻辑表达式构成。,表达式3 修改循环变量表达式,即每循环一次使得表达式1的值 就要变化一次。由算术、赋值、逻辑和逗号表达式构成。,main() int n; for(n=1; n=10; n+) printf(“%d,” ,n); ,1, 2, 3, 4, 5 ,6 ,7, 8 , 9 , 10,for(表达式1;表达式2;表达式3) statements; ,EXAMPLE6-4:,main() int n, i=100; for(n=1; n=5; n+) printf(“%d,”, i); ,100, 100, 100, 100 , 100,main() int n, i=100; for(n=5; n0; n-) printf(“%d,”, i); ,EXAMPLE6-5:,main() int x, y; for(x=0,y=0; x+y=50; x+,y+) printf(“%3d ”, x+y ); if (x%5=0) printf(“n”); ,EXERCISES6-8:,写出右侧 程序段的 运行结果,main( ) int sum, i ; for(sum=0,i=1; i=100; i+) sum+=i; printf(“sum=%dn”, sum ); ,main( ) int sum=0, i =1; do sum+=i; i+; while( i=100 ); printf(“sum=%dn”, sum ); ,main( ) int sum=0, i =1; while( i=100 ) sum+=i; i+; printf(“sum=%dn”, sum ); ,main( ) int sum=0, i =1; label: if( i=100) sum+=i; i+; goto label; printf(“sum=%dn”, sum ); ,1+2+3+4+5+ +100,说明: for语句的一般形式中的“表达式1”可以省略,此时应在 for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如: for(;i=100;i+) sum=sum+i; 执行时,跳过“求解表达式1”这一步,其他不变。,如果表达式2省略,即不判断循环条件,循环无终止地 进行下去。也就是认为表达式2始终为真。 例如:for(i=1;i+) sum=sum+i; 它相当于: i=1; while(1) sum=sum+1;i+;,(3) 表达式3也可以省略,但此时程序设计者应另外设法保证 循环能正常结束。如: for ( i=1;i=100;) sum= sum + i; i+; 在上面的for语句中只有表达式1和表达式2,而没有表达式 3。i+的操作不放在for语句的表达式3的位置处,而作为循环 体的一部分,效果是一样的,都能使循环正常结束。,(4) 可以省略表达式1和表达式3,只有表达式2,即只给循环条件 如: for(;i=100;) while(i=100) sum=sum+i; sum=sum+i; i+; 相当于 i+; 在这种情况下,完全等同于while语句。 可见for语句比while语句功能强,除了可以给出循环条件外, 还可以赋初值,使循环变量自动增值等。,(5) 3个表达式都可省略,如: for(;) 语句 相当于 while(1) 语句 即不设初值,不判断条件(认为表达式2为真值),循环变量 不增值。无终止地执行循环体。,(6) 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如: for (sum=0;i=100;i+) sum=sum+i; 表达式3也可以是与循环控制无关的任意表达式。,表达式1和表达式3可以是一个简单的表达式,也可以是 逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。 如: for (sum=0,i=1;i=100;i+) sum=sum+i; 或 for (i=0,j=100;i=j;i+,j-) k=i+j; 表达式1和表达式3都是逗号表达式,即同时设两个初值, 使两个变量增值。,在逗号表达式内按自左至右顺序求解,整个逗号表达式 的值为其中最右边的表达式的值。如: for (i=1;i=100;i+,i+) sum=sum+i; 相当于 for (i=1;i=100;i=i+2) sum=sum+i;,(7) 表达式2一般是 关系表达式(如i=100) 或逻辑表达式 (如ab 在表达式2中先从终端接收一个字符赋给c,然后判断此赋值 表达式的值是否不等于n(换行符),如果不等于n,就执行 循环体。 注意:此for语句的循环体为空语句,把本来要在循环体内处理 的内容放在表达式3中,作用是一样的。, for( ;(c=getchar()!=n;) printf(“%c”,c); for语句中只有表达式2,而无表达式1和表达式3。其作用 是每读入一个字符后立即输出该字符,直到输入一个“换行”为 止。,例5.9 用for循环按下列公式计算e的值(精度为1e-6): e=1+1/(1!) +1/(2!) +1/(3!) + +1/(n!) void main() int i, f=1; double e=0; x=1.0; for (i=1; x=1e-6; i+) e=e+x; f=f*i; x=1.0/f; printf(“e=%f”, e); ,例5.10 猴子第一天摘下若干桃子,当即吃了一半,还不过瘾,又多 吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以 后每天早上都吃前一天剩下的一半零一个。到第十天想再吃时,就只 剩一个桃子了,求第一天共摘多少桃子。 采用逆算法,若某一天剩余的桃子是x,则前一天的桃子数应 是2(x+1) void main() int x=1, i; for(i=9; i=1; i-) x=2*(x+1); printf(“%d”, x); ,程 序 举 例,例1 求Fibonacci数列前40个数。这个数列有如下特点: 第1、2两个数为1、1。从第3个数开始,该数是其前面两个数 之和。即: F(1)=1 (n=1) F(2)=1 (n=2) F(n)=F(n-1)+F(n-2) (n3) 算法如图所示:,图6-13,例1 求Fibonacci数列前40个数。 #include void main() long int f1,f2; int i; f1=1;f2=1; for (i=1;i=20;i+) printf(“%12ld %12ld”,f1,f2); if (i%2=0) printf(“n”); f1=f1+f2; f2=f2+f1; ,运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 57022887 9227465 14930352 24157817 39088169 63245986 102334155,请输出26个小写的英文字母以及 每个字母所对应的ASCII码值。,HOMEWORK6-5:,设某学校新生入学时,需报选体育课选修 科目。其科目包括有:篮球、排球、体操、乒 乓球、网球。请为某班级(30人)统计报选各 科目的人数。,请设计报选体育科目统计程序,HOMEWORK6-6:,6.5 嵌套循环,嵌套循环是循环中的循环。嵌套 循环的深度可达两层、三层、四层, 甚至更多。实际层数可根据应用程序 的需要而定,但超过三层的嵌套循环 不为多见。, for(i=1; i=9; i+) for(j=1; j=9; j+) ,内层循环,外层循环,双重循环,下面几种都是合法的形式: (1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); (4) while( ) (5) for(;) (6) do do while( ) for(;) while( ); while( ) ;,请设计求解下列问题的C语言程序: s=1!+2!+3!+ +20!,1!= 1,2!= 1*2,3!= 1*2*3,4!= 1*2*3*4,5!= 1*2*3*4*5 20!= 1*2*3*4*5 *20,i,1- 1,1-,i,1-20,EXAMPLE6-6:,1- 2,1- 3,1- 4,1- 5,1- 20,j,t=t*j,s=1!+2!+3!+ +20!,s=0, t,i (120),t=1,j (1i),输出 s,t*=j,s+=t,main() int i, j, t; long s=0; ,for ( ),i=1;,i=20;,i+,for ( ),j=1;,j=i;,j+,t=t*j;,s+=t;,printf(“%ln”, s);,s=1!+2!+3!+ +20!,i (1-20),j (1-i),t=1;,请设计按下列格式打印九九表程序。,1*1=1 1*2=2 1*3=3 1*9= 9 2*1=2 2*2=4 2*3=6 2*9=18 9*1=9 9*2=18 9*3=27 9*9=81,EXAMPLE6-7:,a,b,p=a*b,a,b,p,a (19),b (19),输出 a*b=p,1*1=1 1*2=2 1*3=3 1*9= 9 2*1=1 2*2=4 2*3=6 2*9=18 ,main() int a, b, p; ,p=a*b,for ( ),a=1;,a=9;,a+,for ( ),b=1;,b=9;,b+,printf( );,p=a*b;,“%d,a,b,p,*,%d,=,%d,”,printf(“n”);,1*1=1 1*2=2 1*3=3 1*9= 9 2*1=1 2*2=4 2*3=6 2*9=18 ,双重循环特点,当外层 循环变量中 的值变换一 次时,内层 循环变量中 的值将变换 若干次。,若 i , j 已定义为 int 类型,则以下程序段中 内循环体总的执行次数是: for( i=5; i; i -) for(j=0; j4; j+) A) 20 B) 24 C) 25 D) 30,EXERCISES6-9:,请打印下列图形: ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF,TEST6-4:,# define ROWS 6 # define CHARS 6 main() int row; char ch; for(row=0; rowROWS; row+) for(ch=A; ch=F; ch+) printf(“%c”, ch); printf(“n”); ,ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF,请打印下列图形: ABCDEF BCDEF CDEF DEF EF F,HOMEWORK6-7*:,# define ROWS 6 # define CHARS 6 main() int row; char ch; for (row=0; rowROWS; row+) for (ch=(A+ROW); ch=F; ch+) printf(“%c”, ch); printf(“n”); ,ABCDEF BCDEF CDEF DEF EF F,前面我们介绍了四种能够实现循环的语句,它 们退出循环的方式通常都是以某个表达式的结果作 为判断条件,当其值为零时结束循环。除了这种正 常结束循环的方式外,还可以利用C 语言提供的专 门退出循环的语句。,6.6 break 与 continue 语句,6.6 break语句和continue语句,6.6.1 break 语句 break语句可以用来从循环体内跳出循环体,即提前结束循 环,接着执行循环下面的语句。 一般形式: break; 注意: break语句不能用于循环语句和switch语句之外的任何 其他语句中。,例: float pi=3.14159; for(r=1;r100) break; printf(“r=%f,area=%fn”,r,area); ,程序的作用是计算r=1到r=10时的圆面积,直到面积area大 于100为止。 从上面的for循环可以看到:当area100时,执行break语 句,提前结束循环,即不再继续执行其余的几次循环。,break,break 语句,EXERCISES6-10:,main() int i, m=0,n=0,k=0; for(i=9; i=11; i+) switch(i/10) case 0: m+;n+;break; case 10: n+; break; default: k+; n+; printf(“%d,%d,%dn”, m,n,k); ,m,0,n,0,1,1,k,0,2,1,2,3,continue,continue 语句,main() int k=4, n=0; for(; nk; ) n+; if(n%3!=0) continue; k-; printf(“ %d,%d n”, k,n); ,A) 1,1 B) 2,2 C) 3,3 D) 4,4,EXAMPLE6-8:,main() int i; for(i=1; i5; i+) if(i%2) printf(“*”); else continue; printf(“#”); printf(“$ n”); ,EXERCISES6-11:,main() int i, j, x=0; for(i=0; i2; i+) x+; for(j=0; j=3; j+) if(j%2) continue; x+; x+; printf(“x=%d n”, x); ,x=8,EXERCISES6-12:,在下列语句中,哪一个不为无限循环 A) i=100; B) for( ; ; ) while(1) i=i %100; i+; if (i 100) break; C) k=32764; D) S=32764; do while(S+%2)|(S%2) k+; k+; S+; while(k0);,EXERCISES6-13:,C) k=32764; do k+; printf(“k=%dn”,k); k+; printf(“k=%dn”,k); while(k0);,int -3276832767,215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20,1 个字节,1 个字节,C) k=32764; do k+; printf(“k=%dn”,k); k+; printf(“k=%dn”,k); while(k0);,k+, 32765,k+, 32766,k+, 32767,k+, -32768,int -3276832767,-32767,continue语句和break语句的区别: continue语句只结束本次循环,而不是终止整个循环的执行。 而break语句则是结束整个循环过程,不再判断执行循环的条件 是否成立。,while (表达式1) if(表达式2) continue; ,while(表达式1) if(表达式2) break; ,main() int k=0; char c=A; do switch(c+) case A: k+; break ; case B: k- -; case C: k+=2; break ; case D: k=k%2; continue ; case E: k=k*10; break ; default : k=k/3; k+; while(cG); printf(“k=%d n”, k); ,TEST6-1:,例2 把100200之间的能被3整除的数输出。 #include void main() int n; for (n=100;n=200;n+) if (n%3!=0) continue; printf(“%d”,n); ,说明:当n不能被3整除时,执行continue语句,结束 本次循环(即跳过printf函数语句),只有n能被3 整除时才执行printf函数。,算法思想: 让m被2到 除,如果m能 被2 之中任何一个整数整除,则 提前结束循环,此时i必然小于或等于 k(即 );如果m不能被2k(即 )之 间的任一整数整除,则在完成最后一 次循环后,i还要加1,因此i=k+1,然 后才终止循环。 在循环之后判别i的值是否大于或 等于k+1,若是,则表明未曾被2k 之间任一整数整除过,因此输出 “是素数”。,例3 判断m是否素数。,例3 判断m是否素数。 #include #include void main() int m,i,k; scanf(“%d”, ,运行结果: 17 17 is a prime number,例4 求100200间的全部素数。 #include #include void main() int m,k,i,n=0; for (m=101;m=k+1) printf(“%d”,m);n=n+1; if (n%10=0) printf(“n”); printf (“n”); ,运行结果: 101 103 107 109 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论