2014级程序设计语言课件第3章循环结构_第1页
2014级程序设计语言课件第3章循环结构_第2页
2014级程序设计语言课件第3章循环结构_第3页
2014级程序设计语言课件第3章循环结构_第4页
2014级程序设计语言课件第3章循环结构_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

循环结构循环结构知识点体系问题的提出三种基本循环结构循环控制语句循环嵌套循环应用一、问题的提出?如何计算1+2+3+…+10的和并输出结果?读者应该已经想到,将这10个数直接加起来,输出即可。那如何计算1+2+3+……+100这样前100个自然数的和呢?void

main(){printf(“10自然数的和=%d”,1+2+3+4+5+6+7+8+9+10);}循环结构一、问题的提出?我们之所以感到计算机无所不能,是因为计

算机能不厌其烦地重复执行大量枯燥的工作。计数控制标记控制循环结构术语循环条件——结构中的测试表达式循环体——每个循环周期均要执行的语句序列循环控制变量——控制条件真/假值的变量。对循环控制变量应做如下处理:赋初值;将其代入正确的循环条件;更新/调整【累加型】计算1+2+3+……+nsi

=

si-1

+

i【累乘型】计算n!=1

·

3

·

… ·

npi

=

pi-1

·is=0;for(i=1;i<=n;i++)s

=

s

+

i

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

=

p

*

i

;注意:整型定义为long

或unsigned

long

型智人之法:归纳法(递推法)循环结构的应用场合1*1+2*2+3*3=?s=1*1+2*2+…s=1*1+2*2+3*3…+100*1001*1+2*2+……+99*99+100*100=?for(i=1,s=0;i<=100;i++)s

+=

i*i

;二、循环结构的分类循环的概念:条件成立,重复执行某些步骤。C语言循环结构分成三种:当型循环

直到型循环for循环(本质上也属于当型循环)二、当型循环结构的流程图假循环条件真AcD循环体二、当型循环结构的语法格式while(循环条件){循环体;}while(i<=5){sum=sum+i;i=i+1;}i<=5sum=sum+ii=i+1NOYES二、当型循环结构(1+2+3+4+5)while(i<=5){sum=sum+i;i=i+1;

}

void

main(){int

i,sum;sum=0;i=1;printf(“%d”,sum);}输出sum开始sum=0i=1i<=5sum=sum+ii=i+1YES结束NOi为循环变量二、当型循环结构_循环执行过程#include

<stdio.h>void

main(){int

i,sum;sum=0;i=1;while(i<=5){sum=sum+i;i=i+1;}printf(“%d”,sum);}sumi循环前:01第1次循环后:12第2次循环后:33第3次循环后:64第4次循环后:105第5次循环后:156如何求解1+4+7+10+13+16;三、直到型循环结构的流程图件PAc假条真D循环条件循环体三、直到型循环结构的语法格式do{循环体;}while(循环条件);i<=5sum=sum+ii=i+1NOYESdo{sum=sum+i;i=i+1;}

while(i<=5);三、直到型循环结构(1+2+3+4+5)开始sum=0i=1sum=sum+ii=i+1输出sum结束NOi<=5YES#include

<stdio.h>void

main(){int

i,sum;sum=0;i=1;do{sum=sum+i;i=i+1;}

while(i<=5);printf(“%d”,sum);}四、for循环结构的流程图句假表达式2真语 块ScD表达式1表达式3for

(表达式1;

表达式2;表达式3){语语句句;;}首先执行表达式1。如果表达式2的值为非0,就重复执行语句和表达式3,直到表达式2的值为0时止循环起始条件循环结束条件循环增量四、for循环结构的语法格式四、for循环结构的语法格式for(表达式1;表达式2;表达式3)语句块S;表达式1表达式2语句块S表达式3YESNOfor(i=1;i<=5;i++){sum=sum+i;}i=1i<=5sum=sum+i;i++四、for循环结构(1+2+3+4+5)输出sum开始sum=0i=1i=i+1i<=5YESsum=sum+i结束NOfor(i=1;i<=5;i=i+1){sum=sum+i;}#include

