《C程序设计05选择结构程序设计》由会员分享,可在线阅读,更多相关《C程序设计05选择结构程序设计(43页珍藏版)》请在金锄头文库上搜索。
1、 在C程序的三种结构中,分支结构是一重要结构,其中的P为条件问题:条件如何表达?逻辑运算、关系运算5.1 5.1 关系运算符关系运算符 关系运算比较运算, 如: a3为一比较运算,当a=5, a3成立。结果称为“ 真”, 否则, 如: a=1,a3不成立,为假。上述表达式a3称为关系表达式。 关系运算符及其优先次序关系运算符及其优先次序1. , , =为同一优先级, = =, !=等为同一优先级, 但前者高于后者。2. 关系运算符优先级低于算术运算符。C语言提供了六种关系运算符 = = = !=优先级为:3. 关系运算符优先级高于赋值运算符。如下图:算术运算符赋值运算符关系运算符高低举例: c
2、a+b c(a+b)ab!=c (ab)!=ca= =bc a= =(bc a=(bc) 关系表达式关系表达式关系表达式的结果值规定为1或0.如: ab, a+bb+c, (a=3)(b=5) , a b , (ab)(bb)= =c 成立 1b+cb 则ab值为1, 所以d=1. f=abc ab为1, abc为0,所以f=0.5.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 用逻辑运算符将关系表达式、逻辑量连接起来的式子逻辑表达式。 逻辑运算符及优先级 a b !a !b a&b a b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假
3、 假三种: & (与), (或) ! (非)其意义见真值表a&b 当a, b均为1时,才为1a b 当a, b中有一个为1时,才为1!a 当a为1, !a为0,反之为1.由此看到:和&为双目运算符, !为单目运算符。优先级定义:2. &和低于关系运算符。!高于算术运算符1. !(非)优先于&(与).&优先于即: !& 例: !a&b xy & c (!a)&b) (xy)&c) 逻辑表达式 1. 逻辑表达式的值与关系表达式值一样,真为1,假为0。例: a=4 则 !a 值为0.此处只要a 0,为真.则!a值为0. a=4, b=5 a&b为1 前面已定义了逻辑表达式,以下看一看逻辑表达式的值及
4、具体的运算。 4&0 2 为1. 总之,在逻辑运算中,非0值参加逻辑运算时被看成1处理. a=4, b=5 a b为1 a=4, b=5 !a b为12. 一个逻辑表达式中的逻辑运算符并不是一定全部执行. 一个实际的例子:判断年号是否为润年。如: a&b&c. 则当a=0(假)时, b,c不需判断。当a=1,b=0,则不需判c.又如: a b c. 当a=1时,b, c均不必判别。润年的定义: 能被4整除且又能被400整除。 年号能被4整除但不能被100整除。 当(year%4!=0) (year%100= =0& year%400!=0) 为1时, year为非润年。设用变量year表示年号
5、 当(year%4= =0& year% 100 !=0) year%400= =0)为1时,year为润年,否则为非润年。如果要判别非润年可在上述表达式前加非(!)运算符. 当!( (year%4= =0 & year%100!=0) year% 400= = 0) 为1时,year为非润年。或者:即:则:5.3 if 5.3 if 语句语句条件判条件判断断5.3.1 if5.3.1 if的三种形式的三种形式 功能: 当表达式值非0时, 执行语句A,否则不执行语句A.表达式语句A00例如: if (xy) printf( %d, x);形式1 if(表达式)语句A其流程图:形式2 if(表达
6、式)语句A else 语句B功能: 表达式为非0,执行语句A 表达式为0,执行语句B表达式 0= 0语句A语句B例: if(xy) printf(%d, x); else printf( %d, y);形式3 if(表达式1)语句1 else if (表达式2) 语句2else if (表达式3) 语句3 else if(表达式n) 语句nelse 语句n流程:表达1表达2表达3表达n语句1语句2语句3语句n语句n+1 0= 0= 0 0 0 0如: if (3) prinft(o.k); if (a) 1. 表达式可以是逻辑、关系,甚至是算术表达式。 2. 上述形式中的语句必须以分号结束 3
7、. 上述形式中的语句可以是由 括起来的复合语句。此时,在 外可以不用分号.注意的问题:main ( ) float a, b, t; scabf (%f, %f, &a, &b); if (ab) t=a; a=b; b=t; printf (%5.2f, %5.2f, a, b);例5.1 输入两个实数,按代数值由小到大次序输出这两个数。 3.6, 3.2 3.20, 3.60运行情况如下:例5.2 输入三个数,按大小顺序输出。main ( )float a, b, c,t; scanf(%f,%f,%f, &a, &b,&c); if (ab) t=a; a=b; b=t; if (ac)
8、 t=a; a=c; c=t; if (bc) t=b; b=c; c=t; printf(%5.2f, %5.2f, %5.2f, a, b, c);运行情况如下:3,7,11.00, 3.00, 7.005.3.2. if语句的嵌套if (表达式1)内嵌ifelse内嵌if注意: else与最近的if 配对.一般形式 在上述形式的if语句中, 又可以是if语句称为嵌套。if (表达式2) 语句1if (表达式3) 语句3else 语句2else 语句4例: if ( )if ( ) 语句2else 语句3if ( ) if ( ) 语句1 else 所以:必要时加 . if ( ) 语句1
9、else例5.3 有一函数y=1 (x0)编一程序,输入一个x值,输出y值。有以下几种写法,请判断哪些是正确的?程序1:main ( ) int x, y; scanf(d, &x); if (x=0) if (x0) y=1; else y=0; else y= 1;程序3: 将上述if语句改为: y= 1; if (x! =0) if (x0) y=1; else y=0;程序4: y=0; if (x=0) if (x0) y=1; else y= 1;5.3.3 5.3.3 条件运算符条件运算符 C语言提供了一个简单的条件赋值语句或条件表达式。问题: 当判断条件不论是“ 真”是“ 假”
10、, 均给同一变量赋值时,能否简化语句书写?条件运算符为? : 三目运算符。功能: 先判表达式1, 若非0,则值为表达式2的值,否则为表达式3的值。一般形式表达式1?表达式2: 表达式3 max=ab? a:b;当ab. max a. 否则maxb注: 1. 条件运算符优先于赋值运算符. 例: max=(ab? a:b)可去掉( ) 2. 条件运算符低于关系运算符和算术运算符。 例: max=ab? a:b+1 max= ab? a:(b+1)并不是 max=(ab? a:b)+1 3. 条件运算符结合性为从右至左. 如: ab? a:cd ? c:d 相当于 ab? a:(cd? c:d)4.
11、 条件表达式不能取代一般的if语句,只有当if 的两 个分支为给同一变量赋值时才可替代if.if (ab) printf(%d, a); else printf (%d, b);由于printf不是表达式,故不可用条件表达式,但可为: printf(%d, ab? a:b);5. 表达式1、表达式2、表达式3可类型不同。main ( ) char ch; scanf (%c, &ch); ch=(ch=A & ch=Z)? (ch+32):ch; printf(%c, ch);例5.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。运行
12、结果如下: A a5.4 switch 5.4 switch 语句语句开关语句开关语句 问题: 当某一表达式有n个取值,每一取值执行一语句,则如果用内嵌if十分繁锁,而用switch简单.一般形式: switch(表达式) case 常量表达式1: 语句1 case 常量表达式2: 语句2 case 常量表达式n: 语句n default : 语句n+1 例: 根据成绩等级打印百分数段.switch (grade) case A: printf (85100n);case B: printf (7084n);case C: printf (6069n);case D: printf (60n)
13、; break; case D: printf(0真假p=-b/(2*a) q=sqrt(delt)/(2*a)x1=p+qx2=p-qp=-b/(2*a) q=sqrt(-delt)/(2*a)输出两个相等实根:-b/(2a)delt=b*b-4*a*c输出“非二次”方程#include #include main()float a,b,c,delta,x1,x2,p,q; printf(Please input a,b,c:n); scanf(%f,%f,%f,&a,&b,&c); printf(The equation ); if(fabs(a)=1e-6) printf(is not a quadratic); else delta=b*b-4*a*c; if(fabs(delta)1e-6) p=-b/(2*a); q=sqrt(delta)/(2*a); x1=p+q; x2=p-q; printf(have distinct real roots:%8.4f and%8.4fn,x1,x2); else p=-b/(2*a); q=sqrt(-delta)/(2*a); printf(has complex roots:n); printf(x1=%8.4f+%8.4fin,p,q); printf(x2=%8.4f-%8.4fin,p,q); getch();