计算机应用基础第6章.ppt_第1页
计算机应用基础第6章.ppt_第2页
计算机应用基础第6章.ppt_第3页
计算机应用基础第6章.ppt_第4页
计算机应用基础第6章.ppt_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

6.1概述6.2goto语句以及用goto语句构成循环6.3while语句6.4dowhile语句6.5for语句6.6循环的嵌套6.7几种循环的比较6.8break语句和continue语句6.9程序举例习题,第6章循环控制,6.1概述,在许多问题中需要用到循环控制。例如,要输入全校学生成绩;求若干个数之和;迭代求根等。几乎所有实用的程序都包含循环。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。因此熟练掌握选择结构和循环结构的概念及使用是程序设计的最基本的要求。(1)用goto语句和if语句构成循环;(2)用while语句;(3)用do|while语句;(4)用for语句。在下面各节中将分别作介绍。,6.2goto语句以及用goto语句构成循环,goto语句为无条件转向语句,它的一般形式为goto语句标号;语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。例如:gotolabel-1;是合法的,而goto123;是不合法的。结构化程序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、,可读性差。但也不是绝对禁止使用goto语句。一般来说,可以有两种用途:(1)与if语句一起构成循环结构;(2)从循环体中跳转到循环体外,但在c语言中可以用break语句和continue语句(见6.8节)跳出本层循环和结束本次循环。goto语句的使用机会已大大减少,只是需要从多层循环的内层循环跳到外层循环外时才用到goto语句。但是这种用法不符合结构化原则,一般不宜采用,只有在不得已时(例如能大大提高效率)才使用。,例6.1用if语句和goto语句构成循环,求n。此问题的算法是比较简单的,可以直接写出程序:main()inti,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;gotoloop;printf(%d,sum);,100n=1,运行结果如下:5050这里用的是“当型”循环结构,当满足“i100的语句,今用“i+;”语句来达到此目的。如果无此语句,则i的值始终不改变,循环永不结束。,6.4dowhile语句dowhile语句的特点是先执行循环体,然后判断循环条件是否成立。其一般形式为do循环体语句while(表达式);它是这样执行的:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。可以用图6.3表示其流程。请注意dowhile循环用NS流程图的表示形式(图6.3(b)。,图6.3,例6.3用dowhile语句求n。先画出流程图,见图6.4。,图6.4,图6.5,100n=1,程序如下:main()inti,sum=0;i=1;dosum=sum+i;i+;while(i10时,二者结果就不同了。这是因为此时对while循环来说,一次也不执行循环体(表达式“i10时,二者结果就不同了。这是因为此时对while循环来说,一次也不执行循环体(表达式“i100”。因为“当i100时继续执行循环”和“直到i100结束循环”是对同一问题的两种表述方式。千万不要在图5|4(b)中写成“直到i100”。,6.5for语句C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。for语句的一般形式为for(表达式1;表达式2;表达式3)语句它的执行过程如下:(1)先求解表达式1。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。,(3)求解表达式3。(4)转回上面第(2)步骤继续执行。(5)循环结束,执行for语句下面的一个语句。可以用图6.6来表示for语句的执行过程。for语句最简单的应用形式也就是最易理解的如下形式:,图6.6,for(循环变量赋初值;循环条件;循环变量增值)语句例如:for(i=1;i=100;i+)sum=sum+i;它的执行过程与图6.2完全一样。可以看到它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;,显然,用for语句简单、方便。对于以上for语句的一般形式也可以改写为while循环的形式:表达式1;while(表达式2)语句表达式3;说明:(1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如for(;i=100;i+)sum=sum+i;执行时,跳过“求解表达式1”这一步,其他不变。(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。见图6.7。,图6.7,例如:for(i=1;i+)sum=sum+i;表达式1是一个赋值表达式,表达式2空缺。它相当于:i=1;while(1)sum=sum+1;i+;(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:,(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件,如:for(;i=100;)while(i=100)sum=sum+i;相当于sum=sum+i;i+;i+;在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。(5)三个表达式都可省略,如:for(;)语句相当于while(1)语句。,即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。如:for(sum=0;i=100;i+)sum=sum+i;表达式3也可以是与循环控制无关的任意表达式。表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:for(sum=0,i=1;i=100;i+)sum=sum+i;或for(i=0,j=100;i=j;i+,j-)k+=i*j;,表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值,执行情况见图6.8。在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。如:for(i=1;i=100;i+,i+)sum=sum+i;相当于for(i=1;i=100;i=i+2)sum=sum+i;,。,图6.9,图6.8,(7)表达式一般是关系表达式(如i=100)或逻辑表达式(如a100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。break语句的一般形式为:break;break语句不能用于循环语句和Switch语句之外的任何其他语句中。,6.8.2continue语句一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。如果有以下两个循环结构:(1)while(表达式1)if(表达式2)break;,(2)while(表达式1)if(表达式2)continue;程序(1)的流程图如图6.10所示,而程序(2)的流程如图6.11所示。请注意图6.10和图6.11中当“表达式2”为真时流程的转向。,图6.10,图6.11,例6.5把100200之间的不能被3整除的数输出。main()intn;for(n=100;n1e-6)Pi=Pi+t;n=n+2;s=-s;,t=S/n;Pi=Pi*4;printf(Pi=%10.6fn,Pi);运行结果为:Pi=3.141594,例6.7求fibonacci数列40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n3)这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?解此题的算法如图6.13所示。,图6.13程序如下:,main()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,图6.14,程序中在printf函数中输出格式符用“%12ld”,而不是用“%12d”,这是由于在第23个数之后,整数值已超过整数最大值32767,因此必须用“%ld”格式输出。if语句的作用是使输出4个数后换行。i是循环变量,当i为偶数时换行,而i每增值1,就要计算和输出2个数(f1,f2),因此i每隔2换一次行相当于每输出4个数后换行输出。例6.8判断m是否素数。算法如图6.14所示。我们采用的算法是这样的:让m被2到m除,如果m能被2m之中任何一个整数整除,则提前结束循环,此时i必然小于或等于k(即m);如果m不能,被2k(即m)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环之后判别i的值是否大于或等于k+1,若是,则表明未曾被2k之间任一整数整除过,因此输出“是素数”。程序如下:#includemain()intm,i,k;scanf(%d,,k=sqrt(m+1);/*加1是为了避免在求m时可能出现的误差*/for(i=2;i=k+1)printf(%disaPrimemubern,m);elseprintf(%disnotaPrimenumbern,m);运行情况如下:1717isaPrimenumber,例6.9求100200间的全部素数。在例6.8的基础上,对本题用一个嵌套的for循环即可处理。程序如下:#includemain()intm,k,i,n=0;for(m=101;m=a,printf(%c,c);运行结果如下:china!Glmre!程序中对输入的字符处理办法是:先判定它是否大写字母或小写字母,若是,则将其值加4(变成其后的第4个字母)。如果加4以后字符值大于Z或z,则表示原来的字母在V(或v)之后,应按图6.15所示的规律将它转换为aD(或ad)之一。办法是,使c减26,如果读者对此还有疑问,请查ascII码表即可清楚。还有一点请读者注意:内嵌的if语句不能写成if(cZ|cz)c=c-26;因为当字母为小写时都满足“cZ”条件,从而也执行“c=c-26;”语句,这就会出错。因此必须限制其范围为“cZ&cz&cz”即可。,6.10习题6.1输入两个正整数m和n,求其最大公约数和最小公倍数。6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。6.3求Sn=a+aa+aaa+aaan个a之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),n由键盘输入。6.4求(即求1!+2!+3!+4!+20!)。6.5打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33。,6.6一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序找出1

温馨提示

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

评论

0/150

提交评论