资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Lifang,2012,4.,*,C,程序设计,第,4,章 循环结构程序设计,顺序结构,选择(分支)结构,循环结构,一段有限时间内去做一件或一系列有规律的重复性事情,循环,。,#include,#include,void main(),float,a,b,c,s,area,;,printf,(,请输入三角形的三条边,a,b,c,:);,scanf(%f,%f,%f,&a,&b,&c,);,if(a+b,c&,a+c,b&,b+c,a),s=1.0/2*(,a+b+c,);,area=,sqrt(s,*(s-a)*(,s-b,)*(,s-c,);,printf(a,=%.2f b=%.2f c=%.2fn,a,b,c);,printf(s,=%.2f area=%.2fn,s,area);,else,printf,(,此三条边不能构成三角形!,n);,4.1,引例,实现求三角形面积题目的交互反复运行。,while(a,!=0|b!=0|c!=0),scanf(%f,%f,%f,&a,&b,&c,);,4.1,引例,例,4-2,一行打印,60,个*,程序代码:,include,void main(),int,i;,i=1;,while(i,=60),/*,重复输出*,60,次,循环*,/,printf,(,“,*,”,);,i+,;,/*,作用同前例中的,scanf,使循环能结束*,/,printf(,“,n,”,);,循环结构的组成:,循环条件和循环体,表达式,语句,假,真,语句,表达式,真,假,一段有限时间内去做一件或一系列有规律的重复性事情,循环,。,C,语言提供了,while,、,do-while,和,for,三种循环语句,while(e),s;,while:,do,s;,while(e),;,do-while:,for(e1;e2;e3),s;,for:,例,:4-2,计算,1+2+3+.+100,。,(用,while),P47,设,:n,为数列项变量和循环控制变量,,snm,为累加和变量。,#include,void main(),int,n,sum,;,n=1;/,为循环计数变量赋初值。,sum=0;,while,(n100,时,循环结束。,sum=,sum+n,;,n+;,/,n+,为使循环结束的语句。,printf(“sum,=%d n”,sum);,sum=385,循环体,练习,4-1,:求,100,以内奇数的倒数和,;,练习,4-2,:计算,1,2,+2,2,+10,2,。,1)while,语句的循环体中一定要有使循环结束的语句,否则一旦进入循环,循环永不结束,出现,“,死循环,”,。,编程时应避免出现这些情况。,2)while(1),,条件永远为真,“,死循环”。,3)while,语句的作用范围。循环体如果包含一个以上的语句,应该用花括号括起来,否则,while,循环体的作用范围只到,while,后面的第一个分号处。,4)”,;”的问题,使用,while,循环注意:,P46,程序循环与否取决于循环条件判断表达式值的真与假,真循环,假不循环。,必须树立的概念:,while(a,1),;,a+;,采用穷举法求解,#include,void main(),int,i=300,sum=0;,/*,设循环控制变量初值为,300*/,while(i,=800),/*,循环条件;小于,800*/,if(i%7=0),/*,寻找,7,的倍数,进行筛选*,/,sum=,sum+i,;,/*,循环主体:累加求和*,/,i=i+1;,/*,修改循环变量*,/,printf(“sum,=%,dn”,sum,);,例,4-3,求,300800,之间,7,的倍数和,P48,例,4-6,依次输入一批正数,并求正数之和,当输入负数或,0,时结束,(用,do-while),P49,#include,void main(),float,x,sum,;,sum=0.0;,scanf(“%f,”,/*,循环初值*,/,do,/*,循环条件*,/,sum=,sum+x,;,/*,循环主体:累加求和*,/,scanf(“%f,”,/*,再次读入一个新的,x,值*,/,while(x,0.0),;,printf(“sum,=%,fn”,sum,);/,*,输出结果*,/,1,、,do-,while,循环语句中,,while(e),之后的分号不要忘写。,2,、,do-,while,循环语句中,,,不管循环体是否为单一语句,习惯上都用花括号把它括起来,并把,while(e),直接写在,“,”,的后面,以免把,while(e),部分误认为一个新的,while,循环的开始。,注意:,#include,#include,void main(),float n,s,t,pi;,t=1;pi=1;n=1.0;s=1;,do,n=n+2;,s=-s;,/*,求符号位,s,,正负号变化*,/,t=s*1/n;,/*,求一个数列项的值,t*/,pi=,pi+t,;/*,累加,t*/,while(fabs(t,),=,1e-6);,/*,fabs(t,),绝对值函数*,/,pi=,pi,*4;,printf(“pi=%fn”,pi);,例,4-7,:,利用公式如下公式求,的近似值,直到最后一项的绝对值小于,10,-6,为止。,P49,for,语句是比,while,语句功能更强而且更加灵活的一种循环结构。,4.4.for,循环语句,n=0;,while(,n10,),s;,n+;,while:,e1:,循环变量赋初值,e2,:,循环条件判断,e,3,:,改变循环变量值,for(,e1,;,e2,;,e3,),s;,for,:,例,:4-2,计算,1+2+3+.+100,。,(用,for),P51,#include,void main(),int,n,sum,;,sum=0;,for(n,=1;n100,时,循环结束。,sum=,sum+n,;,n+;,/,n+,为使循环结束的语句。,printf(“sum,=%d n”,sum);,循环体,1.e1,、,e2,、,e3,三个表达式均可省略,但其中的分号“,;”,不能省略。,此时,完全等同于,while(1),,无终止地执行循环体。,for(;),.,s;,2.,只省略表达式,e2,,,即,for(e1;e3),,,省略循环判断的条件,也将无终止地执行循环体。,3.,如果只有表达式,e2,,,即,for(;e2;),,,则完全等同于,while(e),语句。,n=0;,for(;n=10;),sum=sum+n;,n+;,n=0;,while(n2,时,F(n)=F(n-1)+F(n-2),即,:,n=1,F(1)=1;,n=2,F(2)=1;,n=3,F(3)=F(2)+f(1)=2;,n=4,F(4)=F(3)+F(2)=3;,.,n2,F(n)=F(n-1)+F(n-2),。,例,4-8 Fibonacci(,斐波纳契,),数列问题:编写程序,打印其前,20,项,(它是意大利数学家,Fibonacci,提出的)。,P52,#include“,stdio.h,”,main(),int,n,f1=1,f2=1,f3;,printf(“%10d%10d”,f1,f2);,for(n,=3;n=20;n+),f3=f1+f2;,printf(“%10d”,f3);,f1=f2,;,f2=f3,;,迭代问题:,用循环来解决数学上的递推数列问题(由递推关系和初始条件确定的数列),迭代的过程。,内层循环,外层循环,非法嵌套,外循环,内循环,合法嵌套,C,语言的三种循环语句都可以相互嵌套,并且被嵌入的循环又可以嵌套循环,称之为,多重循环,。,循环嵌套的原则,:被嵌套的一定是一个完整的循环结构,即两个循环结构不能相互交叉。,4.5,循环嵌套(多重循环),循环嵌套的执行过程:,例:打印(,1,,,1,),(,9,,,9,)所构成的矩形区域中的每个整数坐标点对应的坐标。,注意:,嵌套循环的循环控制变量不可同名,,并列循环的循环控制变量可以同名;,#include,main(),int,i,j,;,for(i,=1;i=9;i+),for(j,=1;j=9;j+),printf(%d,%d),i,j,);,printf(n,);,练习:,99,乘法表(矩形、三角阵),例,4-11:,百钱买百鸡问题,:,公鸡,1,只,5,元,母鸡,1,只,3,元,小鸡,3,只,1,元。,(,穷举法,),P55,main()/*,法二*,/,int,x,y,z;,for(x=0;x=20;x+),for(y=0;y=33;y+),z=100-x-y;,if(15*x+9*y+z=300),printf(%d,%d%dn,x,y,z);,main()/*,法一*,/,int,x,y,z;,for(x=0;x=100;x+),for(y=0;y=100;y+),for(z=0;z=100;z+),if(x+y+z=100&15x+9y+z=300),printf(“%d,%d%dn”,x,y,z);,改错,:,x+y+z=100&15*x+9*y+z=300,运行次数:,10,6,已知:公鸡:,X,只;母鸡:,Y,只;小鸡:,Z,只,方程:,X+Y+Z=100 5X+3Y+Z/3=100,15,X+9Y+Z=300,main(),float t=1,s=0;,int,n,m,;,for(n,=1;n=20;n+),t=1;,for(m,=1;m=,n;m,+),t*=m;,s+=t;,printf(,“,1,!+2!+3!+.+n!=%en,”,s);,例,:用,for,循环语句计算,1!+2!+3!+.+n!,。,n,循环控制变量;,s,为累加和变量;,t,为阶乘变量。,1!+2!+3!+.+n!=2.56133e+018,main(),float t=1,s=0;,int,n;,for(n,=1;n=20;n+),t*=n;,s+=t;,printf(,“,1!+2!+3!+.+n!=%en,”,s);,例,4-9,:用,for,循环语句计算,1!+2!+3!+.+n!,。,P53,n,循环控制变量;,s,为累加和变量;,t,为阶乘变量。,for(,s,=0,t=1,n=1;n,=20;n+),t*=n;,s+=t;,for,循环语句中的第一个和第三个表达式,e1,、,e3,可以是逗号表达式,,e2,一般不可以!,C,语言的三种循环,都是根据循环判断表达式为,0,时来控制循环结束,这种结束是,正规结束,。,在实际应用中,有时还要求在循环的中途退出循环,这是一种,非正规,的循环退出,可以用,break,、,continue,语句实现。,4.6 break,、,continue,语句,for(;),.,break;,while(),.,break;,do,.,break;,while();,功能:退出当前,循环,或当前,switch,结构,,,不能用于其他语句,。,作用:跳出当前的,循环或,switch,语句转向它们之后的语句执行。,1)break,语句,注意:,若,break,语句处于多重循环中,,break,语句只是跳出当前层循环。,例,4-12,韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从,1,至,5,报数,最末一个士兵报的数为,1,;按从,1,至,6,报数,最末一个士兵报的数为,5,;按从,1,至,7,报数,最末一个士兵报的数为,4,;最后再按从,1,至,11,报数,最末一个士兵报的数为,10,。下面程序的主要功能是计算韩信至少有多少兵。,P56,程序代码,:,#include,void main(),int,x;,for(x=1;x+),if(x%5=1&x%6=5&x%7=4&x%11=10),printf,(x=%,dn,x);,bre
展开阅读全文