第 4 章 循环结构程序设计

107
1 第 4 第 第第第第第第第第

description

第 4 章 循环结构程序设计. printf( “ **********\n ” );. printf( “ **********\n ” );. 问题的提出. 输出一行 10 个星号“ * ” 语句是?. printf( “ **********\n ” );. 输出两行 10 个星号“ * ” 语句是?. 输出 100 行 10 个星号“ * ” 语句是?. 用循环结构解决. 问题 1 :. 4.1 循环的概念. 什么是循环? 为什么要使用循环?. 问题 2: 求学生平均成绩 分数相加后除以课数. - PowerPoint PPT Presentation

Transcript of 第 4 章 循环结构程序设计

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

1

第 4 章 循环结构程序设计

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

2

输出一行 10 个星号“ *” 语句是? printf(“**********\n”);

输出两行 10 个星号“ *” 语句是? printf(“**********\n”);

printf(“**********\n”);

问题的提出

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

3

输出 100行 10 个星号“ *” 语句是?

用循环结构解决

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

4

4.1 循环的概念

什么是循环?为什么要使用循环?

100

1n

y n问题 1 :

问题 2: 求学生平均成绩求学生平均成绩 分数相加后除以课数分数相加后除以课数

在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。循环分为两种:无休止循环和有终止循环构成有效循环的条件:循环体和循环结束条件

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

5

本章将介绍的内容 4.1 for 语句 4.2 while 语句4.3 do - while 语句4.4 break语句和continue语句 4.5 循环语句的嵌套

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

6

4.1 for 语句

C 语言中的 for 语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while 语句。 【例 4.1】 for 语句的引例。

求 1+2+3+…+100 的值,并将其结果放在变量 sum 中。

P88P88

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

7

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

sum=sum+1;sum=0;

不确定

sum

013sum=sum+3;

6

… …

sum=sum+100;

5050sum=sum+i;

规律是:表示为:for(i=1;i<=100;i++)

sum=sum+i;

是 for 语句!是 for 语句!

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

8

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

n",sum);}

运行结果: 1+2+3+......+100=5050

循环体关键字

for

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

9

for 语句的一般形式

for( 表达式 1; 表达式 2; 表达式 3 ) 循环体

注意此处不是“ ,”!

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

10

执行过程

表达式2

处理表达式 1

执行循环体非00

处理表达式3

for语句的执行过程: (1) 先求解表达式 1 。 (2) 求解表达式 2 ,若其值为真 ( 值为非 0),则执行 for

语句中指定的内嵌语句,然后执行下面第 (3)步。若为假( 值为 0),则结束循环,转到第 (5)步。

(3) 求解表达式 3 。 (4) 转回上面第 (2)步骤继续执行。 (5) 循环结束,执行 for语句下面的一个语句

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

11

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

printf ( “**********\n” );

输出 100行 10 个星号“ *” 语句是? i++i++

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

12

讨论题 4.1

若要计算 2+4+6+…+100 的值如何书写 for 语句?

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

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

13

讨论题 4.2 如何通过 for 循环计算

的值? 100

1

3

1

2

11

float t=1,sum=0;int i;

for ( i = 1; i <= 100; i = i + 1 ){ t=1/i;

sum=sum+t ; }

复合语句

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

14

【例 4.2 】键盘输入 10 个学生的成绩,输出各成绩和平均成绩。

编程点拨:确定两件事情

哪些语句重复执行哪些语句重复执行

执行多少次循环体执行多少次循环体 输入 10 个,重复 10次

scanf("%d",&score);scanf("%d",&score);printf("%d ",score);printf("%d ",score);

sum=sum+score; sum=sum+score;

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

15

printf("\n"); ave=(float)sum/10; printf("ave=%f\n",ave);}

用复合语句

循环体是循环体是33 条语句条语句

for( i=1; i<=10; i++) { scanf("%d",&score); printf("%d ",score); sum=sum+score; }

