38
第5第 第第第第第第第第 5.1 第第第第第第第第第第第 5.2 第第第第第 goto 第第 5.3 while 第第 5.4 do … while 第第 5.5 for 第第 5.6 第第第第第第 5.7 break 第第第 continue 第第

第 5 章 循环结构程序设计

Embed Size (px)

DESCRIPTION

第 5 章 循环结构程序设计. 5.1 循环结构程序设计的概念 5.2 语句标号和 goto 语句 5.3 while 语句 5.4 do … while 语句 5.5 for 语句 5.6 循环结构嵌套 5.7 break 语句和 continue 语句. 第 5 章 循环结构程序设计. 5.1 循环结构程序设计的概念. 实现循环的程序结构称为循环结构,是计算机科学中用以描述客观世界循环现象的重要手段。 - PowerPoint PPT Presentation

Citation preview

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

第 5 章 循环结构程序设计 5.1 循环结构程序设计的概念5.2 语句标号和 goto 语句 5.3 while 语句 5.4 do … while 语句 5.5 for 语句 5.6 循环结构嵌套 5.7 break 语句和 continue 语句

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

5.1 循环结构程序设计的概念

实现循环的程序结构称为循环结构,是计算机科学中用以描述客观世界循环现象的重要手段。

程序设计中的循环(简称循环)是指在程序设计中,从某处开始有规律地反复执行某一操作块(或程序块)。如果循环永远不会终止,这样的循环就称为死循环。

第 5 章 循环结构程序设计

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

5.2 语句标号和 goto 语句

goto 语句为无条件转向语句,它的一般格式为:

goto 语句标号 ;

第 5 章 循环结构程序设计

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

例 5.1 用 if 语句和 goto 语句构成循环,求∑ n 。 main( ) { int i , sum=0; i=1;loop: if(i<=100) { sum=sum+i; i++; goto loop; } printf("%d" , sum); }

100

n=1

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

5.3 while 语句 while 语句用来实现“当型”循环结构。 5.3.1 while 语句的一般格式 while 语句是一个循环控制语句,用来控制程序段

的重复执行。其一般格式为: while( 表达式 )

循环体 ;

格式中的循环体,可以是单个语句、空语句,也可以是复合语句。

第 5 章 循环结构程序设计

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

5.3.2 while 语句的执行过程

当表达式为非 0 时,执行 while 语句中的循环体,然后继续进行表达式的判断,如此循环。当表达式为0 时,则退出循环。

说明:如果循环体包含一个以上的语句,就构成块语句,应该用花括号 { } 括起来。

第 5 章 循环结构程序设计

返回章目录

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

当表达式为非 0 值时,执行 while 语句中的内嵌语句。其流程图见图 5.1 。其特点是:先判断表达式,

后执行语句。

图 5.1图 5.2

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

例 5.2 求∑ n 。用传统流程图和 N-S 结构流程图表示算法,见图

P84 5.2(a) 和图 5.2(b) 。根据流程图写出程序:

main(){

int i , sum=0; i=1;

while (i<=100) {

sum=sum+i; i++;

} printf("%d" , sum);

}

100

n=1

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

5.4 do … while 语句 C 语言中,用 do … while 语句构成直到型循环结

构。 5.4.1 do … while 语句的一般格式 do … while 语句也是一个循环控制语句。其特点是

先执行循环体,然后判断条件是否成立。其一般格式为: do

循环体 while( 表达式 ) ;

说明:循环体至少执行一次。当循环体有多个语句时必须加花括号 { } 。

第 5 章 循环结构程序设计

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

5.4.2 do … while 语句的执行过程

先执行一次指定的循环体语句,然后判断表达式。当表达式的值为非 0 的数据时,返回重新执行循环体,如此反复直到表达式的值为 0 为止,此时循环结束。

第 5 章 循环结构程序设计

返回章目录

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

图 5.3

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

例 5.3 用 do while 语句求∑ n 。先画出流程图,见图 5.4 。

图 5.4 图 5.5

100

n=1

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

程序如下:main()

{

int i , sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

printf("%d" , sum) ; }

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

例 5.4while 和 do-while 循环的比较。(1) main ( ) (2) main( )

{int sum=0 , i; {int sum=0 , i;

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

while (i<=10) do

{sum=sum+i; {sum=sum+i;

i++; i++;

} } while (i<=10)

printf(“sum=%d” , sum); printf(“sum=%d” , sum);

} }

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

5.5 for 语句

for 语句可以用于循环次数已经确定的情况,还可用于循环次数不确定而只给出循环结束条件的情况。

5.5.1 for 语句的一般格式

for 语句的一般格式为:

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

循环体

第 5 章 循环结构程序设计

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

5.5.2 for 语句的执行过程

for 语句的执行过程为: (1) 先求解表达式 1 ,表达式 1 只执行一次,一般是赋

值语句,用于初始化变量。 (2) 求解表达式 2 ,若为假( 0 ),则结束循环。

(3) 当表达式 2 为真(非 0 )时,执行循环体。 (4) 执行表达式 3 。 (5) 转回 (2) 。

第 5 章 循环结构程序设计

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

图 5.6

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

sum=sum+i;

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

5.6 循环结构嵌套 一个循环体内包含另一个完整的循环结构,称为循环的嵌套。循

