顺序结构的程序虽然能解决计算、输出等问题,但不能作判断再选择。对于要先作判断再选择的问题就要使用分支结构。git
分支结构的执行是依据必定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不一样的程序流程选择适当的分支语句。面试
分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时每每都要先绘制其程序流程图,而后根据程序流程写出源程序,这样作把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。算法
学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。api
若是判断条件成立就执行分支体,不然直接跳过。其执行过程可表示为下图:学习
这种分支结构中的分支体能够是一条语句,此时“{}”能够省略,也能够是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,不然跳过度支体,这时分支体就不会执行。设计
如:要计算x的绝对值,根据绝对值定义,咱们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,所以程序段为:if(x<0)x=-x;视频
这是典型的分支结构,若是条件成立,执行分支1,不然执行分支2,分支1和分支2均可以是1条或若干条语句构成。blog
其执行过程可表示为下图:开发
如:求ax^2+bx+c=0的根get
分析:由于当b^2-4ac>=0时,方程有两个实根,不然(b^2-4ac<0)有两个共轭复根。其程序段以下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf("x1=%8.4f,x2=%8.4f\n",x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf("x1=%8.4f+%8.4fi\n"r, i);
printf("x2=%8.4f-%8.4fi\n"r,i);
}
其语句格式为:
if(条件1) {分支1};
else if(条件2) {分支2}
else if(条件3) {分支3}
……
else if(条件n) {分支n}
else {分支n+1}
意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的分支,而后跳到整个 if else 语句以外继续执行其余代码。若是全部判断条件都不成立,则执行语句块n,而后继续执行后续代码。
也就是说,一旦遇到可以成立的判断条件,则再也不执行其余的分支,因此最终只能有一个分支被执行。
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得很是复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重之内,超过3重能够用下面的语句。
例如,使用多个 if else 语句判断输入的字符的类别:
#include <stdio.h>
int main(){
char c;
printf("Input a character:");
c=getchar();
if(c<32)
printf("This is a control character\n");
else if(c>='0'&&c<='9')
printf("This is a digit\n");
else if(c>='A'&&c<='Z')
printf("This is a capital letter\n");
else if(c>='a'&&c<='z')
printf("This is a small letter\n");
else
printf("This is an other character\n");
return 0;
}
运行结果:
Input a character:e↙
This is a small letter
在使用 if 语句时还应注意如下两点:
在 if 语句中,判断条件必须用括号括起来。
语句块由{ }包围,但要注意的是在}以后不须要再加分号;(固然加上也没错)。
当if语句中的执行语句又是if语句时,则造成了if语句嵌套。
if(条件表达式)
if语句;
或者
if(条件表达式)
if语句;
else
if语句;
demo:修改下面的程序使程序:输入a和b的值,判断最大值是否大于100,是则输出最大值。
int main(void)
{
int a = 0;
int b = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
if(b > 100)
printf("max:%d\n",b);
else
if(a > 100)
printf("max:%d\n",a);
return 0;
}
注意:C语言规定,else老是与它前面最近的为配对的if配对。
因此修改后应为:
int main(void)
{
int a = 0;
int b = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
{
if(b > 100)
printf("max:%d\n",b);
}
else
{
if(a > 100)
printf("max:%d\n",a);
}
return 0;
}
demo:输入a、b、c的值,判断并输出最大值
int main(void)
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
printf("请依次输入a、b、c的值:");
scanf("%d%d%d", &a, &b,&c);//
if (a > b)
{
if (a > c)
max = a;
else
max = c;
}
else//b > a
{
if (b > c)
max = b;
else
max = c;
}
printf("max:%d\n", max);
return 0;
}
C语言虽然没有限制 if else 可以处理的分支数量,但当分支过多时,用 if else 处理会不太方便,并且容易出现 if else 配对出错的状况。对于这种状况,实际开发中通常使用 switch 语句代替。
该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路。
switch 是另一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式以下:
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
......
case 整型数值n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,若是它们相等,就执行冒号后面的全部语句,也就是从“语句1”一直执行到“语句n+1”,而无论后面的 case 是否匹配成功。
3) 若是“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面全部的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 若是直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
须要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面全部分支的语句。例如:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
case 4: printf("Thursday\n");
case 5: printf("Friday\n");
case 6: printf("Saturday\n");
case 7: printf("Sunday\n");
default:printf("error\n");
}
return 0;
}
运行结果:
Input integer number:4↙
Thursday
Friday
Saturday
Sunday
error
输入4,发现和第四个分支匹配成功,因而就执行第四个分支以及后面的全部分支。这显然不是咱们想要的结果,咱们但愿只执行第四个分支,而跳事后面的其余分支。为了达到这个目标,必需要在每一个分支最后添加break;语句。
break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就再也不执行 switch 中的任何语句,包括当前分支中的语句和其余分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
使用 break 修改上面的代码:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default:printf("error\n"); break;
}
return 0;
}
运行结果:
Input integer number:4↙
Thursday
因为 default 是最后一个分支,匹配后不会再执行其余分支,因此也能够不添加break;语句。
最后须要说明的两点是:
1) case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。请看下面的例子:
case 10: printf("..."); break; //正确
case 8+9: printf("..."); break; //正确
case 'A': printf("..."); break; //正确,字符和整数能够相互转换
case 'A'+19: printf("..."); break; //正确,字符和整数能够相互转换
case 9.5: printf("..."); break; //错误,不能为小数
case a: printf("..."); break; //错误,不能包含变量
case a+10: printf("..."); break; //错误,不能包含变量
2) default 不是必须的。当没有 default 时,若是全部 case 都匹配失败,那么就什么都不执行。
今天就分享到这里啦,但愿对你们学习有所帮助!
最后
特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!
还没关注的小伙伴,能够长按关注一下: