程序控制流实用教案_第1页
程序控制流实用教案_第2页
程序控制流实用教案_第3页
程序控制流实用教案_第4页
程序控制流实用教案_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、一、选择结构程序设计(条件语句)条件语句的作用: :用来判定所给定的条件是否满足,并根据判定的结果决定执行给出的两种操作之一。条件语句的几种形式条件运算符二、switchswitch语句switchswitch语句的用途:解决“多路选择”的问题(wnt)(wnt)。switchswitch语句的格式switchswitch语句的使用三、选择结构程序设计举例四、循环结构程序设计五、breakbreak、continuecontinue语句的作用及在循环中的应用六、循环结构程序设计举例七、穷举与迭代算法七、良好的程序书写风格- -注释教学教学(jio (jio xu)xu)要点要点第1页/共98页

2、第一页,共99页。1、一般形式if (表达式) 例如: 语句组1; if (xy) printf(“max=%d”,x);else else printf(“max=%d”,y); 语句组2; 2、常见(chn jin)形式1)简化形式if(表达式) 语句块 例如: if(xy) printf(“%d”,x);使用说明2)阶梯式3) 嵌套形式4、综合举例ifif语句语句(yj)(yj)的三种形的三种形式式第2页/共98页第二页,共99页。if(if(表达式1) 1) 语句(yj)(yj)块1 1else if(else if(表达式2) 2) 语句(yj)(yj)块2 2else if(els

3、e if(表达式3) 3) 语句(yj)(yj)块3 3else if(else if(表达式4) 4) 语句(yj)(yj)块4 4.else else 语句(yj)(yj)块n n例如: :if (score90) printf(“very good”);if (score90) printf(“very good”);else if(score80) printf(“good”);else if(score80) printf(“good”);else if(score60) printf(“ok”);else if(score60) printf(“ok”);else printf(“

4、bad”);else printf(“bad”);第3页/共98页第三页,共99页。1 1、语句块:当有若干条语句时,必须用括起来。如:if(ab) if(ab) 当只有一条语句时,用“;”。 x=1; x=1; max=a; max=a;2 2、表达式: ifif语句的表达式一般情况下为逻辑表达式或关系表达式。如:if(a= =b & x= =y) printf(“a=b,x=y”);if(a= =b & x= =y) printf(“a=b,x=y”);也可以是任意类型( (包括整型、实型、字符型、指针类型)例如:if(a) printf(“%d”,a);if(a) pri

5、ntf(“%d”,a); if(3) printf(“OK!”); if(3) printf(“OK!”); 注意:“非零”与“零”的用法 请区分if(x=1)if(x=1)与if(x= =1)if(x= =1)的不同。务必牢记:不管是简单语句,还是复合语句中的各个语句,每个语句后面的分号(fnho)(fnho)必不可少!3 3、例:ifif语句的使用语句的使用(shyng)(shyng)要点要点第4页/共98页第四页,共99页。例exp4_1 exp4_1 输入两个数, ,按数值将其按由小到大顺序输出. .#include #include main()main() float a,b,t;

6、 float a,b,t; scanf( scanf(“%f,%f%f,%f”,&a,&b);,&a,&b); if(ab) if(ab) t=a;a=b;b=t; t=a;a=b;b=t; printf( printf(“%5.2f,%5.2f%5.2f,%5.2f”,a,b);,a,b); 要点:交换两个数据(shj)(shj)的方法输入两个(lin )数据abTF交换(jiohun)数据输出数据第5页/共98页第五页,共99页。例exp4_2 exp4_2 输入(shr)(shr)三个数按大小顺序输出. .#include #include main()m

7、ain()float a,b,c,t;float a,b,c,t; scanf( scanf(“%f,%f,%f%f,%f,%f”,&a,&b,&c);,&a,&b,&c); if(ab) t=a;a=b;b=t; if(ab) t=a;a=b;b=t; if(ac) t=a;a=c;c=t; if(ac) t=a;a=c;c=t; if(bc) t=b;b=c;c=t; if(bc) t=b;b=c;c=t; printf( printf(“%5.2f,%5.2f,%5.2f%5.2f,%5.2f,%5.2f”,a,b,c);,a,b,c);

8、第6页/共98页第六页,共99页。输入(shr)(shr)任意三个整数num1num1、num2num2、num3num3,求三个数中的最大值。 main() main()int num1,num2,num3,max;int num1,num2,num3,max; printf(Please input three numbers:); printf(Please input three numbers:); scanf(%d,%d,%d,&num1,&num2,&num3); scanf(%d,%d,%d,&num1,&num2,&num3);

9、 if (num1num2) if (num1num2) max=num1; max=num1; else else max=num2; max=num2; if (num3max) if (num3max) max=num3; max=num3; printf(The three numbers printf(The three numbers are:%d,%d,%dn,num1,num2,num3);are:%d,%d,%dn,num1,num2,num3); printf(max=%dn,max); printf(max=%dn,max); 第7页/共98页第七页,共99页。例exp4

10、_4exp4_4:写一程序判定某一年是否为闰年。闰年的判定: :某年能被4 4整除但不能被100100整除或者能被4 4整除, ,又能被400400整除. .算法设计要点:(1 1)如果能被整除,则余数为,即如果的值等于,则表示能被整除!(2 2)首先将是否闰年的标志(biozh)leap(biozh)leap预置为0 0(非闰年),这样仅当yearyear为闰年时将leapleap置为1 1即可。这种处理两种状态值的方法,对优化算法和提高程序可读性非常有效,请仔细体会。第8页/共98页第八页,共99页。yearyear被被4 4整除整除FTTTTFFFyear被被100整除整除year被被4

11、00整除整除leapleap=1leap=1leap=0leap=0输出闰年输出闰年输出非闰年输出非闰年N-S图:第9页/共98页第九页,共99页。例exp4_4exp4_4:#include #include 请同学们考虑程序有无main() main() 其它简化(jinhu)(jinhu)形式 int year,leap; int year,leap; printf(Please input the year:); printf(Please input the year:); scanf( scanf(“%d%d”,&year);&year); if(year%4= =

12、0) if(year%4= =0) if (year%100= =0) if (year%100= =0) if (year%400= =0) leap=1; if (year%400= =0) leap=1; else leap=0; else leap=0; else leap=1; else leap=1; else leap=0; else leap=0; if(leap) printf( if(leap) printf(“%dis%dis”,year);,year); else printf( else printf(“%d is not %d is not ”,year);,yea

13、r); printf( printf(“a leap yearna leap yearn”););第10页/共98页第十页,共99页。利用逻辑运算能描述复杂条件的特点,可将上述程序(chngx)优化如下:main()int year; printf(Please input the year:); scanf(%d,&year); if (year%4= =0 &year%100!=0)|(year%400= =0) printf(%d is a leap year.n,year); else printf(%d is not a leap year.n,year);第11页/

14、共98页第十一页,共99页。ifif语句的嵌套1 1、含义:一条ifif语句重又包含另一个ifif语句称为(chn (chn wi)ifwi)if语句的嵌套. .2 2、一般形式if()if() if() if() 语句块1 1 else else 语句块2 2elseelse if() if() 语句块3 3 else else 语句块4 43 3、使用要点4 4、例内嵌if内嵌if第12页/共98页第十二页,共99页。嵌套使用要点嵌套使用要点1、if语句中语句中if与与else的配对关系的配对关系(gun x)为为else总是与它上面的最近的总是与它上面的最近的if配对配对.书写格式的缩进

15、与否与它们之间的配对无关书写格式的缩进与否与它们之间的配对无关.例如例如: if() if()语句块语句块1 else 语句块语句块2这时的这时的else配对的对象为内层的配对的对象为内层的if,而不是外层的而不是外层的if.2、要实行强行的配对关系、要实行强行的配对关系(gun x)可以利用可以利用 。 如如:if()if()语句块语句块1 else 语句块语句块2第13页/共98页第十三页,共99页。例exp4_3 exp4_3 有一函数(hnsh):(hnsh):-1-1(x0)(x0)(x0)#include #include main()main() int x,y; int x,y

16、; scanf( scanf(“%d%d”,&x);,&x); if (x0) y=-1; if (x0) y=-1; else if (x= =0) y=0; else if (x= =0) y=0; else y=1; else y=1; printf( printf(“x=%d,y=%dnx=%d,y=%dn”,x,y);,x,y); 例exp4_3 exp4_3 有一函数(hnsh):(hnsh):-1-1(x0)(x=x0)(15=x0)#include #include main()main() int x,y; int x,y; scanf( scanf(“%d%