main( ){ int i=0,score=0, sum=0; float ave=0; printf("Input score:\n");

不必放在循环体内

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

16

Input score:95 100 65 45 60 89 78 80 83 7095 100 65 45 60 89 78 80 83 70ave=76.500000

运行结果如下:

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

17

【例 4.3 】在 3~100 之间所有 3 的倍数中,找出个位数为 2 的数。

编程点拨

用 用 i%10 i%10 表示个位表示个位数 数

3~1003~100内内 33 的倍数有的倍数有 3 6 9 … 993 6 9 … 99

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

if( i%10==2 ) … if( i%10==2 ) …

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

18

将最小的 3 的倍数 3 赋给 i

当 i 的值小于等于 100 时

输出 i 的值

i 个位数是 2 ?真 假

i 的值增 3

流程图

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

19

#include <stdio.h>main( ){ int i=0; for ( i=3; i<=100; i=i+3 ) if( i%10==2 ) printf("%4d",i); printf("\n");} 输出:输出:

按 4 个字符位输出整数

1212 4242 7272__

分支分支结构结构

循环结构循环结构顺序结构

用三种基本结构能用三种基本结构能写出所有复杂程序写出所有复杂程序

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

20

讨论题 4.3 若将例 4.3 的功能改为:找出十位或个位是 2 的所有三位数,程序应如何改写?

#include <stdio.h>main( ){ int i=0,j=0; for ( i=102; i<=999; i=i+3 ) { j=i%100; if((j/10==2) ||(j%10==2) ) /* 判断 10 位数是否是 2 */ printf("%4d",i);

printf("\n");}

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

{ if(i%3==0) /* 若是 3 的倍数 */

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

21

【例 4.4 】输出 1!、 2!、 3!、……、 n! 其中 n!= 1×2×3×……×n n 的值从键盘输入

算法和求算法和求 1+2+…+1001+2+…+100 的算法类的算法类似似

但在本程序中但在本程序中 facfac 的初值为的初值为 11 ,不是,不是 00 。。

编程点拨

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

22

#include <stdio.h>main ( ){ int i=0,n=0; float fac=1.0; printf("Input n:"); scanf ( "%d", &n ); for ( i=1; i<=n; i++ )

{ fac=fac*i; printf( "%d!=%.0f\n",i,fac); }

}

若为若为 intint 型,求型,求 8!8!时开始出现溢出现时开始出现溢出现象 象 不能为不能为 0.0 0.0

只输出整数部分 只输出整数部分

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

23

运行结果如下:Input n:201!=12!=2…… 19!=12164509600422297620!=2432902023163674620

(注意,只保证前 6~7 位是准确的)

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

24

讨论题 4.4 如果要计算 21、 22、 23、…、 2n 的值,应如

何修改本程序? #include <stdio.h>main (){ int i=0,n=0; double fac=1.0; printf("Input n:"); scanf ( "%d", &n ); for ( i=1; i<=n; i++ )

{ fac=fac*2; printf("2^%d=%.0f\n",i,fac); }

}

若为若为 intint 型,求型,求 22ii

时开始出现溢出现时开始出现溢出现象 象

不能为不能为 0.0 0.0

只输出整数部分 只输出整数部分

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

25

课堂练习修改例 4.4 中的程序,计算 1!+2!+3!+ …+n! 的值。修改例 4.4 中的程序,计算21、 22、 23 、…、 2n 的值。修改例 4.4 中的程序,计算21+22+23+ …+2n 的值。

1)

#include <stdio.h>

main()

{ int i=0,n=0;

double fac=1.0,sum=0.0;

printf(“Input n:”);

scanf(“%d”,&n);

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

{ fac=fac*i;

sum=sum+fac }

printf(“1+2!+…+%d!=%.lf\n”,n,sum);

}

3)

#include <stdio.h>

main()

{ int i=0,n=0;

double fac=1.0,sum=0.0;

printf(" Input n: ");

scanf("%d ",&n);

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

{ fac=fac*2;

sum=sum+fac; }

printf("2^1+2^2+…+2^%d!=%.lf\n",n,sum);

}

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

26

教学总结本次课的讲授内容是:1 .用循环解决问题的场合。2 . for 语句。3 .累加算法。4 .求平均值算法。5 .连乘算法。

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

27

作业• 完成未做完的课堂练习• 理解并运行例 4.5~4.8

预习例 4.9~例 4.15

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

28

