250 likes | 495 Views
第 5 章 循环结构. 图 1.6 当型循环结构. 当 p 为真. A. 循环的基本要素有三个: 循环入口(即循环的初始化条件) 循环出口(即循环的终止条件) 循环体(反复执行的部分) C 语言提供了 3 种循环语句实现循环结构 while 语句 do-while 语句 for 语句. sum=0 , i=1. 表达式. i <=100?. sum=sum+i. 语句. i=i+1. 图 5.1 while 语句的语义. 输出 sum. 5.1 while 语句. while 语句的一般形式为: while ( 表达式 ) 语句;.
E N D
图1.6 当型循环结构 当p为真 A • 循环的基本要素有三个: • 循环入口(即循环的初始化条件) • 循环出口(即循环的终止条件) • 循环体(反复执行的部分) • C语言提供了3种循环语句实现循环结构 • while语句 • do-while语句 • for语句
sum=0,i=1 表达式 i <=100? sum=sum+i 语句 i=i+1 图5.1 while语句的语义 输出sum 5.1while语句 • while语句的一般形式为: while (表达式) 语句; while (i<=100) { sum=sum+i; i=i+1; }
1.求 定义变量i=1, sum=0和n 输入正整数给n i<=n sum=sum+i; i++; 输出sum 图5.2 例5.1N-S图 思考: 【例5.1】计算 2.求1+1/2+1/3+…..+1/n 3.求 累加
使用while语句应注意以下几点: • while语句中的表达式可以是任意表达式,一般是关系表达或逻辑表达式,只要表达式的值为非0 (真)则继续循环。 如: while (n--) printf("%d ",n); • 循环体可以是空语句、单语句或用花括号括起来的复合语句。 • 应注意循环条件的选择以避免死循环。例如下列循环语句: while(n=10) printf("%d ",n++); • while语句从语法上来说是一条完整的控制语句。 • 允许while语句的循环体语句又是while语句,从而形成循环嵌套。 如: i=1; while(i<=9) /* 外循环 */ { j=1; while(j<=i) /* 内循环 */ { printf("%4d ",i*j); j++; } i++; printf("\n"); }
语句 表达式 图54 do-while语句的语义 5.2 do-while语句 • do-while语句的一般形式为: do 语句 while(表达式);
【例5.3】一个人口统计程序,1980年世界人口已达45亿,按年增长率1%计算,问什么年份开始世界人口突破100亿大关。
表达式1 表达式2 语句 表达式3 图5.5 for语句的语义 5.3 for语句 • 一般形式为: for(表达式1;表达式2;表达3) 语句 • 执行过程: ① 计算表达式1的值,为循环变量赋初值。 ② 计算表达式2的值,若值为非0 (真),则执行循环体一次,否则跳出循环。 ③ 计算表达式3的值,转回第②步重复执行。 如:sum=0; for (k=1; k<=100; k++) sum+=k;
定义变量i,n,e_sum,o_sum 输入n e_sum=0; o_sum=0; i=1 i<=n i%2==0 0 非0 o_sum+=i e_sum+=i i++ 输出e_sum和o_sum 图5.6 例5.4N-S图 【例5.4】编程计算正整数1到n中的奇数之和以及偶数之和。
注意: for(表达式1;表达式2;表达3) 语句 • 表达式1一般为赋值表达式,通常用于给循环变量赋初值,所以也称为初值表达式。 • 表达式2一般为关系表达式或逻辑表达式,作为控制循环结束的条件,又称为终值表达式。 • 表达式3一般为赋值表达式,或是其他表达式,通常用于为循环变量增值或减值,又称为增值表达式。 • 三个表达式均可省略,但两个分号不能省略。 • 省略表达式1:此时必须在for语句之前给循环变量赋初值。 如:k=1; for ( ; k<=100 ; k++) s+=k ; • 省略表达式2:认为条件永远为真,出现“死循环”。 如:for ( k=1; ; k++) { s+=k ; if(k>=100) break; } • 省略表达式3:应另设法使循环正常执行。 如:for ( k=1 ; k<=100 ; ) { s+=k ; k++; } • 全省略:“死循环” 如: for (; ; ) sum+=k;
循环体也可以省略,但分号不可省略。“;”代表空语句,表示不执行任何操作,但在语法上不可少。循环体也可以省略,但分号不可省略。“;”代表空语句,表示不执行任何操作,但在语法上不可少。 如:for (k=1 ; k<=10000 ; k++) ; • 表达式1和3还可包含与循环变量无关的其它表达式。 如:for ( s=0, k=1; k<=100 ; k++,s=s+k); for (k=0; k<=100; k++, k++) s+=k; • 表达式2可为任意表达式,只要其值为非零,就执行循环体。 如:for ( k=0; (c=getchar ( ))!=’\n’ ; k++) ; for (; (c=getchar ( ))!=’\n’ ;) printf(“%c”,c); 三种循环语句实现:1+2*2+3*3+……+100*100
for语句也可与while,do-while语句相互嵌套,构成多重循环。for语句也可与while,do-while语句相互嵌套,构成多重循环。 ① for( ) { … while( ) {…} … } ② do { … for( ) {…} … }while( ); ③ while( ) {… for( ) {…} … } ④ for() {… for( ) {…} … }
【例5.6 】有1、2、3三个数字,编写程序输出由这三个数组成的互不相同且无重复数字的两位数。即输出:12,13,21,23,31,32。 main() { int i,j,k; printf("\n"); for (i=1;i<4;i++)/*以下为二重循环*/ for (j=1;j<4;j++) { if (i!=j) /*确保i、j两位互不相同*/ printf("%d%d\n",i,j); } }
【例5.7 】编程打印三角形表示(黑色区域)的九九乘法表 * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81
5.4转移语句 • C语言提供的4种转移语句为:goto,break,continue和return。 • goto语句 • goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; • 改变程序正常流向,转去执行语句标号所标识的语句。 • 语句标号用标识符定义,置于某一语句行的前面,语句标号后加冒号(:) ,语句标号起标识语句的作用。 • 与goto语句配合使用 • 如: label: i++; • …… • goto label;
break语句 • 一般形式为:break; • break语句只能用在switch 语句或循环语句中 • 作用: 跳出switch语句或跳出本层循环,转去执行后面的程序语句。 main() {int i, s; s=0; for(i=1; i<=10; i++) { s=s+i; if(s>5) break; printf(“s=%d\n” , s ); } }
continue语句 • 一般格式是:continue; • 只能用在循环体中 • 语义:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。 • 注意,本语句只结束本层本次的循环,并不跳出循环。 main() { int k=0, s=0, i; for( i=1; i<=3; i++ ) {s=s+i; if(s>2) {printf(“****i=%d,s=%d,k=%d\n”,i, s, k); continue; } k=k+s; printf(“i=%d,s=%d,k=%d\n”,i,s,k); } }
例:打印1-100之内能被7整除的数 main() { int n; for (n=1; n<=100; n++) { if ((n%7)!=0) continue; printf (“%d ”,n); } }
本 章 举 例 【例5.12】有一个古老的传说(棋盘上的麦粒):有一位宰相发明了国际象棋,国王打算奖赏他。国王问他想要什么,宰相对国王说:“陛下,请您在棋盘上的第一小格里,赏给我1粒麦子,第2个小格里给2粒,第3个小格里给4粒,以后每一小格给的麦子都是前一小格的2倍。您像这样把棋盘上的64个小格用麦粒摆满,就把这些麦粒赏给我吧!”请问国王需要拿出多少麦粒? 循环/循环嵌套 思考:求 1!+2!+······+100!
求100~200间的全部素数 #include “math.h” main() { int m,k,i,n=0 ; for (m=101;m<=200;m=m+2) { k=sqrt(m); for (i=2;i<=k;i++) if (m%i==0) break; if (i>=k+1) { printf(“%d”,m); n++; } if (n%10==0) printf(“\n”); } }
加密 #include “stdio.h” main() { char c ; while ((c=getchar())!=‘\n’) { if ((c>=‘a’ && c<=‘z’) || (c>=‘A’ && c<=‘Z’)); { c=c+4; if (c>’Z’ && c<‘Z’+4 || c>’z’) c=c-26; } printf(“%c”,c); } printf(“\n”); }