分支结构
分支结构:又被称为选择结构。
概念
选择结构:根据条件成立与否,选择相应的操作。
条件构建
-
关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)
-
逻辑表达式:含有其逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的符合条件,比如:
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",a)
例子:
/** * 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符 */ #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; }
双分支
语法:
if(条件表达式) { 语句1; } else { 语句2; }
说明: 条件表达式 成立,执行 语句1 ,否则执行 语句2 。双分支不管条件是否满足,都要执行。
例子:
#include <stdio.h> int main(void) { // 申明三个变量来存放计算数 double x,a,y; // 通过键盘录入x,a 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 表达式1 ? 表达式2 : 表达式3;
说明: ?: 条件运算符,主要可以简化双分支为同一变量赋值的操作。
求值过程:先计算 表达式1 的值,非0,则将 表达式2 的结果作为条件运算符的最终结果;否则将 表达
式3 的结果作为 条件运算符 的 最终结果 。
案例:
#include <stdio.h> int main() { // 需求:求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); 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;// 可以省略 }
说明:
-
switch后括号内的表达式可以是任何类型的表达式;
-
若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行default后面的语句;
-
每个case后面的常量表达式的值都必须不相同,否则出现矛盾;
-
各个case 和default出现的次序不影响执行结果;
-
case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿透) ;
-
多个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穿透:
-
case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是否和它后面的case常量是否相同),这样的现象称之为case穿透。
-
default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语句可以放在switch语句{}内的任意位置。
总结
-
如果只需要一个判断结果,使用 单分支
-
如果需要两个判断结果,且只能有两个判断结果,使用 双分支
-
如果需要判断N个结果中的某几个,或者所有,使用 多分支
扩展
条件表达式中的运算符优先级
逻辑非(!) > 算数运算符 (+-*/%)>关系运算符(> < >= <= != == )> 逻辑运算符(&&、||)> 赋
值运算符(=、+=)
设置vim中tab字符数
set tabstop=4 set shiftwidth=4 set expandtab标签:case,语句,int,C语言,printf,else,DAY,表达式 From: https://blog.csdn.net/2303_76763383/article/details/140780110