【例 4.5 】在两行上分别按顺序和逆序输出 26 个英文大写字母。

在在 ASCIIASCII 码表中,字母按码表中,字母按 AA到到 ZZ 的顺序排的顺序排列列使用循环通过使用循环通过 AA 计算 计算

(即(即’’ AA’’+i+i,, i=0,1,2,…,25i=0,1,2,…,25 ))

编程点拨

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

29

#include <stdio.h>main ( ){ int i=0; }

for ( i=0; i<=25; i++ ) printf("%c ", 'A'+i);

for ( i=25; i>=0; i-- ) printf("%c ", 'A'+i);

printf("\n");

printf("\n");

顺序输出顺序输出

逆序输出逆序输出

注意位置注意位置

不是不是 i+i+++

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

30

【例 4.6】 从键盘输入 10 个数,求其中最大值。

编程点拨:

用例 3.6 中介绍的算法

数据较多,用循环结构

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

31

#include <stdio.h>main( ){ int a=0,max=0,i=0;

printf("\nmax=%d\n",max); }

scanf("%d",&a); printf("%d ",a);

printf("Input data:");输入第一个数并输出输入第一个数并输出max=a;第一个数存入第一个数存入 max max

输入后九个数并输出输入后九个数并输出for ( i=1; i<=9; i++ ) { scanf("%d",&a); printf("%d ",a); if ( max<a ) max=a;

}

运行时试最大值在 运行时试最大值在 最前最前 最后最后 中中间某一位置间某一位置的情况 的情况

思考:思考: 100100 个数中个数中求最大,如何修改?求最大,如何修改?

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

32

方法方法 22 ::#include <stdio.h>main( ){ int a=0,max=0,i=0; max=-32768; printf("Input data:"); for(i=1; i<=10; i++) { scanf("%d",&a);

printf("%d ",a); if(max<a) max=a;

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

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

33

【例4.7】求

100

1

4

1

3

1

2

11

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

sum=sum+sum=sum+(float)(float)1/i; 1/i;

100

1

4

1

3

1

2

11

先思考:如何求

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

34

100

1

4

1

3

1

2

11

再思考:如何解决正负相间的问题再思考:如何解决正负相间的问题

for ( i=1; i<=100; i++ ) sum=sum+(float) 1 / i;

sign=1;

{ }

sign=-sign;

sign

sign=1sum=sum+1/1

i=1

sign=-1sum=sum-1/2

i=2

sign=1sum=sum+1/3i=3

… …

符号翻转符号翻转

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

35

完完整整程程序序

for ( i=1; i<=100; i++ ) { sum=sum+(float) sign/ i;

sign=-sign; }

printf("sum=%f\n",sum); }

#include <stdio.h>

main( )

{ int i=0,sign=1;

float sum=0.0;

运行结果sum=0.688172

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

36

讨论题 4.7 如何计算

的值? 100

1

98

1

8

1

6

1

4

1

2

1

for ( i=2; i<=100; i=i+2 ) { sum=sum+(float) sign/ i;

sign=-sign; }

printf("sum=%f\n",sum); }

#include <stdio.h>

main( )

{ int i=0,sign=1;

float sum=0.0;

运行结果sum=0.688172

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

37

【例 4.8 】输出斐波纳契( Fibonacci)级 数 1 、 1 、 2 、 3 、 5 、 8、 13、… 的前 30 项。

规律:前两项的值各为 1 ,从第 3 项起,每一项都是前两项的和。

要求:一行输出 6 项

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

38

求解过程

+

a b next 第 5 项+

+a b next 第 3 项

a b next 第 4项

a b next 第 6 项+

… …

1 1 2

8

1 23

2 35

3 5

next=a+b;a=b; b=next;

规律:

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

39

main( ){ int i=0,n=0; long a=0,b=0,next=0; }

a=b=1;printf("%10ld%10ld",a,b);

n=2;

处理前两项

for ( i=3; i<=30; i++ ) { next=a+b; a=b; b=next; }

处理后 28 项

printf("%10ld",next); n++; if ( n%6==0 ) printf("\n");

输出并控制换行

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

40

运行结果如下: 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

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

41

同一个问题,可能有多种算法在学习过程中,勤于思考,善于发现问题,编写出更优化的程序。以上循环共同点:容易确定循环次数for 语句一般用于循环次数已知的情况。如果次数事先不知,则常用 while 语句或 do-while 语句。

说明:说明:

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

42

4.2 while 语句【例 4.9 】从键盘输入若干个非0 数据,

求它们的和。用 0 结束循环的执行。

编程点拨:• 本题需要用循环结构•用 for 语句不方便• 下面用 while 语句

P97P97

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

43

#include <stdio.h>main( ){ int a=0,sum=0; printf("Input data:\n");

scanf("%d",&a); while ( a!=0 ) { printf("%4d",a); sum=sum+a; scanf("%d",&a); } printf("\nsum=%d\n",sum); }