<stdio.h>void

main(){int

i,sum;sum=0;printf(“%d”,sum);}四、for循环语句与while循环语句的区别(1+2+3+4+5)i=1;while(i<=5){sum=sum+i;i=i+1;}#include

<stdio.h>void

main(){int

i,sum;sum=0;printf(“%d”,sum);}for(i=1;i<=5;i++){sum=sum+i;}#include

<stdio.h>void

main(){int

i,sum;sum=0;printf(“%d”,sum);}真正的累加算法并没有改变,只是表达方式有点区别。for循环语句是

C的特色,表达方式简洁。for循环结构本质上也是当型循环结构。for循环说明:最简单的应用形式:

for(循环变量赋初值;循环条件;循环变量增值)语句例如:for(i=1;i<=10;i++)s=s*i;三个表达式均可缺省,但起分割作用的两个分号不可省。例如:for(

;

;

)

等效于

while(1)表达式1省略,应在for之前对循环变量赋初值i=1;for(;i<=5;i++)printf(“%d\n”,i);for(i=1;i<=5;i++)printf(“%d\n”,i);表达式2省略,则不判断条件,循环无终止进行下去表达式3省略,则应另设法保证循环的结束此功能一定在循环体中完成例:for(i=1;i<=5;)

{printf(“%d\n”,i);i++;}(3)表达式1和表达式3可为逗号表达式,因此可以对多个变量赋初值及修改例如:for(i=1,j=10;i<=j;i++,j--)k=i+j;原则上表达式2不可省略,若省略需要在循环体中用其它手段(break、goto等)结束循环。(4)for语句的循环体还可为另一个循环语句for(i=1;i<=2;i++)for(j=1;j<=2;j++){printf(“%3d”,i+j);printf(“\n”);}output:

2334例如:【例】while和do-while循环的比较(1)

void

main(){int

i,sum=0;scanf("%d",&i);while(i<=10){sum=sum+i;i++;}printf(“sum=%d\n”,sum);}(2)void

main(){int

i,sum=0;scanf("%d",&i);do{sum=sum+i;i++;}while(i<=10);printf("sum=%d\n",sum);}循环至少执行一次循环没有被执行输入:12输出:

sum=12输入:12输出:

sum=0三种循环语句的比较for

语句与while语句执行过程相同,但for语句简洁、清晰,它将初始条件、判断条件和循环变量的在一行书写,显得直观、明了。while和do-while语句的循环控制变量初始化是在循环语句之前完成,而for语句循环变量的初始化是在for中(表达式1)中,也可以在for语句前实现。for语句和while语句是判断条件后执行循环体;而do-while是先执行循环体后判断条件,无论条件是否满足都要执行一次循环体。选择三种循环的一般原则如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while

(i

<

100);i++;for

