390 likes | 538 Vues
C 语言程序设计 第六章 循环控制. 主要内容. 6.1 While 语句 6.2 do-While 语句 6.3 for 语句 6.4 循环的嵌套 6.5 break 和 continue 语句 6.6 程序举例. for(i=1; i<=100; i++) sum=sum+i;. 6.1 While 语句. 概述 循环结构、顺序结构、选择结构是结构化程序的三种基本结构,它们共同组成各种复杂程序。 为什么使用循环语句?便捷、效率高。比如:. sum=1+2+3…+100;. 6.1 While 语句. C 语言中循环语句的实现方式
E N D
主要内容 6.1 While语句 6.2 do-While语句 6.3 for语句 6.4循环的嵌套 6.5break 和continue 语句 6.6 程序举例
for(i=1; i<=100; i++) sum=sum+i; 6.1 While语句 • 概述 循环结构、顺序结构、选择结构是结构化程序的三种基本结构,它们共同组成各种复杂程序。 • 为什么使用循环语句?便捷、效率高。比如: sum=1+2+3…+100;
6.1 While语句 • C语言中循环语句的实现方式 • goto 和 if … goto(不要求) • while 语句 • do-while 语句 • for 语句
0 表达式 非0 语句 6.1 While语句 • while( “当型” 循环)语句 • 格式 • 执行过程 • 功能:先判断表达式,若为真则执行循环体,再判断表达式,重复上述过程,直到表达式为假时退出循环。 • while(表达式) • { • 循环体语句; • }
i =1 N i≤ 100 Y sum=sum+i i=i+1 循环条件 循环体 6.1 While语句 • 例1: 用 while 语句构成循环,求 void main( ) { int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum); }
6.1 While语句 例2: 用 while 语句构成循环,显示1~10的平方void main() { int i=1; while(i<=10) { printf("%d*%d=%d\n",i,i,i*i); i++; } } 运行结果:1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100
此表达式的意义是什么? getchar()!='\n‘ 6.1 While语句 例3: 统计从键盘输入一行字符的个数。#include<stdio.h> void main( ) { int n=0; printf("input a string:\n"); while ( getchar()!='\n‘ ) n++; printf("%d",n); }
6.1 While语句 • 关于 while 循环语句的说明 • while 循环先判断表达式,后执行循环体; • 循环体有可能一次也不执行; • 循环体若包含多条语句,应该用{ }括起来; • 循环体应包含使循环趋向结束的语句; • 退出while循环的情况是: • 条件表达式不成立(为零) • 循环体内遇 break , goto • 无限循环(死循环)必须避免: while(1) 循环体 ;
6.1 While语句 • 习题6.4:求 ,(即求 1!+ 2!+ … + 20!)。 #include <stdio.h> void main() { int i,t,sum; t=1;i=1; sum=0; while(i<=20) { t=t*i; sum=sum+t; i++; } printf("sum=%d\n",sum);} 运行结果:s=268040729
6.1 While语句 • 习题6.10:猴子吃桃问题。猴子第一天摘下若干桃子,当即吃了一半多一个;第二天又吃了剩下的一半多一个,以后每天都吃了前一天剩下的一半多一个。到第10天就只剩下一个桃子了。求桃子的总数是多少。 • 分析: • 第10天桃子的总数sum10 = 1; • 第9天桃子总数sum9 = 2*(sum10 + 1); • 第8天绦子总数sum8 = 2*(sum9 + 1); • … • 第1天桃子总数sum1 = 2*(sum2 + 1).
6.1 While语句 #include<stdio.h> void main() { int sum,day; day=9; sum=1; while(day>=1) { sum=2*(sum+1); day--; } printf(“sum=%d\n”,sum); } 运行结果:sum=1534
循环体语句 非0 表达式 0 6.2 do-while语句 • do-while( “直到型”循环)语句 • 格式 • 执行过程 • 功能:先执行循环体,然后判断表达式。若为真则再次执行循环体,否则退出循环。 • do • { • 循环体语句; • } • while(表达式) ;
i =1 sum=sum+i i=i+1 循环条件 Y i≤ 100 循环体 N 6.2 do-while语句 例 用 do-while 语句构成循环,求 main( ) { int i,sum=0; i=1; do { sum= sum+i; i++; } while(i<=100); printf("%d",sum); }
6.2 do-while语句 • 关于 do-while 循环语句的说明 • do-while 循环先执行循环体,后判断表达式; 循环体至少执行一次; • 同一个问题既可以用while 循环实现,也可以用do-while 循环,两者可以相互转换; • 当while后的表达式一开始就为假时,两种循环结果不同!
求解表达式1 假 表达式2 真 语句 求解表达式3 for语句的下一语句 6.3 for 语句 • for 语句 是 C 语言和任何其他计算机语言中最为灵活,使用最广泛的循环语句。 • 格式 • 执行过程 • for(表达式1;表达式2;表达式3) • { 循环体语句; }
i=1 N i≤ 100 Y sum=sum+i i ++ 循环步长 for下面的语句 6.3 for 语句 • 例 用 for 语句构成循环,求 main( ) { int i,sum=0; for(i=1;i<=100;i++) sum=sum+i; printf("%d",sum); }
6.3 for 语句 • 关于 for 循环语句的说明 • for循环中表达式1,2,3均可以省略,但是分号不能省略。 • for( ; ; ) 相当于 while(1) ,即死循环 #include<stdio.h>void main(){ char c; for(;(c=getchar())!=‘\n’;) printf(“%c”,c); printf(“\n”);} 运行结果:a b c d e f g←┘ a b c d e f g
6.4 循环的嵌套 • 定义 一个循环体内包含另一个完整的循环结构,称为循环的嵌套。三种循环可以互相嵌套,层数不限。 while() { …… while() { …… } …... } do { …… do { …… } while(); …... }while( ); while() { …… do { …… }while(); ……. } for( ; ;) {…… do { ……}while(); …… while() { …… } …... }
6.4 循环的嵌套 • 循环可以互相嵌套,但不能相互交叉。 for for …… …... …... for for …… …... …... √ ×
6.4 循环的嵌套 • 下列循环各执行多少次? for (i=1; i<=10; i++){……}; for (i=1; i<=10; i=i+2){……}; for (i=1; i<=10; i=i+3){……}; for (i=1; i<=20; i++){ i=i*2……}; 10次 5次 4次 5次
6.4 循环的嵌套 • 例题:试打印乘法九九表。 #include<stdio.h> void main() { int i,j; printf("*"); for (i=1;i<10;i++) printf("%4d",i); printf("\n---------------------------------------\n"); for (i=1;i<10;i++) { printf("%d",i); for (j=1;j<=i;j++) printf("%4d",i*j); printf("\n"); } }
6.4 循环的嵌套 • 例题:大鸡每只3元,老鸡每只2元,小鸡两只1元,如何用百元购得百鸡,怎么组合? #include<stdio.h> void main() { int i,j,k; printf(“购买鸡的组合有:\n"); for(i=0;i<34;i++) for(j=0;j<=50;j++) for(k=0;k<=200;k++) if (3*i+2*j+0.5*k==100 && i+j+k==100) printf("%4d, %4d, %4d\n", i, j, k);}
无条件循环 if~goto 该循环不能用break 和continue 语句控制 只知道结束条件 而无法确定执行 次数的情况下。 while do-while 至少执行一次时 不知或已知执行次数都可以 或已知初值,终值和步长。 使用比较灵活 for 6.4 循环的嵌套 • 几种循环的比较 语 句 适用范围 说 明 ① 循环变量初始化在循环体之前 ② 循环体中应包含使循环结束的语句 ③ 可以用 break 和continue 语句控制
for expr1 假(0) expr2 真(非0) do …… break; …... while 假(0) …… break; …... expr 真(非0) expr3 …… break; …… 真 while expr 假(0) 6.5break 和continue语句 • break 语句 • 功能:只能用在循环语句和switch语句中,终止并跳出循环体。 • 说明: • break只能终止并跳出最近一层的循环结构。 • break只能用于循环语句和switch语句之中。
switch 表达式 case 常表 1 常表2 常表 n default 语句 break; 语句1 break; 语句2 break; 语句n break; … 6.5break 和continue语句
r =1 N r ≤ 10 Y area=3.14*r*r Y area>100 N i ++ for循环下面的语句 6.5break 和continue语句 • 例 break举例:输出圆面积,面积大于100时停止 void main( ) { int r ; float area; for(r=1;r<=10;r++) { area=3.14*r*r ; if(area>100) break; printf("r=%d,area=%f",r,area); } } 使用break跳出整个循环
6.5break 和continue语句 • 例 break举例:小写字母转换成大写字母,直至输入非字母字符 #include <stdio.h> void main() { int i,j; char c; while(1) { c=getchar(); if (c>='a' && c<='z') putchar(c-'a'+'A'); else break; } }
while for 假(0) expr do 表达式1 真(非0) 假(0) 表达式2 …… continue; …… …… continue; …... 真(非0) …… continue; …... 真(非0) while expr 表达式3 假(0) 6.5break 和continue语句 跳出循环体,但是expr3必须执行 • continue 语句 • 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。continue 语句仅用于循环语句中。
6.5break 和continue语句 • continue举例:把100~200之间的不能被3整除的数输出 #include <stdio.h> void main() { int i; for(i=100;i<=200;i++) { if(i%3==0) continue; printf(“%d ”,i); } }
6.5break 和continue语句 • break 和 continue 语句的区别 • continue 语句只结束本次循环,break语句则是结束整个循环。 • continue 语句只用于while,do-while,for循环语句中,break语句还可以用于switch语句中。
t=1,pi=1,n=1.0,s=1 当|t|1e-6 n=n+2 s=-s t=s/n pi=pi+t pi=pi*4 输出pi 6.6 程序举例 • 例1:用π/4 = 1 - 1/3 + 1/5 – 1/7 + … 公式求π的近似值。 • 分析: 符号:1,-1,1,-1… 分母:1,3,5,7,... π= (1 – 1/3 + 1/5 -1/7 +…)*4
循环结束条件 累加项 符号 最终值 分母 6.6 程序举例 #include <math.h> #include<stdio.h> void main() { int s; float n,t,pi; t=1; pi=0; n=1; s=1; while((fabs(t))>=1e-6) { pi=pi+t; n=n+2; s= -s; t=s/n; } pi=pi*4; printf("pi=%10.6f\n",pi); } 运行结果:pi = 3.141594
6.6 程序举例 • 例2 求输入的十个整数中正数的和及其平均值 #include <stdio.h>void main(){ int i,num=0,a; float sum=0; for(i=0;i<10;i++) { scanf("%d",&a); if(a<=0) continue; num++; sum+=a; } printf("%d plus integer's sum :%6.0f\n",num,sum); printf("Mean value:%6.2f\n",sum/num);} 1 2 3 4 5 -1 -22 -23 -14 -5 5 plus integer’s sum : 15 Mean value: 3.00 Sum为什么设为float?
1 5 34 233 1597 10946 75025 514229 3524578 24157817 1 8 55 377 2584 17711 121393 832040 5702887 39088169 2 13 89 610 4181 28657 196418 1346269 9227465 63245986 3 21 144 987 6765 46368 317811 2178309 14930352 102334155 6.6 程序举例 • 例3 求Fibonacci数列:1,1,2,3,5,8,……的前40个数 • 分析: Fibonacci数列定义: F1 = 1 (n=1) F2 = 1 (n=2) Fn = Fn-1 + Fn-2 (n≥3)
6.6 程序举例 #include <stdio.h>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; }}
ABCDEFGHIJKLMNOPQRSTUVWXYZ 6.6 程序举例 • 例4 译密码。例如 Hello,world! 译成密码:Lipps,asvph! • 算法: • 当输入字符不是“回车”时,执行密码转换。 • 仅转换A~Z、a~z。 • 转换规则:c=c+4,当c=Z~Z+4范围,或c>z时,c=c-26。
6.6 程序举例 #include <stdio.h>void 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); }} 运行结果:Hello,world! Lipps,asvph!
本章小结 • do while语句至少执行一次循环体; • 注意for循环中各表达式的作用及执行次序。for(表达式1;表达式2;表达式3),表达式1初始执行,仅执行一次;接下来执行表达式2,以判断是否退出循环,如果执行了循环,接下来执行表达式3; • break和continue的区别,break是结束本层循环,continue是结束本次循环。