选择结构程序设计
知识补充
C语言中的语句:表达式语句、复合语句、函数调用语句
控制语句:分支语句、循环语句、跳转语句
1.用if实现选择结构
①if语句的一般形式:
if(表达式)语句1
[else 语句2]
如果语句1为真,则执行语句1;若为假,则执行语句2
单个变量构成的表达式也是正确的
②if语句的其他形式1:没有else子句部分
if(表达式)语句1
③if语句的其他形式2:有else子句的部分
if(表达式)
语句1
else
语句2
④if语句的其他形式3:在else部分嵌套了多层的if语句
if(表达式) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
… …
else if (表达式m) 语句m
else 语句m+1
【例如】
if (n>500) cost=0.15;
else if (n>300) cost=0.10;
else if (n>100) cost=0.075;
else if (n>50) cost=0.05;
else cost=0;
就可以写成以下内容
if (n>500)
cost=0.15;
else
if(n>300)
cost=0.1;
else
if(n>100)
cost=0.075;
else
if(n>50)
cost=0.05;
else
cost=0;
【注意】整个if语句可写成多行,也可以写成一行;要注意分号和if语句的整体性
【例题1】
输入两个实数,按由小到大的顺序输出两个数
解题思路:只要做一次比较,然后进行一次交换即可,用if语句实现条件判断。
** 编写程序**:
#include <stdio.h>
int 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.2f\n",a,b);
return 0;
}
运行结果:
3.6,-3.2
-3.20,3.60
【例题2】
输入3个数a,b,c,要求按由小到大的顺序输出
解题思路:
解此题的算法比上一题稍微复杂一些。可以先用伪代码写出算法。
S1:if a>b,将a和b对换
S2:if a>c,将a和c对换
S3:if b>c,将b和c对换
S4:顺序输出a,b,c
编写程序:
#include <stdio.h>
int 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.2f\n",a,b,c); //顺序输出a,b,c的值
return 0;
}
运行结果:
3,7,1
1.00,3.00,7.00
2.关系运算符和关系表达式
- C语言提供6种关系运算符
优先级相同(高):
< (小于)
<=(小于或等于)
〉(大于)
〉=(大于或等于)
优先级相同(低):
==(等于)
!=(不等于)
要注意运算符的优先性
运算符>关系运算符>赋值运算
【举例】
c>a+b 等效于 c>(a+b) 关系运算符的优先级低于算术运算符
a>b==c 等效于 (a>b)==c 大于运算符>的优先级高于相等运算符==
a==b<c 等效于 a==(b<c) 小于运算符<的优先级高于等于运算符==
a=b>c 等效于 a=(b>c) 关系运算符的优先级高于赋值运算符
- 关系表达式
用关系运算符将两个数值或数值表达式连接起来的式子
在C中,以1表示真,以0表示假
逻辑运算符和逻辑表达式
用逻辑运算符将关系表达式或其他逻辑量连接起来的式子
- C逻辑运算符及其含义
运算符 | 含义 |
---|---|
&& | 与 |
! | 非 |
// | 或 |
“&&”和“//”是双目(元)运算符,要求有两个运算对象
“!”是一目(元)运算符,只要求有一个运算对象
优先次序:!(非)→&&(与)→//(或)
【举例】
a>b&&(x>y) 可写成 a>b&&x>y
(a==b)//(x==y) 可写成 a==b//x==y
(!a)//(a>b) 可写成 !a//a>b
- 逻辑运算符
逻辑表达式的值应该是一个逻辑量“真”或“假”
即逻辑运算及结果不是0就是1,不可能出现其他值
【注意】
在逻辑表达式的求解中,并不是所有逻辑运算符都被执行,只有在必须执行时才会继续
①a&&b&&c。只有a为真(非0)时,才需要判别b的值
②a//b//c。只要a为真(非0),就不必判断b和c。只有a为假,才判别b。a和b都假,才判别c。
条件运算符和条件表达式
if(a>b)
max=a;
else
max=b;
可以写成为 max=(a>b)?a:b
即如果(a>b)条件为真,则条件表达式的值等于a;否则取值b
1.条件运算符::和 ?必须一起使用
要求有3个操作对象,称为三目(元)运算符
2.条件表达式一般形式:表达式1?表达式2:表达式3
条件运算符优先于赋值运算符
用switch语句实现多分支选择结构
1.switch语句是多分支选择结构
2.switch语句的一般形式
switch (表达式)
{
case 常量1:语句1
case 常量2:语句2
… …
case 常量n:语句n
default: 语句n +1
}
【例题】
要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60 ~69分,D等为60分以下。成绩的等级由键盘输入。
解题思路:
这是一个多分支选择问题,根据百分制分数将学生成绩分为4个等级,如果用if语句来处理至少要用3层嵌套的if,进行3次检查。用switch语句,进行一次检查即可得到结果。
编写程序:
#include <stdio.h>
int main()
{
char grade;
scanf("%c",&grade);
printf("Your score:");
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("enter data error!\n");
}
return 0;
}
运行结果:
A
Your score:85~100