第7讲 循环结构程序设计_第1页
第7讲 循环结构程序设计_第2页
第7讲 循环结构程序设计_第3页
第7讲 循环结构程序设计_第4页
第7讲 循环结构程序设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第7讲循环结构程序设计结构化程序设计之三7.1循环结构当型循环结构直到型循环结构PA假真当P为真AAP假真A直到P为真注:A可以是一个简单语句,也可以是一个复合语句。在C语言中可以用以下语句来实现循环:1.用while语句;2.用do--while语句;用for语句;用goto语句和if语句构成循环。要求:输入5个数,并求出其和startsum<--n1+n2+n3+n4+n5Inputn1Inputn2Inputn3Inputn4Inputn5outputsumend#include<stdio.h>

intmain()

{

intn1,n2,n3,n4,n5,sum=0;

scanf("%d",&n1);

scanf("%d",&n2);

scanf("%d",&n3);

scanf("%d",&n4);

scanf("%d",&n5);

sum=n1+n2+n3+n4+n5;

printf("sumis%d\n",sum);

return0;

}要求:输入5个数,并求出其和startsum=sum+nInputnOutputsumendcount<6count=1,sum=0count++TF7.2while语句1、while语句的形式:

while(表达式)

循环体;

}其他语句while语句常称为“当型”循环语句。真(非零)表达式

循环体假(零)intmain(){ intn,count=1,sum=0;

while(count<6) { scanf("%d",&n); sum=sum+n; count++;

} printf("sumis%d\n",sum); return0;}startsum=sum+nInputnOutputsumendcount<6count=1,sum=0count++TFintmain(){ intn,count=1,sum=0;

while(count<6) { scanf("%d",&n); sum=sum+n; count++;

} printf("sumis%d\n",sum); return0;}循环变量初值循环条件,while语句后没有“;”循环变量增值例用while循环求

#include<stdio.h>intmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);return0;}循环结构程序示例假i<=100sum=sum+ii=i+1真i=17.3do--while语句1、do--while的形式:

do{

循环体;

}while(表达式);真(非零)表达式

循环体假(零)

do--while语句常称为“直到型”循环语句。循环结构程序示例要求:用do…while循环求#include<stdio.h>voidmain(){inti,sum=0;i=1;do{sum+=i; i++;}while(i<=100);printf("%d",sum);}while和do~while比较#include<stdio.h>voidmain(){inti,sum=0;scanf(“%d”,&i);do{sum+=i; i++;}while(i<=5);printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;

scanf(“%d”,&i);while(i<=5){sum+=i; i++;}printf("%d",sum);}注意:在if、while语句中,表达式后面都没有分号,而在do-while语句的表达式后面则必须加分号。do-while和while语句相互替换时,要注意修改循环控制条件。7.4for语句1、for的形式:for(初始表达式1;条件表达式2;循环表达式3)

{

循环体;}表达式1:用于循环开始前为循环变量设置初始值。表达式2:控制循环执行的条件,决定循环次数。表达式3:循环控制变量修改表达式。循环体语句:被重复执行的语句。2、for语句执行过程表达式3计算表达式1循环体判断表达式2零非零for的下一条语句循环结构程序示例用for循环求#include<stdio.h>voidmain(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum);}for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){

循环体语句;}说明:for语句可以转换成while结构expr1;while(expr2){

循环体语句;

expr3;}for语句的省略形式for语句中expr1,expr2,expr3类型任意,都可省略,但分号;不可省无限循环:for(;;)例:#include<stdio.h>voidmain(){inti=0;for(i=0;i<10;i++)putchar(‘a’+i);}运行结果:abcdefghij例:#include<stdio.h>voidmain(){inti=0;for(;i<10;i++)putchar(‘a’+i);}例:#include<stdio.h>main(){inti=0;for(;i<10;)putchar(‘a’+(i++));}例:#include<stdio.h>voidmain(){inti=0;for(;i<10;putchar(‘a’+i),i++);}思考:1.循环结构可以用哪些语句实现?2.这些语句适用于哪些应用场合?P101一般原则:如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”7.5循环的嵌套在嵌套的各层循环体中,使用复合语句(即用{}将循环体语句括起来)保证逻辑上的正确性