(i

=

0;

i

<

100;

i++);printf("%d",

i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量四、启发式教学for(i=1;i<=5;i++){sum=sum+i;}printf(“%d”,sum);#include

<stdio.h>void

main(){int

i,sum;sum=0;}for(i=1;i<=100;i++)问题1:程序功能是什么?for(i=1;i<=100;i+=2)问题2:程序功能是什么?for(i=30;i<=100;i+=2)问题3:程序功能是什么?问题4:循环体一共执行了多少次?四、循环知识点总结分析:①

在解决问题前,首先需要找出前后通项之间的递推关系;②

在循环中,写出递推表达式,然后累加或累乘到结果变量中。对于如下的表达式:①累加和表达式:x1+x2+x3+…+xn②累乘表达式:t1*t2*t3*…*tn说明:①其中需要累加的项xi或累乘的项ti称为通项。②上述问题通常采用循环算法解决。③累加和的循环表达式通常写成:sum=sum+xi④累乘的循环表达式通常写成:term=term*ti四、启发式教学①如何求2+22+222+……(p94_13)term=1;for(m=1;m<=k;m++)term=term*m;此程序段的功能是什么?假真break表达式1真表达式2假循环语句的下一条语句循环语句的下一条语句假表达式1真表达式2假真continue五、循环辅助语句break

statementprintf(“Input

a

value

between

1

7:

”);scanf(“%d”,&value);for

(i =

1;

i

<=

7;

i++){if

(

i

==

value

)break;printf(“\n%d”,i);}printf(“I’m

out

of

the

loop!\n”);value???ii

<=

7i

==

valueInput

a

value

between

1-7:

_Input

a

value

between

1-7:

411

<=

7

true1

==

4

false4Input

a

value

between

1-7:

4122

<=

7

true2

==

4

falseInput

a

value

between

1-7:

41233

<=

7

true3

==

4

falseInput

a

value

between

1-7:

412344

<=

7

true4

==

4

trueInput

a

value

between

1-7:

5123

I’m

out

of

the

loop!Nowbrweahka?t

can退出一yo层u

循环

con或cluswdeitcahbout

break?continue

statementExample:for

(

i

=

0;

i

<=

5;

i++

){if

(

i

%

2

)continue;elseprintf(“%d

is

an

even

number.

”,

i);printf(“Print

iff

even

!

\n”);}i_00

<=

5

true01

<=

5

true12

<=

5

true3

<=

5

true4

<=

5

true5

<=

5

true1234101i

<=

5

i

%

26

<=

5

false

00

is

an

even

number._0is

an

even

number.

Print

iff

even

!_0is

an

even

number.

Print

iff

even

!2

is

an

even

number._0is

an

even

number.

Print

iff

even

!2is

an

even

number.

Print

iff

even

!_0is

an

even

number.

Print

iff

even

!2is

an

even

number.

Print

iff

even

!4

is

an

even

number._0is

an

even

number.

Print

iff

even

!2is

an

even

number.

Print

iff

even

!4is

an

even

number.

Print

iff

even

!_Nowcownhtaint

ucaen?you中c断on此c次lu循de环a体bo的ut执行,co开nt始in下ue一?次56#include

<stdio.h>main(){int

i,

n;for

(i=1;

i<=5;

i++){printf("Please

enter

n:");scanf("%d",

&n);if

(n

<

0)break;printf("n

=

%d\n",

n);}printf("Program

is

over!\n");}Please

enter

n:10↙n

=

10Please

enter

n:

-10↙Program

is

over!break语句的用法#include

<stdio.h>main(){int

i,

n;er

n:");for

(i=1;

i<=5;

i++){printf("Please

entscanf("%d",

&n);if

(n

<

0)continue;printf("n

=

%d\n",

n);}printf("Program

is

over!\n");}Please

enter

n:

10↙n=10Please

enter

n:-10↙Please

enter

n:

20↙n=20Please

enter

n:-20↙Please

enter

n:

30↙n=30Program

is

over!continue语句的用法说明:1、break语句可用于switch语句结构中也可用于循环中。2、continue语句只可用于循环中。3、在循环嵌套中break与continue都只影响包含它的那层循环4、少用为妙习题:选择下面程序的运行结果#include

<stdio.h>void

main(void){inti;for(i=1;i<=5;i++){if(i%2)

printf("*");else

continue;printf("#");}printf("$\n");}A)*#*#*#$B)#*#*#*$C)*#*#$D)#*#*$一般形式:语句标号;goto……语句标号:……或语句标号:…………goto语句标号;goto语句void

main(){int

i,s;i=1;s=0;loop: /*标号作用*/if(i<=100){s+=i;++i;gotoloop;}printf("%d\n",s);}5050通常goto语句与

if条件语句连用【例】用goto语句求s=1+2+3……100是goto的过错?还是程序员的过错?/*被goto跳过*/破坏了结构化设计风格容易带来错误隐患goto

next;int

sum

=

0;…next:Evil

goto’s

?

Maybe

Not…凌波微步,未必摔跤现代观点认为:混乱根源不在goto,而在标号任何程序都可以不用goto就实现其功能但在某些情况下,使用goto可以让程序更清晰两种适合使用goto的情况跳向共同的出口位置,进行退出前的处理工作跳出多重循环的一条捷径{…{…goto

error;}}使用goto的原则主张少用、慎用,而不是禁用保证使用之后,程序仍然是单入口,单出口不要使用一个以上的标号不要让goto制造出永远不会被执行的代码六、循环嵌套内循环交叉循环外循环入口内循环出口内循环出口外循环外循环出口六、循环嵌套嵌套循环的概念:一个循环结构,完整地包含在另一个循环结构中。嵌套循环:for(…){….for(…){….}…..}内循环外循环六、循环嵌套执行过程for(i=3;i<=6;i+=2)for(j=12;j<=38;j+=13)printf(("%d,%d\n",i,j);i=3j=12j=25j=38j=12j=25j=38i=5i=3j=12j=j+13i<=6YESNONOj<=38YES输出i,ji=i+2退出双重循环循环嵌套在循环体中,又包含有循环结构即构成循环嵌套1

2

3

4

5

6

7

8

9--------------------------------------12

43

6

94

8

12

165

10

15

20

256

12

18

24

30

367

14

21

28

35

42

498

16

24

32

40

48

56

649

18

27

36

45

54

63

72

81行循环中包含列循环输出下三角形乘法九九表例7

8

9-------------3

6

9491

2

3------------12

44

8

125

10

156

12

184

5

6-------------1620

2524

30

367

16243240489

182736455456

6463

72

81思路:行号为i,列号为j(1<=i<=9)(1<=j<=i)则:第i行中一共要输出i

个乘积i=7j=5i*j#include

<stdio.h>void

main

(

){

int

i=1,

j;while

(i

<=

9

)printf

("%4d",i++);/*i:行计数器

j:列计数器

*//*

控制打印表头*/printf("\n----------------------------------\n");for

(i=1;i<=9;i++)

/*

行循环入口*/计数器置1

*/{j=1;while(j<=i

)/*嵌套的内循环。输出第i行*//*输出乘积*//*

列计数器+1

*/{printf

(“%4d”,

i*j);j

++;}printf

("\n");/*

一行输出结束后,输出\n

*/}}打印九九乘法表(三角形)内循环终值与外循环变量有/*

列关用for语句实现打印乘法九九表(三角形)#include

<stdio.h>void

main

(

){

int

i,j;for

(

i=1;

i<10;

i++

)printf

(“%4d”,i);

/*

打印表头*/printf

("\n--------------------------\n");for(i=1;

i<10;

i++)

/*

控制打印表体*/j<=i;for

(

j=1; j++

)printf

(

(j==i)

?

"%4d\n":"%4d",i*j);}若要打印完整的九九乘法表,则哪里需要修改?七、循环应用_【案例】(研究性教学、计算思维)【案例】求1!+2!+3!+……+n!分析:该问题本质上是求累加和,所以通过循环求出每一通项的值,然后将其累加到累加和上。如何求出通项的值?有2种方法。七、循环应用【案例】求1!+2!+3!+……+n!(第一种解决方案)term=1;for(j=1;j<=i;j++)term=term*j;sum=sum+term;#include<stdio.h>void

main(){int

i,j,n;float

term,sum;scanf("%d",&n);sum=0;for(i=1;i<=n;i++){}printf("n=%d,sum=%f",n,sum);}七、循环应用【案例】求1!+2!+3!+……+n!(第二种解决方案)term=term*i;

//i!=(i-1)!*i;递推关系

sum=sum+term;#include<stdio.h>void

main(){int

i,j,n;float

term,sum;scanf("%d",&n);sum=0;term=1;for(i=1;i<=n;i++){}printf("n=%d,sum=%f",n,sum);}比较其时间效率例:打印出所有的“水仙花数”(一个3位数,其各位数字的立方和等于该数本身。153=13+53+33)#include

"stdio.h"void

main(

){

int

i,j,k,n;for

(n=100;n<1000;n++){

i=n/100;j=n/10-i*10;k=n%10;/*百位数*//*十位数*//*个位数*/if(n==i*i*i+j*j*j+k*k*k)printf("%d\n",n);

}}【案例】设计一个程序,输入一个n位数(n>=3),将各数字分开,并按其反序输出。分析:问题的关键是如何将一个数字的各位分开?如1234,将其分解成1,2,3,4。初值:step1:x0=1234r1=x0%10

=

4x1=x0/10

=

123r2=x1%10

=

3x2=x1/10

=

12r3=x2%10

=

2x3=x2/10

=

1r4=x3%10

=

1x4=x3/10

=

0step2:step3:step4:程序:#include<stdio.h>void

main(){int

x,r;scanf("%d",&x);while(x!=0){r=x%10;x=x/10;printf("%d",r);}printf("\n");}递推公式:运行结果输入一个整数:5353443535【案例】编一程序求出满足不等式的最小n值。分析:此题不等式左边和式中的数据项(求和项)个数是未知的,也正是需要求出的的n。因此用while循环比较方便。对于和式中的每个数据项(求和项),i=1,2,...n,可采用循环累加的方法来计算出不等式的和。设循环变量为i,它应从1开始取值,每次增加1,直到不等式的值不小于5为止,此时的i值就是所求的n。设累加和用变量s表示12

31

1n1

+

+

+

+

5采用while循环编写出程序如下:#include<stdio.h>void

main(){int

i=0;double

s=0;while(s<5)s=s

+

1.0/++i;printf("n=%d\n",i);}采用for循环编写程序,则如下所示:#include<stdio.h>void

main(){int

i;double

s=0;for(i=1;

s<5;

i++)s+=1.0/i;printf("n=%d\n",i-1);/*注意:此i-1的值为所求的n值*/}该程序的输出结果应为:n=83八、循环的综合应用_逻辑推理问题【案例】(谁做的好事)已知有有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。A说:不是我。

B说:是C。C说:是D。D说:他胡说。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。循环的综合应用_逻辑推理问题1.算法分析⑴我们把四个人说的四句话写成关系表达式。四个人分别用’A’、’B’、’C’、’D’表示(必须用4个连续常数表示,也可以是1、2、3、4)。定义变量thisman表示做好事的人。将相关的陈述写成关系表达式和逻辑表达式四个人说的话关系表达式A说:不是我。thisman!=‘A’B说:是C。thisman==‘C’C说:是D。thisman==‘D’D说:他胡说。thisman!=‘D’循环的综合应用_逻辑推理问题⑵关系表达式的计算结果只有0(假)和1(真)两种结果。现在“已知三个人说的是真话,一个人说假话”,也就是表中的4个关系表达式中有3个是真的,1个是假的。因此4个关系表达式的值的和应该等于3。定义变量cond表示四个关系表达式的和:cond=(thisman!='A')+(thisman=='C')+(thisman=='D')+(thisman!='D');那么,cond==3循环的综合应用_逻辑推理问题⑶穷举试探。我们现在并不知道是谁做的好事,但我们知道做好事的人是A,B,C,D四个人中的某一个。因此,我们可以一个一个地试探。

先假设是A做的好事,即thisman=‘A’,然后看

cond==3条件是否成立,然后再假设是B做的好事,即

thisman=‘B’,再测试条件cond==3是否成立,如此继续下去,将所有可能的情况(本例有4种情况)都测试一遍,在实际编程过程中,都是使用循环来一个一个的测试循环的综合应用_逻辑推理问题#include<stdio.h>void

main(){char

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论