C语言 分支结构(2)
单分支,双分支,双目运算符 请看 C语言 分支结构(1)
多分支:if...else if... else ...
语法:
//写法1:嵌套 if... else...(不推荐)
if(表达式1)语句2;
elseif(表达式2) 语句2;else...elseif(表达式n)语句n;else 语句n + 1;//写法2:并列if...else if...else(推荐)
if(表达式1)语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
...
else if(表达式n) 语句n;
else 语句n+1;
注:①如果是复合语句,{ }不能省略了,C 语言的控制语句(如if
、for
)默认只能控制紧随其后的一条语句。如果需要控制多条语句,必须用{}
将它们包裹成复合语句,明确控制范围。
②多分支语句else是可以选的,根据自己的需求决定要不要写。
注意:多分支中,同一时刻只能满足一个分支。
案例:
需求:根据学生的成绩,对学生进行评级:
成绩 >= 90 A
成绩 >= 80 B
成绩 >= 60 C
成绩 < 60 D
代码:
//方式一:
#include<stdio.h>
int main()
{//定义一个成绩int secor;//控制台输入printf("输入一个成绩:");while(1){if(scanf("%d",&secor) == 1)break;elseprintf("输入错误,重新输入:");//清理缓存while(getchar() != '\n');}//验证输入printf("您输入的成绩为:%d\n",secor);//多分支结构if(secor <= 100 && secor>=90)printf("成绩真棒,继续加油!\n");else if(secor <90 && secor>=80) printf("还不错,继续加油!\n");else if(secor <80 && secor>=70) printf("别气馁,好还纠错!\n");else if(secor <70 && secor>=60) printf("好好学习天天向上!\n");else if(secor <60 && secor>=0) printf("好好学习,天天向上!\n");else printf("输入成绩无效!");return 0;
}
//方式二
#include<stdio.h>int secor()
{//定义一个成绩int secor;//控制台输入printf("输入一个成绩:");while(1){if(scanf("%d",&secor) == 1)break;elseprintf("输入错误,重新输入:");//清理缓存while(getchar() != '\n');}//验证输入printf("您输入的成绩为:%d\n",secor);//多分支结构if(secor <= 100 && secor>=90)printf("成绩真棒,继续加油!\n");else if(secor <90 && secor>=80) printf("还不错,继续加油!\n");else if(secor <80 && secor>=70) printf("别气馁,好还纠错!\n");else if(secor <70 && secor>=60) printf("好好学习天天向上!\n");else if(secor <60 && secor>=0) printf("好好学习,天天向上!\n");else printf("输入成绩无效!"); return 0;
}
int main()
{secor();return 0;
}
结果:
if...else结构注意
if...else 结构中的语句1和语句2都可以是复合语句。
if...else结构中,语句1和语句2都可以是空语句,举例:if(..);else;
课堂练习
要求:计算并输出如下的分段函数,其中x从键盘录入
代码:
#include<stdio.h>
int main()
{//定义x,ydouble x,y;//控制台输入printf("输入一个数:");while(1){if(scanf("%lf",&x) == 1)break;elseprintf("输入错误,重新输入!\n");while(getchar() != '\n');}if(x<-10) {y=0;printf("x=%lf,y=%lf",x,y);}else if(x >= -10 && x < 0){y=2*x+20;printf("x=%lf,y=%lf",x,y); }else if(x >= 0 && x < 20){y=20;printf("x=%lf,y=%lf",x,y);}else if(x >= 20 && x < 40){y=30-0.5*x;printf("x=%lf,y=%lf",x,y);}else if(x >= 40 && x < 50){y=50 - x;printf("x=%lf,y=%lf",x,y);}else if(x >= 50){y=0;printf("x=%lf,y=%lf",x,y);}else printf("%lf不在函数定义域内\n",x);return 0;}
if语句的嵌套
语法:
if(..)if(..)语句1;else 语句2;
elseif(..) 语句3;else 语句4;
流程图:
注意:
① else总是与前面最近的未配对的if配对使用
② 可通过增加{}来确定配对关系
③ 只要if中包含if,都属于是if语句的嵌套
案例:
需求:根据学生的成绩,对学生进行评级:
成绩 >= 90 A
成绩 >= 80 B
成绩 >= 60 C
成绩 < 60 D
代码:
#include <stdio.h>
int main()
{//定义一个成绩float score;//控制台输入printf("请输入你的成绩:");while(1){if(scanf("%f",&score) == 1)break;elseprintf("请重新输入:");//清除缓存while(getchar() != '\n');}if(score >= 90) printf("您的成绩为 A\n");else if(score >= 80 && score < 90) printf("您的成绩为 B\n");else if(score >= 60 && score < 80) printf("您的成绩为 C\n");else if(score < 60 ) printf("您的成绩为 D\n");return 0;
}
结果:
课后思考
1,如何拆分一个整数的个位,十位,百位...以上的数?
举例:123拆个位:123 % 10 = 3拆十位:123 / 10 % 10 = 2拆百位:123 / 10 / 10 = 12. 什么是水仙花数?
用switch语句实现分支结构
我们也可以用switch实现多分支选择结构(多分支也被称作多路分支)
语法:
switch (表达式) { / 表达式结果必须是「整型/枚举类型」(如int、char,不能是float/double)case 常量1: / 常量1必须是「字面量/宏定义」,且与表达式类型一致(如表达式是int,常量也得是int)语句块1;break; / 可选,但通常需要:执行完语句块1后跳出switch,避免“穿透”case 常量2:语句块2;break;// ... 更多casedefault: / 可选:所有case都不匹配时执行语句块n; / (通常用于“默认处理”或“错误提示”)break; / 可选,加break可避免后续代码影响(若default在最后,不加也可)
}
注:switch的{ }不能省略
流程图:
说明:
① switch后括号内的表达式可以是任意类型的表达式,要求结果是整型,字符型。
②若表达式的值与某个常量表达式的值相等时,执行case后面语句;若没有相等的值时,执行default后面的语句。
③每个case后面的常量表达式值必须不相同,否则出现矛盾。
④ 各个case出现的次序不影响执行结果。
⑤ case后面的语句中如果没有break语句,则执行完本case后的语句后会接着执行下面的
case,直到遇到下一个break或者switch执行完毕为止,演示:
#include <stdio.h>int main()
{int num = 1;switch(num){case 1:printf("A\n");//注意:这里没有break,会继续执行下一个case,直到遇到break或者执行结束(break穿透)case 2:printf("B\n");break;case 3:printf("C\n");break;}
}
运行结果:
⑥ 多个case公用一组语,演示:
// 需求:根据月份判断季节
// 分析:
// 春季:2~4
// 夏季:5~7
// 秋季:8~11
// 冬季:12~1#include <stdio.h>int main()
{int month = 3;switch (month){case 1:case 2:case 3:case 4:printf("春季\n");break;default:break;}
}
案例
需求:按照考试成绩的等级输出百分制分数段
分析:
A级:85~100段
B级:70~84段
C级:60~69段
D级:< 60段
其他:错误
代码:
#include <stdio.h>int main()
{//创建一个变量,存放等级char grade;printf("请输入(A B C D)中的任何一个:\n");while(1){if(scanf("%c",&grade) == 1)break;elseprintf("请重新输入:\n");while(getchar() == '\n');}//校验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("不及格\n");default:}
}
结果:
注意:如果default 出现在所有case的最下面,break可以省略;如果default出现在case的上面,break一定不能省略。
案例:
代码:
#include <stdio.h>
#include <stdlib.h> // 用于system清屏(可选)// ANSI颜色控制码(支持大多数终端,如VS Code终端、PowerShell)
#define COLOR_RED "\033[31m" // 红色(错误信息)
#define COLOR_GREEN "\033[32m" // 绿色(计算结果)
#define COLOR_YELLOW "\033[33m" // 黄色(标题)
#define COLOR_RESET "\033[0m" // 重置颜色
#define LINE "=====================================\n" // 分隔线int main() {// 程序标题printf(COLOR_YELLOW);printf(LINE);printf(" 简易计算器 v1.0 \n");printf(" 支持 + - * / 运算,输入q退出程序 \n");printf(LINE);printf(COLOR_RESET);char op; // 运算符double num1, num2; // 操作数char exitFlag; // 退出标志while (1) {// 输入提示(明确格式)printf("\n请输入计算式(+ - * /):\n");// 循环获取有效输入while (1) {// 先检查是否输入了退出指令(q或Q)if (scanf("%c", &op) == 1 && (op == 'q' || op == 'Q')) {printf("\n"LINE);printf("感谢使用,程序已退出!\n");printf(LINE COLOR_RESET);return 0; // 退出程序}// 若不是退出指令,回退输入流(因为上面读取了一个字符)ungetc(op, stdin);// 读取计算式(数字+运算符+数字)if (scanf("%lf%c%lf", &num1, &op, &num2) == 3) {// 检查运算符是否合法(提前过滤,减少switch的default触发)if (op == '+' || op == '-' || op == '*' || op == '/') {break; // 输入有效,退出输入循环} else {printf(COLOR_RED"输入错误:运算符必须是 + - * / 中的一种!\n"COLOR_RESET);}} else {printf(COLOR_RED"输入格式错误!请按 数字+运算符+数字 格式输入(例如:3.5*2)\n"COLOR_RESET);}// 清空输入缓冲区(处理错误输入残留)while (getchar() != '\n');}// 计算并输出结果(用绿色突出显示)printf(LINE); // 结果区分隔线switch (op) {case '+':printf(COLOR_GREEN"%.2lf + %.2lf = %.2lf\n"COLOR_RESET, num1, num2, num1 + num2);break;case '-':printf(COLOR_GREEN"%.2lf - %.2lf = %.2lf\n"COLOR_RESET, num1, num2, num1 - num2);break;case '*':printf(COLOR_GREEN"%.2lf * %.2lf = %.2lf\n"COLOR_RESET, num1, num2, num1 * num2);break;case '/':if (num2 != 0) {printf(COLOR_GREEN"%.2lf / %.2lf = %.2lf\n"COLOR_RESET, num1, num2, num1 / num2);} else {printf(COLOR_RED"错误:除数不能为0!\n"COLOR_RESET);}break;}printf(LINE); // 结果区结束分隔线// 询问是否继续printf("是否继续计算?(输入任意键继续,输入q退出):");// 清空缓冲区残留的换行符while (getchar() != '\n');scanf("%c", &exitFlag);if (exitFlag == 'q' || exitFlag == 'Q') {printf("\n"LINE);printf("感谢使用,程序已退出!\n");printf(LINE COLOR_RESET);break;}}return 0;
}
结果: