嵌入式开发学习(阶段二 C语言基础)
C语言:第05天笔记
内容提要
- 分支结构
- 条件判断
- 用if语句实现分支结构
- 用switch语句实现分支结构
分支结构
条件判断
条件判断:根据某个条件成立与否,决定是否执行指定的操作。
条件判断的结果是逻辑值,也就是布尔类型值,其结果为真(非0)或者假(0)
面试题:
①C语言中,条件表达式(作为分支或者循环条件的表达式称之为条件表达式)
支持任意类型的表达式,包括如关系、逻辑、赋值、算术等表达式,但实质上有意义的表达式只有关系表达式和逻辑表达式。
②C语言中,条件表达式的结果是逻辑值,使用非0表示真,使用0表示假,但是底层是使用1和0来表示真假。
关系运算符及其表达式
问题抛出
我们在程序设计往往会遇到问题如下面的函数的计算:
也就是我们必须通过一个条件的结果来选择下一步的操作,算上属于一个分支结构,C语言实现分支结构主要使用if语句。
其中的条件需要用关系表达式来表示:x!=0 就是一种关系表达式。
关系运算符及其优先级次序
关系运算符是用来进行比较符号,C语言提供了6中关系运算符
举例:
int a = 5, b = 6;
printf("%d\n", a > 5 != b > 5); // 解释:a > 5结果和b > 5的结果进行比较
关系表达式
关系表达式=关系运算符+表达式(操作数)
逻辑运算符及其表达式
问题抛出
有时,只用一个简单的关系表达式无法完整的表示一个条件:
y = { 1 x + 1 a 当 x ≠ 0 , a ≠ 0 时 10000 其他 y = \begin{cases} \frac{1}{x} + \frac{1}{a} & \text{当 } x \neq 0, a \neq 0 \text{ 时} \\ 10000 & \text{其他} \end{cases} y={x1+a110000当 x=0,a=0 时其他
其中的条件需要用逻辑表达式:x!=0 && a!=0 就是一种逻辑表达式。
逻辑运算及其优先级
- 逻辑算术符构成成复杂复合的运算符。
C语言中提供了三种逻辑运算符:
符号 | 名称 | 分类 | 说明 |
---|---|---|---|
&& | 逻辑与 | 双目运算符 | 两个量都为真时为真(1),否则为假(0) |
|| | 逻辑或 | 双目运算符 | 两个量中只要有一个为真即为真(1),只有两个量都为假时才为 假(0) |
! | 逻辑非 | 单目运算符 | 运算量真时变为假(0),假时变为真(1) |
逻辑表达式
a | b | !a | !b | a&&b | a||b |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
**定义:**用逻辑运算符将关系表达式或者关系表达式或者逻辑表达式链接起来的构成有意义的算式称作逻辑表达式。
逻辑表达式各种优先级顺序如下:
①!(逻辑非)
②算数运算符(
*、/、%、、+、-
)③关系运算符(
\>、>=、<、<=
>==、!=
)④逻辑与逻辑或(
&&、||
)⑤赋值运算符(
=、+=、-=、*=、/=、%=
)
C编译系统在表示逻辑运算符结果时,返回也是逻辑值,用1表示真,用0表示假。
案例
假设a=4,b=5则;
表达式 | 结果 | 说明 |
---|---|---|
!a | 0 | 这里是对非0取反 |
a&&b | 1 | &&两边都是非0 |
a||b | 1 | ||左边是非0,触发短路效果 |
!a||b | 1 | ||右边是非0 |
4&&0||2 | 1 | 同级 |
小贴士:
实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者是0和非0,而且也可以是字符型、实型和指针型等。系统最终是以0和非0来判定他们的真假的,例如:
‘c’ &&'d’结果为1
用if语句实现分支结构
单分支:if
概念
语法:
if(条件表达式)
{语法;
}//如果是单语句,可以省略{},以下两种写法完全等价
if(条件表达式) 语句;if (条件表达式)语句;
流程图;
功能;
- 若表达式为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后其他语句。
- 若表达式值为假(0),则吧执行表达式后面的语句,执行if语句后面的其他的语句。
说明:
- 如果表达式后面是复合语句(语句超过1条),则需要使用一对
{}
括起来。
案例:
-
需求:计算并输出下列分段函数的值。
-
流程图:
-
代码:
/*************************************************************************> File Name: demo02.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 10时48分57秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {//创建2个变量,存储数据int x, y = -2;//printf("请输入一个整数:");scanf("%d",&x);//判断if (x >=0 ){y=2;}printf("x=%d,y=%d\n",x,y);return 0; }
-
运行结果:
案例:
-
需求:有ab,c三个数,要求从控制台输入,并求出它们中最大数和最小数。
-
分析:
①首先创建5个变量,其中a,b,c用来接收控制台输入,max和min分别用来存储最大和最小
②默认a是max和min
③让max分别和b、c比较,如果b、c比max大,就将b、c的值赋值给max
④计分别和b、c比较,如果b、c比max大,就将b、c的值赋值给max
-
代码
/*************************************************************************> File Name: demo03.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 11时00分10秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {//创建5个变量,a,b,c用来接收控制台输入,max和minint a,b,c,max,min;//控制台输入printf("请输入三个整数");scanf("%d%d%d",&a,&b,&c);//最大值max = min = a;if(max < b) max = b;// b是a,b中的最大值if(max < c) max = c;// c是a,b,c中的最大值//最小值if(min > b) min = b;if(min > c) min = c;printf("min=%d,max=%d\n",min,max);return 0; }
-
运行结果
-
有可能产生的问题:
- 在变量赋值前使用变量,导致运行结果错误,因为变量未在赋值之前,系统会给变量分配随机 值。
小贴士:
建议的书写规范:
if(flag == 1) 建议写做:f(flag)
if(flag == 0) 建议写做:if(!flag)
双分支:if…else
语法:
if()
{语句1;
}
else
{语句2;
}//如果是单语句,可以省略{}以下两种写法完全等价
if (条件表达式)语法1;
else 语句2;if (条件表达式)语句1;
else语句2;
注意:else语句本身不能单独存在,必须和距离自己最近的未配对的if配对。
流程图:
功能:
若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立,都要执行一个语句,其次需要注意的是,语句1和雨具都可以是单语句或者复合语句。
说明:
if.else.结构可以实现双分支选择结构。C语言允许if.else.结构嵌套。即在语句1与语句2中又可以包含完整的if语句或者if.else.语句,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过3~4层)。利用if.else.结构的嵌套,可以实现多分支结构。
案例:
-
需求:计算输出下列分段函数的值:
-
流程图
-
代码:
/*************************************************************************> File Name: demo04.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 11时13分32秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{//创建两个变量,用来存放数据int x, y;//通过控制台给x赋值printf("请输入一个整数:");scanf("%d",&x);//根据条件赋值if (x < 0) y = 2;else y = -2;printf("x=%d,y=%d\n",x,y);return 0;
}
- 运行结果:
案例
-
需求:通过控制台,输入一个年份,判断这个年份是闰年还是平年
-
分析:
- 判断条件:(year % 4 == 0 && year % 100 !=0 || year % 400 == 0)
-
代码:
/*************************************************************************> File Name: demo05.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 11时44分18秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {int year;printf("请输入一个年份:");scanf("%d",&year);if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)printf("%d是闰年\n",year);elseprintf("%d是平年\n",year);return 0; }
-
运行结果
-
注意:对于单语句的双分支,我们可以使用三目运算符的写法来简化!
双分支:三目运算符
三目运算符,又被称作三元运算符。
语法:
表达式1?表达式2:表达式3;
说明:
① 如果表达式1的结果为真,就执行表达式2,否则执行表达式3。(表达式2和表达式3只能满 足一个)
② 三目运算符的写法实际上就是单语句的双分支if的简写
案例
- 需求:将双分支案例改造为三目运算符的写法
- 代码:
/*************************************************************************> File Name: demo04.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 11时13分32秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{//创建两个变量,用来存放数据int x, y;//通过控制台给x赋值printf("请输入一个整数:");scanf("%d",&x);//根据条件赋值y = x < 0 ? -2 : 2;printf("x=%d,y=%d\n",x,y);return 0;
}
案例
- 需求通过控制台输入a,b,c三个数,求最大值
- 代码
/*************************************************************************> File Name: demo06.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 14时26分44秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{int a,b,c,max;printf("请输入三个整数:");scanf("%d%d%d",&a,&b,&c);max=a > b ?(a > c ? a : c):(b > c ? b : c);printf("最大值为:%d\n",max);return 0;
}
- 运行结果
。
多分支:if …else if…else…
语法;
//写法1;嵌套if..else..(不推荐)
if (表达式1) 语法1;
elseif (表达式2) 语法2;
else....//写法2;并列 if..else..(推荐)
if (表达式1) 语句1;
else if (表达式2) 语句2;
...
else if (表达式n) 语句n;
else 语句 n+1;
注意:多分支的else是可选的,根据自己的需求决定要不要写。
流程图:
注意;多分支中同一时刻只能满足一个分支
if (){}
if (){}//都有可能执行if(){}
else if(){}//两者只能执行一个
案例
-
需求:根据学生的成绩,对学生进行评级;
- 学生成绩 >=90 A
- 学生成绩 >=80 B
- 学生成绩 >=70 C
- 学生成绩 >=60 D
- 学生成绩 <60 F
-
代码
/*************************************************************************> File Name: demo08.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 15时02分32秒************************************************************************/#include <stdio.h>int textscore1()
{int score;printf("请输入您的成绩:");scanf("%d",&score);if (score < 0 || score >100)printf("成绩错误\n");else if(score >= 90 ) printf("您的成绩为A级\n");else if(score >= 80 ) printf("您的成绩为B级\n");else if(score >= 70 ) printf("您的成绩为C级\n");else if(score >= 60 ) printf("您的成绩为D级\n");else printf("您的成绩为E级\n");return 0;
}int textscore2()
{int score;printf("请输入您的成绩:");scanf("%d",&score);if (score < 0 || score >100)printf("成绩错误\n");else if(score < 60 ) printf("您的成绩为E级\n");else if(score < 70 ) printf("您的成绩为D级\n");else if(score < 80 ) printf("您的成绩为C级\n");else if(score < 90 ) printf("您的成绩为B级\n");else printf("您的成绩为A级\n");return 0;
}int main(int argc,char *argv[])
{textscore1();textscore2();return 0;
}
- 运行结果
if…else结构注意点
- if…else结构中的语句1和语句2都可以是复合语句。
- 在f…else结构中,语句1和语句2都可以是空语句。举例:
if(..);else;
if语句的嵌套
语法:
if (..)if (..) 语句1;[else 语句2;]
[elseif (..) 语句3;else 语句4;
]
流程图:
注意:
①else总是与前面最近的if配对使用
②可通过增加{}来确定配对关系
③只要if中包含if,都属于是if语句的嵌套
案例
-
需求:根据学生的成绩,对学生进行评级;
-
学生成绩 >=90 A
-
学生成绩 >=80 B
-
学生成绩 >=70 C
-
学生成绩 >=60 D
-
学生成绩 <60 F
-
代码:
/*************************************************************************> File Name: demo08.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 15时02分32秒************************************************************************/#include <stdio.h>int textscore1()
{int score;printf("请输入您的成绩:");scanf("%d",&score);if (score < 0 || score >100)printf("成绩错误\n");else if(score >= 90 ) printf("您的成绩为A级\n");else if(score >= 80 ) printf("您的成绩为B级\n");else if(score >= 70 ) printf("您的成绩为C级\n");else if(score >= 60 ) printf("您的成绩为D级\n");else printf("您的成绩为E级\n");return 0;
}int textscore2()
{int score;printf("请输入您的成绩:");scanf("%d",&score);if (score < 0 || score >100)printf("成绩错误\n");else if(score < 60 ) printf("您的成绩为E级\n");else if(score < 70 ) printf("您的成绩为D级\n");else if(score < 80 ) printf("您的成绩为C级\n");else if(score < 90 ) printf("您的成绩为B级\n");else printf("您的成绩为A级\n");return 0;
}int main(int argc,char *argv[])
{textscore1();textscore2();return 0;
}
用swich语句实现分支结构
我们可以使用swich多分支选择结构(多分支也是被多路分支)
语法:
switch (表达式) // 表达式的结果建议是 字符 或者 整型
{case 常量表达式1: // 这里一般使用字面量、符号常量、枚举语句1;break;case 常量表达式2: // 这里一般使用字面量、符号常量、枚举语句2;break;...[case 常量表达式n: // 这里一般使用字面量、符号常量、枚举语句n;break;default:语句n+1;break;]
}
流程图:
说明:
①switch后括号内的表达式可以是任意类型的表达式,建议表达式的结果是整型、字符型
②若表达式的值与某个常量表达式的值相等时,执行case后面的语句;若没有相等的值时,执行default后面的语句。
③每个case后面的常量表达式的值必须不相同,否则出现矛盾。
④各个case出现的次序不影响执行结果。
⑤case后面的语句中如果没有break语句,则执行完本case后的语句后会接着执行下面的case,直到遇到下一个break或者switch执行完毕为止,演示:
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 4:printf("D\n");break;case 5:printf("E\n");break;}
⑥多个case公用一组语句,演示:
//需求:根据月份判断季节
//分析
// 春季:2~4
// 夏季:5~7int mouth = 3;
switch (mouth)//月份
{case 2;case 3;case 4;printf("春季\n");
}
案例:
- 需求:按照考试成绩的等级输出百分制分数段
- 分析:
- 若分段原则如下:
- 90~100 A级
- 80~89 B级
- 70~79C级
- 60~69 D级
- 其他 E级
- 若分段原则如下:
- 代码:
/*************************************************************************> File Name: demo09.c> Author: 小刘> Description: > Created Time: 2025年05月10日 星期六 22时38分45秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{int score;printf("请输入一个整数:");scanf("%d",&score);if(score < 0 || score >100){printf("Error\n");}else{switch(score / 10){default:printf("E级\n");break;case 10 :case 9:printf("A级\n");break;case 8:printf("B级\n");break;case 7:printf("C级\n");break;case 6:printf("D级\n");break;}}return 0;
}
- 运行结果:
案例:
-
需求:设计一个简易计算器,要求能够实现简单的减减乘除运算
-
代码:
/*************************************************************************> File Name: demo02.c> Author: 小刘> Description: > Created Time: 2025年05月08日 星期四 16时26分32秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {char op;double num1,num2;printf("--------------------\n");printf("| 简易计算器 |\n");printf("--------------------\n");printf("请输入运算符(+ - * \):\n");scanf("%c",&op);printf("请输入要计算的公式:\n");scanf("%d%c%d",&mun1,&op,&num2);switch (op){case '+':printf("%.2lf + %.2f = %.2lf",num1,num2,num1+num2);break;case '-':printf("%.2lf - %.2f = %.2lf",num1,num2,num1-num2);break;case '*':printf("%.2lf * %.2f = %.2lf",num1,num2,num1*num2);break;case '/':b==0 ? printf("0不能为被除数"): printf("%.2lf / %.2f = %.2lf",num1,num2,num1/num2);break;}return 0; }
int main(int argc,char *argv[])
{
char op;
double num1,num2;printf("--------------------\n"); printf("| 简易计算器 |\n"); printf("--------------------\n"); printf("请输入运算符(+ - * \):\n"); scanf("%c",&op); printf("请输入要计算的公式:\n"); scanf("%d%c%d",&mun1,&op,&num2); switch (op) {case '+':printf("%.2lf + %.2f = %.2lf",num1,num2,num1+num2);break;case '-':printf("%.2lf - %.2f = %.2lf",num1,num2,num1-num2);break;case '*':printf("%.2lf * %.2f = %.2lf",num1,num2,num1*num2);break;case '/':b==0 ? printf("0不能为被除数"): printf("%.2lf / %.2f = %.2lf",num1,num2,num1/num2);break;} return 0;
}