c 语言程序设计 第六章循环控制
DESCRIPTION
C 语言程序设计 第六章循环控制. 主要内容. 6.1 While 语句 6.2 do-While 语句 6.3 for 语句 6.4 循环的嵌套 6.5 break 和 continue 语句 6.6 程序举例. for(i=1; iTRANSCRIPT
主讲教师:李艺[email protected]
C 语言程序设计第六章 循环控制
6-2
主要内容主要内容
6.1 While6.1 While 语句语句
6.2 do-While6.2 do-While 语句语句
6.3 for6.3 for 语句语句
6.46.4 循环的嵌套循环的嵌套
6.56.5 break break 和和 continue continue 语句语句
6.6 6.6 程序举例程序举例
6-3
6.1 WhileWhile 语句语句
概述概述循环结构、顺序结构、选择结构是结构化程序的三循环结构、顺序结构、选择结构是结构化程序的三
种基本结构,它们共同组成各种复杂程序。种基本结构,它们共同组成各种复杂程序。 为什么使用循环语句?便捷、效率高。比如:为什么使用循环语句?便捷、效率高。比如:
sum=1+2+3…+100;
for(i=1; i<=100; i++) sum=sum+i;
6-4
6.1 WhileWhile 语句语句
CC 语言中循环语句的实现方式语言中循环语句的实现方式 goto goto 和 和 if … goto(if … goto( 不要求不要求 ))
while while 语句语句 do-while do-while 语句语句 for for 语句语句
6-5
6.1 WhileWhile 语句语句
while ( “当型” 循环)语句 格式
执行过程 功能:先判断表达式,若为真则执行循环体,再判断
表达式,重复上述过程,直到表达式为假时退出循环。
while( 表达式 ) {
循环体语句; }
表达式
语句
0
非 0
6-6
6.1 WhileWhile 语句语句
例 1: 用 while 语句构成循环,求
i≤ 100
sum=sum+i
i=i+1
N
Y
i =1void main( ){ int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum);}
循环条件
循环体
6-7
6.1 WhileWhile 语句语句
例 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
6-8
6.1 WhileWhile 语句语句
例例 33 : 统计从键盘输入一行字符的个数。: 统计从键盘输入一行字符的个数。 #include<stdio.h> void main( ) { int n=0; printf("input a string:\n"); while ( getchar()!='\n‘ )
n++; printf("%d",n); }
getchar()!='\n‘
此表达式的意义是什么?此表达式的意义是什么?
6-9
6.1 WhileWhile 语句语句
关于 关于 while while 循环语句的说明循环语句的说明 while while 循环先判断表达式,后执行循环体;循环先判断表达式,后执行循环体; 循环体有可能一次也不执行;循环体有可能一次也不执行; 循环体若包含多条语句,应该用循环体若包含多条语句,应该用 { }{ } 括起来;括起来; 循环体应包含使循环趋向结束的语句;循环体应包含使循环趋向结束的语句; 退出退出 whilewhile 循环的情况是:循环的情况是:
条件表达式不成立(为零)条件表达式不成立(为零) 循环体内遇 循环体内遇 break , gotobreak , goto
无限循环(死循环)必须避免:无限循环(死循环)必须避免: while(1)while(1)
循环体 循环体 ;;
6-10
6.1 WhileWhile 语句语句
习题 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-11
6.1 WhileWhile 语句语句
习题 6.10 :猴子吃桃问题。猴子第一天摘下若干桃子,当即吃了一半多一个;第二天又吃了剩下的一半多一个,以后每天都吃了前一天剩下的一半多一个。到第 10 天就只剩下一个桃子了。求桃子的总数是多少。
分析: 第 10 天桃子的总数 sum10 = 1; 第 9 天桃子总数 sum9 = 2*(sum10 + 1) ; 第 8 天绦子总数 sum8 = 2*(sum9 + 1) ; … 第 1 天桃子总数 sum1 = 2*(sum2 + 1).
6-12
6.1 WhileWhile 语句语句
#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
6-13
6.2 do-whilehile 语句语句
do-whiledo-while ( “直到型”循环)( “直到型”循环)语句语句 格式格式
执行过程执行过程
功能:先执行循环体,然后判断表达式。若为真则再功能:先执行循环体,然后判断表达式。若为真则再次执行循环体,否则退出循环。次执行循环体,否则退出循环。
do {
循环体语句; } while( 表达式 ) ;
循环体语句
表达式
0
非 0
6-14
6.2 do-whilehile 语句语句
例 用 do-while 语句构成循环,求
i≤ 100
sum=sum+i
i=i+1
N
Y
i =1 main( ){ int i,sum=0; i=1; do { sum= sum+i; i++; } while(i<=100); printf("%d",sum);}
循环条件
循环体
6-15
6.2 do-whilehile 语句语句
关于 do-while 循环语句的说明 do-while 循环先执行循环体,后判断表达式; 循环
体至少执行一次; 同一个问题既可以用 while 循环实现,也可以用 do-
while 循环,两者可以相互转换; 当 while 后的表达式一开始就为假时,两种循环结果
不同!
6-16
6.3 for 语句语句
for 语句是 C 语言和任何其他计算机语言中最为灵活,使
用最广泛的循环语句。 格式
执行过程
for( 表达式 1 ;表达式 2 ;表达式3)
{ 循环体语句; }
求解表达式 1
表达式 2假
真语句
求解表达式 3
for 语句的下一语句
6-17
6.3 for 语句语句
例 用 for 语句构成循环,求
i≤ 100
sum=sum+i
N
Y
i=1
for 下面的语句
i ++
main( ){ int i,sum=0; for(i=1;i<=100;i++) sum=sum+i; printf("%d",sum);}
循环步长
6-18
6.3 for 语句语句
关于 for 循环语句的说明 for 循环中表达式 1 , 2 , 3 均可以省略,但是分号不能省略。 for( ; ; ) 相当于 while(1) ,即死循环
运行结果: a b c d e f g←┘
a b c d e f g
#include<stdio.h> void main() { char c; for(;(c=getchar())!=‘\n’;) printf(“%c”,c); printf(“\n”); }
6-19
6.4 循环的嵌套
定义一个循环体内包含另一个完整的循环结构,称为循
环的嵌套。三种循环可以互相嵌套,层数不限。
while()while(){ ……{ …… while()while() { ……{ …… }} … …......}}
dodo{ ……{ …… dodo { ……{ …… } while();} while(); … …......}while( );}while( );
while()while(){ ……{ …… dodo { ……{ …… }while();}while(); …… …….. }}
for( ; ;)for( ; ;){……{…… dodo { ……}while();{ ……}while(); …… …… while()while() { …… }{ …… } … …......}}
6-20
6.4 循环的嵌套
循环可以互相嵌套,但不能相互交叉。
for for …… …... …...
for for …… …... …...
√√ ××
6-21
6.4 循环的嵌套
下列循环各执行多少次?下列循环各执行多少次?
for (i=1; i<=10; i++){……};for (i=1; i<=10; i++){……};
for (i=1; i<=10; i=i+2){……};for (i=1; i<=10; i=i+2){……};
for (i=1; i<=10; i=i+3){……};for (i=1; i<=10; i=i+3){……};
for (i=1; i<=20; i++){ i=i*2……};for (i=1; i<=20; i++){ i=i*2……};
10 次
5 次
4 次
5 次
6-22
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-23
6.4 循环的嵌套
例题:大鸡每只例题:大鸡每只 33元,老鸡每只元,老鸡每只 22元,小鸡两只元,小鸡两只 11元,元,如何用百元购得百鸡,怎么组合?如何用百元购得百鸡,怎么组合?
#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);
}
6-24
6.4 循环的嵌套
几种循环的比较
语 句 适用范围 说 明
while只知道结束条件而无法确定执行次数的情况下。
① 循环变量初始化在循环体之前② 循环体中应包含使循环结束的语句③ 可以用 break 和 continue 语句控制do-while 至少执行一次时
if~goto 无条件循环 该循环不能用 break 和 continue 语句控制
for不知或已知执行次数都可以或已知初值,终值和步长。
使用比较灵活
6-25
expr
……break;……
假 (0)
真 ( 非 0)
while
6.56.5 break break 和和 continuecontinue 语句语句
break break 语句语句 功能:只能用在循环语句和功能:只能用在循环语句和 switchswitch 语句中语句中 ,,终止并跳出循环体。终止并跳出循环体。 说明:说明:
breakbreak 只能终止并跳出最近一层的循环结构。只能终止并跳出最近一层的循环结构。 breakbreak 只能用于循环语句和只能用于循环语句和 switchswitch 语句之中。语句之中。
while
do
……break;…...
expr
假 (0)
真
expr2
……break;…...
假 (0)
真 ( 非 0)
for
expr1
expr3
6-26
6.56.5 break break 和和 continuecontinue 语句语句
常表 1 常表 2 常表 n default
case
语句 1break;
语句 2break;
语句 nbreak;
语句break;…
switch
表达式
6-27
6.56.5 break break 和和 continuecontinue 语句语句
例 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跳
出整个循环
r ≤ 10
area=3.14*r*r
N
Y
i ++
for 循环下面的语句
area>100
N
Y
r =1
6-28
6.56.5 break break 和和 continuecontinue 语句语句
例 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; } }
6-29
6.56.5 break break 和和 continuecontinue 语句语句
continue continue 语句语句 功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。 continue 语句仅用于循环语句中。
while真 ( 非 0)
expr
假 (0)
……continue;
…...
do
expr
……continue;
……
假 (0)
真 ( 非 0)
while
表达式 2
……continue;
…...
假 (0)
真 (非 0)
表达式 1
表达式 3
for
跳出循环体,但是 expr3 必须执行
6-30
6.56.5 break break 和和 continuecontinue 语句语句
continue 举例:把 100~200之间的不能被 3 整除的数输出
#include <stdio.h>#include <stdio.h> void main() void main() { int i; { int i; for(i=100;i<=200;i++) for(i=100;i<=200;i++) { if(i%3==0) continue; { if(i%3==0) continue; printf(“%d ”,i); printf(“%d ”,i); } } } }
6-31
6.56.5 break break 和和 continuecontinue 语句语句
break break 和 和 continue continue 语句的区别语句的区别 continue 语句只结束本次循环, break 语句则是结
束整个循环。 continue 语句只用于 while,do-while,for 循环语句中,
break 语句还可以用于 switch 语句中。
6-32
6.6 6.6 程序举例程序举例
例 1 :用 π/4 = 1 - 1/3 + 1/5 – 1/7 + … 公式求 π 的近似值。 分析:
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
符号: 1 , -1 , 1 , -1…分母: 1 , 3 , 5 , 7 , ...
π= (1 – 1/3 + 1/5 -1/7 +…)*4
6-33
6.6 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-34
6.6 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);}
1122334455-1-1-22-22-23-23-14-14-5-55 plus integer’s sum : 155 plus integer’s sum : 15Mean value: 3.00Mean value: 3.00
SumSum 为什么设为为什么设为 floafloat?t?
6-35
6.6 6.6 程序举例程序举例
例例 3 3 求求 FibonacciFibonacci 数列:数列: 11 ,, 11 ,, 22 ,, 33 ,, 55 ,, 88 ,……的前,……的前 4040
个数个数 分析: 分析: FibonacciFibonacci 数列定义:数列定义:
FF11 = 1 = 1 (( n=1n=1 ))
FF22 = 1 = 1 (( n=2n=2 ))
FFnn = F = Fn-1n-1 + F + Fn-2n-2 (n≥3) (n≥3)15
34233
15971094675025
5142293524578
24157817
18
55377
258417711
121393832040
570288739088169
21389
6104181
28657196418
13462699227465
63245986
321
144987
676546368
3178112178309
14930352102334155
6-36
6.6 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;
}}
6-37
6.6 6.6 程序举例程序举例
例 4 译密码。例如 Hello,
world! 译成密码: Lipps,a
svph!
算法:1. 当输入字符不是“回车”
时,执行密码转换。2. 仅转换 A~ Z 、 a~ z 。3. 转换规则: c=c+4 ,当 c
=Z~ Z+4范围,或 c>z
时, c=c-26 。
6-38
6.6 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!
6-39
本章小结本章小结
do whiledo while 语句至少执行一次循环体;语句至少执行一次循环体; 注意注意 forfor 循环中各表达式的作用及执行次序。循环中各表达式的作用及执行次序。 for(for( 表达式表达式
1;1; 表达式表达式 2;2; 表达式表达式 3)3) ,表达式,表达式 11初始执行,仅执行一次;初始执行,仅执行一次;接下来执行表达式接下来执行表达式 22 ,以判断是否退出循环,如果执行了,以判断是否退出循环,如果执行了循环,接下来执行表达式循环,接下来执行表达式 33 ;;
breakbreak 和和 continuecontinue 的区别,的区别, breakbreak 是结束本层循环,是结束本层循环, contcont
inueinue 是结束本次循环。是结束本次循环。