30
6 第第第第 第第第第第第第 第第第第第第 第第第 循循循循 第第第第

循环型程序设计

Embed Size (px)

DESCRIPTION

第六章 循环控制. 循环型程序设计. 辅助控制语句. 程序举例. 概述 C 语言可实现循环的语句: 用 goto 和 if 构成循环 while 语句 do ~ while 语句 for 语句. 6.1 循环型程序设计. goto 语句及用 goto 构成循环 goto 语句一般格式:. goto 语句标号 ; ….….. 标号:语句 ;. 功能:无条件转移语句 说明 ( 语句标号 ) : 不能用整数作标号; 只能出现在 goto 所在函数内,且唯一; 只能加在可执行语句前面; 限制使用 goto 语句; - PowerPoint PPT Presentation

Citation preview

Page 1: 循环型程序设计

第 6 章 循环结构

循环型程序设计

辅助控制语句

第六章 循环控制

程序举例

Page 2: 循环型程序设计

第 6 章 循环结构

– 概述C 语言可实现循环的语句:

用 goto 和 if 构成循环while 语句do ~ while 语句for 语句

§6.1 循环型程序设计

Page 3: 循环型程序设计

第 6 章 循环结构

功能:无条件转移语句说明 (语句标号 ):

不能用整数作标号;只能出现在 goto 所在函数内 ,且唯一;只能加在可执行语句前面;限制使用 goto 语句;

(1) 与 if 语句一起构成循环结构。 (2) 从循环体中跳转到循环体外。

goto 语句及用 goto 构成循环•goto 语句一般格式:

goto 语句标号; ….…..标号:语句;

Page 4: 循环型程序设计

第 6 章 循环结构

goto 可以跳过若干个末被执行的语句去执行

goto 也可以跳过若干个已被执行的语句去重复执行某些语句

Page 5: 循环型程序设计

第 6 章 循环结构

例 用 if 和 goto 语句构成循环,求

#include <stdio.h>main(){ int i,sum=0; i=1;loop: if(i<=100) { sum+=i;

i++; goto loop;

} printf("%d",sum);}

sum=0+1sum==1+2=3sum=3+3=6sum=6+4……sum=4950+100=5050

循环初值

循环终值循环变量增值

循环条件

循环体

Page 6: 循环型程序设计

第 6 章 循环结构

while 语句一般形式:

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

执行流程:

expr

循环体

假 (0)

真 ( 非 0)

while

Page 7: 循环型程序设计

第 6 章 循环结构

说明:循环体有可能一次也不执行;循环体可为任意类型语句;循环体如果包含一个以上的语句,应该用 {}:下列情况,退出 while 循环;

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

循环体中一般有使循环趋向结束的语句,也有无限循环, 如 while(1) 循环体 ;

特点:先判断表达式,后执行循环体

Page 8: 循环型程序设计

第 6 章 循环结构

例 用 while 循环求

#include <stdio.h>main(){ int i,sum=0; i=1; while(i<=100) { sum=sum+i; i++; } printf("%d",sum);}

循环初值

循环终值循环变量增值

循环条件

循环体

Page 9: 循环型程序设计

第 6 章 循环结构

例 显示 1~10 的平方

#include <stdio.h>main(){ int i=1; while(i<=10) { printf("%d*%d=%d\n",i,i,i*i); i++; }}

运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100

Page 10: 循环型程序设计

第 6 章 循环结构

do~while 语句一般形式:

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

执行流程: do

循环体

expr

假 (0)

真 ( 非 0)while

Page 11: 循环型程序设计

第 6 章 循环结构

特点:先执行循环体,后判断表达式说明:

至少执行一次循环体do~while 可转化成 while 结构

expr

循环体

假 (0)

真 ( 非 0)

循环体While 循环

Page 12: 循环型程序设计

第 6 章 循环结构

例 用 do~while 循环求

#include <stdio.h>main(){ int i,sum=0; i=1; do { sum+=i;

i++; }while(i<=100); printf("%d",sum);}

Page 13: 循环型程序设计

第 6 章 循环结构 while 和 do~while 比较

#include <stdio.h>main(){ int i,sum=0; scanf("%d",&i); do { sum+=i;

i++; }while(i<=10); printf(“sum=%d",sum);}

#include <stdio.h>main(){ int i,sum=0; scanf("%d",&i); while(i<=10) { sum+=i;

i++; } printf(" sum= %d",sum);}

运行结果: 1 sum= 55

运行结果: 1 sum= 55运行结果: 11 sum=0

运行结果: 11 sum= 11

结论:当 while 后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,两者结果不相同。

Page 14: 循环型程序设计

第 6 章 循环结构 for 语句

一般形式 for([expr1] ;[ expr2] ;[ expr3]) 循环体语句;

执行流程:

expr2

循环体

假 (0)

真 ( 非 0)

for

expr1

expr3

Page 15: 循环型程序设计

第 6 章 循环结构 for 语句一般应用形式:

for( 循环变量赋初值;循环条件;循环变量增值 ){

循环体语句;}

说明:for 语句中 expr1, expr2 ,expr3 类型任意,都可省略,

但他们之间分号;不可省无限循环 : for(;;)for 语句可以转换成 while 结构

expr1;while(expr2){

循环体语句;expr3;

}

例 用 for 循环求

#include <stdio.h>main(){ int i,sum=0; for(i=1;i<=100;i++) sum+=i; printf("%d",sum);}

Page 16: 循环型程序设计

第 6 章 循环结构

例: #include<stdio.h> main( ) { int i=0; for(i=0;i<10;i++) putchar(‘a’+i); }

运行结果均为: abcdefghij

例: #include<stdio.h> main( ) { int i=0; for(;i<10;i++) putchar(‘a’+i); }

例: #include<stdio.h> main( ) { int i=0; for(;i<10;) putchar(‘a’+(i++)); }

例: #include<stdio.h> main( ) { int i=0; for(;i<10;putchar(‘a’+i),i++) ; }

Page 17: 循环型程序设计

第 6 章 循环结构

#include<stdio.h>main(){ int i,j,k; for(i=0,j=100;i<=j;i++,j--) { k=i+j;

printf("%d+%d=%d\n",i,j,k); }}

Page 18: 循环型程序设计

第 6 章 循环结构

#include<stdio.h>main(){ char c; for(;(c=getchar())!='\n';) printf("%c ",c);}

#include <stdio.h>main(){ int i,c; for(i=0;(c=getchar())!='\n';i+=3)

printf("%c ",i+c);}

输出字符,以回车换行结束。

Page 19: 循环型程序设计

第 6 章 循环结构 循环的嵌套

三种循环可互相嵌套 ,层数不限外层循环可包含两个以上内循环 ,但不能相互交叉嵌套循环的执行流程

(1) while() { …… while() { …… } …... }

(2) do { …… do { …… }while( ); …... }while( );

(3) while() { …… do { …… }while( ); ……. }

(4) for( ; ;) { …… do { …… }while(); …… while() { …… } …...}

内循环

外循环

内循环嵌套循环的跳转禁止:

从外层跳入内层跳入同层的另一循环

Page 20: 循环型程序设计

第 6 章 循环结构 例 循环嵌套,输出九九表

1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9

2 4 6 8 10 12 14 16 18

3 6 9 12 15 18 21 24 27

9 18 27 36 45 54 63 72 81

……………..

i

j#include <stdio.h>main(){ int i,j; for(i=1;i<10;i++) printf("%4d",i); printf("\n---------------------------------------\n"); for(i=1;i<10;i++) for(j=1;j<10;j++)

printf((j= =9)?"%4d\n":"%4d",i*j);}

Page 21: 循环型程序设计

第 6 章 循环结构 for(i=1;i<10;i++) for(j=1;j<10;j++) printf((j==9)?"%4d\n":"%4d",i*j); i<10

printf

假 (0)

真 ( 非 0)

i=1

j++

j=1

j<10真 ( 非 0

)

假 (0)

i++

外循环

内循环

返回

Page 22: 循环型程序设计

第 6 章 循环结构

§ 6.2 辅助控制语句– break 语句

• 功能:在循环语句和 switch 语句中 , 终止并跳出循环体,即提前结束循环,接着执行循环下面的语句。

• 说明:– break 只能终止并跳出最近一层的结构– break 不能用于循环语句和 switch 语句之外的任

何其它语句之中。

Page 23: 循环型程序设计

第 6 章 循环结构

expr

……

break;

……

假 (0)

真 ( 非 0)

whiledo

……

break;

…...

expr

假 (0)

真 ( 非 0)while

Page 24: 循环型程序设计

第 6 章 循环结构

expr2

……

break;

…...

假 (0)

真 ( 非 0)

for

expr1

expr3

switch

expr

语句组 1

break;

语句组 2

break;

语句组 n

break;

语句组

break;

…...

const 1 const 2 const n default

case

Page 25: 循环型程序设计

第 6 章 循环结构

例 break 举例:输出圆面积,面积大于 100 时停止

#define PI 3.14159main(){ int r; float area; for(r=1;r<=10;r++) { area=PI*r*r; if(area>100)

break; printf("r=%d,area=%.2f\n",r,area); }}

Page 26: 循环型程序设计

第 6 章 循环结构 continue 语句

功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中

expr

……

continue;

……

假 (0)

真 ( 非 0)

while

真 ( 非 0)

do

……

continue;

…...

expr

假 (0)

while

expr2

……

continue;

…...

假 (0)

真 ( 非 0)

for

expr1

expr3

Page 27: 循环型程序设计

第 6 章 循环结构

例:输出 100 ~ 200 之间的不能被 3 整除的数

#include <stdio.h>main(){ int n; for(n=100;n<=200;n++) { if(n%3= =0) continue; printf("%d ",n); }}

返回

Page 28: 循环型程序设计

第 6 章 循环结构 §6.3 程序举例

t=1,pi=0,n=1.0,s=1

当 |t|1e-6

pi=pi+t

n=n+2

s=-s

t=s/n

pi=pi*4

输出 pi

分子: 1 , -1 , 1 , -1…分母: 1 , 3 , 5 , 7 , ...

While((fabs(t))>1e-6) { pi=pi+t; n=n+2; /n 为分母 s=-s; /s 为分子 t=s/n; }

Page 29: 循环型程序设计

第 6 章 循环结构

例 求 Fibonacci 数列: 1 , 1 , 2 , 3 , 5 , 8 ,……的前 40 个数

f1=1,f2=1

for i=1 to 20

输出 f1,f2

f1=f1+f2f2=f2+f1

15

34233

15971094675025

5142293524578

24157817

18

55377

258417711

121393832040

570288739088169

21389

6104181

28657196418

13462699227465

63245986

321

144987

676546368

3178112178309

14930352102334155

for(i=1;i<=20;i++) { printf(“%12ld %12ld”,f1,f2); if(i%2= =0) printf(“\n”); f1=f1+f2; f2=f2+f1;}

Page 30: 循环型程序设计

第 6 章 循环结构

例:译密码(取与其相隔三个字母的那个字母)例如: Hello,world!译成密码: Lipps,asvph!

返回

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