第五章循环结构程序设计讲解材料_第1页
第五章循环结构程序设计讲解材料_第2页
第五章循环结构程序设计讲解材料_第3页
第五章循环结构程序设计讲解材料_第4页
第五章循环结构程序设计讲解材料_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

第五章循环结构程序设计往前走,直到到达目标为止没到?往前走YN只要.....

5.1程序中需要用循环结构什么是循环?为什么要使用循环?问题1:问题2:求学生平均成绩

分数相加后除以课数在许多问题中需要用到循环控制。循环结构就是用来处理需要重复处理的问题的,所以又称重复结构。它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。循环条件(结束条件)循环的内容循环要素:实现循环的方式:whiledowhileforsum=sum+i;i++;sum=0;i=1;i<=100NY输出sum计算1+2+3+......+100表达式语句非00while(表达式)语句;while语句intmain(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf(“%d\n”,sum);return0;}循环体循环条件说明:(1)循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。运行结果:

50505.2.2

dowhile语句表达式语句串非00格式:

do{语句串;

}while(表达式);语义:执行语句串直到表达式为假dowhile语句循环体循环条件do{语句串;

}while(表达式);intmain(){inti=1,sum=0;do{sum+=i++;}while(i<=100);printf(“%d”,sum);return0;}表达式语句串非00dowhile语句循环体循环条件while和do-while循环的比较凡是能用while循环处理,都能用do…while循环处理。do…while循环结构可以转换成while循环结构。在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。例5.11while和do-while循环的比较

(1)(2)

#include<stdio.h>#include<stdio.h>

voidmain()voidmain()

{intsum=0,i;{intsum=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\\n”,printf(“sum=%d\\n”,

sum);sum);

}}运行结果:1↙sum=55再运行一次:11↙sum=0运行结果:1↙sum=55再运行一次:11↙sum=11说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。表达式语句串非00dowhile语句表达式语句非00while语句表达式语句表达式语句两类循环的对比当型循环直到型循环说明:设计循环结构,要考虑两个问题:一是循环体,二是循环结束条件。注意while循环中判断的条件是循环继续的条件,而不是结束条件。例如:for(i=1;i<=100;i++)sum=sum+i;相当于:

i=1;while(i<=100){ sum=sum+i; i++; }5.3用for语句实现循环

5.3.1for语句的一般形式和执行过程格式:

for(e1;e2;e3)s语义:

e1;while(e2){s;e3;}e2e1非00e3s循环体for(循环变量赋初值;循环条件;循环变量增值)

for(e1;e2;e3)ssum=0;for(i=1;i<=100;i++)sum=sum+i;for(i=1,sum=0;i<=100;sum=sum+i++);e2e1非00e3s循环控制变量for(i=1,sum=0;i<=100;i++)sum=sum+i;i<=100i=1非00i++sum=sum+i循环体C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中。16在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容,即循环体不存在while(i<100);

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

printf("%d",i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量注意17如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while只是思路,不是定律选择三种循环的一般思路18输入全班N个人的分数,求出最高分#include<stdio.h>#defineN10main(){inti,max=0,score;printf(“input%dscore:”,N);for(i=0;i<N;i++){scanf(“%d”,&score);if(score>max)max=score;}printf(“max=%d\n”,max);}19输入全班N个人的分数,求出最高分#defineN10main(){inti,max=0,score;printf(“input%dscore:”,N);

i=1;while(i<=N){scanf(“%d”,&score);if(score>max)max=score;

i++;}printf(“max=%d\n”,max);}

人口增长预测。据2005年末统计,我国人口为130756万人,如果人口的年增长率为1%,请计算到哪一年中国总人口超过15亿。例题5.5解题思路计算人口增长和计算存款利息的公式是相同的。假设原来人口为p0,则一年后的人口:其中r是年增长率。用此公式依次计算出每年的人口,每算出一年的人口后就检查一下是否达到或超过15亿?如果未达到或超过15亿,就再计算下一年的人口,直到某一年的人口达到或超过15亿为止。编写程序 #include<stdio.h>