17、d”,&x);,&x); if (x=0) if (xb) max=a; max=(ab)?a:b;if (ab) max=a; max=(ab)?a:b;else max=b;else max=b;(条件运算符是三目运算符)(条件运算符是三目运算符)3 3、使用要点、使用要点4 4、应用举例、应用举例第15页/共98页第十五页,共99页。条件运算符的使用要点条件运算符的使用要点1.1.条件运算符的执行条件运算符的执行(zhxng)(zhxng)顺序顺序先求表达式先求表达式1,1,若为真则求解表达式若为真则求解表达式2,2,整个表达式的值为表达式整个表达式的值为表达式2 2的值

18、的值; ;若表达式若表达式1 1的值为假则求解表达式的值为假则求解表达式3,3,整个表达式的值为表达式整个表达式的值为表达式3 3的值的值. .2.2.比较条件运算符与其他运算符的优先级别和结合性比较条件运算符与其他运算符的优先级别和结合性 优先级仅高于赋值运算符和优先级仅高于赋值运算符和“,”运算符,结合方向自运算符,结合方向自 右向左。右向左。3.3.条件表达式中表达式条件表达式中表达式1 1的类型可以与表达式的类型可以与表达式2 2和表达式和表达式3 3的类型不一致的类型不一致. .表达式表达式2 2与表达式与表达式3 3的类型也可以不一致的类型也可以不一致. .第16页/共98页第十六

19、页,共99页。例exp4_5exp4_5#include #include main()main()float x=1.0; float x=1.0; int a=2,b=3; int a=2,b=3; x=(ab)?a:b; x=(ab)?a:b; printf( printf(“%f%f”,x);,x); 输出为:3.0000:3.0000条件(tiojin)(tiojin)表达式(ab)?a:b(ab)?a:b的值为整型数据, ,但x x为实型数据, ,所以输出为实型数据. .第17页/共98页第十七页,共99页。例exp4_6exp4_6#include #include main()

20、main() float x=1.0; float x=1.0; 输出为:3:3 int a=2,b=3; 3.0000 int a=2,b=3; 3.0000 a=(xb)?x:b; a=(xb)?x:b; printf( printf(“%dn%dn”,a);,a); printf( printf(“%f%f”,(xb)?x:b);,(xb)?x:b); 条件表达式(xb)?x:b(xb)?x:b的值为实型数据(shj),(shj),但a a为整型数据(shj),(shj),所以printf(printf(“%dn%dn”,a);,a);输出为整型数据(shj), (shj), print

21、f(printf(“%f%f”,(xb)?x:b);,(xb)?x:b);为实型数据(shj).(shj).第18页/共98页第十八页,共99页。例exp4_7exp4_7从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则(fuz)(fuz),直接输出。main()main() char ch; char ch; printf(Input a character: ); printf(Input a character: ); scanf(%c,&ch); scanf(%c,&ch); ch=(ch=A & ch=A & ch0)switch

22、(a0) case 1:switch(b10) case 1:switch(b10) case 1:printf();break; case 1:printf();break; case 0:printf(!);break; case 0:printf(!);break; case 0:switch(c=5) case 0:switch(c=5) case 0:printf( case 0:printf(* *);break;);break; case 1:printf(#);break; case 1:printf(#);break; default:printf(%);break; def

23、ault:printf(%);break; default:printf(&); default:printf(&); printf(n); printf(n); A. #& B. !#& C. # D. ! A. #& B. !#& C. # D. !* *第23页/共98页第二十三页,共99页。exp4_9:exp4_9:从键盘上输入一个百分制成绩scorescore,按下列原则输出其等级(dngj)(dngj):score90score90,等级(dngj)(dngj)为A A;80score9080score90,等级(dngj)(dng

24、j)为B B;70score8070score80,等级(dngj)(dngj)为C C;60score7060score70,等级(dngj)(dngj)为D D;score60score5) printf(%dn,a); if(a+5) printf(%dn,a); else printf(%dn,a-); else printf(%dn,a-); 执行后显示结果是执行后显示结果是( ) ( ) 。 A. 4 B. 6 C. 5 D. A. 4 B. 6 C. 5 D. 有语法错误有语法错误第26页/共98页第二十六页,共99页。exp4_10:exp4_10:求一元二次方程ax2+bx+