进入循环前进入循环前先输入一个数 先输入一个数

当当 aa 为非为非 00 时,执行循环体 时,执行循环体 while关键字

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

44

第 1 次 运 行 :Input data:

Input data:

11 22 33 44 55 66 77 88 99 0 1 211 22 33 44 55 66 77 88

99sum=495

第 2 次运行:

0(空一行)

sum=0

Ctrl+Break强行结束执行

sum 的初值

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

45

while 语句的一般形式:

while ( 表达式 ) 循环体

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

46

执行过程

表达式 循环体非 0

0

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

47

【例 4.10 】用while 循环求 1+2+3+…+100 #include <stdio.h>main( ){ int ,sum=0; printf("sum=%d\n",sum);}

while ( i<=100 ) sum=sum+i;

i=1

i++;

{ }

不同循环语句之间可以相互转换

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

48

【例 4.11 】用公式

求 π 的近似值,直到最后一项的绝对值小于 10-4 为止。

7

1

5

1

3

11

4

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

49

编程点拨:

先计算 的近似值,再求 π 的近似值不易确定从第几项起,绝对值小于 10-4

本例用 while 语句

4

7

1

5

1

3

11

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

50

main ( ){ int , ; float pi=0,

pi=sum*4 ; printf("pi=%f\n",pi);}

#include <math.h> 加入一行

while ( )

{ }

fabs(next) >= 1e-4sum=sum+next

;

next=1,sum=0;

sign=-sign;

sign=1

i=i+2;

i=1

next=(float)sign/i;

fabs 是库函数 求绝对值

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

51

4.3 do-while 语句

do-while和while很相似

区别:while 先判断表达式的值,后执行循环体do-while 先执行循环体,再判断表达式

P100P100

返回

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

52

【例 4.12 】从键盘输入若干个非 0 数据,求它们的和。用 0 结束循环的执行 .

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

53

#include <stdio.h> main( ){ int a=0,sum=0; printf("Input data:\n"); do { scanf("%d",&a);

printf("%4d",a); sum=sum+a;

} while ( a!=0 ) ; printf("\nsum=%d\n",sum);}

不要丢不要丢

do 关键字

当当 aa 为非为非 00 时,执行循环时,执行循环体 体

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

54

第 1 次 运 行 :Input data:

Input data:

11 22 33 44 55 66 77 88 99 0 1 211 22 33 44 55 66 77 88 99

0sum=495

第 1 次运行:

00

sum=0 sum 的 初 值与 0 的和

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

55

do-while 语句的一般形式:

do 循环体 while ( 表达式 ) ;

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

56

执行过程

非0表达式

循环体

0

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

57

do-while 先执行一次循环体,后判断表达式 循环体至少被执行一次

while 先判断表达式,后执行循环体循环体有可能一次也不被执行

三种循环可以互相转换根据不同情况,选择具体循环

说明

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

58

如果为大写字母,则先转换为小写字母将 a 转换为 c

b 转换为 d ……… x 转换为 z y 转换为 a z 转换为 b

其它字符不变