voidmain()

{

doublep=1.30756e9,r=0.01;

inty;

for(y=2006;p<1.5e9;y++)

{/*赋值号两侧的变量p代表不同含义*/

p=p*(1+r);

}

printf("year=%d,p=%e\n",y-1,p);

}运行结果:year=2019,p=1.503007e+009说明: y代表年份。循环体中只有一个语句,用来计算从2006年开始的各年的人口数。在for语句中设定的循环条件是p<15亿,当某一年的p达到或超过15亿,就停止循环,输出年份和当年的人口数。由于在最后结束循环前y又加了1,因此在输出年份时应输出y-1的值而不是y的值。

一个变量开始时有一初值,通过一定的运算,可以推算出一个新的值,再从这个新值又推出下一个新值,即不断用计算出的新值去取代原有的值,这种方法称为迭代。上面的计算公式p=p*(1+r)称迭代公式。迭代算法一般是用循环来实现的。迭代是一种常用的算法,用人工实现很麻烦,而用计算机实现却十分方便。总结:要写出一个正确的循环结构,对循环控制变量要做三方面的工作:

1、对循环控制变量赋初值。

2、将循环控制变量写入正确的控制条件。

3、对循环控制变量值的更新。如x=1;

/*给x赋初值*/

while(x<10)

/*循环条件*/

{s=s+x;x++;

/*对x的值做更新、调整*/

}找问题:(1)while(count!=10);{count=1;sum=sum+x;count=count+1;}(2)name=10;do{name=name+1;printf(“ok”);}while(name=1)5.4循环的嵌套一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套。5.4循环的嵌套下面几种都是合法的形式:(1)

while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();5.4循环的嵌套(4)while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()

s=0;for(i=0;i<10;i++)

for(j=0;j<10;j++)s+=i*10+j;printf(“s=%d\n”,s);i=1i<10s=0j=0j<10s+=i*10+jj++i++NNyy输出s读程序?s=0;for(i=0;i<10;i++);for(j=0;j<10;j++);s+=i*10+j;区别!s=0;for(i=0;i<10;i++)for(i=0;i<10;i++)s+=i*10+i;s=0;for(i=0;i<10;i++)for(j=0;j<10;j++)s+=i*10+j;31编程输出如下形式的乘法九九表32#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表头*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(m=1;m<10;m++) { for(n=1;n<10;n++) { printf("%4d",m*n); } printf("\n"); }}33将上例输出格式改成如下的下三角格式打印34#include<stdio.h>main(){ intm,n; for(m=1;m<10;m++) printf("%4d",m);/*打印表头*/ printf("\n"); for(m=1;m<10;m++) printf("-"); printf("\n"); for(m=1;m<10;m++) { for(n=1;n<=m;n++) { printf("%4d",m*n); } printf("\n"); }}5.5提前结束循环

5.5.1用break语句提前退出循环

break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。一般形式:

break;说明:

break语句不能用于循环语句和switch语句之外的任何其他语句中。

统计各班级的学生的平均成绩。已知各班人数不等,但都不超过30人。编一个程序能处理人数不等的各班学生的平均成绩。例题5.6解题思路

如果各班人数相同,问题比较简单,只需用一个for语句控制即可:

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

但是现在有的班不足30人,应当设法告诉计算机本班的人数,使程序也能统计出该班的平均成绩。可以约定,当输入的成绩是负数时,就表示本班数据已结束(一般情况下成绩不会是负数)。在程序接收到一个负的分数时就提前结束循环,计算出本班平均成绩。用break语句可以用来实现提前结束循环。5.5提前结束循环编写程序5.5提前结束循环#include<stdio.h>

voidmain()

