目录
4.1 选择结构和条件判断
【例4.1】
4.2 用if语句实现选择结构
4.2.1 用if语句处理选择结构举例
【例4.2】
【例4.3】
4.2.2 if语句的一般形式
4.3 关系运算符和关系表达式
4.3.1 关系运算符及其优先次序
4.3.2 关系表达式
4.4 逻辑运算符和逻辑表达式
4.4.1 逻辑运算符及其优先次序
4.4.2 逻辑表达式
4.5 条件运算符和条件表达式
【例4.4】
4.6 选择结构的嵌套
【例4.5】
4.7 用switch语句实现多分支选择结构
【例4.6】
4.8 选择结构程序综合举例
【例4.8】
4.1 选择结构和条件判断
C语言有两种选择语句
- if语句,用来实现两个分支的选择结构
- switch语句,用来实现多分支的选择结构
【例4.1】
在例3.5的基础上对程序进行改进。题目要求解得a+bx+c=0方程的根。由键盘输入a,b,c。假设a,b,c的值任意,并不保证b2-4ac≥0。需要在程序中进行判别,如果-4ac≥0,就计算并输出方程的两个实根,如果-4ac<0,就输出“此方程无实根”的信息。
#include#include //程序中要调用求平方根函数sqrt int main() { double a,b,c,disc,x1,x2,p,q; //disc是判别式sqrt(b*b-4ac) scanf("%lf%lf%lf",&a,&b,&c); //输入双精度浮点型变量的值要用格式声明"%lf" disc=b*b-4*a*c; if(disc<0) //若b*b-4ac<0 printf("This equation hasn't real rootsn"); //输出“此方程无实根” else //b*b-4ac≥0 { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q;x2=p-q; //求出方程的两个根 printf("real roots:nx1=%7.2fnx2=%7.2fn",x1,x2); //输出方程的两个根 } return 0; }
4.2 用if语句实现选择结构
4.2.1 用if语句处理选择结构举例
【例4.2】
【例4.2】
输入两个实数,按由小到大的顺序输出这两个数。
解题思路: 只要做一次比较,然后进行一次交换即可。用if语句实现条件判断。
#includeint main() { float a,b,t; scanf("%f,%f",&a,&b); if(a>b) { //将a和b的值互换 t=a; a=b; b=t; } printf("%5.2f,%5.2fn",a,b); return 0; }
【例4.3】
输入3个数a,b,c,要求按由小到大的顺序输出。
#includeint main() { float a,b,c,t; scanf("%f,%f,%f",&a,&b,&c); if(a>b) { t=a; //借助变量t,实现变量a和变量b互换值 a=b; b=t; } //互换后,a小于或等于b if(a>c) { t=a; //借助变量t,实现变量a和变量c互换值 a=c; c=t; } //互换后,a小于或等于c if(b>c) { t=b; //借助变量t,实现变量b和变量c互换值 b=c; c=t; } //互换后,b小于或等于c printf("%5.2f,%5.2f,%5.2fn",a,b,c); //顺序输出a,b,c的值 return 0; }
4.2.2 if语句的一般形式
if (表达式) 语句1
[ else 语句2 ]
- “表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式
- 方括号内的部分(即else子句)为可选的,既可以有,也可以没有
- 语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句
4.3 关系运算符和关系表达式
4.3.1 关系运算符及其优先次序
if (表达式) 语句1
[ else 语句2 ]
4.3.1 关系运算符及其优先次序
在C语言中,比较符(或称比较运算符)称为关系运算符。所谓“关系运算”就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。
- 前4种关系运算符的优先级别相同,后2种也相同。前4种高于后2种。
- 关系运算符的优先级低于算术运算符。
- 关系运算符的优先级高于赋值运算符。
c>a+b 等效于c>(a+b)(关系运算符的优先级低于算术运算符)
a>b==c等效于(a>b)==c(大于运算符>的优先级高于相等运算符==)
a==b
a=b>c等效于a=(b>c)(关系运算符的优先级高于赋值运算符)
对比
x*=y+8 等价于x=x*(y+8)
4.3.2 关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。 关系表达式的值是一个逻辑值,即“真”或“假”。 在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。
若a=3,b=2,c=1,则:
d=a>b,由于a>b为真,因此关系表达式a>b的值为1,所以赋值后d的值为1。
f=a>b>c,则f的值为0。因为“>”运算符是自左至右的结合方向,先执行“a>b”得值为1, 再执行关系运算“1>c”,得值0,赋给f,所以f的值为0
4.4 逻辑运算符和逻辑表达式
4.4.1 逻辑运算符及其优先次序
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式。
- “&&”和“‖”是双目运算符,要求有两个运算对象(操作数); “!”是单目运算符,只要有一个运算对象
- 优先次序:!(非)→&&(与)→‖(或), 即“!”为三者中最高的; 逻辑运算符中的“&&”和“‖”低于关系运算符,“!”高于算术运算符
4.4.2 逻辑表达式
-
逻辑表达式的值
应该是一个逻辑量"真"或"假"。C语言编译系统在表示
逻辑运算结果
时,用
数值1代表"真",用0代表"假"
,但在
判断一个量是否为"真"时
,以
0代表 "假",以非0代表"真"
。即将一个非零的数值认作为"真"。
例如∶
(1)若a=4,则!a的值为0。因为a的值为非0.被认作"真",对它进行"非运算",得
"假"。"假"以0代表。
(2)若 a=4,b=5,则 a&&b的值为1。因为a和b均为非0,被认为是"真",因此
a&&b 的值也为"真",值为1。
(3)a 和b值分别为4和5,a||b的值为1。
(4)a和b值分别为4和5,!a||b的值为1。
(5)4&&0||2的值为1。
逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”对待)
既然关系表达式和逻辑表达式的值是0和1,而且在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。那么就可以理解为什么在if语句中表达式可以是
任何数值表达式。
if (x
!=0) 语句1 //括号内的表达式是
关系表达式,如果x不等于0,执行语句1
if (x>0
&& y>0) 语句2 //表达式是
逻辑表达式,如果x和y都大于0,执行语句2
if (x) 语句3 //表达式是
变量,如果x不等于0,则条件判断结果为真,执行语句3
if (1) 语句4 //表达式是
非0整数, 条件判断结果为真,执行语句4
if (0) 语句5 //表达式是
整数0,条件判断结果为假,不执行语句5,接着执行下一语句 if(x+3.5) 语句6 //表达式是
实数表达式,若x+3.5不等于0,则条件判断结果为真,执行语句6
判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008。②能被400整除,如2000。
(year % 4 == 0 && year % 100 != 0) ‖ year % 400 == 0
在
逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
4.5 条件运算符和条件表达式
//等价写法
//①
if (a>b)
max=a;
else
max=b;
//②
max=(a>b) ? a : b;
//③
a>b ? (max=a) : (max=b);
条件表达式的一般形式
表达式1 ? 表达式2 : 表达式3
逻辑运算结果不是0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”对待)
判别用year表示的某一年是否闰年,可以用一个逻辑表达式来表示。闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除,如2008。②能被400整除,如2000。
(year % 4 == 0 && year % 100 != 0) ‖ year % 400 == 0
//等价写法 //① if (a>b) max=a; else max=b; //② max=(a>b) ? a : b; //③ a>b ? (max=a) : (max=b);
条件表达式的一般形式
表达式1 ? 表达式2 : 表达式3
条件运算符由两个符号(?和:)组成,必须一起使用。要求有3个操作对象,称为三目(元)运算符,它是C语言中唯一的一个三目运算符。
条件运算符的执行顺序: 先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
【例4.4】
输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母; 如果不是,不转换。然后输出最后得到的字符。
解题思路: 用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换。
#includeint main() { char ch; scanf("%c",&ch); ch=(ch>='A'&&ch<='Z')?(ch+32):ch; printf("%cn",ch); return 0; }
4.6 选择结构的嵌套
【例4.5】
#includeint main() { int x,y; scanf("%d",&x); if(x<0) y=-1; else if(x==0) y=0; else y=1; printf("x=%d,y=%dn",x,y); return 0; }
#includeint main() { int x,y; scanf("%d",&x); if(x>=0) if(x>0) y=1; else y=0; else y=-1; printf("x=%d,y=%dn",x,y); return 0; }
4.7 用switch语句实现多分支选择结构
【例4.6】
要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为 60分以下。成绩的等级由键盘输入。
#includeint main() { char grade; scanf("%c",&grade); printf("Your score:"); switch(grade) { case 'A': printf("85~100n");break; case 'B': printf("70~84n");break; case 'C': printf("60~69n");break; case 'D': printf("<60n");break; default: printf("enter data error!n"); } return 0; }
(1) 括号内的“表达式”,其值的类型应为整数类型(包括字符型)。
(2) 花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),它们和default都是起标号作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。
(3) 可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句。
(4) 各个case标号出现次序不影响执行结果。
(5) 每一个case常量必须互不相同;否则就会出现互相矛盾的现象。
(6) case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。因此,一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构。最后一个case子句(今为default子句)中可不加break语句。
如果在各case子句中没有break语句,将 连续输出∶ Your score:85~100 70~84 60~69 <60 enter data error!(7) 在case子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8) 多个case标号可以共用一组执行语句。
case'A': case "B': case 'C':printf(">60n");break; :
4.8 选择结构程序综合举例
【例4.8】
写一程序,判断某一年是否为闰年。
#includeint main() { int year,leap; printf("enter year:"); scanf("%d",&year); if(year%4==0) //核心代码 { if(year%100==0) { if(year%400==0) leap=1; else leap=0; } else leap=1; } else leap=0; //if里嵌套两个if...else if(leap) printf("%d is ",year); else printf("%d is not ",year); printf("a leap year.n"); return 0; }
#includeint main() { int year,leap; printf("enter year:"); scanf("%d",&year); if(year%4!=0) //核心代码 leap=0; else if (year%100!=0) leap=1; else if(year%400!=0) leap=0; else leap=1; //else里嵌套两个if...else if(leap) printf("%d is ",year); else printf("%d is not ",year); printf("a leap year.n"); return 0; }
#includeint main() { int year,leap; printf("enter year:"); scanf("%d",&year); if((year%4==0 && year%100!=0) || (year%400==0)) //核心代码 leap=1; else leap=0; //if括号内的表达式是逻辑表达式 if(leap) printf("%d is ",year); else printf("%d is not ",year); printf("a leap year.n"); return 0; }



