资源描述
,2.5程序控制结构,C语句概述,C语句分为,5类,控制语句函数调用语句表达式语句空语句复合语句,C语言的语句(statement)以“;”作分隔符,编译后产生机器指令。,C语句概述,(一)控制语句,完成一定的控制功能1if()else条件语句6break间断语句2for()循环语句7switch()开关语句3while()循环语句8goto转向语句4dowhile();循环语句9return返回语句5continue继续语句,(二)函数调用语句有一个函数调用加一个分号构成一个语句printf(“ThisisaCstatement.”);,例:,C语句概述,(三)表达式语句有一个表达式加一个分号构成一个语句,C语句概述,(四)空语句,只有一个分号的语句(什么也不做)用来做流程的转向点用来作为循环语句中的循环体,;,C语句概述,(五)复合语句用一对括起来的语句z=x+y;t=z/100;printf(“%f”,t);,例:,C语句概述,B,A,2.6顺序结构,#include#includevoidmain()floata,b,c,s,area;scanf(%f%f%f,输入:346输出:a=3.00,b=4.00,c=6.00s=6.50area=5.33,【例】输入三角形的三边长,求三角形面积。其中s=(a+b+c)/2,顺序结构程序中语句自上而下顺序执行,无分支、无转移、无循环。,【例】交换a,b的值。,设一个中间变量t暂存数据,其操作步骤为:(1)将a存入t,语句为t=a;(2)将b赋给a,语句为a=b;(3)将t赋给b(原来a的值),语句为b=t;正确的交换方法:t=a;a=b;b=t;不能只写下面两个赋值语句a=b;b=a;,a,b,t,b,a,a,b,t,a,b,t,a,b,t,a,b,t,a,b,t,a,b,t,2.7选择结构,如果没有条件判断语句,世界上最先进的计算机也只是一个计算器。选择结构使得计算机表现出具有智能。,1.基本选择结构(ifelse结构),表2-11:选择结构的基本编程模式,B,N,A,Y,条件P,分支结构(选择结构),#includevoidmain()inta,b,t;scanf(%d%d,【例】将二数(a,b)中的大数存放到a中。,510a=10,b=5,分析:假设有三个数a,b,c,用变量max3表示三个数中的最大的数。将三个数分成两组,a,b为一组,c为一组;先求a,b中的最大数,如果ab,则max3=a,否则max3=b;将a,b的最大数max3与c比较,如果max3c,则max3就是三个数中的最大数,否则c是三个数中的最大数,max3=c;,【例2-9】从键盘任意输入三个数,输出三个数中最大的数,#includevoidmain()floata,b,c,max3;printf(输入三个数a,b,c:);scanf(%f%f%f,【例2-9】从键盘任意输入三个数,输出三个数中最大的数,输入三个数a,b,c:345max3=5.000000,2.条件表达式,含义:如果表达式1的值非0(为真),则该条件表达式的结果就是表达式2的值否则,是表达式3的值,表达式3,N,表达式2,Y,表达式1,【例】输入一个英文字母,判断是否为英文大写字母,若是大写字母直接输出,否则转换成大写字母输出。,#includevoidmain()charch;scanf(%c,aA,AA,3.多分支选择结构,多路选择switch(表达式)case常量表达式1:语句序列1;case常量表达式2:语句序列2;default:语句序列n;default可以没有,但最好不省略不要忘记break,多分支选择结构(switchcase),switch(expr)caseM1:S_1;break;caseM2:S_1;break;caseMn:S_n;break;default:S_d;,switch语句的执行过程是:计算expr的值(整型)计算出每个常量表达式M1,M2,Mn的值(整型)让expr依次同M1,M2,进行比较,多分支选择,switch(expression)casevalue1:statement1;break;casevalue2:statement2;break;default:statementX;break;,Example:switch(month)case1:printf(“Januaryn”);break;case2:printf(“Februaryn”);break;case3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);,January_,JanuaryEnd_,多分支选择,Example:switch(month)case1:printf(“Januaryn”);break;case2:printf(“Februaryn”);break;case3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);,多分支选择,Example:switch(month)case1:printf(“Januaryn”);break;case2:printf(“Februaryn”);case3:printf(“Marchn”);break;default:printf(“Othersn”);break;printf(“End”);,February_,March_,End_,多分支选择,Example:switch(month)case1:printf(“Januaryn”);case2:printf(“Februaryn”);case3:printf(“Marchn”);default:printf(“Othersn”);break;printf(“End”);,若month=34?,多分支选择,(1)switch后的表达式可以为任何具有整型值的表达式。(2)关键字case后的整型常量表达式的值是整型。注意各case后的整型常量表达式之值必须互不相同。(3)“语句组”可以是一条或多条合法的语句,但必将它们放在一个复合语句中。(4)break是C语言的一种语句,其功能是中断正在执行的语句。在switch语句中的作用是:执行完某个语句组后,将退出该switch语句。(如果省略了break语句,则执行完某个语句组后,将继续执行其后边的语句组。),3.多分支选择结构,【例】将百分制成绩分段。,#includevoidmain()ints;scanf(%d,switch(s/10)case1:case2:case3:case4:,case5:printf(E.n);break;case6:printf(D.n);break;case7:printf(C.n);break;case8:printf(B.n);break;case9:default:printf(A.n);,95A.,voidmain()floatscore;chargrade;printf(请输入成绩:);scanf(%f,请输入成绩:95.5成绩是95.5,相应等级是A。,【例2-13】分析下面程序段中的错误,floatx=2;inta=3,b=1;switch(2*x)case2.5:printf(“%f”,2*x);break;casea+b:printf(“%d”,a+b);case2,3,4:printf(“%d%d%d”,2,3,4);,/错误:2*x是浮点型表达式,/错误:2.5是浮点常量表达式,/错误:a+b是不是整型常量表达式,因为a,b是变量,/错误:case子句只能有一个常量表达式,2.8循环结构,我们之所以感到计算机无所不能,是因为计算机能不厌其烦地重复大量枯燥的工作。,计数控制,标记控制,循环结构术语,循环条件结构中的测试表达式循环体每个循环周期均要执行的语句序列循环控制变量控制条件真/假值的变量。,对循环控制变量应做如下处理:赋初值;将其代入正确的循环条件;更新/调整,【累加型】计算1+2+3+n,通项公式,【累乘型】计算n!=123n,通项公式,s=0;for(i=1;i=n;i+)s=s+i;,p=1;for(i=1;i=n;i+)p=p*i;,注意:,整型定义为long或unsignedlong型,智人之法:归纳法(递推法),s=1*1+2*2+3*3,循环结构的应用场合,1*1+2*2+3*3=?,s=1*1+2*2+100*100,1*1+2*2+99*99+100*100=?,for(i=1,s=0;i=100;i+)s+=i*i;,1.for循环结构,for(表达式1;表达式2;表达式3)语句;首先执行表达式1。如果表达式2的值为非0,就重复执行语句和表达式3,直到表达式2的值为0时止,循环起始条件,循环结束条件,循环增量,for循环的一般格式:,for(表达式1;表达式2;表达式3)S;,#includevoidmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;printf(sum=%d,i=%dn,sum,i);,sum=5050,i=101,【例】用for循环求s=1+2+3100,#includemain()inti,n,s;printf(输入自然数n=);scanf(%d,for循环结构,输入自然数n=99前99个自然数的和=4950,A,条件P,A,当型循环,直到型循环,真,假,假,条件P,假,真,2.while,dowhile循环结构,voidmain()inti=1,sum=0;while(i=100)sum=sum+i;i+;printf(sum=%dt,sum);printf(i=%d,i);,注意:1、如果语句超过一个,则必须用构成复合语句2、注意修改循环变量的语句,sum=5050i=101,【例】用while循环求s=1+2+3100,counter1,sum0,counter6,sumsum+n,false,true,counter+,outputsum,inputn,1,counter,sum,0,16true,2,n,0+2,2,2,26true,3,2+3,5,3,36true,4,5+4,9,4,46true,5,9+5,14,5,56true,6,14+6,20,6,66false,Thisloopiscounter-controlled,Thecounterincreasesby1,Usesonly3variables,Assumeinputexample:23456,计数控制的循环,voidmain()intcounter=1,sum=0,n;while(counter6)scanf(%d,注意:counter不参加运算,counter控制重复运算的次数counter可以修改,保证执行5次,【例】求从键盘上任意输入5个数的和,23456sum=20,i0,sum0,i0,1+3,4,1323,23,230,4+23,27,1323-9,-9,-90,Thesum:27,标记控制的循环,voidmain(),循环嵌套与多重循环,在一个循环的循环体内又包含另一个循环,称为循环嵌套。两层循环嵌套结构称为双层循环;两层以上的嵌套结构,则称为多重循环。,循环的嵌套(多重循环),for(h=0;h=23;h+)for(m=0;m=59;m+)for(s=0;s=59;s+),3.循环辅助语句,breakstatement,printf(“Inputavaluebetween17:”);scanf(“%d”,value,?,i,i=7,i=value,Inputavaluebetween1-7:_,Inputavaluebetween1-7:4,1,1=7true,1=4false,4,Inputavaluebetween1-7:41,2,2=7true,2=4false,Inputavaluebetween1-7:412,3,3=7true,3=4false,Inputavaluebetween1-7:4123,4,4=7true,4=4true,Inputavaluebetween1-7:5123Imoutoftheloop!,Nowwhatcanyouconcludeaboutbreak?,break?退出一层循环或switch,continuestatement,Example:for(i=0;i=5;i+)if(i%2)continue;elseprintf(“%disanevennumber.”,i);printf(“Printiffeven!n”);ii=5i%2,_,0,0=5true,0,1=5true,1,2=5true,3=5true,4=5true,5=5true,1,6=5false,2,3,4,1,0,1,0,0isanevennumber._,0isanevennumber.Printiffeven!_,0isanevennumber.Printiffeven!2isanevennumber._,0isanevennumber.Printiffeven!2isanevennumber.Printiffeven!_,0isanevennumber.Printiffeven!2isanevennumber.Printiffeven!4isanevennumber._,0isanevennumber.Printiffeven!2isanevennumber.Printiffeven!4isanevennumber.Printiffeven!_,Nowwhatcanyouconcludeaboutcontinue?,continue?中断此次循环体的执行,开始下一次,5,6,#includemain()inti,n;for(i=1;i=5;i+)printf(Pleaseentern:);scanf(%d,Pleaseentern:10n=10Pleaseentern:-10Programisover!,break语句的用法,#includemain()inti,n;for(i=1;i=5;i+)printf(Pleaseentern:);scanf(%d,Pleaseentern:10n=10Pleaseentern:-10Pleaseentern:20n=20Pleaseentern:-20Pleaseentern:30n=30Programisover!,continue语句的用法,说明:1、break语句可用于switch语句结构中也可用于循环中。2、continue语句只可用于循环中。3、在循环嵌套中break与continue都只影响包含它的那层循环4、少用为妙,习题2_28:选择下面程序的运行结果,#includevoidmain(void)inti;for(i=1;i=5;i+)if(i%2)printf(*);elsecontinue;printf(#);printf($n);,A)*#*#*#$B)#*#*#*$C)*#*#$D)#*#*$,一般形式:goto语句标号;语句标号:或语句标号:goto语句标号;,4.goto语句,voidmain()inti,s;i=1;s=0;loop:/*标号作用*/if(i=100)s+=i;+i;gotoloop;printf(%dn,s);,5050,通常goto语句与if条件语句连用,【例】用goto语句求s=1+2+3100,是goto的过错?还是程序员的过错?,破坏了结构化设计风格容易带来错误隐患gotonext;intsum=0;/*被goto跳过*/next:,Evilgotos?MaybeNot凌波微步,未必摔跤,现代观点认为:混乱根源不在goto,而在标号任何程序都可以不用goto就实现其功能但在某些情况下,使用goto可以让程序更清晰两种适合使用goto的情况跳向共同的出口位置,进行退出前的处理工作跳出多重循环的一条捷径gotoerror;,使用goto的原则,主张少用、慎用,而不是禁用保证使用之后,程序仍然是单入口,单出口不要使用一个以上的标号不要让goto制造出永远不会被执行的代码,【例2-22】从键盘输入一个整数n,按下式计算y的值,并输出y和n的值y=1!+2!+3!+n!,分析:使用自顶向下,逐步求精的原则设计这个算法第一步:根据题意,得到算法的顶层框架描述如下:(1)input(n);(2)y=+(3)output(n,y),方法一:用子函数实现,第二步:对上面第(2)步的求和进行细化y=0;for(i=1;i=n;i+)y=y+factorial(i);,累加,用factorial(i)表示整数i的阶乘。,第三步:求阶乘函数的细化factorial(inti)s_i=1;for(j=1;j=i;j+)s_i=s_i*j;,累乘,方法一:用子函数实现,第四步:将算法变成C语言程序将算法转换成C语言程序的过程,实际上是将算法中的相关语句、表达式等用符合C语言规范的语句和表达式表达出来。,方法一:用子函数实现,完整程序见教材46页,外循环为累加型内循环为阶乘型,从变化规律分析,sn=0;for(i=1;i=n;i+)tn=1;for(j=1;j=i;j+)tn=tn*j;sn=sn+tn;,方法二,在同一个循环中先阶乘,后累加,sn=0,tn=1;for(i=1;i=n;i+)tn=tn*i;sn=sn+tn;,从变化规律分析,方法三,/*函数功能:计算i的阶乘函数入口参数:整型i函数返回值:阶乘运算结果*/intFactorial(inti)intj,s_i;for(j=1;j=i;j+)s_i*=j;returns_i;,存在三处错误!你能发现吗?,程序调试实例,/*函数功能:计算i的阶乘函数入口参数:整型i函数返回值:阶乘运算结果*/longFactorial(inti)intj;longs_i=1;for(j=1;j=i;j+)s_i*=i;returns_i;,程序调试实例,计算复用Factorial函数的代码longFactorial(intnumber);voidmain()intm,k;longp;printf(Pleaseinputm,k:);scanf(%d,%d,
展开阅读全文