第二章程序的流程控制2.1选择(分支)结构2.1.1关系运算符与逻辑运算符C的关系运算符如下:大于=大于等于小于=小于等于==等于!=不等于关系运算符关键是真(true)和假(false)的概念。C中true可以是不为0的任何值,而false则为0。使用关系运算符时,若表达式为真(即true)则返回1,否则,表达式为假(即false),则返回0。例如:10099返回110(2+10)返回02.0算法的表示2.1算法的概念算法是对特定问题求解步骤的一种描述,也是解决问题的办法,它是指令的有限序列,其中每一条指令表示一个或多个操作。自然语言流程图N-S图伪代码PAD图2.2算法的表示2.0算法的表示起止框处理框判断框输入输出框流程线连接点注释框2.2算法的表示---流程图2.0算法的表示程序的三种基本结构1.顺序结构2.2算法的表示---流程图AB流程图2.0算法的表示程序的三种基本结构2.2算法的表示---流程图2.选择序结构PAB真假2.0算法的表示程序的三种基本结构2.2算法的表示---流程图3.循环序结构1.当型(while型)循环结构2.直到型(until型)循环结构PA假真AP真假2.0算法的表示2.1选择(分支)结构2.1.1关系运算符与逻辑运算符C的逻辑运算符如下:!逻辑非&&逻辑与||逻辑或例如:!1&&0先求!1和先求1&&0将会等于出不同的结果,那么何者优先呢?这在C中是有规定的C的部分运算符的优先级如下:━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━表达式┃优先级───────────────────────────╂────()(小括号)[](数组下标).(结构成员)-(指针型结构成员)┃最高!(逻辑非)~(位取反)-(负号)++(加1)--(减1)&(变量地址)┃*(指针所指内容)sizeof(长度计算)┃*(乘)/(除)%(取模)┃+(加)-(减)┃(位左移)(位右移)┃(小于)=(小于等于)(大于)=(大于等于)┃==(等于)!=(不等于)┃&(位与)┃^(位异或)┃|(位或)┃&&(逻辑与)┃||(逻辑或)┃?:(?表达式)┃=+=-=(联合操作)┃,(逗号运算符)┃最低━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2.1选择(分支)结构2.1.2if()…else结构C中条件语句的一般形式为:if(表达式)语句1;else语句2;上述结构表示:如果表达式的值为非0(true)即真,则执行语句1,执行完语句1从语句2后开始继续向下执行;如果表达式的值为0(false)即假,则跳过语句1而执行语句2。所谓表达式是指关系表达式和逻辑表达式的结合式。注意:1.条件执行语句中“else语句2;”部分是选择项,可以缺省,此时条件语句变成:if(表达式)语句1;表示若表达式的值为非0则执行语句1,否则跳过语句1继续执行。2.如果语句1或语句2有多于一条语句要执行时,必须使用{和}把这些语句包括在其中,此时条件语句形式为:if(表达式){语句体1;}else{语句体2;}2.1选择(分支)结构2.1.2if()…else结构注意:if(表达式){语句体1;}else{语句体2;}3.条件语句可以嵌套,这种情况经常碰到,但条件嵌套语句容易出错,其原因主要是不知道哪个if对应哪个else。例如:if(x20||x-10)if(y=100&&yx)printf(Good);elseprintf(Bad);对于上述情况,C规定:else语句与最近的一个if语句匹配,上例中的else与if(y=100&&yx)相匹配。为了使else与if(x20||x-10)相匹配,必须用花括号。如下所示:if(x20||x-10){if(y=100&&yx)printf(Good);}elseprintf(Bad);2.1选择(分支)结构2.1.2if()…else结构例2.1符号函数intmain(void){floatx;inty=-1;printf(“inputx:”);scanf(“%f”,&x);if(x!=0){if(x0)y=1;}elseprintf(“\nx=%6.2f,y=%d\n”,x,y);}f(x)=1(x0)0(x=0)-1(x0)2.1选择(分支)结构2.1.3条件运算符与条件表达式条件表达式:e1?e2:e3例如:a=((x0)?(x++):(x--))相当于if(x0)a=x++;elsea=x--;2.1选择(分支)结构2.1.2if()…else结构例2.2数据分段处理,0-49为A段,50-119为B段,120-169为C段intmain(void){inty;charresult;printf(“inputy:”);scanf(“%d”,&y);if(y=0&&y50)result=‘A’;elseif(y=50&&y120)result=‘B’;elseif(y=120&&y170)result=‘C’;elseresult=‘D’;printf(“\nresult=%c”,y);}2.1选择(分支)结构2.1.3switch结构在编写程序时,经常会碰到按不同情况分转的多路问题,这时可用嵌套if-else-fi语句来实现,但if-else-if语句使用不方便,并且容易出错。对这种情况,C提供了一个开关语句。开关语句格式为:switch(变量){case常量1:语句1或空;case常量2:语句2或空;...case常量n;语句n或空;default:语句n+1或空;}2.1选择(分支)结构执行switch开关语句时,将变量逐个与case后的常量进行比较,若与其中一个相等,则执行该常量下的语句,若不与任何一个常量相等,则执行default后面的语句。注意:1.switch中变量可以是数值,也可以是字符。2.可以省略一些case和default。3.每个case或default后的语句可以是语句体,但不需要使用{和}括起来。2.1.3switch结构下例的switch中变量为整数型。例2.3intmain(void){inttest;for(test=0;test=10;test++){switch(test)/*变量为整型数的开关语句*/{case1:printf(%d\n,test);break;/*退出开关语句*/case2:printf(%d\n,test);break;case3:printf(%d\n,test);break;default:puts(Error);break;}}}switch中变量也可为字符2.1选择(分支)结构2.2循环结构for语句的一般形式为:for(表达式1;表达式2;表达式3){循环体}它的执行过程如下:(1)先求解表达式1;(2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步,若为假(0),则结束循环,转到第(5)步。(3)若表达式为真,在执行指定的语句后,求解表达式3。(4)转回上面第(2)步骤继续执行。(5)执行for语句下面的一个语句。2.2.1for结构求解表达式1语句for语句的下一语句求解表达式3求解表达式2FT2.2.1for结构2.2循环结构2.2.1for结构例如:计算1+2+3+…+100=?for(i=1;i=100;i++)sum=sum+i;相当于以下的while语句:i=1;while(i=100){sum=sum+i;i++;}for语句的一般形式用while语句来表示为:表达式1while(表达式2){语句表达式3;}2.2循环结构2.2.1for结构1.for语句中表达式1可以省略,其后的分号不能省略介,此时应在for语句之前给循环变量赋初值。如:for(;i=100;i++)sum=sum+i;执行时,跳过“求解表达式1”这一步,其它不变。2.如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。如:for(i=1;;i++)sum=sum+i;2.2循环结构2.2.1for结构3.表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(sum=0,i=1;i<=100;){sum=sum十i;i++;}本例把i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。4.可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i<=100;){sum=sum+i;i++;}相当于:5.三个表达式都可省略,如for(;;)语句2.2循环结构2.2.2while结构和do…while结构while语句用来实现“当型”循环结构。其一般形式如下:whi1e(表达式E){循环体};执行过程:①计算表达式E的值②若E为非0,则执行语句s,然后转①若E为0,则退出循环,执行该循环后的语句ES0非0特点:先判断表达式,后执行语句,因此,若进入while循环时E的值就是0,则语句S一次也不执行2.2循环结构2.2.2while结构和do…while结构例如:计算1+2+3+…+100=?intmain(void){inti,sum=0;i=1;while(i=100){sum+=i;i++;}printf(“sum=%d”,sum);}2.2循环结构2.2.2while结构和do…while结构do-while语句用来实现“直到型”循环结构。其一般形式为:do{循环体}while(表达式E);执行过程:①执行循环体S②计算E值若E的值为真(非0),则转①若E的值为假(0),则结束循环ES0非0特点:先执行循环体,再判断表达式,因此循环体至少执行一次。2.2循环结构例如:计算1+2+3+…+100=?main(){inti,sum=0;i=1;do{sum+=i;i++;}while(i=100);printf(“sum=%d”,sum);}2.2.2while结构和do…while结构while循环和do~while循环的区别在于:a.它们执行循环体与计算表达式的先后顺序不同,do~while先执行循环体,再计算表达式;while循环为先计算表达式,表达式的结果为非零值,则执行循环体语句。b.do~while至少要执行一次循环体。while执行循环体的次数可能为零次或若干次。2.2循环结构猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子。main(){intday,x1,x2;/*x1是今天,x2是昨天*/day=9;x2=1;while(day0){x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/x2=x1;day--;}printf(thetotalis%d\n,x1);}2.2.2while结构和do…while结构2.2循环结构本节课新内容到此结束后面的内容为下一节2.2.3循环嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套.三种循环(whi1e循环、do-whi1e循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式:(1)while()(3)for(;;){{…for(;;)while(){...}{...}}}(2)do(4)while(){...{...dodo{…}while();{...}}while();while();}2.2循环结构2.2.4break语句和continue语句1break语句break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句。break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下