双分支:if …else…
语法:
//语法1:舍弃{}
if(表达式)
单语句;
else
单语句;
//语法2:保留{}
if(条件表达式)
{
单语句或者复合语句;
}
else
{
单语句或者复合语句;
}
注意:else语句本身不能单独存在,必须和if配合使用
流程图:
功能:
若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立都要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。
说明:
if…else…结构可以实现双分支选择结构。C语言允许if…else…结构嵌套使用。即在语句1与语句2中又可以包含完整的if语句或者if…else…结构,并且这种嵌套可以多层使用(为了保证程序的执行效率,建议不超过4层)。利用if…else…结构的嵌套,可以实现多分支选择结构
案例:
-
需求:计算并输出下列分段的值:
y = { − 2 x < 0 2 x ≥ 0 y = \begin{cases} -2 \quad x<0\\ \\ 2 \quad\quad x\geq0 \end{cases} y=⎩ ⎨ ⎧−2x<02x≥0
-
流程图:
-
代码:
/************************************************************************* > File Name: demo03.c > Author: zk > Description:双分支案例,计算并输出分段函数的值 > Created Time: 2025年02月11日 星期二 11时32分08秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { int x,y;//创建两个变量来存储x,y printf("请输入x:\n"); scanf("%d",&x);//通过键盘输入x的值 //校验 if (x < 0) y = -2; else y = 2; printf("y = %d\n",y);//打印输出的结果 return 0; }
-
运行结果:
注意:对于单语句的双分支,我们可以使用三目(三元)运算符的写法简化
三目运算符
语法:
表达式1?表达式2:表达式3;
说明:
①如果表达式1的结果为真,就执行表达式2,否则就执行表达式3
②三目运算符的写法实际上就是单语句的双分支的缩略写法
案例:
-
需求:将上面的双分支的案例改造为三目运算符的写法。
-
代码:
/************************************************************************* > File Name: demo03.c > Author: zk > Description:双分支案例,计算并输出分段函数的值 > Created Time: 2025年02月11日 星期二 11时32分08秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { int x,y;//创建两个变量来存储x,y printf("请输入x:\n"); scanf("%d",&x);//通过键盘输入x的值 //校验 y = x < 0 ? -2 : 2; printf("y = %d\n",y);//打印输出的结果 return 0; }
-
运行结果:
多分支:if…else if…else…
语法:
//写法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;
else if (表达式) 语句2;
.....
else if (表达式n) 语句n;
else 语句+1; --else 是可选的,由需求决定
流程图:
注意:多分支中,同一时刻只能满足一个分支。
案例:
-
需求:根据学生的成绩,对学生进行分级。
- 成绩>=90 A
- 成绩>=80 B
- 成绩>=60 C
- 成绩< 60 D
-
代码:
/************************************************************************* > File Name:demo04.c > Author:zkk > Description: 多分支案例:根据学生的考试成绩分级 > Created Time: 2025年02月11日 星期二 14时39分22秒 ************************************************************************/ #include <stdio.h> // 方式1:借助于执行顺序,减少判断条件 int if_test1() { // 创建一个变量,用来存储输入的成绩 int score; // 通过键盘录入成绩 printf("请输入一个整数:\n"); scanf("%d",&score); // 校验 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) printf("A\n"); else printf("D\n"); } int main(int argc,char *argv[]) { if_test1(); if_test2(); return 0; }
if…else结构注意点
-
if…else结构中的语句1和语句2都可以是复合语句。
-
在if…else结构中,语句1和语句2都可以是空语句。
if语句的嵌套
语法:
if (..)
if (..) 语句1;
else 语句2;
else
if (..) 语句3;
else 语句4;
流程图:
注意:
①else总是与前面最近的未配对的if配对使用
②可通过增加{}来确定配对关系
③只要if中包含if,都属于是if语句的嵌套
案例:
/*************************************************************************
> File Name:demo04.c
> Author:zk
> 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 if_test3()
{
// 需求:判断一个数是奇数还是偶数
int num;
printf("请输入一个整数:\n");
scanf("%d",&num);
// 校验
if(num == 0)
{
printf("0既不是偶数也不是奇数!");
}
else
{
if(num % 2 == 0)
{
printf("%d是偶数!\n",num);
}
else
{
printf("%d是奇数!\n",num);
}
}
}
int main(int argc,char *argv[])
{
if_test1();
if_test2();
if_test3();
return 0;
}
小贴士:
如何拆出一个三位数中的每一位:
实现:123
个位:123
% 10
= 3十位:123
% 100 / 10
= 2百位:123
/100
= 1经典面试题:求水仙花树
解释;一个n位数各位数的n次方和等于这个数本身,复合这种规则的数叫做水仙花数!
用switch语句实现分支结构
我们可以用switch实现多分支选择结构(多分支也被称作多路分支)
语法:
switch (表达式)//表达式的结果建议是字符或者整型
{
case 常量表达式://这里一般使用自变量,符号常量或者枚举
语句1;
break;
case 常量表达式:
语句2;
break;
.............
case 常量表达式:
语句n;
break;
default:
语句n+1;
break;//一般省略
}
流程图:
说明:
①switch后括号内的表达式可以是任意类型的表达式,但是表达式的值尽量是整型、字符型、枚举。
②若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行default后面的语句。
③每个case后面的常量表达式的值必须不相同,否则出现矛盾。
④各个case出现的次序不影响执行结果。
⑤case后面的语句中如果没有break语句,则执行完本case后的语句后会接着执行下面的case,直到遇到下一个break为止。
⑥多个case共用一组语句。
案例:
-
要求:按照考试成绩的等级输出百分制分数段
-
分析:
- 设分段规则如下:
- A级:85~100段
- B级:70~84段
- C级:60~69段
- D级:<60段
- 输入其他字符时错误
- 设分段规则如下:
-
代码:
/************************************************************************* > File Name:demo05.c > Author: ZK > Description: switch案例 > Created Time: 2025年02月11日 星期二 15时55分43秒 ************************************************************************/ #include <stdio.h> // 案例1:按照考试成绩的等级输出百分制分数段 int switch_test1() { // 创建一个变量,用来存放考试等级 char grade; // 通过控制台输入一个字符 printf("请输入一个字符:\n"); scanf("%c",&grade); // 校验,根据等级输出分数段 Y 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"); break;// 如果default在switch的最下面,break是可以省略,反之不能省略。 } } int main(int argc,char *argv[]) { switch_test1(); return 0; }
案例:
-
需求:若要求按照百分制考试分数输出等级。
-
分析:
- 若分段原则如下:
- 90~100 A级
- 80~89 B级
- 70~79 C级
- 60~69 D级
- 若分段原则如下:
-
代码:
/************************************************************************* > File Name:demo05.c > Author: ZK > Description: switch案例 > Created Time: 2025年02月11日 星期二 15时55分43秒 ************************************************************************/ #include <stdio.h> // 需求:若要求按照百分制考试分数输出等级 int switch_test2() { // 创建一个变量,存储成绩 int score; // 通过键盘输入一个成绩 printf("请输入考试成绩:\n"); scanf("%d",&score); // 校验,根据成绩输出等级 switch(score/10) { 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; default: printf("Error\n"); } } int main(int argc,char *argv[]) { switch_test2(); return 0; }