第六章 循环结构程序设计

42
1 第第第 第第第第第第第第 第第第第 1. 第第第第第第 2.go to 第第第第 go to 第第第第第第第 3.While 第第第第第 4.Do While 第第第第第 5.For 第第第第第 6. 第第第第第 7.Break 第第第 Continue 第第第第第 8. 第第第第

Upload: leanna

Post on 19-Mar-2016

143 views

Category:

Documents


7 download

DESCRIPTION

本章内容 1. 循环结构概述 2.go to 语句及用 go to 语句构成的循环 3.While 语句的使用 4.Do While 语句的使用 5.For 语句的使用 6. 循环的嵌套 7.Break 语句和 Continue 语句的使用 8. 程序举例. 第六章 循环结构程序设计. 例 求 s=1+2+3+ … +100. 例:打印如下形式的九九乘法表. 输入 10 个整数,求它们的平均值,并输出大于平均值的个数。. main() { int a,b,c,d,e,f,g,h,i,j,n=0; float average; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第六章  循环结构程序设计

1

第六章 循环结构程序设计本章内容1. 循环结构概述2.go to 语句及用 go to 语句构成的循环3.While 语句的使用4.Do While 语句的使用5.For 语句的使用6. 循环的嵌套7.Break 语句和 Continue 语句的使用8. 程序举例

Page 2: 第六章  循环结构程序设计

2

C 语言程序设计 第六章 循环结构程序设计

例 求 s=1+2+3+ …+100

Page 3: 第六章  循环结构程序设计

3

C 语言程序设计 第六章 循环结构程序设计例:打印如下形式的九九乘法表 .

Page 4: 第六章  循环结构程序设计

4

C 语言程序设计 第六章 循环结构程序设计输入 10 个整数,求它们的平均值,并输出大于平均值的个数。

main()

{ int a,b,c,d,e,f,g,h,i,j,n=0;

float average; scanf(“%d”, &a); scanf(“%d”, &b);

scanf(“%d”, &c); scanf(“%d”, &d;

scanf(“%d”, &e); scanf(“%d”, &f);

scanf(“%d”, &g); scanf(“%d”, &f);

scanf(“%d”, &i); scanf(“%d”, &j);

Page 5: 第六章  循环结构程序设计

5

C 语言程序设计 第六章 循环结构程序设计average=(a+b+c+d+e+f+g+h+i+j)/10;

if( a>average ) n=n+1;

if( b>average ) n=n+1;

if( c>average ) n=n+1;

if( d>average ) n=n+1;

if( e>average ) n=n+1;

if( f>average ) n=n+1;

if( g>average ) n=n+1;

if( h>average ) n=n+1;

if( i>average ) n=n+1;

if( j>average ) n=n+1;

printf(“n=%d",n);

}

Page 6: 第六章  循环结构程序设计

6

C 语言程序设计 第六章 循环结构程序设计

6.1 概 述  循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。C语言提供了多种循环语句,可以组成各种不同形式的循环结构。 ( 1 )用 goto 语句和 if 语句构成循环 ( 2 )用 while 语句 ( 3 )用 do----while 语句 ( 4 ) 用 for 语句

Page 7: 第六章  循环结构程序设计

7

C 语言程序设计 第六章 循环结构程序设计

表达式

语句 表达式语句

a) 当型循环 b) 直到循环

非 0

0

非 0

0

Page 8: 第六章  循环结构程序设计

8

C 语言程序设计 第六章 循环结构程序设计6.2 goto 语句及用 goto 语句构成的循环

一、无条件转移语句—— goto 语句 一般格式: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号 ( : ) 。语句标号起标识语句的作用,与 goto 语句配合使用。 如: label: i++; goto label1; C语言不限制程序中使用标号的次数,但各标号不得重名。 goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。

Page 9: 第六章  循环结构程序设计

9

C 语言程序设计 第六章 循环结构程序设计二、用 goto 语句与 if 语句实现循环用 goto 语句与 if 语句实现循环的形式:形式 1 :loop1 : 语句; if (表达式) goto loop1;

形式 2 :loop1 : if (表达式) goto loop2;

语句; goto loop1;

loop2 : 注意:在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

Page 10: 第六章  循环结构程序设计

10

C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100

main()

{ int s=0,n=1;

loop:

s=s+n;

n++;

if (n<=100) goto loop;

printf("S=%d",s);

}

main() { int s=0,n=1;loop1: if (n>100) goto loop2; s=s+n; n++; goto loop1; loop2: printf("S=%d",s); }

Page 11: 第六章  循环结构程序设计

11

C 语言程序设计 第六章 循环结构程序设计例 2 :统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string\n"); loop: if(getchar()!='\n') { n++;

goto loop; } printf("%d",n); }

Page 12: 第六章  循环结构程序设计

12

C 语言程序设计 第六章 循环结构程序设计6.3 while 语句

执行过程是:计算表达式的值,当值为真 ( 非0) 时, 执行循环体语句。如右上图。

while 语句的一般形式为: while( 表达式 )

语句; 其中表达式是循环条件,语句为循环体,若是多个语句则必须用 { 和 } 组成复合语句。

表达式

语句非 0

0

Page 13: 第六章  循环结构程序设计

13

C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100

main()

{ int s=0,n=1;

while (n<=100)

{ s=s+n;

n++;

}

printf("S=%d",s);

}

Page 14: 第六章  循环结构程序设计

14

C 语言程序设计 第六章 循环结构程序设计

6.4 Do—while 语句 do-while 语句的一般形式为: do

{ 语句; }while ( 表达式 ) ; 其中:语句是循环体, 表达式是循环条件。

表达式语句

非 0

0

执行过程:先执行循环体语句一次, 再判别表达式的值,若为真 ( 非 0) 则继续循环,否则终止循环。

Page 15: 第六章  循环结构程序设计

15

C 语言程序设计 第六章 循环结构程序设计例 1 : 编程序求: s=1+2+3+……+100

main()

{ int s=0,n=1;

do

{ s=s+n;

n++;

} while (n<=100);

printf("S=%d",s);

}

Page 16: 第六章  循环结构程序设计

16

C 语言程序设计 第六章 循环结构程序设计使用 while 和 do-while 语句应注意以下几点: 1. 在 if 语句, while 语句中, 表达式后面都不能加分号, 而在 do-while 语句的表达式后面则必须加分号。 2.do-while 语句也可以组成多重循环,而且也可以和 while 语句相互嵌套。 3. 当循环体由多个语句组成时,也必须用 {} 括起来组成一个复合语句。 4. 如果循环至少要执行一次, while 和 do-while 语句可以相互替换。

Page 17: 第六章  循环结构程序设计

17

C 语言程序设计 第六章 循环结构程序设计6.5 for 语句

for 语句是C语言所提供的功能更强,使用更广泛的一种循环语句。一、使用一般形式为: for( 表达式 1 ;表达式 2 ;表达式 3)

语句; 其中:表达式 1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在 for 语句外给循环变量赋初值,此时可以省略该表达式。 表达式 2 通常是循环条件,一般为关系表达式或逻辑表达式。 表达式 3 通常可用来修改循环变量的值,一般是赋值语句。

Page 18: 第六章  循环结构程序设计

18

C 语言程序设计 第六章 循环结构程序设计for 语句的执行过程: 1. 首先计算表达式 1 的值。 2. 再计算表达式 2 的值,若值为真 ( 非 0) 则执行循环体一次, 否则跳出循环。 3. 然后再计算表达式 3 的值,转回第 2 步重复执行。 在整个 for 循环过程中,表达式 1 只计算一次,表达式 2 和表达式 3 则可能计算多次。循环体可能多次执行,也可能一次都不执行。

表达式 2

语句非 0

0

语句

求解表达式1

求解表达式3

for 语句的执行过程

Page 19: 第六章  循环结构程序设计

19

C 语言程序设计 第六章 循环结构程序设计例:用 for 语句计算 s=1+2+3+...+99+100 main()

{ int n,s=0;

for(n=1;n<=100;n++)

s=s+n;

printf("s=%d\n",s);

}

本例 for 语句中的表达式 3 为 n++ ,实际上也是一种赋值语句,相当于 n=n+1 ,以改变循环变量的值。

Page 20: 第六章  循环结构程序设计

20

C 语言程序设计 第六章 循环结构程序设计二、在使用 for 语句中要注意以下几点: 1.for 语句中的各表达式都可省略,但分号间隔符不能少 如: for( ;表达式 2 ;表达式 3) 省去了表达式 1 。 for( 表达式 1 ;;表达式 3) 省去了表达式 2 。 for( 表达式 1 ;表达式 2 ; ) 省去了表达式 3 。 for( ;; ) 省去了全部表达式。 2. 在循环变量已赋初值时,可省去表达式 1 。如省去表达式 2 或表达式 3 则将造成无限循环,这时应在循环体内设法结束循环。 例:

Page 21: 第六章  循环结构程序设计

21

C 语言程序设计 第六章 循环结构程序设计main() { int n=1,s=0; for(;n<=100;n++)

s=s+n; printf("s=%d\n",s); }

main() { int n=1,s=0; for(;n<=100;)

{ s=s+n; n++;} printf("s=%d\n",s); }

省略表达式 1 和 3 ;

省略表达式 1 :

Page 22: 第六章  循环结构程序设计

22

C 语言程序设计 第六章 循环结构程序设计main() { int n=1,s=0; for(; ;)

{ s=s+n; n++;} printf("s=%d\n",s); }

省略全部表达式: —— 程序为死循环

main() { int n=1,s=0; for(; ;)

{ s=s+n; n++; if (n>=100) break; } printf("s=%d\n",s); }

for( ; ; )等效于 while( 1)

Page 23: 第六章  循环结构程序设计

23

C 语言程序设计 第六章 循环结构程序设计 3. for 语句中的 三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。 例: main()

{ int n,s; for(n=1,s=0;n<=100;n++)

s=s+n; printf("s=%d\n",s); }

main() { int n,s; for(n=1,s=0;n<=100;n++,s+=n); printf("s=%d\n",s); }

这里为什么要加;

Page 24: 第六章  循环结构程序设计

24

C 语言程序设计 第六章 循环结构程序设计例:统计从键盘输入一行字符的个数。 #include"stdio.h" void main() { int n=0; printf("input a string:\n"); for(;getchar()!='\n';n++); printf("%d",n); } 说明:本例中,省去了 for 语句的表达式 1 ,表达式 3 也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的 printf 语句当成循环体来执行。 反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能执行循环体。

Page 25: 第六章  循环结构程序设计

25

C 语言程序设计 第六章 循环结构程序设计6.6 循环的嵌套

for 语句也可与 while,do-while 语句相互嵌套,构成多重循环。以下形式都合法的嵌套。

(4) while() { … for() {…} … }

(1) while( ) {… while( )

{…}…

}

( 2 ) do {

… do

{ …} while() … }while();

(3) for() { ……… for() { …… } …… }

Page 26: 第六章  循环结构程序设计

26

C 语言程序设计 第六章 循环结构程序设计

(7) while() { … do { … }while(); … }

(5) for( ) {… while( )

{…}…

}

(6) do{…for( ){…}…

}while();

(8) for() { ……… do { …… } while(); …… }

Page 27: 第六章  循环结构程序设计

27

C 语言程序设计 第六章 循环结构程序设计例:打印如下形式的九九乘法表 .

main() { int x,y; for(x=1;x<=9;x++) { for(y=1;y<=9;y++) printf("%d*%d=%2d ",x,y,x*y); printf("\n"); } }

Page 28: 第六章  循环结构程序设计

28

C 语言程序设计 第六章 循环结构程序设计6.7 几种循环语句的比较

for ( ) while ( ) { …}

do { ...

}while();

循环类型 当型循环 当型循环 直到循环

循环控制条件 表达式 2值非 0 表达式值非 0 表达式值非 0

循环变量初值 在 for语句行中 在 while之前 在 do之前

使循环结束 表达式 3 循环体中使用专门语句

循环体中使用专门语句

Page 29: 第六章  循环结构程序设计

29

C 语言程序设计 第六章 循环结构程序设计6.8 break 语句和 continue 语句

一、 break 语句 break 语句只能用在 switch 语句或循环语句中, 其作用是跳出 switch 语句或跳出本层循环,转去执行后面的程序。由于 break 语句的转移方向是明确的,所以不需要语句标号与之配合。 break 语句的一般形式为: break; 注意:break 语句用于循环体中,一般与 if 语句联合使用。

Page 30: 第六章  循环结构程序设计

30

C 语言程序设计 第六章 循环结构程序设计例:计算 s=1+2+3+...+99+100 main()

{ int n=1,s=0;

while(1)

{ if(n>100) break;

s=s+n;

n++;

}

printf("s=%d\n",s);

}

Page 31: 第六章  循环结构程序设计

31

C 语言程序设计 第六章 循环结构程序设计 分析下面程序的功能#include"stdio.h"void main() { char a,b; printf("input a string:\n"); b=getchar(); while((a=getchar())!='\n') { if(a==b) { printf("same character\n");

break; } b=a;

} }

功能是: 检查输入的一行中有无相邻两字符相同。

Page 32: 第六章  循环结构程序设计

32

C 语言程序设计 第六章 循环结构程序设计 done=0; for( … ) { for ( … ) { while ( … ) { if ( … ) { done=1; break; } … } if (done) break; … } if (done) break; } 多层嵌套循环: 可用 goto 退出 goto stop;

而 break; 只能退出本层循环。

Page 33: 第六章  循环结构程序设计

33

C 语言程序设计 第六章 循环结构程序设计

main(){ int n; for(n=7;n<=100;n++) { if (n%7!=0) continue; printf("%d ",n); } }

main(){ int n; for(n=7;n<=100;n++) { if (n%7==0) printf("%d ",n); } }

二、 continue 语句 continue 语句只能用在循环体中其一般格式是: continue; 其语义是:结束本次循环,即不再执行循环体中 continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。

Page 34: 第六章  循环结构程序设计

34

C 语言程序设计 第六章 循环结构程序设计6.9 程序举例

例 6.6 教材 Pg.116

(略) fabs()

例 6.7 教材 Pg.116

(略) if( i%2==0) printf(“\n”)

例 6.8 判断一个整数 m 是否是素数。教材 Pg.118

素数是只能被 1 和本身整除的数。

Page 35: 第六章  循环结构程序设计

35

C 语言程序设计 第六章 循环结构程序设计#include "math.h"void main() { int m,i,k; printf("Enter m=\n"); scanf("%d",&m); k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; if(i>k) printf("Yes\n"); else printf("No\n"); }

输入 m

当 i<=k

k=sqrt(m)

m%i=0i=2

YN

i=i+1

当 i>k YN

打印 Yes

break

打印 No

程序流程图

Page 36: 第六章  循环结构程序设计

36

C 语言程序设计 第六章 循环结构程序设计例 6.9 打印输出 100——200 之间的素数。 #include "math.h"void main() { int n=0,i,k,m; for (m=101;m<=199;m++) { k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) break; if(i>=k) { n++; printf("%d ",m); if (n% 10==0) printf("\n");} } }

Page 37: 第六章  循环结构程序设计

37

C 语言程序设计 第六章 循环结构程序设计例 6.10 字符加密、解密 教材 Pg.119

加密的思想是: 将每个字母 C 加(或减)一序数 k ,即用它后的第 k个字母代替,变换式公式: c=c+k 例如序数 k 为 5 ,这时 “ A”“F” , “ a”“f” ,“ B”“G”… 当加序数后的字母超过“ Z” 或“ z” 则 c=c+k -26 例如: You are good Dtz fwj ltti 解密为加密的逆过程 将每个字母 C 减(或加)一序数 k ,即 c=c-k, 例如序数 k 为 5 ,这时 “ Z”“U” , “ z”“u” ,“ Y”“T”… 当减序数后的字母小于“ A” 或“ a” 则 c=c-k +26

Page 38: 第六章  循环结构程序设计

38

C 语言程序设计 第六章 循环结构程序设计加密程序如下:#include "stdio.h"main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c+5; if (c>'Z' && c<'Z'+5 || c>'z') c=c-26; } printf("%c",c); } }

Page 39: 第六章  循环结构程序设计

39

C 语言程序设计 第六章 循环结构程序设计解密程序如下:#include "stdio.h"main() { char c; while((c=getchar())!='\n') { if((c>='a' && c<='z') || (c>='A' && c<='Z')) { c=c-5; if (c<'A' || c<'a' && c>'a'-5) c=c+26; } printf("%c",c); } }

作业: (6.1) 6.3 6.6 6.11

Page 40: 第六章  循环结构程序设计

40

C 语言程序设计 第六章 循环结构程序设计例 3-16 求一元二次方程 ax2+bx+c=0 的根源程序如下#include "stdio.h" main() { float a,b,c,x1,x2,d; scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if(d==0) {x1=-b/(2*a); printf("x1=x2=%f\n",x1); }

Page 41: 第六章  循环结构程序设计

41

C 语言程序设计 第六章 循环结构程序设计

else if(d>0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("x1=%f,x2=%f\n",x1,x2); } else { x1=-b/(2*a);x2=sqrt(-d)/(2*a); printf("real part=%f,imag part=%f",x1,x2); } }

Page 42: 第六章  循环结构程序设计

42

C 语言程序设计 第六章 循环结构程序设计例 3-18 数列 1,1, 2,3, 5,8, 13 的前 40 个数这是一个递推问题 . 该数列可以用下面的通式来表示f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n>=3) 程序如下

main() {long f1,f2; int k; f1=1;f2=1; for(k=1;k<=20;k++) { printf("%12ld %12ld",f1,f2); if(k%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } }