高级程序设计语言吴 凡
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第五章 选择结构程序设计电子科技大学通信与信息工程学院引例
计算函数值:

0 1
0
)s in (
x
x
x
x
y
输入 x
X= 0?
Y N
y = 1 y = six/x
输出 y
#include "stdio.h"
#include "math.h"
main()
{
float x,y;
printf("input x:\n");
scanf("%f",&x);
if (x != 0.0)
y = sin(x)/x;
else
y = 1;
printf("y = %f",y);
}
电子科技大学通信与信息工程学院关系运算符
关系运算实际上是“比较运算”
< <= > >= (优先级相同)
== != (优先级相同)
优先级:
算术运算符
关系运算符
赋值运算符
结合方向:从左向右
例:
c > a + b? c > (a+b)
a == b > c? a == (b > c)
a = b == c? a = (b == c)
低高低高电子科技大学通信与信息工程学院关系表达式
关系表达式:用关系运算符将两个表达式(算术表达式,字符表达式,关系表达式,逻辑表达式,赋值表达式)连接起来的式子
例:
x + y > 5
'a' == 'A' 字符量比较:根据 ASCII值
(4 * 2) > (4 == 2)
关系表达式的值:“真” (1) 或,假” (0)
例,a = 3,b = 2,c=1 则:
a > b 的值为真,表达式的值为 1
a > b == c 的值为真,表达式的值为 1
b + c < a 的值为假,表达式的值为 0
b + c <= a的值为真,表达式的值为 1
例,a = 3,b = 2,c = 1,如果 d = a != b == c,则 d = 1
电子科技大学通信与信息工程学院逻辑运算符
逻辑运算符:
&& 逻辑与
例,a && b,若 a,b都为真,则逻辑表达式值为 真 。
|| 逻辑或
例,a || b,若 a,b都为假,则逻辑表达式值为 假,
(换言之,a,b中有一个为真,则逻辑表达式值为真)。
! 逻辑非
例,!a,若 a为真,则逻辑表达式值为假;反之依然。
真值表( P89)
电子科技大学通信与信息工程学院逻辑运算符
优先级:
!
&&
||
结合顺序:
!:从右向左
&&和 ||:从左向右
例,!a || b && x > y && c
(!a) || b &&(x > y) && c
低高低高!(非)
算术运算符关系运算符
&&
||
赋值运算符各种运算符的优先级
1 23 45
电子科技大学通信与信息工程学院逻辑表达式
逻辑表达式:用逻辑运算符将关系表达式或 逻辑量 连接起来的式子
逻辑量:用来进行判断的变量或者常量
C编译系统认为:
值等于零:假
非零值:真
例:若 a = 4,在 a && 1中,a就是逻辑量,代表真
逻辑表达式的值:真为 1,假为 0
例:若 a = 4,则:
!a 0
a && -5 1
a || 0 1
a && 0 0
电子科技大学通信与信息工程学院逻辑表达式
例,a = 3,b = 2,c=1 则:
a > b && b > c? (a > b) && (b > c)
a != b && b !=c? (a != b) && (b !=c)
!a || c > a? (!a) || (c > a)
例,5 > 3 || 2 && !8 < 4 - !0,结果为 1
例:判断某年 year是否是闰年(闰年:能被 4整除,
且不能被 100整除,或者能被 400整除)
year % 4 == 0 && year % 100 != 0 || year % 400 == 0
例,x ≤ a+1,并且 y ≤ b,C语言逻辑表达式:
x <= a + 1 && y <= b
例 的定义域
(x > 2 || x < 1) && x != 0
x
xxxf )2)(1()(
电子科技大学通信与信息工程学院
if 语句
if语句的三种形式:
1,条件执行
格式,if (判断条件 p)
语句 A;
例:

A 空
p
真 假
if (a > 0)
printf( "a=%d is positive\n",a) ;
..,
if (x > y){
temp = x;
x = y;
y = temp;
}
...
电子科技大学通信与信息工程学院条件执行
注意:
语句 A可以是复合语句
判断条件 P是一个表达式,如果值为 0?假,非
0?真
例:
例:
例:
if ('a')
printf("OK\n");
x = -1;
if (x)
printf("OK\n");
y = 0;
if (y)
printf("OK\n");
电子科技大学通信与信息工程学院例:任给 a,b,c三数,按从大到小顺序输出 (1/2)
例:任给 a,b,c三数,按从大到小顺序输出
方法:判断-交换
若 a < b,则 a,b交换
若 a < c,则 a,c交换?a最大
若 b < c,则 b,c交换?c最小
判断 ——if else语句
交换:需引入临时变量
tmp = a;
a = b;
b = tmp;
电子科技大学通信与信息工程学院例:任给 a,b,c三数,
按从大到小顺序输出
(2/2)
交换 a,b B
a < b真 假输入 a,b,c
交换 a,c B
a < c真 假交换 b,c B
b < c真 假输出 a,b,c
#include "stdio.h"
main()
{
int a,b,c;
int tmp;
printf("Input a,b,c:\n");
scanf("%d%d%d",&a,&b,&c);
if (a < b){
tmp = a;
a = b;
b = tmp
}
if (a < c)
tmp = a;
a = c;
c = tmp;
}
if (b < c){
tmp = b;
b = c;
c = tmp;
}
printf("%d,%d,%d\n",a,b,c);
}
电子科技大学通信与信息工程学院
if 语句 ——分支选择
if语句的三种形式:
分支选择
格式,if (判断条件 p)
语句 A;
else
语句 B;
例:
注意:
else部分不能单独存在,它必须是 if语句的一部分
语句 A,B都可以是复合语句
A B
p
真 假
if (a > 0)
printf( "a=%d is positive\n",a) ;
else
printf( "a=%d is not positive\n",a) ;
电子科技大学通信与信息工程学院
if 语句
例:输入一个整数,判断奇偶
#include "stdio.h"
main()
{
int a;
printf("Input integer:\n");
scanf("%d",&a);
if (a % 2)
printf("%d is an odd\n",a);
else
printf("%d is a even\n",a);
}
电子科技大学通信与信息工程学院
if 语句 ——阶梯式
if语句的三种形式:
多分支选择(称为阶梯式 if else或 else if 语句)
格式,if (判断条件 p1)
语句 A1
else if (判断条件 p2)
语句 A2
else if (判断条件 p3)
语句 A3
else
语句 A4
注意:
执行顺序:从上向下逐个判断条件 pi,一旦发现条件 pi满足,执行
Ai,并跳过剩余的阶梯
最后一个 else表示除了以上所有条件( p1,p2,p3 )外的情况下,有时可以省略
else与最近的 if语句匹配
A1
p2
p1
真 假真 假
A2
p3真 假
A3 A4
电子科技大学通信与信息工程学院
if 语句
例:评价学生成绩,规则:
score>=90,A
score>=80,B
score>=60,C
score < 60,D
#include "stdio.h"
main()
{
int score;
printf("Input score:\n");
scanf("%d",&score);
if (score >= 90)
printf("%d greed is A\n",score);
else if (score >= 80)
printf("%d greed is B\n",score);
else if (score >= 60)
printf("%d greed is C\n",score);
else
printf("%d greed is D\n",score);
printf("finish\n");
}
电子科技大学通信与信息工程学院
if 语句
例:判断输入的字符是数字、
大写字母、小写字母或其他字符。
#include <stdio.h>
int main()
{
char c;
printf("Enter a character:");
c=getchar();
if(c>='0' && c<='9')
printf("Digit!\n");
else if(c>='A'&&c<='Z')
printf("Uppercase!\n");
else if(c>='a' && c<='z')
printf("Lowercase!\n");
else
printf("Other charater!\n");
}
电子科技大学通信与信息工程学院
if语句的嵌套
标准格式
if (P1)
if(P2)
A1;
else
A2;
else
if(P3)
A3;
else
A4;
P1
真 假
P2
真 假
P3
真 假
A1 A2 A3 A4
电子科技大学通信与信息工程学院
if语句的嵌套
标准格式
if (P1)
if(P2)
A1;
else
A2;
else
if(P3)
A3;
else
A4;
格式 1
if (P1)
A1;
else
if(P2)
A2;
else
A3;
格式 2
if (P1)
if(P2)
A1;
else
A2;
else
A3;
else与最近的 if
语句匹配
if (P1)
if(P2)
A1;
else
if ( P3)
A3;
else
A4;
电子科技大学通信与信息工程学院
if语句的嵌套
注意:
else与最近的 if语句匹配
例:
if (x > 0)
if (y == 1) printf("1");
else printf("2");
通过加 { }可以改变 else的层次

if (x > 0){
if (y == 1) printf("1");
}
else printf("2");
电子科技大学通信与信息工程学院例:断某一年是否是闰年(被 4整除且不被 100整除,或者被 400整除)
#include "stdio.h"
main()
{
int year,flag;
scanf(“%d”,%year);
if(year % 400 == 0)
flag = 1;
else
if (year %4 == 0)
if(year % 100 == 0)
flag = 0;
else flag = 1;
else flag = 0;
if(flag)
printf("%d is leap year\n",year);
else
printf("%d is not a leap year\n",year);
}
flag=1
year%4
year%400
真 假真 假
year%100
真 假
flag=0 flag=1
flag=0
输入 year
flag真 假输入闰年 输入非闰年电子科技大学通信与信息工程学院例:断某一年是否是闰年(被 4整除且不被 100整除,或者被 400整除)
#include "stdio.h"
main()
{
int year,flag;
scanf(“%d”,%year);
if(year % 400 == 0)
flag = 1;
else
if (year %4 == 0)
if(year % 100 == 0)
flag = 0;
else flag = 1;
else flag = 0;
if(flag)
printf("%d is leap year\n",year);
else
printf("%d is not a leap year\n",year);
}
if(year % 4 != 0)
flag = 0;
else if (year % 100 != 0)
flag = 1;
else if (year % 400 == 0)
flag = 1;
else flag = 0;
if(year%4==0 && year%100
||year%400==0)
flag = 1;
else flag = 0;
电子科技大学通信与信息工程学院条件运算符
唯一的三目运算符
格式:表达式 1?表达式 2:表达式 3
例,x = a > b? a,b
等价 if(a > b) x = a;
else x = b;
优先级:高于赋值运算赋,低于算术、条件、逻辑运算符
结合方向:从右向左
例,a > b? a,c > d? c,d 等价 a > b? a,(c > d? c,d)
电子科技大学通信与信息工程学院
switch语句和 break语句
switch 语句:是专门用于实现多分支选择的语句
break语句:终止 switch语句的执行
格式:
switch语句的一般形式:
switch(表达式 ){
case 常量表达式 1,语句 1
case 常量表达式 2,语句 2
……
case 常量表达式 n,语句 n
[default,语句 n+1]
}
执行过程:
1.计算表达式
2.若与常量表达式 i
一致,开始执行,
直到遇到 break
语句或 switch语句的 }时结束
3.若与所有常量表达式均不一致,
执行 default后的语句电子科技大学通信与信息工程学院
switch语句
switch 语句中的“表达式”和 case后面的“常量表达式”的结果值的类型应该一致。
每一个 case的常量表达式的值必须互不相同,否则出现矛盾现象。
各个 case的出现次序不影响执行结果。
执行完一个 case后面的语句后,流程控制转移下一个 case继续执行。
default 语句为选择项,可有可无。另外,default 后面可以不加 break语句。
多个 case可以共用一组执行语句,如
例:

case?A?:
case?B?:
case?C?,printf(“>60\n”);break;
Grade的值为‘ A?、‘ B?、‘ C?时都执行同一组语句。
电子科技大学通信与信息工程学院
switch语句
例:根据考试成绩的等级打印出百分制分数段:
#include "stdio.h"
main()
{
char grade;
grade = getchar();
switch(grade){
case 'a':printf("85~100\n");break;
case 'b':printf("70~84\n");break;
case 'c':printf("60~69\n");break;
case 'd':printf("<60\n");break;
default:printf("error!\n");
}
}