程序控制结构选择结构.ppt
选择结构,本讲内容:关系运算和逻辑运算(2)单分支结构(3)双分支结构,3.1 关系运算和逻辑运算,一、关系运算符=!=,1.不同运算符之间的优先级,2.关系运算符之间的优先级,低于算术运算符,高于赋值运算符,=,!=的优先级相同,=,=优先级相同,=,!=的优先级低于,=,=的优先级,3.结合性:左结合性,二、关系表达式:用关系运算符连接起来的式子 关系表达式的值只有2个,1 表示真,0 表示假,1 2 值为62=0 值为,3.1 关系运算和逻辑运算,如:,假,0,真,1,注意:(1)字符数据按其ASCII码值进行比较,9798,0,1,3.1 关系运算和逻辑运算,(2)应避免2个实数作=或!=的比较,结果:c=1,Why?,精度问题!,(3)5278 是允许的,它相当于(52)7)8,(4)可以将关系表达式看成是一种整型表达式,c=(a=b);,三、逻辑运算符!&|,3.1 关系运算和逻辑运算,1、3个运算符的优先级由高到低为:!&|,2、!的优先级高于关系运算,&和|的优先级低于关系运算。,3、!是右结合性,&和|是左结合性,四、逻辑表达式,例:使用逻辑表达式表示 x-1,1区间,3.1 关系运算和逻辑运算,1.逻辑表达式的值只有2个:真,假,进行判断时,非零值代表“真”,零值代表“假”,(x=-1)&(x=1),30 x20|x-100,例:如何表述“20 x30”或“x-100”?,(x20&x30)|x-100,x20&x30|x-100,x=-1&x=1,逻辑运算规则表,2、逻辑运算中的规律,3.1 关系运算和逻辑运算,(2)类似有 1|a=1,(1)在&表达式中,若左端为0,则不必再计算右端,表达式值为0 即:0&a=0,规律:0|a=a 0&a=0 1|a=1 1&a=a a|a=a a&a=a a|!a=1 a&!a=0!(a|b)=!a&!b!(a&b)=!a|!b,3.1 关系运算和逻辑运算,结果:m=0,n=1,+x|+y,结果:1,0,0,(m=ab)&(n=cd),3.1 关系运算和逻辑运算,结果:0,-1,0,+x,+y不进行运算,+z进行运算,3.2.1 单分支结构,1、语法形式:if(表达式)语句;,2、执行过程:先计算表达式的值,若为真(非0值),则执行其后的语句,若值为0,则继续向下执行,3、常见的错误,(1)if(x0);y=3*x+2;,(2)if(x=2)printf(“x0”);,(3)if(1=x=10)y=x-1;,空语句!,赋值语句!,x=100,表达式的值为真,3.2.1 单分支结构,例3-1:输入2个实数,按由小到大的顺序输出,#include void main()float a,b,t;printf(input a,b:);scanf(%f%f,输入a,b,输出a,b,b=t,3.2.1 单分支结构,if(ab)t=a;a=b;b=t;,括号不能省略!,例3-2:输入3个实数,按由小到大的顺序输出,输入x1,x2,x3,输出x1,x2,x3,#include void main()float x1,x2,x3,temp;scanf(%f%f%f,3.2.1 单分支结构,if(x1x3)temp=x1;x1=x3;x3=temp;if(x2x3)temp=x2;x2=x3;x3=temp;,1、语法形式:if(表达式)语句1;else 语句2;,2、执行过程:先计算表达式的值,若为真(非0值),执行语句1;若值为0,执行else后的语句2,3.2.2 双分支结构,例3-3:输入2个整数,请输出其中的较大的数,输入x,y,真,假,输出x,输出y,#include void main()int x,y;printf(input x,y:);scanf(%d%d,3.2.2 双分支结构,选择结构,本讲内容:多分支结构(2)if语句的嵌套(3)条件运算符,例:编写一个判断某一年是否为闰年的程序。,判断某一年是否为闰年的逻辑表达:(year%4=0)&(year%100!=0)|(year%400=0),所谓闰年,是指符合下面两个条件之一:能被4整除,但不能被100整除;能被4整除,又能被400整除。,分析:如果判断闰年的表达式的值为真,则是闰年,输出“xxxx年是闰年”,否则不输出。,单分支结构例题,#include void main()int Year;printf(Input year:);scanf(%d,/满足条件执行该输出语句,单分支结构例题,#include#include void main()int x,y;scanf(“%d”,#include#include void main()int x,y;scanf(“%d”,分支结构例题,3.2.3 多分支结构,1、语法形式:if(表达式)语句1;else if(表达式)语句2;else if(表达式)语句3;else if(表达式)语句n;else语句n+1;,3.2.3 多分支结构,2、执行过程:按顺序求各表达式的值。如果某一表达式的值为真(非0),那么执行其后相应的语句,执行完后整个if语句结束,其余语句则不被执行;如果没有一个表达式的值为真,那么执行最后的else语句。,例:设有分段函数:,多分支结构例题,y=2x-1(-2x3),编写一个程序,输入x,输出y值。,多分支结构例题,输入x,输出y,y=-e2x+1+3,y=2x-1,y=3log10(3x+5)-11,#include#include void main()double x,y;printf(Input x:);scanf(%ld,多分支结构例题,exp是以e为底的指数函数,log10是以10为底的对数函数,/包含数学运算函数的头文件,3.2.3 多分支结构,请将输入的百分制成绩,转换成五分制成绩输出,转换标准如下:,很明显这是一个多分支问题,利用多分支if语句完全可以解决这类问题。但是如果ifelse语句过多,会令人眼花缭乱。幸运的是C语言提供了另外一种多分支语句:switch语句。,1、switch语句的格式 switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;:case 常量表达式n:语句n;break;default:语句序列n+1,注意:(1)switch后的表达式一般多为整型或字符型表达式(2)case后常量表达式的值必须互不相同(3)语句1至语句n+1为多条语句时可省略(4)多个case可以共用一组执行语句(5)switch语句可以嵌套,代表可选项,3.2.3 多分支结构,2、switch的执行过程(语句1-语句n后没使用break;),switch(表达式)case 常量表达式1:语句1;case 常量表达式2:语句2;:case 常量表达式n:语句n;default:语句n+1;,(1)计算switch后表达式的值,(2)如果表达式的值与某个case常量表达式的值相等时,就执行此case后的语句,执行完后将继续执行下一个case后的语句,如果表达式的值与所有case常量表达式的值都不同,就执行default后的语句,执行后结束整个switch语句,3.2.3 多分支结构,例 void main()int x,y;scanf(“%d”,输入x为 2输出:20 30 0,输入x为 6输出:0,3.2.3 多分支结构,注意:执行一个case 分支后,应用break结束switch语句,void main()int x,y;scanf(“%d”,输入x为 2输出:20,3.2.3 多分支结构,例:将输入的百分制成绩s,转换成五分制成绩输出,#includevoid main()int s;printf(“input s:”);scanf(“%d”,两个case共用一组执行语句,3.2.3 多分支结构,3.2.4 if 语句的嵌套:在if 语句中又包括一个或多个if 语句,规定:在if 嵌套结构中,else是与其前面最近的尚未配对的if 配对(就近原则),所以第一种理解是正确的。,1.if(表达式1)if(表达式2)语句,4.if(表达式1)if(表达式2)语句1 else 语句2,2.if(表达式1)语句1 else if(表达式2)语句2,3.if(表达式件1)语句1 else if(表达式2)语句2 else 语句3,对第4种形式可以有两种理解方式:(1)if(表达式1)if(表达式2)语句1 else 语句2,(2)if(表达式1)if(表达式2)语句1 else 语句2,3.2.4 if 语句的嵌套,写法1if(x0)y=-1;else if(x=0)y=0;else y=1;,写法2if(x=0)if(x0)y=1;else y=0;else y=-1;,写法3y=-1;if(x!=0)if(x0)y=1;else y=0;,修改写法3y=-1;if(x!=0)if(x0)y=1;else y=0;,例 判断某人的肥胖程度,体指数 t=w/h2 w-体重(千克),h-身高(米)t=18&t=25&t=27 肥胖,输出低体重,输出正常体重,输出高体重,输出肥胖,#includevoid main()float t,w,h;scanf(“%f%f”,例:试编程,当键入+,-,*,/时,分别计算并输出x+y,x-y,x*y,x/y的值,#include void main()int x,y;char c1;scanf(“x=%d,y=%d,c1=%c”,3.2.5 条件运算符,例 max=ab?a:b+1 ab?a:cd?c:d,注意:(1)表达式1,表达式2和表达式3 的数据类型可以互不相同(2)条件表达式值的数据类型与表达式2,表达式 3中数 据类型较高的那个保持一致 如 75?10:1.4 条件表达式的值为10.0,ab?a:(cd?c:d),1.条件运算符?:(唯一的三目运算符)优先级仅高于赋值类,是右结合性,执行过程:先计算表达式1,若其值为非零值(真),则计算表达式2 的值,该条件表达式的值即为表达式2 的值;若表达式1的值为零(假),则计算表达式3 的值,该条件表达式的值即为表达式3 的值,2.条件表达式的一般形式:表达式1?表达式2:表达式3,max=(ab?a:b+1),用条件表达式实现#include void main()int max;max=xy?x:y;max=zmax?z:max;printf(“max=%d”,max);,当if中的语句为简单赋值语句时,我们可以用条件表达式来取代if 语句,例 求3个数中的最大数#includevoid main()int max;if(xy)max=x;else max=y;if(zmax)max=z;printf(“max=%d”,max);,