环之中还可以套循环,称为多层循环。三种循环( while 循环、 do … while 循环和 for 循环)可以互相嵌套。例如:

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

第 5 章 循环结构程序设计

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

5.7 break 语句和 continue 语句 5.7.1 break 语句

break 语句可以使流程跳出 Switch 结构,继续执行 Switch 语句下面的一个语句。 break 语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如:

for(r=1;r<=10;r++) { area=Pi*r*r; if(area>100) break; printf("%f" , area); }

第 5 章 循环结构程序设计

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

5.7.2 continue 语句

continue 语句的作用是结束本次循环,忽略 continue 后面的语句,进行下一次循环判定。

continue 语句和 break 语句的区别是: continue 语句只结束本次循环,而不是终止整个循环的执行。而 break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。

第 5 章 循环结构程序设计

返回章目录

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

5.9 程序举例

例 5.6 用 π/4≈1-13+15-17+… 公式求 π 的近似值,直到最后一项的绝对值小于 10-6 为止。

用 N\|S 结构化流程图表示算法 ( 见图 5.12) 。

图 5.12

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

程序如下:#include<math.h>

main()

{

int s;

float n , t , Pi;

t=1 ; Pi=0;n=1.0;S=1;

while((fabs(t))>1e-6)

{Pi=Pi+t;

n=n+2;

s=-s;

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

t=S/n;

}

Pi=Pi*4;

printf("Pi=%10.6f \ n" , Pi);

}

运行结果为:Pi= 3.141594

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

例 5.7 求 fibonacci 数列 40 个数。这个数列有如下特点:第1 , 2 两个数为 1 , 1 。从第 3 个数开始,该数是其前面两个数之和。即 :

f1=1 (n=1)

f2=1 (n=2)

fn=fn-1+fn-2 (n≥3)

解此题的算法如图 5.13 所示。

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

图 5.13

程序如下:

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

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 27: 第 5 章  循环结构程序设计

运行结果为: 1 1 2 3

5 8 13 21

  34 55 89 144

233 377 610 987

1597 2584 4181 6765

10946 17711 28657 46368

75025 121393 196418 317811

514229 832040 1346269 2178309

3524578 57022887 9227465 14930352

24157817 39088169 63245986 102334155

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

例 5.8 判断 m 是否素数。算法如图 5.14 所示。我们采用的算法是这样的:让 m 被 2 到 m 除,如果 m 能被 2 ~ m 之中任何一个整数整除,则提前

结束循环,此时 i 必然小于或等于 k( 即 m) ;如果 m不能

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

图5.14

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

 #include <math.h>

main()

{

int m , i , k;

scanf("%d" , &m);

k=sqrt(m+1);/* 加 1 是为了避免在求 m 时可能出现的误差 */

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

for (i=2;i<=k;i++)

if(m%i==0) break;

if(i>=k+1) printf("%d is a Prime muber \ n" ,m);

else printf("%d is not a Prime number \ n" ,m);

}

运行情况如下:17

17 is a Prime number

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

例 5.9 求 100 ~ 200 间的全部素数。 在例 5.8 的基础上,对本题用一个嵌套的 for 循环即可处理。程序如下: # include <math.h>

main()

{

int m , k , i , n=0;

for(m=101;m<=200;m=m+2)

{

k=sqrt(m);

for (i=2;i<=k;i++)

if (m%i==0) break;

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

if (i>=k+1){printf("%d " , m);n=n+1;}

if(n%10==0) printf(" \ n");

}

printf (" \ n");

}

运行结果如下:101 103 107 109 113 127 131 137 139 149

151 157 163 167 173 179 181 191 193 197

199

n 的作用是累计输出素数的个数,控制每行输出10 个数据。

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

例 5.10 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母 a 变成字母 E , a 变成 e ,即变成其后的第4 个字母, W 变成 a , X 变成 b , Y 变成 c , Z 变成 D 。见图 5.15 。字母按上述规律转换,非字母字

符不变。如“ china!” 转换为“ Glmre!” 。输入一行字符,要求输出其相应的密码。

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

图5.15

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

程序如下: #include <Stdio.h>

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;

}

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

printf("%c" , c);

}

}

运行结果如下:china!

Glmre!

程序中对输入的字符处理办法是:先判定它是否大写字母或小写字母,若是,则将其值加 4( 变成其后的第 4 个字母 ) 。如果加 4 以后字符值大于‘ Z’或‘ z’ ,则表示原来的字母在 V( 或 v) 之后,应按图 5.15 所示的规律将它转换为 a ~ D( 或 a ~ d)之一。办法是

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

 使 c 减 26 ,如果读者对此还有疑问,请查 ascII码表即可清楚。还有一点请读者注意:内嵌的 if 语

句不能写成 if(c>'Z'|| c>'z') c=c-26;

因为当字母为小写时都满足“ c>‘Z’” 条件,从而也执行“ c=c-26;” 语句,这就会出错。

因此必须限制其范围为“ c>‘Z’ && c<=‘Z’+4” ,即原字母为‘W’ 到‘ Z’ ,在此范围以外的不是大写字母 W ~ Z ,不应按此规律转换。请考虑:为什么对

小写字母不按此处理,即写成 c>'z' && c<='z'+4

而只须写成“ c>‘z’” 即可。