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

下载本文档

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

文档简介

循环结构程序设计2(1)goto语句和if语句构成的循环结构。(2)while语句构成的循环结构。(3)do-while语句构成的循环结构。(4)for语句构成的循环结构。循环结构

循环结构又称重复结构,是按照一定的条件重复执行某段语句的程序控制结构。3while语句一般形式为:while(表达式){循环体}

循环体表达式真假while语句用来构造“当型”循环,多用于解决循环次数事先不确定的问题。【例5.1】编程实现1+2+3+…+100。

i=1当i<=100sum=sum+Ii=i+1i<=100假真sum=sum+i

i=i+1i=1#include""main(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf("%d\n",sum);}循环的初始值循环的条件循环变量的增量具有唯一真值的表达式循环体5【例5.2】一个简单的印数程序。

#include""main(){intnumber=0;

while(number<=1)

{

number++;printf("%d\n",number);}}number011226#include""main(){intnumber=0;while(number++<=1)printf("*%d\n",number);printf("**%d\n",number);

}【例5.3】第二个印数程序number012*101*223**3循环体的构成不一样有一个延时效应while(number<=1){

number++;printf("%d\n",number);}while(number<=1){

number++;printf("%d\n",number);}【例1】输入一行字符,按字母、数字和其它分成三类,分别统计各类字符的数目(换行符'\n'不在统计范围内)。字母的条件:c>='a'&&c<='z'c>='A'&&c<='Z'

||

数字的条件:c>='0'&&c<='9'while(ch!='\n'){

}if(ch>='A'&&ch<='Z'||ch<='a'&&ch<='z')z++;elseif(ch>='0'&&ch<='9')s++;elseq++;scanf("%c",&ch);charch;scanf("%c",&ch);intz=s=q=0;8【例2】输入一正文,统计正文包含的行数,字数和字符数。分析:字符数:对每个输入的字符(不包含EOF)进行计数行数:以'

\n'为结束标志的一串字符,字数:假定识别符为空格字符'

'、换行字符'

\n'或制表字符'

\t'对'

\n'计数标志

如果c是空格字符'

'、换行字符'

\n'或制表字符'

\t',则将标志符置为0,表示c字符不在字中

否则,如果标志符为0(表示c是字的第一个字符)则将字数加1,并修改标志为1(表示当前字符c是一个字中的字符)。pleaseinputn:while((c=getchar())!=EOF){++nc;if(c=='\n')++nl;if(c==''||c=='\n'||c=='\t')state=OUT;

elseif(state==OUT){++nw;state=IN;}

}pleaseinputn:#defineIN1#defineOUT0if(c=='\n')++nl;if(c==''||c=='\n'||c=='\t')state=OUT;

elseif(state==OUT){++nw;state=IN;}

}pleaseinputn:#defineIN1#defineOUT0#include""voidmain(){intc,nl,nw,nc,state;state=OUT;nl=nw=nc=0;printf("inputatextendofctrl+z:\n");while((c=getchar())!=EOF){++nc;if(c=='\n')++nl;11【例5.6】搬砖问题。(36块砖,36人搬;男搬4,女搬3,两个小孩抬一砖。要求一次全搬完,问男、女、小孩各若干)设计搬砖问题的程序。分析:男人(men)的可能取值范围为:0-8;女人(women)的可能取值范围为:0-11;对于men:men=0;while(men<=8){找出满足题意的women,children;men++;}找每一个women下的children:

children=36-women-menwomen=0;while(women<=11){找出满足题意的children;women++;}

if(4*men+3*women+children/2.0==36)#include""main(){intmen=0,women,children;while(men<=8){women=0;while(women<=11){children=36-women-men;if(4*men+3*women+children/2.0==36){printf("\nmenis%d",men);printf("\twomenis%d",women);printf("\tchildrenis%d\n",children);}women++;}men++;}return0;}【例5.7】利用公式:求的值,直到最后一项的绝对值小于等于为止。

main(){floatpi,t,n;intsign=1; pi=0.0;n=1.0;t=1.0;while(fabs(t)>=1e-6){ t=sign/n; pi+=t; n+=2;sign=-sign; }pi=pi*4;printf("pi=%f\n",pi);}14do-while语句do-while语句的一般格式是:

do{

循环体

}while(<表达式>);表达式循环体假真

功能:先执行一次循环体,再判断表达式的真假。若表达式为真(非0)则继续执行循环体,一直到表达式为假(0)时退出循环结构。15

【例4】用do-while语句实现1+2+3+…+100main() {inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d\n",sum);}while后面的“;”号不能少16

【例5】while和do-while循环的比较。⑴main()(2)main(){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",sum);printf("sum=%d\n",sum);}}运行结果如下:运行结果如下:11sum=55sum=55运行一次:再运行一次:1111sum=0sum=11for语句for语句的一般形式:for(表达式1;表达式2;表达式3)

循环体【例5.10】求自然数列前n项的和。for语句#include""main(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf("%d\n",sum);}main(){inti,sum=0;

scanf("%d",&n);for(i=1;i<=n;i++)sum+=i;printf("%d\n",sum);return0;}for语句【例5.11】从键盘上输入10个数,求其平均值。main(){inti;floatf,sum;for(i=1,sum=0;i<11;i++){scanf("%f",&f);sum+=f;}printf("average=%f\n",sum/10);return0;}for语句【例5.12】试求2000-2050年间的闰年。inty;(y%4==0&&y%100!=0)(y%400==0)||该年份能被4整除,但不能被100整除;或者该年份能被400整除。printf("%d",y);if()for语句的几种特殊情况进行说明:(1)对于for语句的一般格式for(p1;p2;p3)中,p1可以省略,但分号不能省略。for(;i<=100;i++)sum+=i;(2)p2可以省略,但保留分号。for(i=1,sum=0;;i++)sum+=i;for(i=1,sum=0;;i++){sum+=i;if(i>100)break;}(3)P3后面没有分号,也可以省略。for(i=1,sum=0;i<=100;){sum+=i;}i=1;for(;i<=100;i++)sum+=i;for(i=1,sum=0;i<=100;){sum+=i;i++;}???

【例5.13】兔子繁殖问题。设有一对新生的兔子,从第三个月开始,它们每个月都生一对兔子。按照这样的规律,并假设兔子没有死亡,一年后共有多少对兔子。

1 n=1f(n)=1 n=2f(n-2)+f(n-1)n>=311f1f2ff1f23ff1f2f?258f=f1+f2;f1=f2;f2=f;for(i=3;i<=n;i++){}intf,f1=1,f2=1,i,n;#include""main(){longintf,f1=1,f2=1;inti,n;scanf("%d",&n);printf("%8ld%8ld",f1,f2);for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;printf("%8ld",f);if(i%6==0)printf("\n");

}return0;}应用举例

【例5.14】相传,印度舍罕时期有个宰相名字叫达依尔,达依尔见国王很自负,整天被一群溜须拍马的大臣们包围,百无聊赖,特别需要一种新的方式来排遣郁闷的心情.他就向国王舍罕推荐了一种游戏,这种游戏就是现在的国际象棋,国王对这种新奇的游戏很快就产生了浓厚的兴趣,高兴之余,他便问达依尔,你对我这么衷心耿耿,希望我用什么来褒奖你呢?达依尔回答说:“国王只要在国际象棋的棋盘上的第一个格子上放一粒麦子,第二个格子上放上2粒,第三个格子上放上4粒,依次类推,每格是前一格的2倍,一直放到64格,我就感恩不尽了”。“好吧!”国王哈哈大笑,慷慨地答应了达依尔的请求。然而等到麦子成熟时,国王才发现,按照与达依尔的约定,全印度的麦子竟然连棋盘一半的格子数目都不够。国王很纳闷,怎么也算不清这笔帐。(1立方的小麦大约1.42×108粒)sum+=t;t*=2;{}sum=0.0,t=1.0;

