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

下载本文档

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

文档简介

1、第第6章章 循环结构程序设计循环结构程序设计l循环结构可以完成重复性、规律性的操作.在人们所需处理的运算任务中,常常需要用到循环,例如:1100的累加和等。在语言中有三种循环语句:while、dowhile、for。用goto语句和if语句也能构成循环。l6.1 goto6.1 goto语句语句lgoto语句 为无条件转向语句。l格式:格式:goto goto ;l功能:功能:程序执行到goto语句时,转到语句标号指定的语句去执行。l说明:(1)语句标号必须用标识符表示,不能整数作为标号。(2)与if语句一起构成循环结构。l例题例题6.1 求s=1+2+3+100lmain()l int i=

2、1,s=0;lloop: if(i=100) /* loop是一个语句标号*/l s=s+i;li+;lgoto loop;llprintf(“s=%dn”,s);l6.2 for语句语句l注意注意:结构化程序设计方法,主张限制使用goto语句。因为滥用goto语句,将会导致程序结构无规律、可读性差。l6.2 for语句语句l1for语句的一般格式语句的一般格式l for(变量赋初值;循环继续条件;循环变量增值)l 循环体语句组;2for语句的执行过程语句的执行过程(1)求解“变量赋初值”表达式。(2)求解“循环继续条件”表达式。如果其值非0,执(3) ;否则,转至(5)。(3)执行循环体语句

3、组,(4)求解“循环变量增值”表达式,然后转向(2)。(5)执行for语句的下一条语句。l例如:for (n=1;n=20;n+)ls=s+n; for语句执行过程图3说明说明l(1)“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。l i=1;lfor(;i=100;i+)ls=s+i; for中缺省变量赋初值,但是在for前面要有i=1;lfor(i=1; ;i+)l s=s+i;l for中缺省“循环继续条件”,相当于条件永远为真,无限循环。lfor( ; ; ) 语句;l全部缺省即不设初值,不判断条件,循环变量不增值。无终止地执行循环体

4、。 3说明说明l(2)当循环体语句组仅由一条语句构成时,可以不使用 号括,但是当循环体语句组由多条语句构成时必须用 号括起来。l(3)“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。l例如: for(sum=0,i=1;i=100;i+) sum += i;l(4)“循环继续条件”部分是一个逻辑量,除一般的关系表达式(如 n=20)或逻辑表达式(ab&xy)外,也允许是数值(或字符)表达式,只要其值为非0(真),就执行循环体。3说明说明l例如:例如:for(n=0; (c=getchar()!=n; n+=c);for(n=

5、0; (c=getchar()!=n; n+=c);l在循环继续条件中先从键盘接收一个字符给c,然后判断值是否不等于n(换行符),如果不等于,就执行循环体,此语句最后有“;”说明循环体为空语句,所以执行n+=c即把字符的ascii码累加存入n变量。l此语句的作用是:不断输入字符,将它们的码相加,直此语句的作用是:不断输入字符,将它们的码相加,直到输入一个到输入一个“换行换行”符为止符为止例题l例题例题6.2 求1100的累计和。l/*程序功能:求1100的累计和*/lmain()l int i,sum=0; /*将累加器sum初始化为0*/l for(i=1; i=100; i+) sum +

6、= i; /*实现累加*/l printf(sum=%dn,sum);l程序运行情况如下:sum=5050例题l例题例题6.3 求t=1*2*3*4*5*nlmain()l int n, i;ldouble t=1.0; /*所求累乘值很大,所以用double型且初始化为1 */lprintf(“input n:”);lscanf(“%d”,&n);lfor (i=1;i=n;i+)lt=t*i; /*实现累乘,循环体只有一个语句不用 号*/lprintf(“t=%e”,t); /*用指数形式输出双精度类型的t变量的值*/l运行结果:input n: 5t=1.200000e+02 此

7、程序t 放的是n!,当n较大时阶乘数会很大,所以定义为double型。例题l例例6.4 求s=1+1/2+1/3+1/nlmain()l int i,n;lfloat s=1;lprintf(“input n:”);lscanf(“%d”,&n);lfor(i=2;i=n;i+)ls=s+1.0/i;lprintf(“s=%fn”,s);l此程序注意求1/2、1/3时,如果两个操作数都是int型,完成的是整除得0,则最后s的是1,这是错误的。应使除数和被除数其中有一个为实型才可以,如:s=s+1.0/i;或i定义为float,则 s=s+1/i。运行结果:input n:4s=2.08

8、33336.3 while语句语句l(1)一般格式l while(循环继续条循环继续条件件) l 循环体语句组;循环体语句组;l(2)执行过程例题l例题例题6.5用while语句求1100的累计和。lmain()l int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/l while( i=100 )l sum += i;/*实现累加*/l i+;/*循环控制变量i增1*/l lprintf(“sum=%dn”,sum);l 此程序此程序while while 语句的循环体语句的循环体有两个语句有两个语句sum += i; sum += i; i+;i+;所以要用所以要用 号

9、括起来号括起来以复合语句形以复合语句形式出现。式出现。程序运行情况如下: sum=50506.4 do while 语句语句l1一般格式一般格式l do l 循环体语句循环体语句组组; l while(循环继续循环继续条件条件); /*本行的分号不能缺省*/例题l 例题例题6.6 用do-while语句求解1100的累计和。lmain()l int i=1, sum=0; /*定义并初始化循环控制变量i,以及累计器sum*/l dol sum += i; /*累加*/l i+; l l while(i=100);/*循环继续条件:i=100*/ printf(“sum=%dn”,sum);l

10、程序运行情况如下: sum=5050例题l例题例题6.7统计从键盘上输入整数的个数(输入0时结束,0不计在内)lmain( )l int n,x=0;ldo lscanf(“%d”,&n);lx+;lwhile(n!=0);lprintf(“x=%dn”,x-1);l运行结果及分析l运行情况:l2 4 6 34 0lx=4l此程序用do while语句一开始不做判断进入循环,用scanf()输入整数,输入一个整数,x加一次1,然后判断是否输入的是表示结束的0,一直重复直到输入0停止循环。由于do while语句是后判断循环继续条件,最后输入的0也计算在个数内,所以输出时,要输出x-1的

11、值。例题l例题例题 6.8 while和 dowhile循环的比较l (1) (2)lmain() main() l int s=0,i; int s=0,i;lscanf (“%d”,&i); scanf(“%d”,&i); lwhile (i=10) dol s=s+i; s=s+i;li+; i+;l while (i10时,二者结果就不同了。这是因为此时对while 循环来说,一次也不执行循环体,而对dowhile循环语句来说则要执行一次循环体。while 循环是前判断,而dowhile循环是后判断。6.5 循环的嵌套循环的嵌套l3种循环(种循环(while、dowhi

12、le、for) 可以互相嵌套。可以互相嵌套。l(1) while( ) (2)while( )l l do l while( ) l while( ); l (3) do l (4) for( ; ; )l do l while( )l while( ); llwhile( ); 6.5 循环的嵌套循环的嵌套l(5) for( ; ; ) (6) dol lfor( ; ; ) for( ; ;)l l while( );双重循环l2两层两层for组成的双循环的执行过程:组成的双循环的执行过程:l当外循环控制变量每确定一个值时,内循环的控制变量就要从头至尾的循环一遍。l例题例题6.9 双循环程

13、序举例。lmain()l int x,y;lfor (x=1;x=2;x+)lfor(y=1;y=3;y+)lprintf (“x=%d,y=%dn”,x,y);l 运行结果:x=1,y=1x=1,y=2x=1,y=3x=2,y=1x=2,y=2x=2,y=3例题l例题例题6.10下面程序的输出结果是什么?(训练阅读程序能力)lmain( )l int k=0,m=0;lint x,y;lfor(x=0;x2;x+)l for(y=0;y3;y+)l k+;lk-=y;llm=x+y;lprintf(“k=%d,m=%dn”,k,m);l运行结果:k=0,m=5本程序是双循环嵌套,注意内循环体

14、只有 一个语句k+;因为没有大花括号。不要将 k-=y;语句也认为是内循环体语句。当x=0时,内循环执行3次(y=0,1,2)k+执行3次故循环结束时k=3。注意当内循环结束 时循环控制变量y的值是3,接着执行 k-=y; 语句,即k=k-y=3-3=0。当x=1时,内循环仍执行原操作。使y=3,k=0。当x=2外循环结束,执行m=x+y=2+3=5。所以输出结果为k=0,m=5。 6.6 break语句和语句和continue语句语句l为了使循环控制更加灵活,语言提供了break语句和continue语句。l1 break语句语句l一般格式: break;(本语句必须在循环中使用)l功能:l

15、在循环中当满足特定条件时,使用break语句强行结束循环,转向执行循环语句的下一条语句。例题l例题例题6.11 break语句应用lmain()l int r; lfloat pi=3.14159,s;lfor (r=1;r100) break;lprintf(“r=%d,s=%fn”,r,s);ll运行结果:r=1,s=3.141590r=2,s=12.566360r=3,s=28.274311r=4,s=50.265442r=5,s=78.539749continue语句:语句:l2continue语句:语句:l功能:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于w

16、hile和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。l例题例题6.12将100200之间的不能被3整除的数输出。(continue应用举例。)lmain()l int n;lfor(n=100; n200停止循环。l例题例题6.13分析下面程序的运行结果。(continue应用举例。)l/*例题源代码文件名:lt6_13.c*/lmain()l int i=0,s=0;例题l do lif (i%2)l i+; continue;l i+;ls+=i;lwhile (i7);lprintf(“s=%dn”,s);ll分析:分析:l当i%2为0时,表示假跳过 i+; c

17、ontinue;语句,执行i+; s+=i;l当i%2为1时,表示真执行 i+; continue;语句,所以本程序s的和是1+3+5+7。l运行结果:运行结果: s=166.7 循环程序举例循环程序举例l 例题例题6.146.14 输出10100之间的全部素数。所谓素数n是指,除1和n之外,不能被2(n-1)之间的任何整数整除。l算法设计要点:算法设计要点:l(1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环即可。l(2)判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。l判断一个数是否能被另一个数

18、整除,可通过判断它们整除的余数是否为0来实现。参考源程序:lmain()l int i=11, j, counter=0; l for( ; i=100; i+=2) /*外循环:为内循环提供一个整数i*/l for(j=2; j= i ) /*整数i是素数:输出,计数器加1*/l printf(“%6d”,i); l counter+;l l l运行结果:11 13 17 19 23 29 31 37 41 4347 53 59 61 67 71 73 79 83 8997循环程序举例循环程序举例l 例题例题6.156.15相传古代印度国王舍罕要褒奖他的聪明能干的宰相达依尔(国际象棋发明者)

19、,问他需要什么,达依尔回答说:“国王只要在国际象棋的棋盘上第一个格子放1粒麦子,第二个格子放2粒麦子,第三个格子放4粒麦子,以此类推,每一格加一倍,一直放到64格,我就感恩不尽了,”。国王答应了,结果全印度的粮食用完还不够。国王很纳闷,怎么也算不清这笔账。现在用c语言编程来算一下。l计算s=1+2+2+2+2算出小麦的颗粒数。l1立方米小麦大约1.42*10参考源程序:lmain()l int n;ldouble v, sum=0.0, t=1.0;lfor (n=0;n64;n+)l sum+=t; /*做累加各项*/lt*=2; /*做累乘求2各项*/llprintf(“sum=%en”,sum);lv=sum/1.42e+8;lprintf(“v=%e”,v);l运行结果:sum=1.84467e+19v=1.29907+116.8阅读程序

温馨提示

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

评论

0/150

提交评论