想必大家都知道C语言是一门结构化程序设计的语言,在C语言中常见分为三种结构:顺序结构、选择结构和循环结构。今天我们用控制语句来实现选择和循环结构。
注:控制语句实质就是控制程序的执行过程,共有九种类型,分为三大类
- 选择判断语句(分支语句):if语句,switch语句。
- 循环语句:for语句,while语句,do while语句。
- 转向语句:break语句,continue语句,return语句。
一、选择结构:
1.if语句
1.1.if
if语句的语法格式
if (表达式)
语句;
表达式为真,则执行语句;表达式为假,则不执行
eg.判断奇偶数
在C语言中0表示假,非零为真。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 0)
printf("是偶数\n");
return 0;
}
不难发现上面代码中只能判断偶数,要想判断是奇数我们需要引入else。
1.2.else
if else的语法与if差别不大
if(表达式)
语句1;
else
语句2;
对于上文举例的代码,我们只需稍加改进,就能完整的判断奇偶数
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 0)
printf("是偶数\n");
else
printf("是奇数\n");
return 0;
}
1.3.一个分支包含多个语句
无论是if语句还是else语句都默认控制下面一行语句
eg.
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 18)
printf("未成年\n");
printf("不可以饮酒\n");
return 0;
}
运行结果如下:
输入值大于等于18或小于18,不可以饮酒这条语句都会打印
要想单分支控制多语句只需加上{}。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a < 18)//在if或else语句后加上{}用于控制多个语句
{
printf("未成年\n");
printf("不可以饮酒\n");
}
else
{
printf("成年了\n");
printf("适度饮酒\n");
}
return 0;
}
1.4.if语句的嵌套
(1)当我们判断一个稍微复杂一些的问题时,显然if else就不太够用了,所以我们可以将else再与if连用构成多重判断。
eg.输入两个数比较大小
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (a < b)
{
printf("%d<%d", a, b);
}
else if (a > b)
{
printf("%d>%d", a, b);
}
else
{
printf("%d=%d", a, b);
}
return 0;
}
1.5.悬空else
当判断复杂的逻辑问题时,会出现多个if,else语句,但是else总是跟它距离最近的if匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
if (a == 1)
if (b == 1)
printf("right\n");
else
printf("left\n");
return 0;
}
许多初学者初见大多都认为既然else与最近的if匹配那就该打印left 。此段代码什么都不会打印,因为本段代码不带{}默认控制一行,也就是相当于后面的if...else语句相当于嵌套在第一个if语句中,当判断第一个if语句为假,下面语句就不会被执行。
- 我们可以把代码复制到vs中查看结果
聪明的vs会帮你把else与对应的if对齐。与其这样不如自己养成写代码1好习惯,适当的加上{}可以让自己写代码时逻辑更清晰,所以可以再修改一下
2.switch语句
switch语句可以认为成一种特殊的if...else语句,它可以用来处理多个结果的问题
switch语句的语法如下:
switch (表达式)
{
case 1://case后一定是整形常量表达式并且用空格隔开
语句;
case 2:
语句;
default:
语句;
}
eg.判断余数
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 5)
{
case 0:
printf("整除\n");
case 1:
printf("余数为1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
运行结果:
我们发现当输入一个5被整除后语句继续执行并没有停下来,因为switch也是一个具有分支效果语句。当case后没有break语句程序就会继续执行下个语句直到遇到break或者switch语句结束。
2.1. switch语句中break
break在switch中是很重要的,没有它就不能实现分支的效果,同时想要跳出switch也需要break。break固然重要但是不代表每个case后reak,要具体问题具体分析。
eg.输入数字并打印对应日期
#include <stdio.h>
int main()
{
int day = 0;
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;
}
如果我们想更改需求,例如:输入1~5打印工作日,6,7打印休息日就不需要使用太多的break。
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
我们在输入时有可能不小心输入了1~7以外的数字,如何在输入其他值的情况下生成一个提示呢?我们可以加入default字句。
2.2.switch语句中的default
switch语句后的表达式中的值与case语句无法匹配就会执行default。我们对以上代码稍作改进
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误,请输入1~7范围内的值");
break;
}
return 0;
}
default与case的位置关系无关紧要 ,但一般默认default在末尾
输入其他值运行结果: