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

第六章 循环结构程序设计

Mar 19, 2016

Download

Documents

leanna

本章内容 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
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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; } }