39
主主主主 主主 [email protected] C 语语语语语语 语语语 语语语语

C 语言程序设计 第六章循环控制

  • Upload
    vida

  • View
    97

  • Download
    4

Embed Size (px)

DESCRIPTION

C 语言程序设计 第六章循环控制. 主要内容. 6.1 While 语句 6.2 do-While 语句 6.3 for 语句 6.4 循环的嵌套 6.5 break 和 continue 语句 6.6 程序举例. for(i=1; i

Citation preview

Page 1: C 语言程序设计 第六章循环控制

主讲教师:李艺[email protected]

C 语言程序设计第六章 循环控制

Page 2: 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 程序举例程序举例

Page 3: C 语言程序设计 第六章循环控制

6-3

6.1 WhileWhile 语句语句

概述概述循环结构、顺序结构、选择结构是结构化程序的三循环结构、顺序结构、选择结构是结构化程序的三

种基本结构,它们共同组成各种复杂程序。种基本结构,它们共同组成各种复杂程序。 为什么使用循环语句?便捷、效率高。比如:为什么使用循环语句?便捷、效率高。比如:

sum=1+2+3…+100;

for(i=1; i<=100; i++) sum=sum+i;

Page 4: C 语言程序设计 第六章循环控制

6-4

6.1 WhileWhile 语句语句

CC 语言中循环语句的实现方式语言中循环语句的实现方式 goto goto 和 和 if … goto(if … goto( 不要求不要求 ))

while while 语句语句 do-while do-while 语句语句 for for 语句语句

Page 5: C 语言程序设计 第六章循环控制

6-5

6.1 WhileWhile 语句语句

while ( “当型” 循环)语句 格式

执行过程 功能:先判断表达式,若为真则执行循环体,再判断

表达式,重复上述过程,直到表达式为假时退出循环。

while( 表达式 ) {

循环体语句; }

表达式

语句

0

非 0

Page 6: C 语言程序设计 第六章循环控制

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);}

循环条件

循环体

Page 7: C 语言程序设计 第六章循环控制

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

Page 8: C 语言程序设计 第六章循环控制

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‘

此表达式的意义是什么?此表达式的意义是什么?

Page 9: C 语言程序设计 第六章循环控制

6-9

6.1 WhileWhile 语句语句

关于 关于 while while 循环语句的说明循环语句的说明 while while 循环先判断表达式,后执行循环体;循环先判断表达式,后执行循环体; 循环体有可能一次也不执行;循环体有可能一次也不执行; 循环体若包含多条语句,应该用循环体若包含多条语句,应该用 { }{ } 括起来;括起来; 循环体应包含使循环趋向结束的语句;循环体应包含使循环趋向结束的语句; 退出退出 whilewhile 循环的情况是:循环的情况是:

条件表达式不成立(为零)条件表达式不成立(为零) 循环体内遇 循环体内遇 break , gotobreak , goto

无限循环(死循环)必须避免:无限循环(死循环)必须避免: while(1)while(1)

循环体 循环体 ;;

Page 10: C 语言程序设计 第六章循环控制

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

Page 11: C 语言程序设计 第六章循环控制

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).

Page 12: C 语言程序设计 第六章循环控制

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

Page 13: C 语言程序设计 第六章循环控制

6-13

6.2 do-whilehile 语句语句

do-whiledo-while ( “直到型”循环)( “直到型”循环)语句语句 格式格式

执行过程执行过程

功能:先执行循环体,然后判断表达式。若为真则再功能:先执行循环体,然后判断表达式。若为真则再次执行循环体,否则退出循环。次执行循环体,否则退出循环。

do {

循环体语句; } while( 表达式 ) ;

循环体语句

表达式

0

非 0

Page 14: C 语言程序设计 第六章循环控制

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);}

循环条件

循环体

Page 15: C 语言程序设计 第六章循环控制

6-15

6.2 do-whilehile 语句语句

关于 do-while 循环语句的说明 do-while 循环先执行循环体,后判断表达式; 循环

体至少执行一次; 同一个问题既可以用 while 循环实现,也可以用 do-

while 循环,两者可以相互转换; 当 while 后的表达式一开始就为假时,两种循环结果

不同!

Page 16: C 语言程序设计 第六章循环控制

6-16

6.3 for 语句语句

for 语句是 C 语言和任何其他计算机语言中最为灵活,使

用最广泛的循环语句。 格式

执行过程

for( 表达式 1 ;表达式 2 ;表达式3)

{ 循环体语句; }

求解表达式 1

表达式 2假

真语句

求解表达式 3

for 语句的下一语句

Page 17: C 语言程序设计 第六章循环控制

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);}

循环步长

Page 18: C 语言程序设计 第六章循环控制

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”); }

Page 19: C 语言程序设计 第六章循环控制

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() { …… }{ …… } … …......}}

Page 20: C 语言程序设计 第六章循环控制

6-20

6.4 循环的嵌套

循环可以互相嵌套,但不能相互交叉。

for for …… …... …...

for for …… …... …...

√√ ××

Page 21: C 语言程序设计 第六章循环控制

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 次

Page 22: C 语言程序设计 第六章循环控制

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"); } }

Page 23: C 语言程序设计 第六章循环控制

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);

}

Page 24: C 语言程序设计 第六章循环控制

6-24

6.4 循环的嵌套

几种循环的比较

语 句 适用范围 说 明

while只知道结束条件而无法确定执行次数的情况下。

① 循环变量初始化在循环体之前② 循环体中应包含使循环结束的语句③ 可以用 break 和 continue 语句控制do-while 至少执行一次时

if~goto 无条件循环 该循环不能用 break 和 continue 语句控制

for不知或已知执行次数都可以或已知初值,终值和步长。

使用比较灵活

Page 25: C 语言程序设计 第六章循环控制

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

Page 26: C 语言程序设计 第六章循环控制

6-26

6.56.5 break break 和和 continuecontinue 语句语句

常表 1 常表 2 常表 n default

case

语句 1break;

语句 2break;

语句 nbreak;

语句break;…

switch

表达式

Page 27: C 语言程序设计 第六章循环控制

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

Page 28: C 语言程序设计 第六章循环控制

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; } }

Page 29: C 语言程序设计 第六章循环控制

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 必须执行

Page 30: C 语言程序设计 第六章循环控制

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); } } } }

Page 31: C 语言程序设计 第六章循环控制

6-31

6.56.5 break break 和和 continuecontinue 语句语句

break break 和 和 continue continue 语句的区别语句的区别 continue 语句只结束本次循环, break 语句则是结

束整个循环。 continue 语句只用于 while,do-while,for 循环语句中,

break 语句还可以用于 switch 语句中。

Page 32: C 语言程序设计 第六章循环控制

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

Page 33: C 语言程序设计 第六章循环控制

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

循环结束条件

累加项 分母符号最终值

Page 34: C 语言程序设计 第六章循环控制

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?

Page 35: C 语言程序设计 第六章循环控制

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

Page 36: C 语言程序设计 第六章循环控制

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;

}}

Page 37: C 语言程序设计 第六章循环控制

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 。

Page 38: C 语言程序设计 第六章循环控制

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!

Page 39: C 语言程序设计 第六章循环控制

6-39

本章小结本章小结

do whiledo while 语句至少执行一次循环体;语句至少执行一次循环体; 注意注意 forfor 循环中各表达式的作用及执行次序。循环中各表达式的作用及执行次序。 for(for( 表达式表达式

1;1; 表达式表达式 2;2; 表达式表达式 3)3) ,表达式,表达式 11初始执行,仅执行一次;初始执行,仅执行一次;接下来执行表达式接下来执行表达式 22 ,以判断是否退出循环,如果执行了,以判断是否退出循环,如果执行了循环,接下来执行表达式循环,接下来执行表达式 33 ;;

breakbreak 和和 continuecontinue 的区别,的区别, breakbreak 是结束本层循环,是结束本层循环, contcont

inueinue 是结束本次循环。是结束本次循环。