1 / 42

第六章 循环结构程序设计

本章内容 1. 循环结构概述 2.go to 语句及用 go to 语句构成的循环 3.While 语句的使用 4.Do While 语句的使用 5.For 语句的使用 6. 循环的嵌套 7.Break 语句和 Continue 语句的使用 8. 程序举例. 第六章 循环结构程序设计. 例 求 s=1+2+3+ … +100. 例:打印如下形式的九九乘法表. 输入 10 个整数,求它们的平均值,并输出大于平均值的个数。. main() { int a,b,c,d,e,f,g,h,i,j,n=0; float average;

leanna
Download Presentation

第六章 循环结构程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 本章内容 1.循环结构概述 2.go to语句及用go to语句构成的循环 3.While语句的使用 4.Do While语句的使用 5.For 语句的使用 6.循环的嵌套 7.Break语句和Continue语句的使用 8.程序举例 第六章 循环结构程序设计

  2. 例 求s=1+2+3+ …+100

  3. 例:打印如下形式的九九乘法表.

  4. 输入10个整数,求它们的平均值,并输出大于平均值的个数。输入10个整数,求它们的平均值,并输出大于平均值的个数。 main() { int a,b,c,d,e,f,g,h,i,j,n=0; float average; scanf(“%d”, &a); scanf(“%d”, &b); scanf(“%d”, &c); scanf(“%d”, &d; scanf(“%d”, &e); scanf(“%d”, &f); scanf(“%d”, &g); scanf(“%d”, &f); scanf(“%d”, &i); scanf(“%d”, &j);

  5. average=(a+b+c+d+e+f+g+h+i+j)/10; if( a>average ) n=n+1; if( b>average ) n=n+1; if( c>average ) n=n+1; if( d>average ) n=n+1; if( e>average ) n=n+1; if( f>average ) n=n+1; if( g>average ) n=n+1; if( h>average ) n=n+1; if( i>average ) n=n+1; if( j>average ) n=n+1; printf(“n=%d",n); }

  6. 6.1 概 述 循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。 (1)用goto语句和if语句构成循环 (2)用while语句 (3)用do----while语句 (4) 用for语句

  7. b) 直到循环 a) 当型循环 0 表达式 语句 非0 语句 非0 表达式 0

  8. 6.2 goto语句及用goto语句构成的循环 一、无条件转移语句——goto语句 一般格式: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。 如: label: i++; goto label1; C语言不限制程序中使用标号的次数,但各标号不得重名。 goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。

  9. 二、用goto语句与if语句实现循环 用goto语句与if语句实现循环的形式: 形式2: loop1: if (表达式) goto loop2; 语句; goto loop1; loop2 : 形式1: loop1: 语句; if (表达式) goto loop1; 注意:在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

  10. 例1: 编程序求:s=1+2+3+……+100 main() { int s=0,n=1; loop: s=s+n; n++; if (n<=100) goto loop; printf("S=%d",s); } main() { int s=0,n=1; loop1: if (n>100) goto loop2; s=s+n; n++; goto loop1; loop2: printf("S=%d",s); }

  11. 例2:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string\n"); loop: if(getchar()!='\n') { n++; goto loop; } printf("%d",n); }

  12. 6.3 while 语句 while语句的一般形式为: while(表达式) 语句; 其中表达式是循环条件,语句为循环体,若是多个语句则必须用{和}组成复合语句。 0 表达式 非0 语句 执行过程是:计算表达式的值,当值为真(非0)时, 执行循环体语句。如右上图。

  13. 例1: 编程序求:s=1+2+3+……+100 main() { int s=0,n=1; while (n<=100) { s=s+n; n++; } printf("S=%d",s); }

  14. 6.4 Do—while语句 do-while语句的一般形式为: do { 语句; }while (表达式); 其中:语句是循环体, 表达式是循环条件。 语句 非0 表达式 0 执行过程:先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。

  15. 例1: 编程序求:s=1+2+3+……+100 main() { int s=0,n=1; do { s=s+n; n++; } while (n<=100); printf("S=%d",s); }

  16. 使用while和do-while语句应注意以下几点: 1.在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。 2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。 3.当循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。 4.如果循环至少要执行一次,while和do-while语句可以相互替换。

  17. 6.5 for语句 for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。 一、使用一般形式为: for(表达式1;表达式2;表达式3) 语句; 其中:表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。 表达式2通常是循环条件,一般为关系表达式或逻辑表达式。 表达式3通常可用来修改循环变量的值,一般是赋值语句。

  18. for语句的执行过程: 1.首先计算表达式1的值。 2.再计算表达式2的值,若值为真(非0)则执行循环体一次, 否则跳出循环。 3.然后再计算表达式3的值,转回第2步重复执行。 在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。 求解表达式1 0 表达式2 非0 语句 语句 求解表达式3 for 语句的执行过程

  19. 例:用for语句计算s=1+2+3+...+99+100 main() { int n,s=0; for(n=1;n<=100;n++) s=s+n; printf("s=%d\n",s); } 本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。

  20. 二、在使用for语句中要注意以下几点: 1.for语句中的各表达式都可省略,但分号间隔符不能少 如:for(;表达式2;表达式3) 省去了表达式1。 for(表达式1;;表达式3) 省去了表达式2。 for(表达式1;表达式2;) 省去了表达式3。 for(;;) 省去了全部表达式。 2.在循环变量已赋初值时,可省去表达式1。如省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。 例:

  21. main() { int n=1,s=0; for(;n<=100;n++) s=s+n; printf("s=%d\n",s); } 省略表达式1: main() { int n=1,s=0; for(;n<=100;) { s=s+n; n++;} printf("s=%d\n",s); } 省略表达式1和 3;

  22. main() { int n=1,s=0; for(; ;) { s=s+n; n++;} printf("s=%d\n",s); } 省略全部表达式: ——程序为死循环 for( ; ; ) 等效于while( 1) main() { int n=1,s=0; for(; ;) { s=s+n; n++; if (n>=100) break; } printf("s=%d\n",s); }

  23. 3.for语句中的 三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。 例: main() { int n,s; for(n=1,s=0;n<=100;n++) s=s+n; printf("s=%d\n",s); } main() { int n,s; for(n=1,s=0;n<=100;n++,s+=n); printf("s=%d\n",s); } 这里为什么要加;

  24. 例:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); } 说明:本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf 语句当成循环体来执行。 反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能执行循环体。

  25. 6.6 循环的嵌套 for语句也可与while,do-while语句相互嵌套,构成多重循环。以下形式都合法的嵌套。 (2)do { … do { …} while() … }while(); (1) while( ) {… while( ) {…} … } (3) for() { ……… for() { …… } …… } (4) while() { … for() {…} … }

  26. (5) for( ) {… while( ) {…} … } (6) do{ … for( ) {…} … }while(); (8) for() { ……… do { …… } while(); …… } (7) while() { … do { … }while(); … }

  27. 例:打印如下形式的九九乘法表. main() { int x,y; for(x=1;x<=9;x++) { for(y=1;y<=9;y++) printf("%d*%d=%2d ",x,y,x*y); printf("\n"); } }

  28. 6.7 几种循环语句的比较

  29. 6.8 break语句和continue语句 一、break语句 break语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。 break语句的一般形式为: break; 注意: break语句用于循环体中,一般与if语句联合使用。

  30. 例:计算s=1+2+3+...+99+100 main() { int n=1,s=0; while(1) { if(n>100) break; s=s+n; n++; } printf("s=%d\n",s); }

  31. 分析下面程序的功能 #include"stdio.h" void main() { char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n') { if(a==b) { printf("same character\n"); break; } b=a; } } 功能是: 检查输入的一行中有无相邻两字符相同。

  32. done=0; for( … ) { for ( … ) {while ( … ) { if ( … ) { done=1; break; } … } if (done) break; … } if (done) break; } 多层嵌套循环: 可用goto退出 goto stop; 而break;只能退出本层循环。

  33. 二、continue语句 continue语句只能用在循环体中 其一般格式是: continue; 其语义是:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。 main() { int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); } } main() { int n; for(n=7;n<=100;n++) { if (n%7==0) printf("%d ",n); } }

  34. 6.9 程序举例 例6.6 教材Pg.116 (略) fabs() 例6.7 教材Pg.116 (略)if( i%2==0) printf(“\n”) 例6.8 判断一个整数m是否是素数。教材Pg.118 素数是只能被1 和本身整除的数。

  35. #include "math.h" void main() { int m,i,k; printf("Enter m=\n"); scanf("%d",&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>k) printf("Yes\n"); else printf("No\n"); } 输入m k=sqrt(m) 当i<=k i=2 m%i=0 N Y break i=i+1 当i>k N Y 打印No 打印Yes 程序流程图

  36. 例6.9 打印输出100——200之间的素数。 #include "math.h" void main() { int n=0,i,k,m; for (m=101;m<=199;m++) { k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) break; if(i>=k) { n++; printf("%d ",m); if (n% 10==0) printf("\n");} } }

  37. 例6.10 字符加密、解密 教材Pg.119 加密的思想是: 将每个字母C加(或减)一序数k,即用它后的第k个字母代替,变换式公式: c=c+k 例如序数k为5,这时 “A”“F”, “a”“f”,“B”“G”… 当加序数后的字母超过“Z”或“z”则 c=c+k -26 例如:You are good  Dtz fwj ltti 解密为加密的逆过程 将每个字母C减(或加)一序数k,即 c=c-k, 例如序数k为5,这时 “Z”“U”, “z”“u”,“Y”“T”… 当减序数后的字母小于“A”或“a”则 c=c-k +26

  38. 加密程序如下: #include "stdio.h" main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c+5; if (c>'Z' && c<'Z'+5 || c>'z') c=c-26; } printf("%c",c); } }

  39. 解密程序如下: #include "stdio.h" main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c-5; if (c<'A' || c<'a' && c>'a'-5) c=c+26; } printf("%c",c); } } 作业:(6.1) 6.3 6.6 6.11

  40. 例3-16 求一元二次方程ax2+bx+c=0 的根 源程序如下 #include "stdio.h" main() { float a,b,c,x1,x2,d; scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if(d==0) {x1=-b/(2*a); printf("x1=x2=%f\n",x1); }

  41. else if(d>0) { x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else { x1=-b/(2*a);x2=sqrt(-d)/(2*a); printf("real part=%f,imag part=%f",x1,x2); } }

  42. main() {long f1,f2; int k; f1=1;f2=1; for(k=1;k<=20;k++) { printf("%12ld %12ld",f1,f2); if(k%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } } 例3-18 数列 1,1, 2,3, 5,8, 13的前40 个数 这是一个递推问题.该数列可以用下面的通式来表示 f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n>=3) 程序如下

More Related