【例 4.13 】从键盘输入的一串字符(用# 结束输入)按如下规则进行转换:

a b c d … x y z

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

59

编程点拨if ( ch>='A' && ch<='Z' )

ch=ch+32;

'y'和 'z' 通过 ch=ch+2; 后 ch>'z' if ( ch>'z') ch=ch-26;

大写转小写if ( ch>='a' && ch<='z' )

ch=ch+2; 小写转其后第二个字母

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

60

#include <stdio.h>main( ){ char ch='\0'; printf("Input data:\n"); do { ch=getchar( ); if ( ch>='A' && ch<='Z' )

ch=ch+32; if ( ch>='a' && ch<='z' ) { ch=ch+2;

if ( ch>'z') ch=ch-26; }

putchar( ch ); } while ( ch!='#');}

Input data:

UfYr'q 2 yLb 3?#what's 2 and 3?#

不希望输出用用 whilewhile 解决解决

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

61

#include <stdio.h>main( ){ char ch='\0'; printf("Input data:\n"); ch=getchar( ); while ( ch != '#' ) { if ( ch>='A' && ch<='Z' )

ch=ch+32; if ( ch>='a' && ch<='z' ) { ch=ch+2;

if ( ch>'z') ch=ch-26; }

putchar( ch ); ch=getchar( ); }}

不输出“不输出“ #” #”

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

62

4.4 break 语句和 continue语句

4.4.1 循环体中使用break语句

P103P103

返回

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

63

4.4.1 循环体中使用 break语句

结构化程序设计只有一个入口、一个出口 顺序、分支、循环结构满足其要求

为提高执行效率,常要提前终止循环 常用 break 语句实现提前终止循环

P103P103

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

64

【【例例 4.144.14】】 breakbreak 语句示例语句示例#include <stdio.h>main( ){ int i=0,sum=0; for ( i=1; i<=10; i++ ) { if ( i%3 == 0 ) break; sum=sum+i; } printf("i=%d,sum=%d\n",i,sum);}

运行结果:i=3,sum=3

break; 关键字

1和 2 的和 i≤10 说明

提前退出循环

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

65

执行过程i=1

i=i+1 i≤10假

sum=sum+i i%3==0

循环体

第 1 个出口

第 2 个出口输出 i和 sum 的值

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

66

请注意break 语句

只能在 switch 语句体和循环体内使用

功能是 提前退出本层的 switch 语句体或循环

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

67

【【例例 44..1515 】】判断从键盘输入的自然数判断从键盘输入的自然数 (大于 (大于 11 ),是不是素数。),是不是素数。

素数(质数) : 除了 1 和它本身外,没有 其它因子的大于 1 的整数。

例如2 3 13 17 23 等是素数

4 12 20 等不是素数

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

68

要判断 a 是不是素数,应该根据素数的定义,用 2 、 3 、…、 a-1 分别去除 a

如果其中有能整除 a 的数,则 a 不是素数

如果这些数都不能整除 a ,则 a 是素数

只要找到一个能整除 a 的数,就能断定 a不是素数,因此这时应提前退出循环

编程点拨

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

69

else

#include <stdio.h>main( ){ int i=0,a=0; printf("Input a(>1):"); scanf("%d",&a);

for ( i=2; i<=a-1; i++ ) if ( a%i==0 ) break;

if ( i>a-1 )

用 2、 3、…、 a-1去试 若找到因子提前退出

若真,说明正常退出,是素数

若假,说明提前退出,不是素数 printf("%d is a prime number.\

n",a);

printf("%d is not a prime number.\n",a); }

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

70

第 1 次运行:Input a(>1):1111 is a prime number.第 2 次运行:Input a(>1):1515 is not a prime

number.

运行情况

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

71

实际上要判断 a 是不是素数,只需用 2 、 3 、…、 [ ]去除 a 即可

程序改写如下:

a

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

72

#include <stdio.h>#include <math.h>main( ){ int i=0,a=0,end=0; printf("Input a(>1):");

scanf("%d",&a); end=sqrt(a); for ( i=2; i<=end; i++ ) if ( a%i==0 ) break; if ( i>end ) printf("%d is … \n", a); else printf("%d is not … \n", a);}

end 的值可以是

a-1、 a/2 、 a

更优化

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

73

4.4.2 循环体中使用 continue语句

P105P105

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

74

【【例例 4.164.16】】 continuecontinue 语句示例语句示例#include <stdio.h>main( ){ int i=0,sum=0; for ( i=1; i<=10; i++ ) { if ( i%3 == 0 ) continue; sum=sum+i; } printf("i=%d,sum=%d\n",i,sum);}

运行结果:i=11,sum=37

continue;

关键字 1 2 4 5 7 8 10

的和 i>10 说明正常退出循环

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

75

执行过程i=1

i=i+1 i≤10假

sum=sum+i

i%3==0真

循环体

没增加出口

输出 i和 sum 的值

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

76

break和 continue 的区别:

break 结束本层循环 continue 结束本次循环

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

77

课堂练习田径赛 2000米比赛需要在 400米的操场上跑 5圈。编写程序,每跑一圈(输入回车键表示跑了一圈),显示已跑的圈数。

#include <stdio.h>#include <stdlib.h> /*TC中 #include<conio.h>*/

main(){ int n=0; while(1) { printf("%d",n); getchar(); /* 输入回车键表示跑了一圈 */

system("cls"); /*在 TC中 clrscr();*/

n++; if(n>5) break; } }

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

78

教学总结

1 .while 语句。2 . do- while 语句。3 . break 语句。

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

79

作业1 .自学例 4.10 、例 4.12 、例 4.132 . P123 4、 11、 12

预习例 4.17 、例 4.19

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

80

习题讲解语句“ while(x%3) a++; ” 中的表达式 x%3 等价于

A、 x%3!=0 B、 x%3==0 C、 x%3==1 D、 x%3==2

B

A

1. 有以下程序段,则下面描述中正确的是 。int  k=1;while(10)  {  k++;     if(k) break; }A、 1 次也不执行循环体语句B 、执行 1 次循环体语句C 、执行 10 次循环体语句 D 、有语法错

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

81

2. 有以下程序:程序运行后的输出结果是 。main( ) {   int  x,n=0;    for (x=0; x<=60; x++)        if(x%2==0)            if(x%3==0)                if(x%5==0) n++;   printf("%d\n",n); } A 、 3 B、 2 C、 0D 、 61

A

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

82

3. 有以下程序:程序运行后的输出结果是 。main(){  int i;    for (i=1; i<=3; i++)       switch(i%3)       {   case 0: printf("*");break;            default:  printf("#");            case 1: printf("&");        }} A 、 &#* B、 &#&*

C、 &#&*#& D 、有语法错误

B

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

83

4. 以下程序运行后的输出结果是 _________  。main( ){ int a,num=16118,count=0;  do  { a=num%10;  if(a==1) count++;  num=num/10;  } while(num);printf("count=%d",count);}

3

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

84

5. 运行以下程序后,从键盘输入 abcdef< 回车 > ,则程序输出的结果是 _______     。#include <stdio.h>main(){ char ch; int n=0;  ch=getchar( );  while(ch!='\n')  {  ++n ; ch=getchar( );  }  printf("%d",n) ; }

6

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

85

以下程序运行后的输出结果是 ___________。main( ){ int i,s,t;  s=0;  for(i=1;i<=10; ++i) { if(i%2==0) t=t-i;   else t=i;  s=s+t; } printf( "s=%d",s);

}

S=20

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

86

4.5 循环语句的嵌套

一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套 循环,这就是多层循环。三种循环 (while 循环、 do-while 循环和 for 循 环 ) 可以互相嵌套。

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

87

4.5 循环语句的嵌套

下面几种都是合法的形式:(1) while( ) (2) do (3) for(;;) {… {… { while( ) do for(;;) {…} {… } {… } } while( ); } } while( );

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

88

4.5 循环语句的嵌套(4) while( ) (5) for(;;) (6) do {… {… {… do{…} while( ) for(;;){ } while( ) { } … {…} … } } } while( )

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

89

4.5 循环语句的嵌套

【【例例 4.174.17 】】(( 11 ))输出以下内容:输出以下内容: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

P105P105

返回

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

90

分析:一行输出 10 个“ * ” 的语句是for ( j=1; j<=10; j++ ) printf("* "); 输出三行,每行输出 10 个“ *” 的语句是for ( j=1; j<=10; j++ ) printf("* ");printf("\n");for ( j=1; j<=10; j++ ) printf("* ");printf("\n");for ( j=1; j<=10; j++ ) printf("* ");printf("\n");

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