内层和外层循环控制变量不应同名,以免造成混乱

嵌套的循环最好采用进格式书写,以保证层次的清晰性循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环问题:编写程序,打印九九表1234567891234567892468101214161836912151821242791827364554637281……………..ij#include<stdio.h>main(){inti,j;for(i=1;i<10;i++)printf("%4d",i);/*打印表头*/printf("\n---------------------------------------\n");for(i=1;i<10;i++)for(j=1;j<10;j++)printf(“%4d”,i*j);printf(“\n”);}printfj++j=1j<10真(非0)假(0)for(i=1;i<10;i++)

for(j=1;j<10;j++)

printf((j==9)?"%4d\n":"%4d",i*j);外循环:共打印9行i<10假(0)真(非0)i=1i++内循环:打印一行7.6break语句和continue语句1.break语句

(1)语句形式:break;(2)作用:

结束break所在的switch语句。结束当前循环,跳出break所在的 循环结构。例:求300以内能被17整除的最大的数。#include"stdio.h"voidmain(){intx,k;for(x=300;x>=1;x--)

if(x%17=

=0)break;printf("x=%d\n",x);}找到满足条件的最大数,结束循环2、continue语句(1)语句形式:continue;(2)语句作用:

结束本次循环。(3)语句执行流程:

continue语句可以结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。求300以内能被17整除的所有整数。#include"stdio.h"voidmain(){intx,k;

for(x=1;x<=300;x++)

{

if(x%17!=0)

continue;

printf("%d\t",x);

}}此数不满足条件,结束本次循环,开始下一次循环例求输入的十个整数中正数的个数及其平均值#include<stdio.h>voidmain(){inti,num=0,a;floatsum=0;for(i=0;i<10;i++){scanf("%d",&a); if(a<=0)continue; num++; sum+=a;}printf("%dplusinteger'ssum:%6.0f\n",num,sum);printf("Meanvalue:%6.2f\n",sum/num);}例判断m是否素数。⑴素数:指除了1和该数本身之外,不能被其它任何整数整除的数。例如:13。⑵判断一个数n是否素数的方法:

将n作为被除数,将2到n-1之间的各个整数轮流作为除数,如果都不能被整除,则n为素数,否则为非素数。n例判断m是否素数读入mk=m-1i=2当ikm被i整除真假

结束循环i=i+1i>k真假输出:m是素数

输出:m不是素数用breakk=mk=m/2#include<stdio.h>#include<math.h>voidmain(){ intn,i,k; printf("pleaseinputanumber:"); scanf("%d",&n); k=sqrt(n); for(i=2;i<=k;i++) { if(n%i==0)break; } if(i>k) printf("Yes\n"); else printf("No\n"); }标号举例(标号起名符合标识符命名规则)error:goto举例gotoerror;一般形式

goto语句标号;……

语句标号:……或语句标号:…………goto语句标号;goto与标号(label)是goto的过错?还是程序员的过错?破坏了结构化设计风格容易带来错误隐患

gotonext;intsum=0;/*被goto跳过*/…next:现代观点认为:混乱根源不在goto,而在标号任何程序都可以不用goto就实现其功能但在某些情况下,使用goto可以让程序更清晰两种适合使用goto的情况与if语句一起构成循环结构跳出多重循环的一条捷径{…{…{…gotoerror;}}}

