C语言:分支结构
分支结构
问题引出
我们在程序设计往往会遇到如下的问题,比如下面的函数的计算
也就是我们是必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,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,则:
!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…
- 语法:
// 语法1:舍弃{}花括号
if(表达式)单语句;// 语法2:保留{}
if(表达式)
{单语句或复合语句;
}
- 流程图
-
功能
-
若表达式值为true(非0),则执行表达式后面的这个语句,执行完该语句后,继续执行if语句后的语句。
-
若表达式值为0,则不执行表达式后面的语句而直接执行if语句后面的语句。
-
-
说明:
- 如果表达式(条件表达式)后面的是符合语句,则要用一段{}括起来。
-
案例:
-
要求:计算并输出下列分段函数的值
-
代码:
-
#include <stdio.h>
{// 创建两个变量,用来存储两个操作数double x,y = -2;// 我们给y赋初值,假定<0// 从控制台输入xprintf("请输入一个整数,作为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
- 代码:
#include <stdio.h>int main()
{// 创建三个变量,用来存放a,b,c的值int a,b,c;// 通过控制台输入a,b,c三个数printf("请在控制台输入三个整数:\n");scanf("%d%d%d",&a,&b,&c);// 创建一个变量maxint max = a;// 让最大值和b,c进行比较if(max < b){max = b;// 如果max < b,就让b作为最大值}if(max < c){max = c;// 如果max < c,就让c作为最大值}printf("%d,%d,%d中的最大值是%d\n",a,b,c,max);return 0;
}
双分支:if…else…
语法:
// 舍弃{}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…结构的嵌套,可以实现多分支选择结构。
案例:
- 要求:计算并输出下列分段函数的值
- 代码:
#include <stdio.h>
int main(int argc, char *argv[])
{// 需求:计算并输出下列分段函数的值// 创建两个变量,存放x,y的值int x, y;// 通过键盘录入数据printf("请输入一个整数:\n");scanf("%d", &x);// 校验if (x < 0)y = -2;elsey = 2;// 打印输出测试结果printf("x=%d,y=%d\n", x, y);return 0;
}
改为三目运算符的写法:
#include <stdio.h>
int main(int argc, char *argv[])
{// 需求:计算并输出下列分段函数的值// 创建两个变量,存放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
语法:
写法1:嵌套if..elseif(表达式1)语句1;elseif(表达式2)语句2;else...elseif(表达式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;
-
代码:
/**
* 要求:根据学生的成绩,对学生进 行分级,成绩 >= 90,A成绩 >= 80,B成绩 >= 60,C成绩 < 60,D
*/
#include <stdio.h>
// 方式1:借助于执行顺序,减少判断的条件
int if_test1()
{// 创建一个变量,用来存放输入的成绩int score;// 通过控制台输入一个成绩printf("请输入一个整数:\n");scanf("%d",&score);// 校验,分级95if(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;
elseif(..) 语句3;else 语句4;
流程图:
注意:
① else总是与前面最近的未配对的if配对使用
② 可通过增加{}来确定配对关系
③只要if中包含if,都属于是if语句的嵌套
案例:
/**
* 要求:根据学生的成绩,对学生进行分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 < 60,D
*/
#include <stdio.h>
// 方式1:借助于执行顺序,减少判断的条件
int if_test1()
{// 创建一个变量,用来存放输入的成绩int score;// 通过控制台输入一个成绩printf("请输入一个整数:\n");scanf("%d", &score);// 校验,分级 95if (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,个位数:1233%10=3;十位数:123 % 100 / 10 = 2,123 / 10 % 10 =2;百位数:123 / 100 = 1
用switch语句实现分支结构
我们可以使用switch实现多分支选择结构(多分支也被称作多路分支)
语法:
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段;
输⼊其它字符时为错。
- 代码:
#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[])
{switch_test1();return 0;
}
案例:
-
要求:若要求按照百分制考试分数输出等级。
-
分析:
若分段原则如下:
90~100 为A级;
80~89 为B级;
70~79 为C级;
60~69 为D级;
其它为E级。
- 代码:
#include <stdio.h>
/*
- 要求:若要求按照百分制考试分数输出等级
- 分析:
若分段原则如下:
90~100 为A级; 9,10
80~89 为B级; 8
70~79 为C级; 7
60~69 为D级; 6
其它为E级。
*/
int switch_test2()
{// 创建一个变量,存放分段标识(等级)int grade;// 通过键盘录入一个数字printf("input grade:\n");scanf("%d", &grade);// 校验switch ((grade / 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("E\n");}
}
int main(int argc, char *argv[])
{switch_test2();return 0;
}
;
80~89 为B级;
70~79 为C级;
60~69 为D级;
其它为E级。
- 代码:
#include <stdio.h>
/*
- 要求:若要求按照百分制考试分数输出等级
- 分析:
若分段原则如下:
90~100 为A级; 9,10
80~89 为B级; 8
70~79 为C级; 7
60~69 为D级; 6
其它为E级。
*/
int switch_test2()
{// 创建一个变量,存放分段标识(等级)int grade;// 通过键盘录入一个数字printf("input grade:\n");scanf("%d", &grade);// 校验switch ((grade / 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("E\n");}
}
int main(int argc, char *argv[])
{switch_test2();return 0;
}