2024年7月29日 第11天
选择(分支)结构
分支结构:又被称为选择结构
概念
选择结构:根据条件成立与否,选择相应的操作。
条件构建
-
关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)
-
逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:
if(year % 100 == 0 && year % 4 !=0) // 这种既含有关系表达式,又含有逻辑表达式的条件叫做复合条件
-
常量/变量:值是否非0,取值(0|1)
注意:类似以下写法,是无效的,没有意义的。
if(x+y) // 编译通过,但没有实际意义,不建议这样写if(5*6)
选择结构的形式
单分支
语法:
if(条件表达式){语句1;}
说明:条件表达式
成立,执行语句1
,否则跳过该分支结构。单分子条件不满足可以不执行。
例子:
if a = 5;if(a < 0){a = -a;}printf("a=%d\n");
/*** 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成>小写字母后输出,否则输出原来输入的字符*/#include <stdio.h>int main(){//声明一个变量,存放从键盘录入的字符char c;printf("请输入一个英文字母:\n");scanf("%c",&c);//判断if(c >= 'A' && c <='Z'){//c = c + 32;c += 32;}printf("输入的字符是:%c\n",c);return 0;}/*********************************************************请输入一个英文字母:V输入的字符是:v**********************************************************/
双分支
语法:
if(条件表达式){语句1;}else{语句2;}
说明: 条件表达式
成立,执行语句1
,否则执行语句2
。双分支不管条件是否满足,都要执行。
例子:
#include <stdio.h>int main(void){//申明三个变量来存放计算数double a,x,y;//通过键盘输入a,xprintf("请输入两个数字:\n");scanf("%lf,%lf",&a,&x);//检验除数if(x != 0 && a != 0){y = 1/x + 1/a;}else{y = 10000;}//输出printf("y=%f\n",y);return 0;}/************************************************请输入两个数字:2,4y=0.750000请输入两个数字:0,0y=10000.000000****************************************************/
三目运算符
语法:
表达式1?表达式2:表达式3;
说明:?:
条件运算符,主要可以简化双分支为同一变量赋值的操作。
求值过程:先计算表达式1
的值,非0,则将表达式2
的结果作为条件运算符的最终结果;否则将表达式3
的结果作为条件运算符
的最终结果
。
案例:
#include <stdio.h>int main(void){//需求:求a,b两个数中最大数//写法1:正常写法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);elseprintf("最大数是:%d\n",b1);//写法3:三目运算符int a2 = 5,b2 = 3;int ret = a2 > b2 ? a2 : b2;printf("最大数是:%d\n",ret);return 0;}/************************************************最大数是:5最大数是:5最大数是:5***********************************************/
案例:
#include <stdio.h>int main(){//需求:输入两个实数,按代数值 由小到大的顺序输出这两个实数//申明变量,存储操作数int a,b;printf("请输入两个数值作为操作数:\n");scanf("%d,%d",&a,&b);//校验//方式1if(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);return 0;}/********************************************请输入两个数值作为操作数:4,5由小到大的顺序是:4,5由小到大的顺序是:4,5请输入两个数值作为操作数:6,3由小到大的顺序是:3,6由小到大的顺序是:3,6**********************************************/
案例:
#include <stdio.h>int main(){////int a,b,c,t;printf("请从键盘输入三个数:\n");scanf("a=%d,b=%d,c=%d",&a,&b,&c);//条件判断if(a > b){t = a;a = b;b = t;}if(a > c){t = a;a = c;c = t;}if(b > c){t = b;b = c;c = t;}printf("三个数字由小到大是:%d,%d,%d\n",a,b,c);return 0;}/**************************************************请从键盘输入三个数:a=5,b=8,c=3三个数字由小到大是:3,5,8*******************************************************/
多分支
语法:
if(条件1){语句1;}else if(条件2){语句2;}...else {语句n+1;}
案例:
#include <stdio.h>int main(){//需求:编写一个程序,要求输入一个x值,输出y值//方法1:嵌套的if...int x,y;printf("请输入一个整数x值:\n");scanf("%d",&x);//条件判断if(x < 0){y = -1;}else{if(x == 0){y = 0;}else{y = 1;}}printf("方式1-输出y的值是:%d\n",y);//方式2:多分支if...else if...else...//条件判断if(x < 0){y = -1;}else if(x == 0){y = 0;}else{y = 1;}printf("方式2-输出y的值是:%d\n",y);return 0;}/******************************************请输入一个整数x值:6方式1-输出y的值是:1方式2-输出y的值是:1请输入一个整数x值:0方式1-输出y的值是:0方式2-输出y的值是:0请输入一个整数x值:-5方式1-输出y的值是:-1方式2-输出y的值是:-1******************************************/
案例:
#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 < 90 && score >= 80){printf("良好\n");}else if(score < 80 && score >= 70){printf("中等\n");}else if(score < 70 && score >= 60){printf("及格\n");}else{printf("不及格\n");}}else{//成绩不合法printf("您输入的成绩不合法,请重新录入!\n");}return 0;}/***************************************************请录入学生成绩:89良好请录入学生成绩:58不及格请录入学生成绩:120您输入的成绩不合法,请重新录入!*******************************************************/
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出现的次序不影响执行结果;
(5)case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿透);
(6)多个case可共用一组语句。
注意:
1.表达式一般写一个变量,变量的值是一个确定的常量。
2.当遇到break或者switch语句的右大括号时,switch语句结束。
3.表达式中的数据类型:char,short,int,long,long long,不能是浮点型。
表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。
案例:
#include <stdio.h>/***需求:高校要求对实训学生根据实训成绩进行评级范围:0 <= score <= 100;评级:100 > score >= 90 优秀 90~99/10 == 9 && 100/10 == 1090 > score >= 80 良好 80~89/10 == 880 > score >= 70 中等 70~79/10 == 770 > score >= 60 及格 60~69/10 == 6score < 60 不及格*/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://80~89分printf("良好\n");break;case 7://70~79分printf("中等\n");break;case 6://60~69分printf("及格\n");break;default:printf("不及格\n");}}else{printf("录入的成绩不合法!\n");}return 0;}/*****************************************请输入实训成绩:100优秀请输入实训成绩:120录入的成绩不合法!请输入实训成绩:78中等请输入实训成绩:58不及格*********************************************/
案例:
/***需求:实现简易计算器,要求实现+,-,x,/运算*/#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;defalut:printf("您的输入错误!\n");}return 0;}/*************************************简易计算机 v1.0请输入两个操作数:3,5请输入运算符:(+、-、.*、/)+3.00+5.00=8.00简易计算机 v1.0请输入两个操作数:6,2请输入运算符:(+、-、.*、/)-6.00-2.00=4.00简易计算机 v1.0请输入两个操作数:3,4请输入运算符:(+、-、.*、/)*3.00*4.00=12.00简易计算机 v1.0请输入两个操作数:8,4请输入运算符:(+、-、.*、/)/8.00/4.00=2.00*****************************************/
switch语句的case穿透:
-
case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是否和它后面的case常量是否相同),这样的现象称之为case穿透。
-
default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语句可以放在switch语句{}内的任意位置。
总结
-
如果需要一个判断结果,使用
单分支
-
如果需要两个判断结果,且智能有两个判断结构,使用
双分支
-
如果需要判断N个结果中的某几个,或者所以,使用
多分支
扩展
条件表达式中的运算符优先级
逻辑非(!)> 算术运算符(+-*/%)> 关系运算符(> < >= <= != ==
)> 逻辑运算符(&&、||)> 赋
值运算符(=、+=)
设置vim中tab字符数
set tabstop=4set shiftwidth=4set expandtab
以上是嵌入式学习第11天笔记,有什么还请指正,谢谢!