for(n=0;n<64;n++)

main(){intn;doublev,sum=0.0,t=1.0;for(n=0;n<64;n++){sum+=t;t*=2;}printf("sum=%e",sum);v=sum/1.42e8;printf("v=%e",v);}*****现实的问题如何打印下列图形********************printf("*****\n");printf("*****\n");循环的嵌套

在一个循环内又完整地包含另一个循环,称为循环的嵌套。printf("%c\n",'*');for(i=1;i<=5;i++)for(j=1;j<=5;j++){}printf("\n");循环嵌套的应用举例【例5.15】计算下式的结果,n由终端输入。for(sum=0,i=1;i<=n;i++){

}t=1;for(j=1;j<=i;j++)t*=i;sum+=t;for(i=1;i<=n;i++)sum+=i;t*=2;sum+=t;for(t=1,i=0;i<n;i++){}main(){inti,j,n;longsum,term;scanf("%d",&n);for(sum=0,i=1;i<=n;i++){term=1;for(j=1;j<=i;j++)

term

*=i;sum+=term;}printf("sum=%ld\n",sum);}编程实现求下列数据的和(n从键盘输入):

n【例5.15】求整数3~100中的素数。

main(){inti,n,num;for(n=3,num=0;n<=100;n++){ i=2;

while(i<n&&n%i!=0)i++;if(i==n){printf("%4d",n);num++;}}printf("\n素数个数为%d",num);}字符三角形【例】输入一个字母,输出由这个字母决定其高度的字符“金字塔”。例如输入小写字母d,则输出下列左边图形,如果输入大写字母D,则输出右边图形。aAabaABAabcbaABCBAabcdcbaABCDCBAfor(c2=top;c2<=c1;++c2)printf("%c",c2);for(c2=c1-1;c2>=top;--c2)printf("%c",c2);printf("\n");

}}}voidmain(){charc,c1,c2,top;inti;top=isupper(c=getchar())?'A':(islower(c)?'a':'\0');if(top){for(c1=top;c1<=c;++c1)

{for(i=c;i>=c1+1;--i)

putchar('');【例7】输出如下格式的九九乘法口诀表。*1234567891123456789246810121416183 91215182124274 1620242832365 25303540456 364248547 4956638 64729 81main(void){inti,j;

printf("%4c",'*');for(i=1;i<=9;++i)

printf("%4d",i);printf("\n");

for(i=1;i<=9;++i){printf("%4d",i);for(j=1;j<=9;++j){if(j>=i)printf("%4d",i*j);elseprintf("%4c",'');}

printf("\n");

}return0;}break语句

在循环结构中执行到break语句时,循环将无条件终止,程序跳出循环结构。

【例5.22】下列程序的功能是:从键盘上输入任意个数,求其平均值,当输入值为0时,计算结束。仔细阅读程序,体会break的使用。main(){inti;floatf,sum;

for(i=0,sum=0.0;;i++){scanf("%f",&f);if(f==0.0)break;sum+=f;}if(i==0)printf("nodata");elseprintf("average=%f\n",sum/i);}【例5.19】用break语句打印直角三角形的九九乘法表。main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++)

{if(i<j)break;printf("%d*%d=%-4d",i,j,i*j);}printf("\n");}return0;}continue语句

continue语句的作用是终止本次循环,continue语句后面的语句不执行而进入下一次循环。

【例2】下列程序的功能是:输出100以内能被7整除的数。仔细阅读程序,体会continue语句的功能。main(){inti;for(i=1;i<=100;i++)

{if(i%7!=0)continue;printf("%4d",i);}return0;}break语句和continue语句区别终止本次循环,continue语句后面的语句不执行而进入下一次循环。循环将无条件终止,程序跳出循环结构,执行循环体之后的语句。break语句:continue语句:5.7.1列举算法所谓列举算法,是指根据提出的问题,列举所有可能的情况,并根据条件检验哪些是需要的,哪些是不需要的。设计列举算法的关键是根据问题的性质确定判断的条件,从而对列举的所有条件进行判断。【例5.22】某单位要在A,B,C,D,E,F六个人中选派若干个人去执行一项任务,选人的条件如下:⑴若C不去,则B也不去;⑵C和D两个人中去一个;⑶D和E要么都去,要么都不去;⑷A、B、F三个人中要去一个⑸C和F不能一起去⑹E和F两个人中至少去一个。问应该派选哪几个人去?用a,b,c,d,e和f这6个整型变量分别表示A,B,C,D,E和F是否被选中的状态。若变量的值为1,则表示该人被选中;若变量值为0,则表示该人没有选中。根据选人的条件,可以得到如下相应的表达式:⑴若C不去,则B也不去。这句话表示:C和B都不去或C去而B随便。相应的表达式为:b+c==0||c==1⑵C和D两个人中去一个,相应的表达式为:c+d==1⑶D和E要么都去,要么都不去,相应的表达式为:d+e==0||d+e==2⑷A、B、F三个人中要去一个,相应的表达式为:a+b+f==2⑸C和F不能一起去,相应的表达式为:c+f!=2⑹E和F两个人中至少去一个,相应的表达式为:e+f>1上述6个表达式之间是“与”的关系,最终可以得到总的表达式如下:(b+c==0||c==1)&&(c+d==1)&&(d+e==0||d+e==2)&&(a+b+f==2)&&(c+f!=2)&&(e+f>1)穷举每个人去(变量的值为1)或不去(变量的值为0)的各种情况,用上述逻辑值进行判断,使逻辑表达式值为真的情况就是最后选派的结果。#include<>voidmain(){inta,b,c,d,e,f;for(a=0;a<=1;a++)for(b=0;b<=1;b++)for(c=0;c<=1;c++)for(d=0;d<=1;d++)for(e=0;e<=1;e++)for(f=0;f<=1;f++)if((b+c==0||c==1)&&(c+d==1)&&(d+e==0||d+e==2)&&(a+b+f==2)&&(c+f!=2)&&(e+f>1)){printf("Awill%sbeassigned.\n",a?"":"not");printf("Bwill%sbeassigned.\n",b?"":"not");printf("Cwill%sbeassigned.\n",c?"":"not");printf("Dwill%sbeassigned.\n",d?"":"not");printf("Ewill%sbeassigned.\n",e?"":"not");printf("Fwill%sbeassigned.\n",f?"":"not");}}5.7.2试探算法而在有些问题中,可能其列举量事先并不知道,只能从初始情况开始,往后逐步进行试探,直到满足给定的条件为止。这就是逐步试探法,简称试探法。【例5.23】某幼儿园按如下方法依次给A,B,C,D,E五个小孩发苹果。将全部苹果的一半加上二分之一个苹果发放给第一个小孩;将剩下苹果的三分之一在家三分之一个苹果发给第二个小孩;将剩下苹果的四分之一再加四分之一个苹果发给第三个小孩;将剩下苹果的五分之一再加五分之一个苹果发给第四个小孩;将左后剩下的11个苹果发给第五个小孩。每个小孩得到的苹果数均为整数。根据分配策略,假设总的苹果树为x,设A,B,C,D,E五个小孩发苹果数为a,b,c,d,e,可按如下公式依次计算:a=(x+1)/2;b=(x-a+1)/3;c=(x-a-b+1)/4;e=(x-a-b-c+1)/5;e=11;设当前试探点苹果数为n,通过前面的分析可以推知,n应满足下列条件:第k个小孩得到全部剩下苹果的(k+1)分之一再加(k+1)分之一个苹果,即(n+1)/(k+1)个苹果。根据题意,这个数

温馨提示

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

评论

0/150

提交评论