问题引出
我们在程序设计往往会遇到如下的问题,比如下的函数的计算。
也就是我们是必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言中实现分支结构主要使用if语句。
条件判断
根据某个条件成立与否,决定是否执行指定的任务(操作)。
条件判断的结果是逻辑值(布尔类型值,也就是说分支语句的条件可以使用关系表达式和逻辑表达式),在程序中用真(1)和假(0)来表示。
关系运算及其表达式
关系运算符及其优先次序
关系运算符是用来进行比较的符号,C语言中提供了6种关系运算符:
关系表达式
关系表达式是指用关系运算符将两个表达式连接起来组成的有意义的式子。
在C语言中,用1(非0)表示关系表达的值为真(条件成立),0表示关系表达式的值为假(条件不成立),即关系表达式的值要么是1(条件成立),要么是0(条件不成立)
问题引出
有时,只用一个简单的关系表达式无法完整地表达一个条件。
其中的条件需要用逻辑表达式来表示:x!=0&&a!=0 ,&&就是一种逻辑运算符。
逻辑运算及其表达式
逻辑运算符及其优先级
逻辑运算符是构成复杂的复合条件的运算符。
C语言中提供3种逻辑运算符:
逻辑表达式
用逻辑运算将关系表达式或逻辑量连接起来构成的有意义的式子。
逻 辑 表 达 式 中 各 种 运 算 符 的 优 先 级 顺 序 如
下:
!(逻辑非) → 算术运算符 → 关系运算符 → &&和|| → 赋值运算符
C语言编译系统在表示逻辑运算符结果时:真用1表示,假用0表示
案例
假设a = 4,b = 5,则:
c
!a -- 0
a && b -- 1
a || b -- 1
!a || b -- 1
4 && 0 || 2 -- 1
⼩贴⼠:
实际上,逻辑运算符两侧的运算对象不但可以是0和1,或是0和⾮0,⽽且也可以是字符型、实型和指针型等。系统最终是以0和⾮0来判定它们的真假的。例如:'c' && 'd' 为1
⽤if语句实现分⽀结构
单分支:if...
语法:
c
// 语法1:舍弃{}
if (表达式)
单语句; // 语法2:保留{}
if (表达式)
{
}
流程图
功能
若表达式值为True(⾮0),则执⾏表达式后⾯的语句,执⾏完该语句后继续执⾏if语句后的语句。
若表达式值为0,则不执⾏表达式后⾯的语句⽽直接执⾏if语句后⾯的语句。
说明:
如果表达式(条件表达式)后⾯的是复合语句,则要⽤⼀对花括号{}括起来。单语句可有可⽆。
案例:
要求:计算并输出下列分段函数的值
代码:
c
#include <stdio.h>
int main()
{
// 创建两个变量,用来存储两个操作数
double x,y = -2; // 我们给y赋初始值,假定x < 0
// 从控制台输入x
printf("请输入一个整数,作为x的值:\n");
scanf("%lf",&x);
// 校验
if (x >= 0)
y = 2;
printf("x=%lf,y=%lf\n",x,y);
return 0;
}
案例:
要求:有a,b,c三个数,要求从控制台输⼊,并且求出最⼤值
分析:
- 通过控制台给a,b,c赋值
- 创建⼀个变量max,⽤来存放a,b,c中的最⼤值,默认a是最⼤值(这样可以减少⼀次判断)
- 让b,c和max进⾏⽐较,将最⼤值存⼊max
代码:
c
/*************************************************************************
> File Name:
> Author:
demo02.c
fpf
> Description: 单分支 if..
> Created Time: 2024年11月29日 星期五 10时59分45秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
// 要求:求a,b,c中的最大值
// 创建三个变量,用来存放a,b,c的值
int a,b,c;
// 创建一个变量,用来存放max的值
printf("请在控制台输入三个整数:\n");
scanf("%d%d%d",&a,&b,&c);
// 创建一个变量,用来存放max的值
int max = a;
// 让最大值分别和b,c进行比较
if (max < b)
{
max = b; // 如果max < b,就让b作为a,b中的最大值
}
if (max < c)
{
max = c; // 其实a,b中的最大值和c比
}
printf("%d,%d,%d中的最大值是%d\n",a,b,c,max);
return 0;
}
有可能产⽣的问题:
scanf()同时输⼊多个变量时,默认时使⽤空格或者回⻋换⾏。
在变量赋值前使⽤变量,导致运算结果错误(莫名输出随机数)
双分支:if...else...
语法:
c
// 舍弃{}
if (表达式)
单语句1;
else
单语句2;
// 针对以上写法,我们可以使用三目表达式:表达式 ? 单语句1 : 单语句2
// 保留{}
if (表达式)
{
单语句或者复合语句1;
}
else
{
单语句或者复合语句2;
}
注意:
else语句本身不能单独存在,必须依赖于if配对使用
流程图:
功能:
若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立都要执行一个语句,其次需要
主要的是,语句1和语句2都可以是复合语句。
说明:
if...else...结构可以实现双分支选择结构。C语言允许if...else...结构嵌套。即在语句1与语句2中又可以包含完
整的if语句或者if...else结构,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过4层)。
利用if...else结构的嵌套,可以实现多分支选择结构。
案例:
要求:计算并输出下列分段函数的值
流程图:
代码:
c
/*************************************************************************
> File Name:
> Author:
demo03.c
fpf
> Description: 双分支 if..else..
> Created Time: 2024年11月29日 星期五 11时42分39秒
#include <stdio.h>
************************************************************************/
int main(int argc,char *argv[])
{
}
// 需求:计算并输出下列分段函数的值
// 创建两个变量,存放x,y的值
int x,y;
// 通过键盘录入数据
printf("请输入一个整数:\n");
scanf("%d",&x);
// 校验
if (x < 0)
y = -2;
else
y = 2;
// 打印输出测试结果
printf("x=%d,y=%d\n",x,y);
return 0;
}
改造为三⽬运算符的写法:
c
/*************************************************************************
> Created Time: 2024年11月29日 星期五 11时42分39秒
************************************************************************/
int main(int argc,char *argv[])
14
// 需求:计算并输出下列分段函数的值
// 创建两个变量,存放x,y的值
int x,y;
// 通过键盘录入数据
printf("请输入一个整数:\n");
scanf("%d",&x);
// 校验
// 三目表达式
y = x < 0 ? -2 : 2;
// 打印输出测试结果
printf("x=%d,y=%d\n",x,y);
return 0;
}
多分支:if...else...if...else
语法:
c
写法1:嵌套if..else..(不推荐)
if(表达式1) 语句1;
else
if(表达式2) 语句2;
else
...
else
if(表达式n) 语句n;
else 语句n+1;
写法2:并列if..else..if....else..(推荐)
if(表达式1) 语句1;
else if(表达式2) 语句2;
...
[else if(表达式n) 语句n;]
[else 语句n+1;]
案例:
要求:根据学⽣的成绩,对学⽣进⾏分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 < 60,D
代码
c
#include <stdio.h>
// 方式1:借助于执行顺序,减少判断的条件
int if_test1()
{
`` // 创建一个变量,用来存放输入的成绩
int score;
// 通过控制台输入一个成绩
printf("请输入一个整数:\n");
scanf("%d",&score);
// 校验,分级 95
if(score >= 90)
{
printf("A\n");
}
else if(score >= 80)
{
printf("B\n");
}
else if(score >= 60)
{
printf("C\n");
}
else
{
printf("D\n");
}
}
// 方式2:不借助于执行顺序,做更精准的判断
int if_test2()
{
// 创建一个变量,用来存放输入的成绩
int score;
// 通过控制台输入一个成绩
printf("请输入一个整数:\n");
scanf("%d",&score);
// 校验,分级
if(score >= 60 && score < 80)
{
printf("C\n");
}`
else if(score >= 80 && score < 90)
{
}
printf("B\n");
else if(score >= 90)
{
}
else
{
}
}
printf("A\n");
printf("D\n");
int main(int argc,char *argv[])
{
}
if...else结构注意点
if...else结构中的语句1与语句2都可以是复合语句。
在if...else结构中,语句1与语句2都可以是空语句。
if语句的嵌套
注意:
① else 总是与前面最近的未配对的if配对使用
② 可通过增加{}来确定配对关系
③ 只要if中包含if,都属于是if语句的嵌套
c
/*************************************************************************
> File Name:
demo04.c
> Author:
FPF
> Description: 多分支:if..else if....else..
> Created Time: 2024年11月29日 星期五 14时20分18秒
************************************************************************/
/**
* 要求:根据学生的成绩,对学生进行分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 < 60,D
*/
#include <stdio.h>
// 方式1:借助于执行顺序,减少判断的条件
int if_test1()
{
// 创建一个变量,用来存放输入的成绩
int score;
// 通过控制台输入一个成绩
printf("请输入一个整数:\n");
scanf("%d",&score);
// 校验,分级 95
if(score < 0 || score > 100)
{
printf("您的输入不合法!\n");
}
else
{
if(score >= 90)
{
printf("A\n");
}
else if(score >= 80)
{
printf("B\n");
}
else if(score >= 60)
{
printf("C\n");
}
else
{
printf("D\n");
}
}
}
// 方式2:不借助于执行顺序,做更精准的判断
int if_test2()
{
// 创建一个变量,用来存放输入的成绩
int score;
// 通过控制台输入一个成绩
printf("请输入一个整数:\n");
scanf("%d",&score);
// 校验,分级
if(score < 0 || score > 100)
{
printf("您的输入不合法!\n");
}
else if(score >= 60 && score < 80)
{
printf("C\n");
}
else if(score >= 80 && score < 90)
{
printf("B\n");
}
else if(score >= 90)
{
printf("A\n");
}
else
{
printf("D\n");
}
}
int main(int argc,char *argv[])
{
if_test1();
if_test2();
return 0;
}
如何摘除⼀个三位数中的每⼀位:
实现:123,个位数:123 % 10 = 3;⼗位数:123 % 100 / 10 = 2,123 / 10 % 10 =2;百位数:123 / 100 = 1
⽤switch语句实现分⽀结构
我们可以使用switch实现多分支选择结构(多分支也被称作多路分支)
语法:
c
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公用一组语句。
案例:
要求:按照考试成绩的等级输出百分制分数段
分析:
设分段原则如下:
A级为85~100段;
B级为70~84段;
C级为60~69段;
D级为<60段;
输⼊其它字符时为错。
代码:
c
*************************************************************************
> File Name: demo05.c
> Author: 冯鹏飞
> Description: 多分支:switch
> Created Time: 2024年11月29日 星期五 15时51分59秒
************************************************************************/
#include <stdio.h>
/*- 要求:按照考试成绩的等级输出百分制分数段- 分析:
设分段原则如下:
A级为85~100段;
B级为70~84段;
C级为60~69段;
D级为<60段;
输入其它字符时为错。
*/
int switch_test1()
{
// 创建一个变量,用来存放考试等级
char grade;
// 通过控制台输入一个字符
printf("input grade:\n");
scanf("%c",&grade);
// 校验,根据等级输出分段
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("<60\n");
break;
default:
printf("Error\n");
}
}
int main(int argc,char *argv[])
{
}