Linux基础25-C语言之分支结构Ⅱ【入门级】
用if语句实现分支结构
单分支:if…
-
语法:
//语法1:舍弃{} if(条件表达式); 单语句; //语法2:必须保留{} if(条件表达式) { 单语句或者复合语句; }
-
流程图
-
功能
- 若表达式值为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后的代码。
- 若表达式值为假(0)则不执行表达式后面的语句而直接执行if后面的语句。
-
说明:
- 如果表达式后面的是复合语句,则要用一对花括号{}括起来,单语句可有可无。
-
案例:
-
要求:计算并输出下列分段函数的值:
-
流程图:
-
代码:
#include <stdio.h> int main(int argc,char *argv[]) { // 创建两个变量,用来存储两个操作数 double x,y = -2; // 从控制台输入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三个数,要求从控制台输入,并求出最大值
-
分析:
1.通过控制台输入a,b,c的值
2.创建一个变量max,用来存放a,b,c中得最大值,默认a是最大值(这样可以减少一次判断)
3.让b,c和max进行比较,将最大值存入max
-
代码:
#include <stdio.h> int main(int argc,char *argv[]) { // 创建四个变量a,b,c,max int a,b,c,max; // 通过键盘录入数据给a,b,c printf("请输入三个整数:\n"); scanf("%d%d%d",&a,&b,&c); // 默认a是最大值 max = a; // 让最大值分别和b和c比较 if (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()同时输入多个变量时,默认使用空格、tab、回车键进行区分。
②在变量赋值前使用变量,导致运算结果错误(变量为赋值,系统会给变量分配随机数)
双分支if…else…
语法:
//语法1:舍弃{}
if(表达式)
单语句1;
else
单语句2;
//语法2:保留{}
if(条件表达式)
{
单语句1或者复合语句1;
}
else
{
单语句2或者复合语句2;
}
注意:else语句本身不能单独使用,必须和if配合使用
流程图:
功能:
若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立都需要执行一个语句,其次需要注意的是,语句1和语句2都可以是单语句或者复合语句。
说明:
if…else…结构可以实现双分支选择结构。C语言允许if…else…结构嵌套。即在语句1与语句2中有可以包含完整的if语句或者if…else…结构,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过4层)。利用if…else…结构的嵌套,可以实现多分支选择结构
案例:
- 需求:计算并输出下列分段函数的值:
-
流程图
-
代码:
#include <stdio.h> int main(int argc,char *argv[]) { // 创建两个变量存储x,y int x,y; // 通过键盘录入x printf("请输入一个整数:\n"); scanf("%d",&x); // 校验 if (x < 0) y = -2; else y = 2; // 打印输出测试结果 printf("x=%d,y=%d\n",x,y); return 0; }
-
运行结果:
注意:对于单语句的双分支,我们可以使用三目(三元)运算符的写法简化
三目运算符
语法:
表达式1?表达式2:表达式3;
说明:
①如果表达式1的结果为真,就执行表达式2,否则就执行表达式3
②三目运算符的写法实际上就是单语句的双分支语句的缩略写法
案例:
-
需求:将上面双分支的案例改造为三目运算符得写法
-
代码:
#include <stdio.h> int main(int argc,char *argv[]) { // 创建两个变量存储x,y int x,y; // 通过键盘录入x printf("请输入一个整数:\n"); scanf("%d",&x); // 校验 y = x < 0 ? -2 : 2; // 打印输出测试结果 printf("x=%d,y=%d\n",x,y); return 0; }
-
运行结果:
多分支:if…else if…else
语法:
//写法1:嵌套if...else(不推荐)
if(表达式)语句1;
else
if(表达式2)语句2;
else
...
else
if(表达式n)语句n;
else 语句;
//写法2:并列if...else if...else...(推荐)
if(表达式1)语句1;
else if(表达式2)语句2;
...
[else if(表达式n)语句n;]
[else 语句n+1;]//else是可选的,写不写由我们的最终需求决定
流程图:
注意:多分支中,同一时刻只能满足一个分支。
案例:
-
需求:根据学生得成绩,对学生进行分级:
- 成绩>=90 A
- 成绩>=80 B
- 成绩>=60 C
- 成绩<60 D
-
代码:
#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语句的嵌套
案例:
#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次方等于这个数本身,符合这种规则的数叫做水仙花数