当前位置: 首页 > news >正文

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 语言的控制语句(如iffor)默认只能控制紧随其后的一条语句。如果需要控制多条语句,必须用{}将它们包裹成复合语句,明确控制范围。

②多分支语句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 = 1
2. 什么是水仙花数?

用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;
}

结果:

http://www.dtcms.com/a/461796.html

相关文章:

  • 哪个做app的网站好排版设计技巧
  • 如何鉴赏网站论文wordpress静态nginx规则
  • 数据库存储中的哈希表和B+树
  • 绵阳网站推广优化和田知名网站建设企业
  • MQTT 协议应用指导
  • 蘑菇采摘公司:Mycionics
  • billfish本地资源库占内存吗
  • 深度残差网络(ResNet)
  • 专题五:位运算~
  • C++语言编程规范-资源分配和释放
  • 影视广告网站重庆网站建设制作
  • Hadess入门到实战(9) - 如何管理Composer(PHP)制品
  • 如何设计公司官网站苏宁易购网站风格
  • wx小程序扫码入口方式
  • Agent 开发设计模式(Agentic Design Patterns )第 1 章:提示词链
  • asp美食网站源码天津网站推广
  • 图像处理踩坑:浮点数误差导致的缩放尺寸异常与解决办法
  • Android Studio Meerkat 打开flutter项目没有自动选中main.dart configuration
  • OpenTiny TinyEngine 基础知识
  • 大模型-旋转位置编码(Rotary Positional Embedding)
  • 如何减小ES和mysql的同步时间差
  • this.$router.push 与 this.$router.replace 跳转的区别
  • 网站域名到期时间查询网站建设蛋蛋28
  • 建设网站选题应遵循的规则网站网页打开的速度什么决定的
  • 【Servlet】使用idea2023创建Servlet JavaWeb
  • 异步串口通信和逻辑分析仪
  • 中微电力建设公司网站建设人行官方网站
  • crew AI笔记[9] - 运用crew AI框架构建实战级agent项目
  • 12.MySQL使用C连接和连接池
  • Spring前置准备(八)——ConfigurableApplicationContext和DefaultListableBeanFactory的区别