第4章循环语句和转移语句_第1页
第4章循环语句和转移语句_第2页
第4章循环语句和转移语句_第3页
第4章循环语句和转移语句_第4页
第4章循环语句和转移语句_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、循环语句和转移语句,第4章,第4章循环语句和转移语句,4.1循环的概念,1.问题的提出,S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;,6条赋值语句,100?,4.1循环的概念,2.什么是循环,S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;,6条赋值语句,循环思想:有规律重复执行相同操作的过程称为循环;实现这种循环操作的程序称为程序的循环结构。,4.1循环的概念,3.解决循环的关键,S=0;S=S+1;S=S+2;S=S+3;S=S+4;S=S+5;,6条赋值语句,确定循环的规律(循环条件、循环条件的修改)确定重复的内容(算法),S=0;i=1;S=

2、S+i;i+;,4.1循环的概念,3.解决循环的关键,其它问题如:1+1/2+1/3+1/n1-1/3+1/5-等,4.1循环的概念,4.循环的种类,C语言可实现的循环:for循环while循环dowhile循环用goto和if构成循环多重循环,4.2for循环,1.for语句的一般形式,for(表达式1;表达式2;表达式3)循环体;,注:表达式1用于循环控制变量赋初始值,它只能执行一次;表达式2是循环条件;表达式3用于对循环变量的修改,以使循环能够结束。,2.for语句举例,#includevoidmain()inti,sum=0;for(i=1;i=5;i+)sum+=i;printf(%

3、d,sum);,循环体,2.for语句举例,用for循环编写下列程序,#includevoidmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;printf(%d,sum);,3.for语句说明,for语句的三个表达式都可以缺省,但两个分号不能缺省;,若在for语句之前已经对循环控制变量赋初值,则表达式1可以缺省;,例:i=1;for(;i=5;i+)sum=sum+i;,for(i=1;i=5;i+)sum=sum+i;,3.for语句说明,缺省表达式2,即不判断循环条件,循环将无终止的执行,即认为表达式2始终为真;为了结束循环,在循环体内用if和break控

4、制循环结束。,if(条件)break;,for(i=1;i+)sum=sum+i;,for(i=1;1;i+)sum=sum+i;,可以把表达式3改为表达式语句移到循环体的尾部,作为循环体的一部分。,for(i=1;i=100;)sum=sum+i;i+;,可以省略表达式1和表达式3,即只给循环条件。,如:i=1;for(;i=100;)sum=sum+i;i+;,构成复合语句,简化为:i=1;for(;i=100;)sum=sum+i+;,如果循环体中没有任何语句,则应该加一个分号。,例如:s=0;for(i=1;i=100;s=s+i+);,F1=1(n=1)F2=1(n=2)Fn=Fn-

5、1+Fn-2(n=3)2=1+13=1+25=2+38=3+5在一次循环中计算两项,递推公式为:F1=1F2=1(初值)F1=F1+F2F2=F2+F1,例求Fibonacci数列1,1,2,3,5,8的前16个数,#includevoidmain()longintf1,f2;inti,n;printf(“nInputn:”);scanf(“%d”,Inputn:,16,1123581321345589144233377610987,前16个数,N为奇数时再输出一项,小结for语句的特点,1、使用了三个表达式,2、循环控制变量可以在循环体内使用,也可以不使用,仅用来控制循环次数。,3、从正常出

6、口离开循环时,循环控制变量会超过终值。,4.3while循环,1.while语句的一般形式,while(表达式)循环体;,功能:计算并判断表达式的值;若值为0,则结束循环,退出while执行后续语句;若值为非0,则执行循环体语句;依次往复。特点:先判断表达式,后执行循环体。,2.while语句说明,循环体有可能一次也不执行。,循环体可为任意类型语句,复合语句不能忘记。,下列情况,退出while循环:条件表达式不成立(为零);循环体内遇break、return、goto;,无限循环:while(1)循环体语句;,循环体中必须有使循环趋于结束的语句,如i+。,3.while语句举例,#includ

7、evoidmain()ints,i;s=0;i=1;while(i=5)s=s+i;i+;printf(”Sum=%d”,s);,循环体,循环初值,循环终值,循环变量增殖,3.while语句举例,#includevoidmain()ints,i;s=0;i=1;while(i=100)s=s+i;i+;printf(”Sum=%d”,s);,改变终值,例:将键盘输入复制到屏幕,直到按下一个回车键为止,程序如下:,#include“stdio.h”voidmain()charc;c=getchar();while(c!=n)putchar(c);c=getchar();,#include“std

