分支结构
分支结构:又被称之为选择结构
概念
选择结构:根据条件成立与否,选择相应的操作
条件构建
关系表达式:含有关系运算符夫人表达式(>,<,>=,<=,!=,==)
逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复制的复合条件,比如:
if(year % 100 == 0 && year % 4 !=0) //这种即含有关系表达式,又含有逻辑表达式的条件叫做复合条件
常量/变量:值是否非0,取值(0|1)
注意:类似一下写法,是无效的,没有意义的。
if(x+y) //编译通过,但是没有实际意义,不建议这样写
if(5*6)
选择结构的形式
单分支
语法:
if(条件表达式)
{
语句1;
}
说明:条件表达式成立,执行语句1,否则跳过该分支结构。单分支条件不满足可以不执行。
例子:
int a = 5;
if(a < 0)
{
a = -a;
}
printf("a=%d\n");
例子:
#include <stdio.h>
int main(void)
{
char c;
printf("请输入一个英文字母:\n");
scanf("%c",&c);
if(c >= 'A' && c <= 'Z')
{
c += 32;
}
printf("输入的字符啥:%c\n",c);
return 0;
}
双分支
语法:
if(条件表达式)
{
语句1;
}
else
{
语句2;
}
说明:条件表达式成立,执行语句1,否则执行语句2。双分支不管条件是否满足,都需要执行。
例子:
#include <stdio.h>
int main(void)
{
double x,a,y;
printf("请输入两个数值:\n");
scanf("%lf,%lf",&x,&a);
if(x != 0 && a != 0)
{
y = 1.0/x + 1.0/a;
}
else
{
y = 10000;
}
printf("y=%f\n",y);
return 0;
}
三目运算符
语法:表达式1 ? 表达式2 : 表达式3;
说明:?:条件运算符,主要可以简化双分支为同一变量赋值操作。
求值过程: 先计算表达式1的值,非0,则将表达式2的结果作为条件运算的最终结果:否则将表达式3的结果作为条件运算符的最终结果。
案例:
#include <stdio.h>
int main(void)
{ //写法1:正常写法语法:表达式1 ? 表达式2 : 表达式3;
int a = 5,b = 3;
if(a > b)
{
printf("最大数是:%d\n",a);
}
else
{
printf("最大数是:%d\n",b);
}
// 写法2 :省略{}
int a1 = 5,b1 = 3;
if(a1 >b1)
printf("最大数数:%d\n",a1);
else
printf("最大数是:%d\n",b1);
//写法3 :三目运算符
int a2 = 5,b2 = 3;
int ret = a2 > b2 ? a2 : b2;
printf("最大数是:%d\n",ret);
return 0;
}
案例:
#include <stdio.h>
int main()
{
// 需求:输入两个实数,按代数值由 小到大的顺序输出这两个实数。
// 申明变量,存储操作数
int a,b;
printf("请输入两个数值作为操作数:\n");
scanf("%d,%d",&a,&b);
// 校验
// 方式1
if(a > b)
{
printf("由小到大的顺序是:%d,%d\n",b,a);
}
else
{
printf("由小到达的顺序是:%d,%d\n",a,b);
}
// 方式2
// 创建一个临时变量,用来存放交换信息
int t = 0;
if(a > b)
{
t = a;
a = b;
b = t;
}
printf("由小到大的顺序是:%d,%d\n",a,b);
}
案例:
#include <stdio.h>
int main()
{
// 需求:输入3个数a,b,c,要求按由小到大的顺序输出这3个数
// 申明变量,用来存放操作数
int a,b,c,tmp;
printf("请输入三个整数:\n");
scanf("a=%d,b=%d,c=%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("a,b,c三个数按照由小到大的顺序是:%d,%d,%d\n",a,b,c);
return 0;
}
多分支
语法:
if(条件1)
{
语句1;
} else if(条件2)
{
语句2;
}
...
else {
语句n+1;
}
案例:
#include <stdio.h>
int main()
{
// 需求:编一程序,要求输入一个x值,输出y值
// 方式1:嵌套的if..
int x,y;
printf("请输入一个整数:\n");
scanf("%d",&x);
// 条件判断
if(x < 0)
{
y = -1;
}
else
{
// x >= 0
if(x == 0)
{
y = 0;
}
else
{
y = 1;
}
}
printf("方式1:x=%d,y=%d\n",x,y);
// 方式2:多分支if..else if....else..
// 条件判断
if(x < 0)
{
y = -1;
}
else if(x == 0)
{
y = 0;
}
else
{
y = 1;
}
printf("方式2:x=%d,y=%d\n",x,y);
}
案例:
#include <stdio.h>
/**
* 需求:高校要求粤嵌对实训学生根据实训成绩进行评级
范围:0 <= score <= 100;
评级:
score >= 90 优秀
score >= 80 良好
score >= 70 中等
score >= 60 及格
score < 60 不及格
*/
int main()
{
// 声明一个变量,存储成绩
int score;
printf("请录入学生成绩:\n");
scanf("%d",&score);
// 对score进行合法校验
if(score >= 0 && score <= 100)
{
// 对合法输入的成绩进行评级
if(score >= 90)
{
printf("优秀\n");
}
else if(score >= 80)
{
printf("良好\n");
}
else if(score >= 70)
{
printf("中等\n");
}
else if(score >= 60)
{
printf("及格\n");
}
else
{
printf("不及格\n");
}
}
else
{
printf("成绩录入不合法!\n");
}
}
switch
语法:
switch(表达式) // 不能是布尔型和 浮点型
{
case 常量表达式1:
语句体1;
break;
case 常量表达式2:
语句体2;
break;
...
case 常量表达式n:
语句体n;
break;
default:
语句体n+1;
break;// 可以省略
}
说明:
(1)switch后括号内的表达式可以是任何类型的表达式;
(2)若表达式的值与某个常量表达式的值相等时,执行此case后面的语句:若没有相等的值时,执行default后面的语句;
(3)每个case后面的常量表达式的值都必须不相同,否则出现矛盾;
(4)各个case和default出现次序不影响执行结果;
(4)各个case 和default出现的次序不影响执行结果;
(5)case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿 透) ;
(6) 多个case可共用一组语句。
注意:
- 表达式一般写一个变量,变量的值是一个确定的常量。
- 当遇到break或者switch语句的右大括号时,switch语句结束。
- 表达式中的数据类型:char,short,int,long,long long,不能是浮点型。 表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。
案例:
/*
需求:根据成绩进行评级
score <= 100;
评级:
90 <= score < 100 优秀 90~99/10 == 9 && 100/10 ==10
80 <= score < 90 良好 80~89/10 == 8
70 <= score < 80 中等 70~79/10 == 7
60 <= score < 70 及格 60~69/10 == 6
score < 60 不及格
*/
#include <stdio.h>
int main()
{
int score;// 成绩
printf("请输入实训成绩:\n");
scanf("%d",&score);
if(score >= 0 && score <= 100)
{
// 对成绩进行加工
int l = score / 10;
switch(l)
{
case 10:// 100分
case 9:// 90~99分
printf("优秀\n"); // 这里:多个case共用一块代码
break;
case 8:
printf("良好\n");
break;
case 7:
printf("中等\n");
break;
case 6:
printf("及格\n");
break;
default:
printf("不及格\n");
}
}
else
{
printf("成绩录入不合法!\n");
}
}
案例:
/*
需求:实现一个简易计算器,要求实现+,-,×,/运算
*/
#include <stdio.h>
int main()
{
printf("简易计算器 v1.0\n");
printf("请输入两个操作数:\n");
double x,y;// 存放计算数
char ch;// 运算符
scanf("%lf,%lf",&x,&y);
scanf("%c",&ch);// 消除上面产生的最后一个回车符
printf("请输入运算符:(+、-、.*、/)\n");
scanf("%c",&ch);
// 计算
switch(ch)
{
case '+':
printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
break;
case '-':
printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
break;
case '.':
case '*':
printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
break;
case '/':
if(y == 0)
{
printf("除数不能为0\n");
}
else
{
printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
}
break;
default:
printf("输入错误!");
}
return 0;
}
switch语句的case穿透:
1. case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是 否和它后面的case常量是否相同),这样的现象称之为case穿透。
2. default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语 句可以放在switch语句{}内的任意位置。
总结
- 如果只需要一个判断结果,使用单分支
- 如果需要两个判断结果,且只能有两个判断结果,使用双分支
- 如果需要判断N个结果中的某几个,或者所有,使用多分支
扩展
条件表达式中的运算符优先级
逻辑非(!) > 算数运算符 (+-*/%)>关系运算符(> < >= 逻辑运算符(&&、||)> 赋 值运算符(=、+=)