25、c=0ax2+bx+c=0的解(a0a0)。/ /* *功能:求一元二次方程的解。* */ /#include math.h#include math.hmain()main()float a,b,c,disc,x1,x2,p,q;float a,b,c,disc,x1,x2,p,q; scanf(“%f,%f,%f”, &a, &b, &c); scanf(“%f,%f,%f”, &a, &b, &c); disc=b disc=b* *b-4b-4* *a a* *c;c; if (fabs(disc)=1e-6) if (fabs(disc

26、)1e-6) if (disc1e-6) x1=(-b+sqrt(disc)/(2 x1=(-b+sqrt(disc)/(2* *a); /a); /* *求出两个不相等的实根* */ / x2=(-b-sqrt(disc)/(2 x2=(-b-sqrt(disc)/(2* *a);a); printf(x1=%7.2f,x2=%7.2fn, x1, x2); printf(x1=%7.2f,x2=%7.2fn, x1, x2); 第27页/共98页第二十七页,共99页。 else else p=-b/(2 p=-b/(2* *a);a);/ /* *求出两个(lin )(lin )共轭复根*

27、 */ / q=sqrt(fabs(disc)/(2 q=sqrt(fabs(disc)/(2* *a);a); printf(“x1=%7.2f + %7.2f in“, p, q);/ printf(“x1=%7.2f + %7.2f in“, p, q);/* *输出两个(lin )(lin )共轭复根* */ / printf(”x2=%7.2f - %7.2f in“, p, q); printf(”x2=%7.2f - %7.2f in“, p, q); 程序演示 说明:由于实数在计算机中存储时,经常会有一些微小误差,所以本案例判断discdisc是否为0 0的方法是:判断disc

28、disc的绝对值是否小于一个很小的数(例如10-610-6)。 思考题:如果将系数a a、b b、c c定义成整数,能否直接判断discdisc是否等于0 0?第28页/共98页第二十八页,共99页。Exp4_11: Exp4_11: 已知某公司员工的保底薪水为500500,某月所接工程的利润profitprofit(整数)与利润提成的关系如下(计量单位:元): profit1000 profit1000没有提成;10001000profit2000profit2000提成10%10%;20002000profit5000profit5000提成15%15%;50005000profit100

29、00profit10000提成20%20%;1000010000profitprofit提成25%25%。算法设计要点: 为使用switchswitch语句,必须将利润profitprofit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是10001000的整数倍(10001000、20002000、50005000、),如果将利润profitprofit整除(zhngch)1000(zhngch)1000,则当: profit1000 profit1000对应0 0、1 110001000profit2000profit2000对应1 1、2 220002000pro

30、fit5000profit5000对应2 2、3 3、4 4、5 550005000profit10000profit10000对应5 5、6 6、7 7、8 8、9 9、10101000010000profitprofit对应1010、1111、1212、第29页/共98页第二十九页,共99页。 为解决相邻两个(lin )(lin )区间的重叠问题,最简单的方法就是:利润profitprofit先减1 1(最小增量),然后再整除10001000即可: profit1000 profit1000对应0 0 1000 1000profit2000profit2000对应1 1 2000 2000

31、profit5000profit5000对应2 2、3 3、4 4 5000 5000profit10000profit10000对应5 5、6 6、7 7、8 8、9 9 10000 10000profitprofit对应1010、1111、1212、main()main() long profit; long profit; int grade; int grade; float salary=500; float salary=500; printf(Input profit: ); printf(Input profit: ); scanf(%ld, &profit); sca

32、nf(%ld, &profit); grade= (profit 1) / 1000; grade= (profit 1) / 1000;/ /* *将利润-1-1、再整除10001000,转化成 switch switch语句中的casecase标号* */ /第30页/共98页第三十页,共99页。switch(grade)switch(grade) case 0: break; case 0: break;/ /* *profit1000 profit1000 * */ / case 1: salary += profit case 1: salary += profit* *0.

33、1; break;0.1; break; / /* *10001000profit2000 profit2000 * */ / case 2: case 2: case 3: case 3: case 4: salary += profit case 4: salary += profit* *0.15; break; /0.15; break; /* *20002000rofit5000 rofit5000 * */ / case 5: case 5: case 6: case 6: case 7: case 7: case 8: case 8: case 9: salary += prof

34、it case 9: salary += profit* *0.2; break;/0.2; break;/* *50005000profit10000 profit10000 * */ / default: salary += profit default: salary += profit* *0.25;0.25;/ /* *1000010000profit profit * */ / printf(salary=%.2fn, salary);printf(salary=%.2fn, salary); 第31页/共98页第三十一页,共99页。循环(xnhun)(xnhun)结构程序设计功能

35、:重复执行某一种动作(代码)若干次。循环语句概述gotogoto语句构成的循环whilewhile循环dowhiledowhile循环forfor循环whilewhile、dowhiledowhile、forfor三种循环的比较循环的嵌套使用:一个循环中又包含另一个循环成为循环的嵌套. .上面讲到的三种循环可以(ky)(ky)互相嵌套. .第32页/共98页第三十二页,共99页。 循环(xnhun)语句概述求1 1100100的累计和。根据已有的知识,可以用“1+2+.+1001+2+.+100”来求解,但显然很繁琐。现在换个思路来考虑:首先设置一个累计器sumsum,其初值为0 0,利用su

36、m += nsum += n来计算(n n依次取1 1、2 2、.100.100),只要(zhyo)(zhyo)解决以下3 3个问题即可: (1 1)将n n的初值置为1 1; (2 2)每执行1 1次“sum += nsum += n”后,n n增1 1; (3 3)当n n增到101101时,停止计算。此时,sumsum的值就是1 1100100的累计和。 根据已有的知识,单独实现每一步都不难。但是,由于需要经常使用这种重复计算结构(称为循环结构),C C语言提供了3 3条循环语句来实现,以简化、并规范循环结构程序设计。在语言中,可用以下语句实现循环:(1 1)用forfor语句。(2 2

37、)用do-whiledo-while语句。(3 3)用whilewhile语句。第33页/共98页第三十三页,共99页。(4 4)用gotogoto语句和ifif语句构成循环。使用gotogoto语句实现求解1 1100100累计(li j)(li j)和的程序可以如下:main()main() int n=1, sum=0; int n=1, sum=0; loop: sum += n; n+; loop: sum += n; n+; if (n=100) goto loop; if (n=100) goto loop; printf( printf(“sum=%dnsum=%dn”, su

38、m);, sum); 其中“loop:loop:”为语句标号(格式:标号: : 语句行),其命名遵循标识符命名规则。gotogoto语句格式:goto goto 标号,功能为:使系统转向标号所在的语句行执行。注意:结构化程序设计方法,主张限制使用gotogoto语句。因为滥用gotogoto语句,将会导致程序结构无规律、可读性差。 另外,从功能上说,forfor语句可完全代替当型循环语句whilewhile,所以该语句也不是必需的。第34页/共98页第三十四页,共99页。go to 语句构成的循环1、一般形势为:goto 语句标号;2、例: 100 #include 求 n main() n=

39、1 int i,sum=0; i=1;运行结果为:5050 loop :if (i=100) sum=sum+i; i+; goto loop; printf(“%d”,sum);3、说明:目前goto语句很少使用,过多的使用goto语句会降低(jingd)程序的可读性。第35页/共98页第三十五页,共99页。whilewhile语句构成的循环1 1、功能:whilewhile语句一般完成当型循环,2 2、语句格式为:while while (表达式p p) 循环体 3 3、执行过程:当表达式P P为非零时,反复执行A A操作,直到(zhdo)P(zhdo)P为假时才停止。PA当P为真AFT第

40、36页/共98页第三十六页,共99页。 100例如:求 n n=1main() int i,sum=0; i=1; 要点: while (i=100) 循环体若不止一条语句时, sum=sum+i; 应用括起来(q li)。 i+; 在循环体中应有使循环趋于结束的语 printf(“%d”,sum); 句,以避免“死循环”。 i=1当i=100Sum=sum+ii+第37页/共98页第三十七页,共99页。dowhiledowhile语句语句1 1、功能:、功能:dowhiledowhile语句一般完成直到型循环语句一般完成直到型循环(xnhun)(xnhun),2 2、格式为:、格式为:do

41、do 循环循环(xnhun)(xnhun)体体 while while (表达式(表达式p p);); / /* *本行的分号不本行的分号不能缺省能缺省* */ /3 3、执行过程:先执行循环、执行过程:先执行循环(xnhun)(xnhun)体,后判体,后判定表达式,当表达式的值为定表达式,当表达式的值为“假假”时,循环时,循环(xnhun)(xnhun)结束。结束。PATF直到(zhdo)P为假A第38页/共98页第三十八页,共99页。 100 100例如: :求 n n n=1 n=1mainmain() int i int i,sum=0sum=0; i=1; i=1; dosum=su

42、m+i dosum=sum+i; i+ i+; while while(i=100);i100Sum=sum+ii+第39页/共98页第三十九页,共99页。各种循环的比较各种循环的比较(1 1)注意)注意whilewhile与与do_while do_while 循环中(条件循环中(条件(tiojin)(tiojin))后面的)后面的“;”。(2 2) while while与与do_whiledo_while执行循环体与判断的顺序不同。执行循环体与判断的顺序不同。(3 3)各自的应用场合不同。)各自的应用场合不同。whilewhile强调强调“条件条件(tiojin)(tiojin)是否满足

43、是否满足”do_whiledo_while强调强调“动作的行为动作的行为”(4 4)forfor语句为非条件语句为非条件(tiojin)(tiojin)循环语句,功能比条件循环语句,功能比条件(tiojin)(tiojin)循环要强,也循环要强,也更灵活,凡能使用条件更灵活,凡能使用条件(tiojin)(tiojin)循环的场合,用循环的场合,用forfor循环都能实现。循环都能实现。(5 5)各种形式的循环都可以用来处理同一问题,一般情况下它们可以互相替代。)各种形式的循环都可以用来处理同一问题,一般情况下它们可以互相替代。第40页/共98页第四十页,共99页。forfor语句构成的循环语句

44、构成的循环1 1、功能、功能: :用于循环次数已确定或给定用于循环次数已确定或给定(i dn)(i dn)循环条件的情况,适合于描述循环条件的情况,适合于描述一个事物从初始态到终止态的变化过程。最为灵活。一个事物从初始态到终止态的变化过程。最为灵活。2 2、语句格式为:、语句格式为:forfor(表达式(表达式1;1;表达式表达式2;2;表达式表达式3) 3) 循环体循环体; ;3 3、执行过程为、执行过程为: :(1)(1)先求解表达式先求解表达式1 1(初值)(初值); ;(2)(2)求解表达式求解表达式2,2,并判定其值是否为真并判定其值是否为真( (非非0),0),若为真若为真, ,

45、执行下面的步骤执行下面的步骤3;3;若为假若为假, ,则直接执行步骤则直接执行步骤5;5;(3)(3)执行循环体语句后执行循环体语句后, ,求解表达式求解表达式3;3;(4) (4) 转回执行步骤转回执行步骤2;2;(5)(5)执行执行forfor下面的语句下面的语句. .第41页/共98页第四十一页,共99页。求解表达式1表达式2语句块求解表达式3for循环下面的语句TF第42页/共98页第四十二页,共99页。 100例如:求 n 将变化为: n=1for(i=1;i=100;i+)sum=sum+i;for语句(yj)使用要点:(1)for语句(yj)中的表达式1可以省略,但在for循环之

46、前应给循环变量赋值.例如:i=1;for(;i=100;i+) sum=sum+i;(2)表达式2也可以省略,但循环将陷入死循环.例如:for(i=1;i+) sum=sum+i;(3)表达式3也可以省略,但应在循环体中增加使循环变量值改变的语句(yj).例如:for(sum=0,i=0;i=100;) sum=sum+i; i+;第43页/共98页第四十三页,共99页。(4)(4)表达式1 1和表达式3 3同时省略也允许, ,例如:i=1;sum=0;:i=1;sum=0;for(;i=100;)for(;i=100;)sum=sum+i;sum=sum+i;i+;i+; 这是完全与whil

47、ewhile循环(xnhun)(xnhun)等同. .(5)(5)三个表达式都可以省略, ,但“;”不能省略。 for(;) sum=sum+i; for(;) sum=sum+i; 循环(xnhun)(xnhun)将无休止的执行下去. .第44页/共98页第四十四页,共99页。(6)(6)表达式1 1中的表达式可以是循环变量的赋初值的表达式, ,也可是(ksh)(ksh)与赋初值根本无关的其他表达式, ,或者两者兼而有之. .例如:for(sum=0,i=1;i=100;i+):for(sum=0,i=1;i=100;i+) sum=sum+i; sum=sum+i; 表达式3 3也可以出现

48、同样的情况, ,例如: :for(sum=0,i=1;i=100;sum=sum+i,i+);for(sum=0,i=1;i=100;sum=sum+i,i+);(7)(7)表达式2 2一般情况下是关系表达式或逻辑表达式, ,也可以是其他表达式, , 例如: : for(i=0;(c=getchar()!=n;printf(“%c”,c);for(i=0;(c=getchar()!=n;printf(“%c”,c); 若输入:cauc:cauc 输出为cauc,cauc, 不是输出ccaauucc.ccaauucc.例题第45页/共98页第四十五页,共99页。求n的阶乘n!(n!=1*2*n)

49、。/*程序功能:求n!*/main() int i, n; long fact=1; /*将累乘器fact初始化为1*/ printf(“Input n: ”); scanf(“%d”, &n); for(i=1; i=n; i+) fact *= i;/*实现(shxin)累乘*/ printf(%d ! = %ldn, n, fact); 程序运行情况如下:Input n: 5 5 ! = 120第46页/共98页第四十六页,共99页。breakbreak语句(yj)(yj)1. Break1. Break语句的功能:用于从循环(xnhun)(xnhun)体内跳出循环(xnhun)

50、(xnhun)体,即提前结束循环(xnhun)(xnhun)。例: :计算r=1r=1到r=10r=10的圆面积, ,当面积大于100100时结束循环(xnhun),(xnhun),for(r=1;r=10;r+)for(r=1;r100) breakarea100) break; printf(“%f”,area); printf(“%f”,area); 2 2、使用要点:breakbreak只能用在循环(xnhun)(xnhun)语句和switchswitch语句中. .第47页/共98页第四十七页,共99页。continuecontinue语句1 1、功能: :结束(jish)(jish

51、)本次循环, ,接着判定下一次是否执行循环。2 2、continuecontinue与breakbreak的区别: :continuecontinue只结束(jish)(jish)本此循环, ,而breakbreak终止本层循环. .3 3、例:把100200100200之间的不能被3 3整除的数输出. . main() main() int n; int n; for(n=100;n=200;n+) for(n=100;n=200;n+) if (n%3= =0) continue; if (n%3= =0) continue; printf(“%d”,n); printf(“%d”,n);

52、 第48页/共98页第四十八页,共99页。 题目:求07所能组成的奇数(j sh)个数。 程序源代码: main() long sum=4,s=4; int j; for(j=2;j=8;j+)/*j is place of number*/ printf(n%ld,sum); if(j=2) s*=7; else s*=8; sum+=s; printf(nsum=%ld,sum); 第49页/共98页第四十九页,共99页。 题目:八进制转换(zhunhun)为十进制 程序源代码: main() char *p,s6;int n=0; p=s; gets(p); while(*p!=0) n

53、=n*8+*p-0; p+; printf(%d,n); 第50页/共98页第五十页,共99页。例exp4_12:exp4_12:用/4=1-1/3+1/5-1/7+./4=1-1/3+1/5-1/7+.公式求的近似值, ,直到(zhdo)(zhdo)最后意向的绝对值小于10-610-6为止. .#include #include #include #include main()main() int s=1;float n=1.0,t=1,pi=0; int s=1;float n=1.0,t=1,pi=0; while(fabs(t)=1e-6) while(fabs(t)=1e-6) pi

54、=pi+t;n+=2; pi=pi+t;n+=2; s=-s;t=s/n; s=-s;t=s/n; pi=pi pi=pi* *4;printf(4;printf(“pi=%10.6fnpi=%10.6fn”,pi);,pi); 第51页/共98页第五十一页,共99页。例exp4_13:exp4_13:求FibonacciFibonacci数列(shli):1,1,2,3,5,8,(shli):1,1,2,3,5,8,的前4040个数. . 公式为: :F1=1 F1=1 (n=1)(n=1)F2=1 F2=1 (n=2)(n=2)Fn=Fn-1+Fn-2 Fn=Fn-1+Fn-2 (n=3)

55、(n=3)程序如下: :main()main() long f1=1,f2=1;int i; long f1=1,f2=1;int i; for(i=1;i=20;i+) for(i=1;i=20;i+) printf( printf(“%12ld%12ld%12ld%12ld”,f1,f2);,f1,f2); if(i%2= =0) printf( if(i%2= =0) printf(“nn”);); f1=f1+f2,f2=f2+f1; f1=f1+f2,f2=f2+f1; 第52页/共98页第五十二页,共99页。exp4_14: 输出10100之间的全部素数。所谓素数n是指,除1和n之

56、外,不能被2(n-1)之间的任何整数整除。 算法设计要点: (1)显然,只要设计出判断某数n是否是素数的算法,外面再套一个for循环(xnhun)即可。 (2)判断某数n是否是素数的算法:根据素数的定义,用2(n-1)之间的每一个数去整除n,如果都不能被整除,则表示该数是一个素数。 判断一个数是否能被另一个数整除,可通过判断它们整除的余数是否为0来实现。参考源程序如下:main() int i=11, j, counter=0; for( ; i=100; i+=2) /*外循环(xnhun):为内循环(xnhun)提供一个整数i*/第53页/共98页第五十三页,共99页。 for(j=2;

57、j= i ) /*整数i是素数:输出,计数器加1*/ printf(“%6d”,i); counter+; 思考题:外循环控制变量i的初值从11开始、增量为2的作法有什么好处?为提高(t go)运行速度,如何优化内循环?(提示:从减少计算次数角度来考虑)第54页/共98页第五十四页,共99页。例exp4_15: 判断m是否为素数(s sh)算法为:用2 sqrt(m)之间的数除m,如果m能被2sqrt(m)之中的任何一个整数整除则提前结束,若m不能被2sqrt(m)之间的任意整数整除,则表明m是素数(s sh).#include main() int m,i,k; scanf(“%d”,&am

58、p;m);k=sqrt(m); for(i=2;i=k+1) printf(“%d is a prime numbern”,m); else printf(“%d is not a prime numbern”,m); 第55页/共98页第五十五页,共99页。题目:一个偶数总能表示(biosh)(biosh)为两个素数之和。 程序源代码: #include stdio.h #include stdio.h #include math.h #include math.h main() main() int a,b,c,d; int a,b,c,d; scanf(%d,&a); scanf

59、(%d,&a); for(b=3;b=a/2;b+=2) for(b=3;b=a/2;b+=2) for(c=2;c=sqrt(b);c+) for(c=2;csqrt(b) d=a-b; if(csqrt(b) d=a-b; else break; else break; for(c=2;c=sqrt(d);c+) for(c=2;csqrt(d) if(csqrt(d) printf(%d=%d+%dn,a,b,d); printf(%d=%d+%dn,a,b,d); 第56页/共98页第五十六页,共99页。例exp4_7:exp4_7:写出下面(xi mian)(xi mian)

60、程序的输出结果main()main() int x=3,y=6,a=0; int x=3,y=6,a=0; while(x+!=(y-=1) while(x+!=(y-=1) a+=1; a+=1; if(yx) break; if(yx) break; printf( printf(“x=%d,y=%d,a=%dnx=%d,y=%d,a=%dn”,x,y,a);,x,y,a); 输出结果为x=5,y=4,a=1x=5,y=4,a=1第57页/共98页第五十七页,共99页。例exp4_16: exp4_16: 输入两个(lin )(lin )正整数, ,求出它们的最大公约数和最小公倍数. .方法一: :main()main() int a,b,num1,num2,temp; int a,b,num1,num2,temp; scanf( scanf(“%d,%d%d,%d”,&num1,&num2);,&num1,&num2); if(num1num2) temp=num1,num1=num2,num2=temp; if(num11;b- -)

温馨提示

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

评论

0/150

提交评论