420 likes | 533 Views
本章内容 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;
E N D
本章内容 1.循环结构概述 2.go to语句及用go to语句构成的循环 3.While语句的使用 4.Do While语句的使用 5.For 语句的使用 6.循环的嵌套 7.Break语句和Continue语句的使用 8.程序举例 第六章 循环结构程序设计
输入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);
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.1 概 述 循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。 (1)用goto语句和if语句构成循环 (2)用while语句 (3)用do----while语句 (4) 用for语句
b) 直到循环 a) 当型循环 0 表达式 语句 非0 语句 非0 表达式 0
6.2 goto语句及用goto语句构成的循环 一、无条件转移语句——goto语句 一般格式: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。 如: label: i++; goto label1; C语言不限制程序中使用标号的次数,但各标号不得重名。 goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。
二、用goto语句与if语句实现循环 用goto语句与if语句实现循环的形式: 形式2: loop1: if (表达式) goto loop2; 语句; goto loop1; loop2 : 形式1: loop1: 语句; if (表达式) goto loop1; 注意:在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
例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); }
例2:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string\n"); loop: if(getchar()!='\n') { n++; goto loop; } printf("%d",n); }
6.3 while 语句 while语句的一般形式为: while(表达式) 语句; 其中表达式是循环条件,语句为循环体,若是多个语句则必须用{和}组成复合语句。 0 表达式 非0 语句 执行过程是:计算表达式的值,当值为真(非0)时, 执行循环体语句。如右上图。
例1: 编程序求:s=1+2+3+……+100 main() { int s=0,n=1; while (n<=100) { s=s+n; n++; } printf("S=%d",s); }
6.4 Do—while语句 do-while语句的一般形式为: do { 语句; }while (表达式); 其中:语句是循环体, 表达式是循环条件。 语句 非0 表达式 0 执行过程:先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。
例1: 编程序求:s=1+2+3+……+100 main() { int s=0,n=1; do { s=s+n; n++; } while (n<=100); printf("S=%d",s); }
使用while和do-while语句应注意以下几点: 1.在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。 2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。 3.当循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。 4.如果循环至少要执行一次,while和do-while语句可以相互替换。
6.5 for语句 for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。 一、使用一般形式为: for(表达式1;表达式2;表达式3) 语句; 其中:表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。 表达式2通常是循环条件,一般为关系表达式或逻辑表达式。 表达式3通常可用来修改循环变量的值,一般是赋值语句。
for语句的执行过程: 1.首先计算表达式1的值。 2.再计算表达式2的值,若值为真(非0)则执行循环体一次, 否则跳出循环。 3.然后再计算表达式3的值,转回第2步重复执行。 在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。 求解表达式1 0 表达式2 非0 语句 语句 求解表达式3 for 语句的执行过程
例:用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,以改变循环变量的值。
二、在使用for语句中要注意以下几点: 1.for语句中的各表达式都可省略,但分号间隔符不能少 如:for(;表达式2;表达式3) 省去了表达式1。 for(表达式1;;表达式3) 省去了表达式2。 for(表达式1;表达式2;) 省去了表达式3。 for(;;) 省去了全部表达式。 2.在循环变量已赋初值时,可省去表达式1。如省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。 例:
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;
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); }
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); } 这里为什么要加;
例:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); } 说明:本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf 语句当成循环体来执行。 反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能执行循环体。
6.6 循环的嵌套 for语句也可与while,do-while语句相互嵌套,构成多重循环。以下形式都合法的嵌套。 (2)do { … do { …} while() … }while(); (1) while( ) {… while( ) {…} … } (3) for() { ……… for() { …… } …… } (4) while() { … for() {…} … }
(5) for( ) {… while( ) {…} … } (6) do{ … for( ) {…} … }while(); (8) for() { ……… do { …… } while(); …… } (7) while() { … do { … }while(); … }
例:打印如下形式的九九乘法表. 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"); } }
6.8 break语句和continue语句 一、break语句 break语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。 break语句的一般形式为: break; 注意: break语句用于循环体中,一般与if语句联合使用。
例:计算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); }
分析下面程序的功能 #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; } } 功能是: 检查输入的一行中有无相邻两字符相同。
done=0; for( … ) { for ( … ) {while ( … ) { if ( … ) { done=1; break; } … } if (done) break; … } if (done) break; } 多层嵌套循环: 可用goto退出 goto stop; 而break;只能退出本层循环。
二、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); } }
6.9 程序举例 例6.6 教材Pg.116 (略) fabs() 例6.7 教材Pg.116 (略)if( i%2==0) printf(“\n”) 例6.8 判断一个整数m是否是素数。教材Pg.118 素数是只能被1 和本身整除的数。
#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 程序流程图
例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");} } }
例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
加密程序如下: #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); } }
解密程序如下: #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
例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); }
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); } }
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) 程序如下