第六章 循环控制

27
第第第 第第第第 第第第第 第第 : 1 while 第第第第第第第第第第第第第第 2. for 第第第第第第第第第第第第第第 3. 第第第第第第 C 第第第第第 第第第第第第

description

第六章 循环控制. 本章重点、难点: 1、 while 语句及使用该语句进行程序设计 2. for 语句及使用该语句进行程序设计 3. 初步学会利用 C 语言来解决一些实际的问题. 6.1 概述. 程序经常会重复执行某些相同的操作,如: 求: s=1+2+3+4+…+100. 算法描述: ① s=0;i=1; ② s+=i; i++; ③ 判断 i 是否小于等于100 如果 i 小于等于100,重复 ② ; 否则,结束。. 初始化部分。. 循环体。. - PowerPoint PPT Presentation

Transcript of 第六章 循环控制

Page 1: 第六章    循环控制

第六章 循环控制

本章重点、难点 :

1 、 while 语句及使用该语句进行程序设计

2. for 语句及使用该语句进行程序设计

3. 初步学会利用 C 语言来解决一些实际的问题

Page 2: 第六章    循环控制

6.1 概述程序经常会重复执行某些相同的操作,如:求: s=1+2+3+4+…+100

算法描述:① s=0;i=1;②s+=i; i++;③判断 i 是否小于等于 100 如果 i 小于等于 100 ,重复②; 否则,结束。

此类根据某个条件重复执行相同算法的结构,称为循环。

初始化部分。

循环体。

C 语言提供了三类实现循环的语句 : while , do while , for

Page 3: 第六章    循环控制

6.2 goto 语句goto 语句格式: goto Label /* Label: 同一函数内语句前的标号。 */作用:转移到标号对应的语句上继续执行。无条件转向语句 .

loop: if (i<=100 ) { sum=sum+i; i++; goto loop; }

语句标号的命名规则 :与变量名相同。不能用整数来作标号。例如: goto labeL1 ; goto 23 ; 这样写对吗?

Page 4: 第六章    循环控制

6.2 goto语句 注意 : 结构化程序设计方法主张限制使用 goto语句,因为滥用 goto语句将使程序流程无规律、可读性差。但也不是绝对禁止使用goto语句。一般来说,可以有两种用途:

与 if语句一起构成循环结构; if (……) goto kk;

从循环体中跳转到循环体外,但在 C 语言中可以用 break语句和continue语句跳出本层循环和结束本次循环。 goto语句的使用机会已大大减少,只是需要从多层循环的内层循环跳到外层循环外时才用到 goto语句。但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时才使用。

Page 5: 第六章    循环控制

6.3 while 语句⒈while 循环(当型循环)格式: while(expression) statement;

表达式:值非 0 ,表示满足条件;值为 0 代表不满足条件。

语句(复合语句),重复执行部分(循环体)。

流程:

e?yes

statement;

no

Page 6: 第六章    循环控制

举例:求 1+2+3+…+100#include <stdio.h> /*test2.c */void main(void ){ int s=0, i=1; while (i<=100) { s=s+i; /* s+=i; */ i++; } printf (“s = %d \ n”, s) ; }

初始化部分

循环体

条件测试

实例运行

6.3 while 语句

S=0;i=1

i<=100

s=s+ii=i+1

0

非 0

注意 :1 、 循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。如果不加花括弧,则 while语句的范围只到 while后面第一个分号处。 2 、在循环体中应有使循环趋向结束的语句 .

Page 7: 第六章    循环控制

6.4 do-while 语句格式: do {

statement ; } while (expression ); 流程:

statement;

e?yes

no

含有使条件趋假的语句。while 循环与 do-while 循环的

区别:while 循环先判条件,后执行循环体;do –while 循环先执行循环体,后判条件。

Page 8: 第六章    循环控制

6.4 do-while 语句举例: 求: 30 !#include <stdio.h>void main(void){ float s=1.0; int i=1; do{ s*=i; i++; }while(i<=30); printf(“30!=%f”,s) ;}

初始化。

循环体。测试条件

? 思考题:1. 用 do-while 实现 s=1+2+…+100 2. 用 while 实现 30 !。

使条件趋假。

Page 9: 第六章    循环控制

6.4 do-while 语句举例:while 和 do 一 while 循环的比较

1 ) main () /*test3.c*/ 2 ) main () /*test4.c*/ { 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(“%d”,sum); } printf(“%d”,sum);}

实例运行 1 实例运行 2

Page 10: 第六章    循环控制

6.5 for 语句 ⒊ for 循环

格式: for (e1; e2; e3 ) statement ;流程:

e1

e2?yes

statement;

e3

no

使 e2 趋假。

初值表达式。测试表达式

。增值表达式。

(1) 先求解表达式 1 ; (2) 求解表达式 2 ,若其值为真(非 0 ),然后执行下面第( 3 )步,若为假( 0 ),则结束循环,转到第( 5 )步。(3)若表达式为真,在执行指定的语句后,求解表达式 3 。(4)转回上面第( 2 )步骤继续执行。 (5 )执行 FOR 语句下面的一个语句。

Page 11: 第六章    循环控制

例:求 s=1+2+3+……n

6.5 for 语句

#include <stdio.h>void main(){int n,sum=0,i; pinrtf (“please input n: ”); scanf(“%d”,&n); for(i=1;i<=100;i++) sum=sum+i; pirntf (“sum=%d”,sum);}

for语句的形式如下: for(循环变量赋初值;循环条件;循环变量增值)

Page 12: 第六章    循环控制

6.5 for 语句for (e1; e2; e3 ) 在 for 循环中, e1 、 e2 、 e3 都可以省略!1. for语句中表达式 1可以省略,其后的分号不能省略。执行时

,跳过“求解表达式 1”这一步,其它不变。 2.如果表达式 2省略,即不判断循环条件,循环无终止地进行下

去。也就是认为表达式 2始终为真。 for ( i= l;; i++ ) sum= sum+I 它相当于: i= 1; while( 1 ) {sum= sum+i; i++; }

求解表达式 1

语句

求解表达式 33.表达式 3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如: for( sum= 0, i= 1; i<= 100;) {sum= sum十 1; i++;}

Page 13: 第六章    循环控制

6.5 for 语句4 .可以省略表达式 1 和表达式 3 ,只有表达式 2 ,即只

给循环条件。如 : for (; i <= 100 ;) {sum = sum+i ; i+

+; } 相当于 : while ( i<=100 ) { sum = sum + i ; i+

+;}

5 .三个表达式都可省略,如 : for (;;)语句 相当于 : while ( 1)语句 即不设初值,不判断条件(认为表达式 2 为真),循

环变量不增值。

Page 14: 第六章    循环控制

6.5 for 语句 6 .表达式 1可以是设置循环变量初值的赋值表达式,也

可以是与循环变量无关的其它表达式。如 : for ( sum = 0 ; i <= 100 ; i ++) sum

= sum+ i; 表达式 3也类似 ,如: for(sum=0;i<=100;k++) 表达式 1 和表达式 3 可以是一个简单的表达式,也可

以是多个表达式,中间用逗号间隔。如: for(sum=0,i=1;i<=100;i++) sum=sum+i; 或 for(i=0,j=100;i<=j;i++,j--) k=i+j ; 7. 表达式 2一般是关系表达式或逻辑表达式 , 但也可以

是数值表达式或字符表达式,只要其值为非零就执行循环体。

Page 15: 第六章    循环控制

概念:在一个循环的循环体内又包含一个完整的循环称为循环的嵌套。

例:打印 99乘法表。#include <stdio.h> void main (void ){ int i,j ; for (i=1 ; i<=9 ; i++) { for (j=1; j<=9 ; j++) { printf ( “ %4d “ , i * j ) ; } printf (“ \n “); } }

外层循环

内层循环

说明: ⒈ 内外层循环采用缩进形式。

⒉while 和 do- while 和 for 可以 相互嵌套。 ⒊ 执行次数为内层次数和外存 次数的乘积。

如何打印乘法表的一半?

6.6 循环的嵌套

实例运行 乘法表的一半

Page 16: 第六章    循环控制

① 循环的中断: break 语句

概念:循环体中可以加分支,判断是否继续执行循环, break 语句可以提前结束循环。

6.7 循环的中断 (break) 和继续(continue)

如有以下循环结构:While (表达式 1 ){…… if (表达式

2 ) break; ……}其流程图为:

表达式 1

表达式 2

循环的下一语句

假 break

Page 17: 第六章    循环控制

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

void main (void ){ int s,i ; for (s=0,i=1; ;i++ ) { s =s + i; if ( i > ?? ) break; } printf (“s= %d” , s) ;}

6.7 循环的中断 (break) 和继续(continue)

void main (void )

{ int s=0,i=1;

for (; ; )

{ s =s + i; i++;

if ( i > ?? ) break;

}

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

}

实例运行 实例运行

99100

Page 18: 第六章    循环控制

举例:求: r =1—10 的圆的面积,如圆面积大于 100则中断。

float pi=3.14159;for (r=1; r<=10; r++) { area =pi * r * r; if ( area >100 ) break; printf ( “ \n% f “ , area); }

6.7 循环的中断 (break) 和继续(continue)

Page 19: 第六章    循环控制

② 继续循环: continue 语句continue 语句的作用:跳过本次循环剩余的循环体内容,执行下次循环。

6.7 循环的中断 (break) 和继续(continue)

如有以下循环结构:While (表达式 1 ){…… if (表达式

2 ) continue; ……}其流程图为:

表达式 1

表达式 2

循环的下一语句

假 continue

Page 20: 第六章    循环控制

举例:求 1—100 内的偶数和。

s=0; for ( n=1; n<=100; n++) { if (n%2!=0) continue; s+=n; }

6.7 循环的中断 (break) 和继续(continue)

如果不使用 continue 语句 ,如何来实现 ?

Page 21: 第六章    循环控制

输入 10 个自然数统计其中偶数的个数及偶数值和。算法框图:

start

定义变量

初始化

循环?yes

输入

偶数?yes

统计累加

no

no

输出结果

end

#include <stdio.h>void main(void){ int i, ix,iCount=0,iSum=0; for(i=1;i<=10;i++) { scanf(“%d\n”, &ix);

if( ix%2==0 ) { iSum+=ix; iCount++; } } printf(“Num=%d\nSum=%d”,iCount,iSum);}

循环结

构分支结构

输入负数?do{ if(ix<=0) printf(“date error”); } while(ix<=0);

算法的健壮性

6.8 循环和分支相互嵌套

Page 22: 第六章    循环控制

⒈ 求 100 到 200之间的所有素数(只能被 1 和自身整除的数)。

对于自然数 n,判断其是否为素数的方法:判断 n 是否能被从 2到 (int)sqrt(n)范围的数整除;

6.9 程序举例

在程序设计中,经常要记录一些状态,作为判断的条件。因此需要在程序中设置一些标志,通常标志是整型变量。

程序设计中标志技术的使用 :如:设置变量 iFlag用于记录是否是素数, iFlag==1是素数; iFlag==0不是素数。

Page 23: 第六章    循环控制

s=sqrt(n);

iFlag=1;

n%i==0iFlag=0;break;

iFlag==0?

判断某自然数 n 是否是素数的算法

Y

N

i<=s

Y

i=i+1;

N

输出 n 不是素数输出 n 是素数

Page 24: 第六章    循环控制

#include <stdio.h> #include <math.h>void main(void){ int n, j, s, iFlag; for(n=101;n<200;n+=2 ) { s=sqrt(n); iFlag=1; for(j=2; j<=s; j++) { if(n%j==0){ iFlag=0;break;} } if(iFlag==1)printf(“\n%d”,n); }}

0 不是素数; 1 是素数。

枚举所有

数假定 n 是素数。

如果 n 能被 2 到s 的任意数整除,设标志退出循环。

如果 n 是素数,输出n 。

实例运行

程序如下:

Page 25: 第六章    循环控制

#include <stdio.h>void main(void){ int n, a, b, c; for(n=100 ; n<=999 ; n++) { a=n/100; b=n%100/10; c=n%10; if(a*a*a+b*b*b+c*c*c==n)

printf(“\n%d”,n); }}

列举所有三位

数构造条

测试条件

取 n 的百位 a 、十位 b 、个位 c 。

实例运行

⒉ 求水仙花数(条件:三位数的个、十、百位的立方和等于该数。 153==13 +53 +33 )。

Page 26: 第六章    循环控制

36人一次搬 36块砖,男搬 4 ,女搬 2 ,两个小孩抬一块。要一次搬完。问:男、女、小孩要多少? ( 要求输出所有的方案 )

思考题:

#include <stdio.h>main(){ int m,w,c,k=0; for (m=0;m<=9;m++) for (w=0;w<=18;w++) for(c=0;c<=72;c+=2)

if(m*4+w*2+c/2==36 && m+w+c==36) {printf("m=%d,w=%d,c=%d\n",m,w,c);

k=k+1;} printf ("total=%d",k);}

Page 27: 第六章    循环控制

课堂作业:1. 输出 10-1000 之间所有被 3 余 2 、被 5 除余 3 的数,并统计其个数。

2. 输入 n 的值,计算并输出 S 的值。 s=1+(1*2)+(1*2*3)+……+(1*2*3*4*…n)