资源描述:
《b程序b的控制流》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
第四章程序的控制流【教学要求】1.熟练掌握IF语句的三种形式,掌握IF语句的基本结构以及IF语句的嵌套,并能将条件运算符给出的语句转化成IF语句的形式。2.掌握SWITCH语句的一般形式,并能把复杂的分支选择性结构化成SWITCH语句来解决问题。3.掌握WHILE语句与DOWHILE语句的结构与使用方法。6.掌握FOR语句的结构,熟练掌握其使用方法。7.会使用常见的循环嵌套形式。5.能正确区分FOR语句、DO…WHILE语句与WHILE语句三者的不同。8.掌握BREAK语句和CONTINUE的应用及其区别。9.分析总结常用的程序设计方法及算法特点,并能编写相应的程序。
1一、选择结构程序设计(条件语句)条件语句的作用:用来判定所给定的条件是否满足,并根据判定的结果决定执行给出的两种操作之一。条件语句的几种形式条件运算符二、switch语句switch语句的用途:解决“多路选择”的问题。switch语句的格式switch语句的使用三、循环结构程序设计四、break、continue语句的作用及在循环中的应用五、综合举例教学要点
21、一般形式if(表达式)例如:语句块1if(x>y)printf(“max=%d”,x);elseelseprintf(“max=%d”,y);语句块22、常见形式1)简化形式if(表达式)语句块例如:if(x>y)printf(“%d”,x);使用说明2)阶梯式3)嵌套形式4、综合举例if语句的三种形式
3if(表达式1)语句块1elseif(表达式2)语句块2elseif(表达式3)语句块3elseif(表达式4)语句块4...else语句块n例如:if(score>90)printf(“verygood”);elseif(score>80)printf(“good”);elseif(score>60)printf(“ok”);elseprintf(“bad”);
41、语句块:当有若干条语句时,必须用{…}括起来。如:if(a>b)当只有一条语句时,用“;”。{x=1;max=a;}2、表达式:if语句的表达式一般情况下为逻辑表达式或关系表达式。如:if(a==b&&x==y)printf(“a=b,x=y”);也可以是任意类型(包括整型、实型、字符型、指针类型)例如:if(‘a’)printf(“%d”,’a’);if(‘3’)printf(“OK!”);注意:“非零”与“零”的用法请区分if(x=1)与if(x==1)的不同。3、例:if语句的使用要点
5例exp4_1输入两个数,按数值将其按大小顺序输出.#includemain(){floata,b,t;scanf(“%f,%f”,&a,&b);if(a>b){t=a;a=b;b=t;}printf(“%5.2f,%5.2”,a,b);}要点:交换两个数据的方法输入两个数据a>bTF交换数据输出数据
6例exp4_2输入三个数按大小顺序输出.#includemain(){floata,b,c,t;if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf(“%5.2f,%5.2f,%5.2f”,a,b,c);}
7例exp4_4:写一程序判定某一年是否为闰年。闰年的判定:某年能被4整除但不能被100整除或者能被4整除,又能被400整除.year被4整除FTTTTFFFyear被100整除year被400整除leapleap=1leap=1leap=0leap=0输出闰年输出非闰年
8例exp4_4:#include请同学们考虑程序有无main()其它简化形式{intyear,leap;scanf(“%d”,&year);if(year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf(“%dis”,year);elseprintf(“%disnot”,year);printf(“aleapyear
9”);}
10if语句的嵌套1、含义:一条if语句重又包含另一个if语句称为if语句的嵌套.2、一般形式if()if()语句块1else语句块2elseif()语句块3else语句块43、使用要点4、例内嵌if内嵌if
11嵌套使用要点1、if语句中if与else的配对关系为else总是与它上面的最近的if配对.书写格式的缩进与否与它们之间的配对无关.例如:if()if()语句块1else语句块2这时的else配对的对象为内层的if,而不是外层的if.2、要实行强行的配对关系可以利用{}。如:if(){if()语句块1}else语句块2
12例exp4_3有一函数:-1(x<0)y=0(x=0)1(x>0)#includemain(){intx,y;scanf(“%d”,&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf(“x=%d,y=%d
13”,x,y):}
14条件运算符(?:)1、含义:在if语句中,表达式为真和假时都执行一条赋值语句并且都是给同一个变量赋值.这时可以把if语句简化为条件运算符.2、一般形式为:表达式1?表达式2:表达式3;如:可以写成:if(a>b)max=a;max=(a>b)?a:b;elsemax=b;(条件运算符是三目运算符)3、使用要点4、应用举例
15条件运算符的使用要点1.条件运算符的执行顺序先求表达式1,若为真则求解表达式2,整个表达式的值为表达式2的值;若表达式1的值为假则求解表达式3,整个表达式的值为表达式3的值.2.比较条件运算符与其他运算符的优先级别和结合性3.条件表达式中表达式1的类型可以与表达式2和表达式3的类型不一致.表达式2与表达式3的类型也可以不一致.
16例exp4_5#includemain(){floatx=1.0;inta=2,b=3;x=(a>b)?a:b;printf(“%f”,x);}输出为:3.0000条件表达式(a>b)?a:b的值为整型数据,但x为实型数据,所以输出为实型数据.
17例exp4_6#includemain(){floatx=1.0;输出为:3inta=2,b=3;3.0000a=(x>b)?x:b;printf(“%d
18”,a);printf(“%f”,(x>b)?x:b);}条件表达式(x>b)?x:b的值为实型数据,但a为整型数据,所以printf(“%d
19”,a);输出为整型数据,printf(“%f”,(x>b)?x:b);为实型数据.
20switch语句的格式switch(表达式){case常量表达式1:语句块1;break;case常量表达式2:语句块2;break;….case常量表达式n:语句块n;break;default:语句块n+1}
21switch语句的使用要点1.switch中的表达式可以是整型或字符型表达式。(也可以是枚举类型,新标准的c语言允许为任意类型.)2.每个常量表达式的值必须各不相同,否则将会出现矛盾.3.当表达式的值与case后面的常量表达式值相等时就执行此case后面的语句.4.“case常量:”只起语句标号的作用。5.break语句在switch中的作用:强行跳出switch体转到其它某条语句,每个case后面应有一个break语句(否则程序的执行顺序将改变),default分支后的break可以省略。6.各个case出现的先后顺序不影响程序的执行结果.7.多个case可以执行一组语句.8.举例:
22例exp4_7:写出下面程序的输出结果.main(){intx;scanf(“%d”,&x);switch(x){case5:printf(“excellent”);case4:printf{“Good”);case3:printf(“Pass””);case2:printf(“Fail”);/*break;*/default:printf(“Poor”);}}若从键盘输入3,则程序的输出为:PassFailPoor
23例:若变量已正确定义,则以下程序段的运行结果是:a=2;b=7;c=5;switch(a>0){case1:switch(b<10){case1:printf("@");break;case0:printf("!");break;}case0:switch(c==5){case0:printf("*");break;case1:printf("#");break;default:printf("%%");break;}default:printf("&");}printf("
24");A.@#&B.!#&C.@#D.!*答案:A
25例:程序main(){inta=5;if(a++>5)printf("%d
26",a);elseprintf("%d
27",a--);}执行后显示结果是()。A.4B.6C.5D.有语法错误
28循环结构程序设计功能:重复执行某一种动作(代码)若干次。goto语句构成的循环while循环do—while循环for循环while、do—while、for三种循环的比较循环的嵌套使用:一个循环中又包含另一个循环成为循环的嵌套.上面讲到的三种循环可以互相嵌套.
29goto语句构成的循环1、一般形势为:goto语句标号;2、例:100#include求nmain()n=1{inti,sum=0;i=1;运行结果为:5050loop:if(i<=100){sum=sum+i;i++;gotoloop;}printf(“%d”,sum);}3、说明:目前goto语句很少使用,过多的使用goto语句会降低程序的可读性。
30while语句构成的循环1、功能:while语句一般完成当型循环,2、语句格式为:while(表达式p){循环体}3、执行过程:当表达式P为非零时,反复执行A操作,直到P为假时才停止。PA当P为真AFT
31100例如:求nn=1main(){inti,sum;i=1;要点:while(i<=100)·循环体若不止一条语句时,{sum=sum+i;应用{…}括起来。i++;}·在循环体中应有使循环趋于结束的语printf(“%d”,sum);句,以避免“死循环”。}i=1当i<=100Sum=sum+ii++
32do—while语句1、功能:do—while语句一般完成直到型循环,2、格式为:do语句块;while(表达式p);3、执行过程:先执行循环体,后判定表达式,当表达式的值为“假”时,循环结束。PATF直到P为假A
33100例如:求nn=1main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<100);printf(“%d”,sum);}从上面对一个问题的两种解决方法可以看出:while循环与do_while循环在绝大多数情况下是可以相互转化的.i=1直到i>100Sum=sum+ii++
34各种循环的比较(1)注意while与do_while循环中(条件)后面的“;”。(2)while与do_while执行循环体与判断的顺序不同。(3)各自的应用场合不同。while强调“条件是否满足”do_while强调“动作的行为”(4)for语句为非条件循环语句,功能比条件循环要强,也更灵活,凡能使用条件循环的场合,用for循环都能实现。(5)各种形式的循环都可以用来处理同一问题,一般情况下它们可以互相替代。
35for语句构成的循环1、功能:用于循环次数已确定或给定循环条件的情况,适合于描述一个事物从初始态到终止态的变化过程。最为灵活。2、语句格式为:for(表达式1;表达式2;表达式3)循环体;3、执行过程为:(1)先求解表达式1(初值);(2)求解表达式2,并判定其值是否为真(非0),若为真,则执行其所包含的语句,然后执行下面的步骤3;若为假,则直接执行步骤5;(3)执行循环体语句后,求解表达式3;(4)转回执行步骤2;(5)执行for下面的语句.
36求解表达式1表达式2语句块求解表达式3for循环下面的语句TF
37100例如:求n将变化为:n=1for(i=1;i<=100;i++)sum=sum+i;for语句使用要点:(1)for语句中的表达式1可以省略,但在for循环之前应给循环变量赋值.例如:i=1;for(;i<=100;i++)sum=sum+i;(2)表达式2也可以省略,但循环将陷入死循环.例如:for(i=1;;i++)sum=sum+i;(3)表达式3也可以省略,但应在循环体中增加使循环变量值改变的语句.例如:for(sum=0,i=0;i<=100;){sum=sum+i;i++;}
38(4)表达式1和表达式3同时省略也允许,例如:i=1;sum=0;for(;i<=100;){sum=sum+i;i++;}这是完全与while循环等同.(5)三个表达式都可以省略,但“;”不能省略。for(;;)sum=sum+i;循环将无休止的执行下去.
39(6)表达式1中的表达式可以是循环变量的赋初值的表达式,也可是与赋初值根本无关的其他表达式,或者两者兼而有之.例如:for(sum=0,i=1;i<=100;i++)sum=sum+i;表达式3也可以出现同样的情况,例如:for(sum=0,i=1;i<=100;sum=sum+i,i++);(7)表达式2一般清况下是关系表达式或逻辑表达式,也可以是其他表达式,例如:for(i=0;(c=getchar())!=‘
40’;printf(“%c”,c));若输入:cauc输出为:cauc不是输出ccaauucc.
41break语句1.Break语句的功能:用于从循环体内跳出循环体,即提前结束循环。例:计算r=1到r=10的圆面积,当面积大于100时结束循环,for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;printf(“%f”,area);}2、使用要点:break只能用在循环语句和switch语句中.
42continue语句1、功能:结束本次循环,接着判定下一次是否执行循环。2、continue与break的区别:continue直结束本此循环,而break终止本层循环.3、例:把100~200之间的不能被3整除的数输出.main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf(“%d”,n);}}
43例exp4_8:用/4=1-1/3+1/5-1/7+….公式求的近似值,直到最后意向的绝对值小于10-6为止.#include#includemain(){ints=1;floatn=1.0,t=1,pi=0;while(fabs(t)>=1e-6){pi=pi+t;n+=2;s=-s;t=s/n;}pi=pi*4;printf(“pi=%10.6f
44”,pi);}
45例exp4_9:求Fibonacci数列:1,1,2,3,5,8,…的前40个数.公式为:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n>=3)程序如下:main(){longf1=1,f2=1;inti;for(i=1;i<=20;i++){printf(“%12ld%12ld”,f1,f2);if(i%2==0)printf(“
46”);f1=f1+f2,f2=f2+f1;}}
47例exp4_10:判断m是否为素数算法为:用2~sqrt(m)之间的数除m,如果m能被2~sqrt(m)之中的任何一个整数整除则提前结束,若m不能被2~sqrt(m)之间的任意整数整除,则表明m是素数.#includemain(){intm,i,k;scanf(“%d”,&m);k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1)printf(“%disaprimenumber
48”,m);elseprintf(“%disnotaprimenumber
49”,m);}
50例exp4_11:写出下面程序的输出结果main(){intx=3,y=6,a=0;while(x++!=(y-=1)){a+=1;if(y51”,x,y,a);}输出结果为x=5,y=4,a=1
52例exp4_12:输入两个正整数,求出它们的最大公约数和最小公倍数.方法一:main(){inti,j,num1,num2,temp;scanf(“%d,%d”,&num1,&num2);if(num1>num2)temp=num1,num1=num2,num2=temp;for(i=2;i53例exp4_12:输入两个正整数,求出它们的最大公约数和最小公倍数.方法二:main(){inta,b,num1,num2,temp;scanf(“%d,%d”,&num1,&num2);a=num1,b=num2;while(b!=0)temp=a%b,a=b,b=temp;printf(“maxcommondivisoris%d”,a);printf(“mincommonmultipleis%d”,num1*num2/a);}
54例exp4_12:输入两个正整数,求出它们的最大公约数和最小公倍数.方法三:main(){inta,b,num1,num2,temp;scanf(“%d,%d”,&num1,&num2);a=num1,b=num2;for(;b>1;b--)if(num1%b==0&&num2%b==0)break;printf(“maxcommondivisoris%d”,b);printf(“mincommonmultipleis%d”,num1*num2/b);}
55例exp4_13:求出所有的水仙花数.main(){inti,j,k,m,n;for(m=101;m<1000;m++){n=m;k=n%10;n=n/10;j=n%10;n=n/10;i=n%10;if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)printf(“%5d”,m);}}
56例exp4_14:译密码。(课本P119例6.10)#includemain(){charc;while((c=getchar())!=‘
57’){if((c>=‘a’&&c<=‘z’)||(c>=‘A’&&c<‘Z’)){c=c+4;if(c>’Z’&&z<‘Z’+4||c>’z’)c=c-26;}printf(“%c”,c);}}