{

floatscore,sum=0,average;

inti,n;

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

{

scanf("%f",&score);/*输入一个学生的成绩*/

if(score<0)break;/*如果输入负值,则跳出循环*/

sum=sum+score;/*把该成绩累加到sum*/

}

n=i-1;/*学生数应是i-1*/

average=sum/n;/*计算平均成绩*/

/*输出学生数和平均成绩*/

printf("n=%d,average=%7.2f\n",n,average);}运行结果:100↙(输入一个学生成绩)80↙70↙-1↙(输入负数,表示本班数据结束)n=3,average=90.00说明:如果一个班有30人,则输入完30人的成绩后累计总分后自动结束循环,不必再输入负数作为结束标志。在结束循环后i的值等于31(因为执行完30次循环后,i再加1,变成31,此时才终止循环),因此学生数n应该等于i-1。如果一个班人数少于30人,则在输入完全班学生的成绩后,输入一个负数,此时程序就跳过循环体其余的语句,也不再继续执行其余的几次循环。直接跳到循环下面的语句(n=i-1;)继续执行。刚输入的数不进行累加(不执行sum=sum+score;)。注意此时i的值,假如已输入了25个有效分数,在第26次循环时输入一个负数,此时i的值是26,而学生数n应是i-1。5.5提前结束循环5.5提前结束循环

5.5.2用continue语句提前结束本次循环continue语句作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.一般形式:

continue;5.5提前结束循环

5.5.2用continue语句提前结束本次循环continue语句和break语句的区别:

continue语句只结束本次循环,而不是终止整个循环的执行。while(表达式1)

{…

if(表达式2)continue;

…}continue语句和break语句的区别:

break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。

while(表达式1)

{…if(表达式2)break;…}5.5提前结束循环

5.5.2用continue语句提前结束本次循环

输入一个班全体学生的成绩,把不及格的学生成绩输出,并求及格学生的平均成绩。例题5.7解题思路

在进行循环中,检查学生的成绩,把其中不及格的成绩输出,然后跳过后面总成绩的累加和求平均成绩的语句。用continu语句即可处理此问题。5.5提前结束循环#include<stdio.h>

voidmain()

{

floatscore,sum=0,average;

inti,n=0;

for(i=1;i<6;i++)/*假设有5个学生*/

{

printf("pleaseenterscore:");

scanf("%f",&score);/*输入学生成绩*/

if(score<60)/*如不及格*/

{/*输出不及格的成绩*/

printf("Fail:%7.2f\n",score);

continu;}/*跳过下面的语句,结束本次循环*/

sum=sum+score;

n=n+1;/*n是用来统计及格学生人数*/

}

average=sum/n;/*及格学生平均分数*/

/*输出及格学生人数和平均分数*/

printf("\nn=%d,average=%7.2f\n",n,average}运行结果:pleaseenterscore:89↙pleaseenterscore:56↙Fail:56pleaseenterscore:76↙pleaseenterscore:58↙Fail:58pleaseenterscore:98↙n=3average=87.675.5提前结束循环编写程序说明:输入不及格学生成绩后,输出该成绩,然后跳过循环体中未执行的语句,即不参加累计总分sum,也不累计合格学生数n。但是,继续执行后面的几次循环。5.5提前结束循环5.6几种循环的比较(1)三种循环都可以用来处理同一问题,一般情况下它们可以互相代替。(2)在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。5.6几种循环的比较for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。(3)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。5.6几种循环的比较(4)while循环、do…while循环和for循环,都可以用break语句跳出循环,用continue语句结束本次循环。

有一对兔子,出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问40个月的兔子总数为多少?例题5.8解题思路5.7程序举例

第几个月小兔子对数中兔子对数老兔子对数兔子总数110012010131012411135212563238753513┆┆┆┆┆可以看到每个月的兔子总数依次为

1,1,2,3,5,8,13…这就是有名的费波那西(Fibonacci)数列。

5.7程序举例

编写程序5.7程序举例

#include<stdio.h>

voidmain()

{

longintf1,f2;

inti;

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;

}

}运行结果:

11235813213455891442333776109871597258441816765109461771128657463687502512139319641831781151422983204013462692178309352457857022887922746514930352241578173908816963245986102334155说明:(1)变量f1和f2用长整型,在printf函数中输出格式符用“%12ld”,而不是用“%12d”,这是由于在第23个数后,整数值已超过整数最大值32767,因此必须用长整型变量才能容纳,并用“%ld”格式输出。(2)if语句的作用是使输出4个数后换行。i是循环变量,当i为偶数时换行,而i每增值1,就要计算和输出2个数(f1,f2),因此i每隔2换一次行相当于每输出4个数后换行输出。5.7程序举例

给一个整数m,判断它是否素数。例题5.9解题思路5.7程序举例

让m被i(i由2变到k=)除,如果m能被某一个i(2~k之间的任何一个整数)整除,则m必然不是素数,不必再进行下去。此时的i必然小于或等于k;如果m不能被2-k之间的任一整数整除,则m应是素数,此肘在完成最后一次循环后,使i再加1,因此i的值就等于k+1,这时才终止循环。在循环结束之后判别i的值是否大于或等于k+1,若是,则表明未曾被2-k之间任一整数整除过,因此输出“是素数”。53判断m是否是素数输入m判断m是否是素数输出结果一个自然数,若除了1和它本身外不能被其他整数整除,则称为素数。54k=sqrt(m)i=2i<=ki能被m整除m不是素数i++yNm是素数yNi>kyN#include<stdio.h>

#include<math.h>

voidmain()

{intm,i,k;

printf(“pleaseenteraintegernumber:”);

scanf(“%d”,&m);/*输入一个整数m*/

k=(int)sqrt(m);/*对m求平方根,再取整*/

for(i=2;i<=k;i++)/*i作为除数*/

/*如果m被i整除,m肯定不是素数*/

if(m%i==0)break;

if(i>k)printf("%disaprimenumber.\n",m);

elseprintf("%disnotaprimenumber.\n",m);

}编写程序5.7程序举例

运行结果:

pleaseenteraintegernumber:17↙17isaprimenumber.

译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例题5.10解题思路5.7程序举例

可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。ABCDEFGHIJKLMNOPQRSTUVWXYZ#include<stdio.h>

voidmain()

{charc;

while((c=getchar())!=‘\n’)

{/*判定c是否字母*/

if((c>=‘a'&&c<='z')||(c>='A'&&c<='Z'))

{c=c+4;/*是字母就加4*/

/*如在字母范围外就减26*/

if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;

}

printf("%c",c);

}

printf("\n");

}编写程序5.7程序举例

运行结果:

China!↙

Glmre!

说明:内嵌的if语句不能写成:if(c>’Z’||c>’z’)/*请和程序笫7行比较*/c=c-26;因为如果所有小写字毋都满足“c>′Z′”的条件,从而也都执行“c=c-26;”语句,这就会出错。因此必须限制其范围为“c>′Z′&&c<=′Z′+4”,即原字母为W到Z。只有符合此条件才减26,否则,不应按此规律转换。5.7程序举例

5.8提高部分

5.8.2for语句的各种形式for语句相当灵活,形式变化多样:

(1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如:

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

执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。如:

for(i=1;;i++)sum=sum+i;

表达式1是一个赋值表达式,表达式2空缺。它相当于:

i=1;while(1){sum=sum+1;i++;}5.8提高部分

5.8.2for语句的各种形式(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:

for(i=1;i<=100;){sum=sum+i;i++;}

在上面的for语句中只有表达式1和表达式2,而没有表达式3。i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。5.8提高部分

5.8.2for语句的各种形式(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:

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

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

在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。5.8提高部分

5.8.2for语句的各种形式(5)3个表达式都可省略,如:

for(;;)语句相当于

温馨提示

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

评论

0/150

提交评论