使用goto的原则主张少用、慎用,而不是禁用不要使用一个以上的标号不要用goto往循环内跳,要向外跳不要让goto制造出永远不会被执行的代码例子参看教材:P104#include<stdio.h>#include<math.h>voidmain(){ intn,i,k; printf("pleaseinputanumber:"); scanf("%d",&n); k=sqrt(n); for(i=2;i<=k;i++) { if(n%i==0)gotoend; } if(i>k) printf("Yes\n"); else printf("No\n");end:printf("Theprogramisover\n"); }7.7循环结构程序设计常用算法迭代法:不断用新值代替旧值的操作过程,称为迭代。用迭代法完成的加法操作,称为累加。用迭代法完成的乘法操作,称为累乘。解题要点:1)定义变量作累加器,累加器初始化为02)按下式循环计算:累加器当前值=累加器原来的值+新的要加的数据3)根据累加数的变化规律,修改循环控制变量,确定循环次数。【例1】用for循环计算12+22+32+42+…+1002参考程序#include"stdio.h"voidmain(){intk; longresult=0; for(k=1;k<=100;k++)

result+=k*k;printf("result=%ld\n",result);}迭代初始值迭代终止条件迭代式思考:如何用循环结构实现求n!2.“枚举法”(穷举法,列举法)按问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。对于所列举的值,既不能遗漏也不能重复。(教材P106,例5-32)“笨人之法”:把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。3.递推法所谓递推法就是从初值出发,归纳出新值与旧值间的关系,直到求出所需值为止。新值的求出依赖于旧值,不知道旧值,无法推导出新值。数学上递推公式正是这一类问题。“智人之法”:通过分析归纳,找出从变量旧值出发求新值的规律。Fibonacci数列Fibonacci是中世纪意大利的一位极有才华的数学家。他的代表作是1202年出版的《算盘的书》。在这本书中,Fibonacci提出一个问题:假定一对新出生的兔子一个月后成熟,并且再过一个月开始生出一对小兔子。按此规律,在没有兔子死亡的情形下,一对初生的兔子,到一年头上,可以繁殖成多少对兔子?Fibonacci数列1123581321345589144……

问题分析问题分析显然,各月的兔子数组成数列:1,1,2,3,5,8,13,21,34,55,89,…进一步归纳分析,可以知道从第三个月开始,该月的兔子数由两部分组成:上月的兔子数和本月新增的兔子数。因为每对兔子只有隔一个月才有生育能力,所以本月新增兔子数为上上个月的兔子数。因此有关系:

Fn-1+Fn-2=Fn(n>=3)问题分析从第2个月开始,下月的兔子数为本月的兔子数加上上月的兔子数,即

Fnext3=Flast1+Fthis2下一个Fibonacci数,则可以递推求得:

Flast=Fthis2

Fthis=Fnext3

Fnext4=Flast2+Fthis3下标的数字表示月份问题分析如果要求出一个Fibonacci数列,就应当用一个循环递推过程:初始值:Flast=1,Fthis=1求递推数列的下一个数Fnext

for(n=3;n<=12;n++){Fnext=Flast+Fthis;

Flast=Fthis;

Fthis=Fnext;

}参考程序#include<stdio.h>voidmain(){intn,Fnext,Flast=1,Fthis=1;for(n=3;n<=12;n++){Fnext=Flast+Fthis;Flast=Fthis;Fthis=Fnext;

}printf(“\nF(%d)=%d”,n,Fnext);}猴子吃桃子问题:一天一只小猴子摘下一堆桃子,当即吃去一半,还觉得不过瘾,又多吃了一个。第二天接着吃了前一天剩下的一半,馋不忍罢又多吃了一个。以后每天如此。到第十天小猴子去吃时,只剩下一个桃子了。问小猴子共摘了多少桃子。问题分析:

第1天:X1

第2天:X2=X1-(X1/2+1)=X1/2–1 X1=(X2+1)*2

第3天:X3=X2-(X2/2+1)=X2/2–1 X2=(X3+1)*2

……

第10天:1若某天为X2,则前一天X1=(X2+1)*2

已知第10天的桃子数为1,就可倒推出第9天的;

……倒推法!参考程序main()

{

intday,x1,x2;

温馨提示

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

评论

0/150

提交评论