文章目录
第六章 分支
if语句
三大结构
我们c语言是一个结构化的程序设计语言,一个结构化设计的程序无论程序结构如何复杂,都可以使用3种基本流程控制结构加以表达与陈述。
这3种结构分别为:
1.顺序结构
2.选择结构
3.循环结构。
顺序结构
顺序结构就是从头到尾一句接着一句的执行下来,执行完上一个语句就会自动执行下一个语句,是无条件的,不必做任何判断,直到执行完最后一句程序结束。
顺序结果顾名思义顺序,顺序,顺序,一切按照顺序来,一步一步往下运行。
代码实现:
代码会依次运行 先打印 hello,然后打印 haha ,然后打印 xixi 按照从上往下的顺序运行代码。
分支/选择结构
分支/选择结构就是到某个节点后,会根据一次判断的结果来决定之后程序向哪一个分支方向执行。
所谓分支就是给了我们多个选择,而我们根据自身的条件去选择特定的选项。
在现实生活中假如 我们要完成两件事情,称之为事件A,事件B,完成事件A需要1个小时,完成事件B需要半个小时,
而我们目前只有40分钟的空闲事件 ,所以按照条件我们只能完成事件B。
运行逻辑图片:
if语句是指编程语言中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。if语句的实现过程如下图所示。
if(条件) 在代码块中可以看成是如果的意思 属于判定条件的语句 ,一般与else(否则的意思)连用,
可以理解为:
if就是如果的意思
如果(条件成立)
{
执行代码
}
else就是否则的意思
否则
{
执行代码
}
假如 我们学c语言 敲0-5000行代码为 “入门级”,5000-10000行代码为“中等级”,10000-20000为“优秀级”,20000以上为大师级,可以获得一个好offer。定义为a表示我们的敲的代码行数,现在我们输入一个数表示为我们的敲的代码行数
当我们分别输入为15000和20001时得到:
if 后面的括号里是我们的条件表达式 ,用于判定分支走向。当条件表达式为真时,执行对应if 下面的语句,当所有的条件表达式都为假时则
执行 else 下面的语句。
else if 用于有三个或者三个以上分支时使用else if 来创建多个分支 。
注:if 与else 后面默认包含一条语句 如果有两条或两条以上语句时要用大括号 包含起来
循环结构
在日常生活中有大量的事情需要我们重复去做,而在c语言中也有这样的逻辑结构——循环结构,
循环结构指在条件范围内重复执行循环体里面的语句,直到条件不满足时停止循环。
这就是我们前面的while,for,dowhile这些
if语句的使用
if语句被称为分支语句(branchingsialement)或选择语句,因为它相当于一个交叉点,程序要在两条分支中选择一条执行。if 语句的通用形式如下:
if(expression)
{
statement
}
如果对 expression求值为真(非0),则执行 statement;否则,跳过 statement。
与 while 循环一样,statement可以是一条简单语句或复合语句。if语句的结构和 while语句很相似,它们的主要区别是:如果满足条件可执行的话,if语句只能测试和执行一次,而 while语句可以测试和执行多次。
通常,expression是关系表达式,即比较两个量的大小(如,表达式x>y或c== 6)。如果expression为真(即x大于y,或c==6),则执行 statement。否则,忽略 statement。概括地说,可以使用任意表达式,表达式的值为0则为假。
statement部分可以是一条简单语句,如本例所示,或者是一条用花括号括起来的复合语句
if else 语句
简单形式的 if语句可以让程序选择执行一条语句,或者跳过这条语句。C还提供了if else 形式,可以在两条语句之间作选择。
注意,if else语句的通用形式是:
if(expression)
statementl
else
statement2
如果 expression为真(非0),则执行statement1;
如果 expression为假或0,则执行 else后面的 statement2。
statement1和statement2 可以是一条简单语句或复合语句。C并不要求一定要缩进,但这是标准风格。缩进让根据测试条件的求值结果来判断执行哪部分语句一目了然。
众所周知18岁就已经成年了,所以我们这里写一段程序,使用者输入自己的年龄,如果你的年龄小于18就会自动显示未成年,如果你的年龄大于等于18岁就会自动显示已经成年。
首先我们看到输入使用者的年龄,那么我们是不是得使用scanf函数来接收使用者的输入的值,并且我们还得创建一个整形变量来存储输入的值那么我们的代码如下:
#include<stdio.h>
int main()
{
int age = 0;//创建年龄变量
scanf("%d", &age);//输入自己的年龄
if(age<18)//表达式
{
printf("未成年\n");//表达式为真执行的语句
}
else
{
printf("已经成年\n");//表达式为假执行的语句
}
return 0;
}
if else执行多条件的话,一定要用括号括起来
如:
if(x>0)
printf("X的值为:%d",x);
x++;
else
printf("x<=0");
这样子的后果是:
编译器把 printf()语句视为 if 语句的一部分,而把x++;看作一条单独的语句,它不是 if 语句的-部分。然后,编译器发现else并没有所属的if,这是错误的。上面的代码应该这样写:
if(x>0)
{
printf("X的值为:%d",x);
x++;
}
else
printf("x<=0");
if 语句用于选择是否执行一个行为,而else if 语句用于在两个行为之间选择。
else if
相比于if,else ,else if可以理解为多重选择的意思
现实生活中我们经常有多种选择。在程序中也可以用else if扩展if else 结构模拟这种情况。
if(表达式)
执行语句
else if(表达式1)
执行语句1
......(很多的else if)
else if(表达式m)
执行语句m
else
例如:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool bTrue = true;
bool bFalse = false;
if (bFalse)
printf("if true!\n");
else if(bFalse)
printf("else if true!\n");
else if (bTrue)
printf("else if true!\n");
return 0;
}
定义了一个_Bool(布尔值类型)变量bTrue,并且赋值true(1)
定义了一个_Bool(布尔值类型)变量bFalse,并且赋值false(0)
下面的if、else if,此处故意定义多定义一个else if表示在一个if条件判断中可以有多个else if判断
首先第一个if,因为bFalse为0,所以判断为false(假),为通过,所以往下执行
下一个else if,因为bFalse为0,所以当前的else if判断为false(假),未通过,然后往下执行
下一个else if,因为bTrue为1,不等于0,所以当前的else if判断为true(真),通过,然后进行printf格式化输出else if true!,最后跳出当前这个if判断
PS:如果没有通过当前else if,则一直执行下面的else if判断,如果最后所有else if判断都没有通过,则执行else语句(else为无条件通过),如果也没有else,则最终跳出当前if判断语句
也可以是这样子:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool bTrue = true;
bool bFalse = false;
if (bFalse)
printf("if true!\n");
else if(bFalse)
printf("else if true!\n");
else
printf("else!\n");
return 0;
}
定义了一个_Bool(布尔值类型)变量bTrue,并且赋值true(1)
定义了一个_Bool(布尔值类型)变量bFalse,并且赋值false(0)
首先执行第一个if,if判断为bFalse为false(假),未通过,继续执行下面的else if或else
下一个else if,else if判断为bFalse为false(假),未通过,继续执行下面的else if或else
下一个else,else为无条件通过,最终printf格式输出else!
PS:在一个if条件判断中,如果之前的if和else if都未通过,那么执行到else为无条件通过
else 与if 配对
如果程序中有许多if和else,编译器如何知道哪个if对应哪个else?例如,
if(number>6)
if(number<12)
printf("You're close!\n");
else
printf("Sorry,you lose a turn!\n");
何时打印 Sorry,you lose a turn!?
当number 小于或等于6时,还是 number 大于 12 时?换言之,else 与第1个if还是第2个if匹配?
答案是:else与第2个if匹配。也就是说,输入的数字和匹配的响应如下:
再例如:
if(条件1)
if(条件2)
if(条件3)
else if(条件4) /*如果条件三不成立执行*/
else/*这是条件3的*/
else/*这是条件2的*/
else/*这是条件1的*/
可以理解为就近原则,谁离得比较近就是谁的
小结:
结束循环
break和continue的作用
break和continue都是用来控制循环结构的,主要作用是停止循环。
一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue利break语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。
continue语句
3种循环都可以使用continue 语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。
如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环。
假设和上面案例同样的场景,你犯错了,你老婆罚你做5天家务,每天都是做菜,但是做菜到第三天后老婆心软了,原谅你不用做了,但后面依然不解恨,让你继续做第4、5天。
for(int i = 1; i <= 5; i++ )
{
if(i == 3)
{ //给老婆做菜第3天
continue;//立即跳出当次执行,进入下一次循环
}
System.out.println("给老婆第"+ i +"天做菜");
}
例如:
又或者是
#include <stdio.h>
int main(void)
{
const float MIN = 0.0f;
const float MAX = 100.0f;
float score;
float total = 0.0f;
int n = 0;
float min = MAX;
float max = MIN;
printf("Enter the first score (q to quit): ");
while (scanf("%f", &score) == 1)
{
if (score < MIN || score > MAX)
{
printf("%0.1f is an invalid value. Try again: ",
score);
continue;
}
printf("Accepting %0.1f:\n", score);
min = (score < min)? score: min;
max = (score > max)? score: max;
total += score;
n++;
printf("Enter next score (q to quit): ");
}
if (n > 0)
{
printf("Average of %d scores is %0.1f.\n", n, total / n);
printf("Low = %0.1f, high = %0.1f\n", min, max);
}
else
printf("No valid scores were entered.\n");
return 0;
}
break语句
1.只能在for、while、do…while,循环语句中和switch语句体内使用break。
2. break用于跳出一个循环或一个switch,若多个循环,即结束本层的一个循环体。
假设一个场景,你有一个漂亮的老婆,然后你犯错了,你老婆罚你做5天家务,每天都是给老婆做菜,但是做菜到第三天后老婆心软了,原谅你不用做了。
for (int i = 1; i <= 5; i++)
{
printf("快乐的做菜~~~~");
if(i == 3)
{ //给老婆做菜第3天
break; // 跳出并结束当前循环的执行
}
}
上图示例中,循环体for " j " == 5 时遇到break后直接跳出本层循环体for “ j ”,然后继续执行外边的循环体for “ i ”,因为两个printf都是在循环体 “ j ” 中,所以这里并未打印 “Hello” 和"5"。
#include <stdio.h>
int main(void)
{
float length, width;
printf("Enter the length of the rectangle:\n");
while (scanf("%f", &length) == 1)
{
printf("Length = %0.2f:\n", length);
printf("Enter its width:\n");
if (scanf("%f", &width) != 1)
break;
printf("Width = %0.2f:\n", width);
printf("Area = %0.2f:\n", length * width);
printf("Enter the length of the rectangle:\n");
}
printf("Done.\n");
return 0;
}
break和continue的区别
1、
break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环。
注意:
(1)只能在循环体内和switch语句体内使用break。
(2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。
(3)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。
2、
continue语句的作用是跳过本次循环体中剩下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为只是中止(跳过)本次循环,接着开始下一次循环。
注意:
(1)continue语句并没有使整个循环终止。
(2)continue 只能在循环语句中使用,即只能在 for、while 和 do…while 语句中使用。
switch
实际生活中,需要做出很多选择,大家都知道做选择可以使用if语句,但是如果选择太多,if语句使用起来就会很繁琐,这个时候就需要一个能将代码简化的语句,也就是我们今天的主角switch语句。
switch语句是一个多分支选择语句,并且可以支持嵌套。
switch可以这样理解:
switch 相当于 if
case的话就是,如果你if中的条件是 case 1:,则执行 case 1后的语句,如果是case2…
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
default:语句n
}
如果这个条件为真(表达式)
{
条件如果常量1这种情况的话:执行语句1
条件如果常量2这种情况的话:执行语句2
如果都不是上面枚举的情况的话:执行语句n
一般来讲像如下这种情况的,建议用switch:
if(表达式1)
else if(表达式2)
else if(表达式3)
else if(表达式4)
switch(表达式)
{
case 表达式1:语句1
case 表达式1:语句2
.........
default:语句n
}
switch语句通过将表达式的值与常量值进行比对,如果相等则执行后面的语句,如果不相等则跳到下一个case语句,当表达式和常量值相等,switch语句会将当前case语句以及后面所有的case语句全部输出(如果不进行跳过的话)。假如我们要实现用户输入一个数字来判断今天是星期几,那么就可以用下面的代码实现。
#include <stdio.h>
int main()
{
int day = 0; //定义一个整型变量day,并对其赋值为0
printf("请输入一个数字\n"); //让用户输入一个数字
scanf("%d", &day); //接收用户输入的数字
switch (day)
{
case 1:printf("星期一\n"); //如果day的值为1,则输出星期一
case 2:printf("星期二\n"); //以下同上
case 3:printf("星期三\n");
case 4:printf("星期四\n");
case 5:printf("星期五\n");
case 6:printf("星期六\n");
case 7:printf("星期天\n");
default:
break;
}
return 0;
}
行结果如下图所示,可以看到当我输入2时,switch语句将我2以及下面所有语句都执行,这显然不是我想要的结果,那么怎么解决这个问题呢,很简单,只需要在每一个case语句后面加上一个break语句
break语句:
当switch语句运行时遇到break关键字时会跳出,意思就是当语句运行到break时就不再运行了,接下来剩下的case语句也不会再执行,switch语句结束。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int day = 0; //定义一个整型变量day,并对其赋值为0
printf("请输入一个数字\n"); //让用户输入一个数字
scanf("%d", &day); //接收用户输入的数字
switch (day)
{
case 1:printf("星期一\n");
break;
case 2:printf("星期二\n");
break;
case 3:printf("星期三\n");
break;
case 4:printf("星期四\n");
break;
case 5:printf("星期五\n");
break;
case 6:printf("星期六\n");
break;
case 7:printf("星期天\n");
break;
}
return 0;
}
可以看到当我再次输入2时,只输出一个星期二,这显然break语句已经生效,也达到了我想要的结果,还有一个值得注意的是,语句是可以为空语句的,那么我们将break和空语句结合起来就可以实现下面的代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
//实现1-5都为工作日,6,7为休息日,可以看出当case语句后没有执行语句且没有break时代码会从条件判断成立进入,直到遇到break
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("工作日\n");
break;
case 6:printf("休息日\n");
break
case 7:printf("休息日\n");
break;
}
return 0;
那么问题来了,如果用户输入时不小心输入了一个switch语句中没有的常量值怎么办呢,这个也很简单,只需要一个小小的default,请看
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
//实现1-5都为工作日,6,7为休息日,可以看出当case语句后没有执行语句且没有break时代码会从条件判断成立进入,直到遇到break
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("工作日\n");
break;
case 6:printf("休息日\n");
break
case 7:printf("休息日\n");
break;
default:printf("请重新输入\n");
break;
}
return 0;
}
default的作用就是当表达式的值和常量值全部对比过之后,如果没有匹配的就会输出default后的语句。