8、io.h”voidmain()charc;while(c=getchar()!=n)putchar(c);,abcdef,abcdef,例:利用辗转相除法,求两个正整数的最大公约数,算法:若J=0,则I为最大公约数若J!=0将I除以J,余数为tempI=J;J=temp转,#includevoidmain()inti,j,temp;printf(“ntEnter2integers:”);scanf(“%d%d”,Enter2integers:,1218,Gcd=6,分析:ijtemp12181218126126060(退出循环),小结while语句的特点,1、循环一般由条件控制。,2、在循环体

9、内至少有一条语句能对循环条件产生影响,以防止死循环。,4.4do-while循环,1.do-while语句的一般形式,do循环体while(表达式);,功能:先执行一遍循环体,再判断表达式,当表达式的值为非0(真)时,返回重新执行循环体;如此反复,直到表达式的值为0(假)时退出循环。特点:先执行循环体,后判断循环条件(表达式)是否成立,即循环体至少执行一次。,2.do-while语句说明,循环体至少能执行一次。,循环体可为任意类型语句,复合语句不能忘记。,dowhile允许嵌套。,dowhile(1)表示无穷循环。,while后必须跟();。,3.while语句举例,#includevoidm

10、ain()ints,i;s=0;i=1;dos=s+i;i+;while(i=5);printf(”Sum=%d”,s);,循环体,循环初值,循环终值,循环变量增殖,注意“;”,例:从键盘输入一个字符,判别其是否为大写字母,如果是,则将其转换为小写字母并输出;否则不转换,不输出。,#include“stdio.h”#include“ctype.h”voidmain()charch,answer;doprintf(“Enteraletter:”);ch=getchar();if(isupper(ch)printf(“%c”,ch+a-A);getchar();,printf(“nDoyouwan

11、ttodoagain?(Y/N)”);answer=getchar();getchar();while(answer=Y|answer=y);,y,清除输入的回车键,Enteraletter:,A,a,Doyouwanttodoagin?(Y/N),Enteraletter:,b,Doyouwanttodoagin?(Y/N),n,清除输入的回车键,测试c是否为大写字母,4.5多重循环,1.什么是多重循环,一个循环体内又包含另一个完整的循环结构,称为循环嵌套。嵌套多层的循环结构又称为多重循环。,2.三种循环的多重循环形式,外循环,内循环,外循环,内循环,3.循环嵌套说明,三种循环可互相嵌套,层

12、数不限。,外层循环可包含两个以上内循环,但不能相互交叉。,嵌套循环的跳转应禁止:,从外层跳入内层。,跳入同层的另一循环。,例:打印九九乘法表#includevoidmain()inti,j;for(i=1;i10;i+)for(j=1;j=i;j+)printf(%d*%d=%d,i,j,i*j);printf(n);,对第一个乘数循环1-9,对第二个乘数循环1-i,输出完一行后输出换行符,4.6转移语句,1.break语句,break语句可以用于两个地方:在switch语句中,用于中断语句的执行。在循环语句中,break语句常与if语句配合使用,当条件成立后就跳出循环体,提前结束循环。,br

13、eak语句示例,此循环本是无限循环,因加上了break语句,使程序在输入字符常量!时就终止循环。,for(;)scanf(%c,例:求2M之间的全部素数。要判断一个数n是否素数,只需判断2之间的整数是否能整除n,如能整除,则不是素数。,#include#includemath.hvoidmain()intn,m,i,j,l=0;scanf(%d,m:给定的一个自然数n:2m中的任意自然数i:存放n的平方根值j:2i之间的整数l:一排输出素数计数器,100,23571113,171923293137,414347535961,677173798389,97,2.continue语句,contin

14、ue语句用于提前结束循环中的一轮循环。当程序执行到continue语句时,就跳过循环中后面还未执行的语句,回到循环的起始处,继续进行下一轮的循环。continue语句常与if语句联合起来使用,以便在满足一定条件时提前结束本轮循环。,continue语句示例,例如对除5的倍数以外的1100的数求和,s=0;for(i=1;i=100;i+)if(!(i%5)continue;s+=i;printf(SUM=%dn,s);,3.goto语句,goto语句作用:将控制转到标号所指定的语句去执行。,goto语句格式:,或:goto标号;标号:语句,标号:语句goto标号;,语句使用说明,goto语句对

15、结构程序设计有影响。它将使程序的结构不清晰。应尽可能用break和continue语句代替goto不能用goto语句从循环的外层跳到循环的内层,否则会导致程序的混乱。,4.7程序举例,求最大、最小和平均级数求和迭代算法打印图案穷举法,置初值的方法一般有两种:极值法:取有界数据的上界作为最小值的初值,取有界数据的下界作为最大值的初值。成员法:取一批数据的第一个数作为最大值和最小值的初值本程序采用极值法,【例1】求10个大于0小于100的数中的最大数和最小数,求最大、最小和平均,#includevoidmain()inta,i,max,min;max=0;min=100;for(i=1;ia)mi

16、n=a;printf(“Max=%d,Min=%dn”,max,min);,20,Max=98,Min=20,86,45,50,90,88,28,98,77,27,【例2】求每个班的平均成绩,各班人数不等#includevoidmain()intm,n,i,j;floatscore,sum,aver;printf(Inputnumbersofclasses:);scanf(%d,累加器和计数器的初始化,输入负数表示该班成绩输入结束,【例3】利用公式计算ex=1+x/1!+x2/2!+x3/3!+xn/n!,对于求级数的和,常用两类方法:1)通项公式法t0=1ti=xi/i!(i=1,2,.n)

17、2)递推公式法t0=1ti=ti-1.x/i(i=1,2,n)对于本题使用递推公式法计算量要小。程序如下:,级数求和,#includevoidmain()inti,n;doublet,x,ex;ex=1.0;/*第一项*/t=1.0;printf(“Entervalueofn,x:”);scanf(“%d%lf”,Entervalueofn,x:,200.5,exp(0.500000)=1.648721,Entervalueofn,x:,205,exp(5.000000)=148.413108,思考下列问题,1、利用公式/4=1-1/3+1/5-1/7+求的近似值,直到最后一项的绝对值小于10

18、-5为止。2、利用公式sinx=x-x3/3!+x5/5!-x7/7!+x9/9!-+(-1)n-1x2n-1/(2n-1)!编程计算sinx的值。,【例4】用牛顿迭代法求方程f(x)=-6x-1=0在2.5附近的一个实根.直到满足:,所以,牛顿迭代公式为:,在几何意义上:,迭代算法,已知:,求出:,算法:1、输入x的初值2、做循环:x0=x按牛顿迭代公式计算x直到满足:3、输出结果,#include#includemath.hvoidmain()floatx,x0;printf(nInputx0:);scanf(%f,【例5】输出下列图形:ABCDEBCDE特点:行数i递增,CDE字符数递减

19、DE每行的开头字符E是前一行的下一个字符,#include“stdio.h”voidmain()constintROWS=5;/*循环终值*/constintCHARS=5;inti;charch;for(i=0;iROWS;i+)for(ch=A+i;chA+CHARS;ch+)printf(“%c”,ch);printf(“n”);,每排第一个字符,小于F,当前字符ASCII码值增1,打印图案,【例6】打印以下图案*,1、图形对称,使用对称的循环参数i=-4到42、i与行号k的变换k=5-|i|3、每行输出*的个数2*k-14、每行第一个*的位置为:常量-k,5、定位方法:printf(“

20、%*c”,输出位置,);,程序如下:#include#includevoidmain()inti,j,k;for(i=-4;i=4;i+)k=5-abs(i);printf(“%*c”,30-k,);for(j=1;j=2*k-1;j+)printf(%c,*);printf(“n”);注:printf(“%*c”,30-k,);是输出30-k个空格,思考:1、输入棱形的边长n怎么修改程序?2、*之间有一个空格怎么修改程序?3、输出以下图形怎么修改程序?3333222222222222111111110,#include#includemath.hvoidmain()intn,i,j,k,m;

21、printf(nEnterthemaxnumber:);scanf(%d,3333222222222222111111110,【例7】百元买百鸡,其中母鸡3元/只,公鸡2元/只,小鸡3只/元,且每种鸡至少买一只。试编一程序,列出所有可能的购买方案。,#includevoidmain()intx,y,z;for(x=1;x=32;x+)for(y=1;y=48;y+)z=100-x-y;if(z%3=0,hen=5cock=32chicken=63hen=10cock=24chicken=66hen=15cock=16chicken=69hen=20cock=8chicken=72,设母鸡数:x,公鸡数:y,小鸡数:z,最多花去96元剩下买y、z,最多花去96

温馨提示

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

评论

0/150

提交评论