91

分析:一行输出 10 个“ * ” 的语句是for ( j=1; j<=10; j++ ) printf("* "); 输出三行,每行输出 10 个“ *” 的语句是

for ( i=1; i<=3; i++ ) { for ( j=1; j<=10; j++ ) printf("* "); printf("\n"); }

控制行数 控制行数 控制列数 控制列数

输出一行后换行 输出一行后换行

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

92

【【例例 4.174.17 】】(( 22 ))输出以下内容:输出以下内容:

1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10

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

93

#include <stdio.h>main( ){ int i=0,j=0; for ( i=1; i<=3; i++ ) { for ( j=1; j<=10; j++ )

printf("\n"); }}

printf("%3d",j);

每列上输出的值与 j 有关

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

94

【【例例 4.174.17 】】(( 33 ))输出以下内容:输出以下内容:

* * * * * *

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

95

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

+ ) printf("* "); printf("\n");

}}

j<=i

每行输出的数量与 i 有关

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

96

在一个循环体内又包含另一个循环。称它为嵌套循环。for while do-while 可以互相嵌套

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

97

【【例例 44..1818 】】求求 11!!+2+2!!+3+3!!++……+20+20!!

例 4.4 中已介绍求 n! 的程序。为了求各阶乘之和,在求 n! 的程序段外面还要使用循环。

编程点拨

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

98

main( ){ int n=0,i=0; float fac=0,

sum=0;

printf("sum=%e\n",sum);}

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

{

}

i=1; fac=1;do { fac=fac*i; i++; } while(i<=n);

sum=sum+fac;

求 n!

求各阶乘之和

运行结果: sum=2.56133e+18

可移吗?可移吗?

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

99

#include <stdio.h>main( ){ int n=0; float

printf("sum=%e\n",sum);}

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

{ }

fac=1, sum=0;

n=1 fac=1!

sum=1!

fac= fac * n ;sum=sum+fac

;

n=2 fac=2!

sum=1!+2!n=3 fac=3

!sum=1!+2!

+3!……

本程序还可以不用嵌套循环

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

100

【【例例 4.194.19 】】输出所有两位素数输出所有两位素数 要求一行输出要求一行输出 1515 个素数。个素数。

当 a=10,11,…,99 时,逐个判断是不是素数,因此需要再套一个循环。

编程点拨

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

101

#include <math.h>main( ){ int i=0,a=0,end=0,n=0;

}

end=sqrt(a);for ( i=2; i<=end; i++ ) if ( a%i==0 ) break;if ( i>end ) { printf("%4d",a); n++; if ( n%15==0 ) printf("\

n"); }

for ( a=10; a<=99; a++ )

{

}

能改成 for ( a=11; a<=99; a=a+2 ) ?

判断a是否素数

aa在在 10~9910~99时时

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

102

本例是在范围内逐一变化 a 的值,再一一去试

使用逐个去试的方法——穷举法或枚举法

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

103

课堂练习 输入 7 个 1 至50 之间的整数,每输入一个数,打印出该值个数的 * 。如:输入10 ,输出 10个* 。

要求:输入的数一定是 1 至 50之间的数,否则,要求重新输入。

#include <stdio.h>main(){ int i=0,j=0,n=0; for(i=1;i<=7;i++) { printf(" input n- -%d: ",i); do { scanf(" %d ",&n) if(n>=1&&n<=50) break; else printf(“input again:”); } while(1); for(j=1;j<=n;j++) printf(" *" ); printf(" \n "); } }

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

104

以下程序段的输出结果是           。int i,j,k ;for (i=1; i<5; i=i+2 )  { k=1;     for( j=i; j<5; j++)

k=k+j;  }printf(" s=&d\n",k);

A、 s=1 B、 s=8 C、 s=18 D、 s=5

B

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

105

教学总结本次课的讲授内容是:1 .循环语句的嵌套。2 .完善贯穿实例。

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

106

作业P125 16、 18

预习4.7节 上机训练

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

107

上机实验(第 3 次实验)

完成训练 4.1完成训练 4.2完成训练 4.3完成训练 4.4

P120P120