项目概述
前面的项目一直在介绍C语言的基本语言知识,然而仅仅依靠这些语法知识是不能编写出完整的C程序的。
在程序中,通常需要加入业务逻辑,根据业务逻辑进行流程控制,本项目我们将会学到流程控制的三种结构顺序结构,分支结构,循环结构,会详细介绍分支结构和循环结构,在分支结构中我们将会学到if分支以及switch分支,循环结构中我们将会学到三种循环结构,while循环,do-while循环以及for循环,掌握本项目能够编写逻辑较复杂的代码,有助于后面的项目的学习。
项目目标
了解流程控制结构
掌握分支语句语句结构
掌握if语句和switch语句的使用
掌握循环结构语句结构
掌握while、do-while和for循环语句的使用
掌握break与continue关键字的使用
掌握goto跳转语句的使用
任务描述
通过本任务的学习,读者应该能够熟练的运用if判断语句、switch判断语句,可以编写相对来说业务复杂的程序。
学习目标
了解分支程序的流程。
掌握选择结构语句(if、switch语句)使用。
相关知识
在c语言中,有三种流程控制结构:顺序结构、选择结构、循环结构。
1.顺序结构。
顺序结构就是指顺序从上向下依次执行每条语句的结构,中间没有任何的判断和跳转,前面讲的课程中使用的案例都是顺序结构。如流程图5-1所示。
图5- 1顺序结构流程图
2.选择结构。
选择结构是根据条件判断的结果来选择执行不同的代码。选择结构分为单分支结构、双分支结构和多分支结构在c语言中提供了if控制语句、switch语句来实现选择结构。如流程图5-2所示。
图5- 2 选择结构流程图
3.循环结构。
循环结构是根据条件来重复执行某段代码的结构,c语言提供了while语句、do-while语句、for语句来实现循环结构。如流程图5-3所示。
图5- 3 循环结构流程图
前面的代码都是按照顺序结构进行设计,但是在实际生活中经常需要我们做一些判断,比如说你来到了一个十字路口如果是红灯你就要停下脚步,不能通行,如果是路灯你就可以通行。在开发系统的时候有时候需要实现这样的判断比如当你登陆账号的时候,或是成功,或是失败。像是这样的程序的编写我们就要用到分支控制。
接下来我们先来了解分支语句的第一种语句形式if语句。
分支控制if语句有三种: 单分支 、双分支和多分支。
1.if语句的第一种形式-单分支
在C语言if的单分支的基本语法如下:
if(表达式){
执行代码块;
}
其中”表达式”一般为逻辑表达式或者是关系表达式。
说明:当表达式为真 (非0) 时,就会执行 { } 的代码,返回假(0) 时,不会执行{ }
执行过程如下图所示5-4所示。
图5- 4 单分支流程图
实例5- 1编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出 “你我成年了”。
分析
1. int age 接收输入的年龄。
2. 使用if 单分支来判断,进行相应处理。
#include
int main()
{
int age = 0;
printf("请输入年龄");
scanf("%d", &age);
根据age的值来处理
if(age > 18) {
printf("\n你年龄大于18,要对自己的行为负责!!");
}
printf("ok~~~");
getchar();//接收回车
return 0;
}
设定我们输入的值是19,满足我们年龄大于18的条件,屏幕上显示的结果如图5-5所示。
图5- 5 实例5-1输出结果
上述的案例中,对age做了判断代码执行的流程如下图5-6所示。
图5- 6 实例5-1代码执行的流程
2.if语句的第二种形式-双分支也叫做if.....else语句
if......else语句是指如果满足某种条件,就执行这个条件,否则执行另外一种处理。例如我们做账号登陆不是登陆成功就是登陆失败,只有两种选择,就可以使用if.....else语句进行分支程序的编写。
If.....else的基本语法如下
if(表达式){
执行代码块1;
}
else{
执行代码块2;
}
说明:当表达式成立(为真),执行代码块1,否则执行代码块2.
执行过程如下图所示5-5所示。
图5- 7 单分支流程图
实例5- 2编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出 “我成年了,要对自己的行为负责!”。否则 ,输出”你的年龄未满18岁。”
分析:
1. int age 接收输入的年龄
2. 使用if-else 双分支来判断,进行相应处理
#include
int main()
{
int age = 0;
printf("请输入年龄");
scanf("%d",&age);
if(age > 18) {
printf("\n你年龄大于18,要对自己的行为负责!");
} else {
printf("\n你的年龄未满18岁");
}
printf("程序结束~~~");
getchar();
return 0;
}
设定我们输入的值是17,未满足我们年龄大于18的条件,所有走else{},屏幕上显示的结果如图5-8所示。
图5- 8 实例5-2输出结果
执行过程如下图所示5-9所示。
图5- 9 实例5-2代码执行的流程
3.if语句的第三种形式-多分支也叫做 if.....else if....else语句
if.....else if....else语句用于多多个条件进行判断,从而进行不同的处理。生活中也有很多这样的例子比如年龄小于六岁我们称谓小婴儿,年龄小于18岁称谓学生,小于50岁的称谓大叔,当然大于50岁的我们就的称谓爷爷了,像这样如再程序中,就可以使用 if.....else if....else语句语句进行分支程序的编写。
if.....else if....else语句基本语法
if(条件表达式1){
执行代码块1;
}
else if (条件表达式2){
执行代码块2;
}
……
else{
执行代码块n;
}
说明:当条件表达式成立(为真),执行代码块1,否则执行代码块2或者代码其他.
执行过程如下图所示5-10所示。
图5- 10 多分支流程图
实例5- 3 接下来我们就来编写根据年龄的不同对应输出不同的称谓。
#include
int main()
{
int age;
printf("请输入年龄,对应不同的称谓");
scanf("%d",&age);
if(age<0) {
printf("输入的年龄不正确\n");
} else if(age<6) {
printf("%s\n","该年龄为小婴儿");
} else if(age<18) {
printf("%s\n","该年龄为大哥哥");
} else if(age<50) {
printf("%s\n","该年龄为大叔");
} else {
printf("%s\n","该年龄为老爷爷");
}
getchar();
return 0;
}
最后的else 也可以省略,那么就是如果上面的每个 if 都不匹配,就什么都不做。
设定我们输入的值是100,满足年龄大于50的条件,所有走else if(age<50){},屏幕上显示的结果如图5-11所示。
图5- 11 实例5-3输出结果
执行过程如下图所示5-12所示。
图5- 12 实例5-3代码执行的流程
4.if语句的嵌套分支
在一个分支结构中又完整的嵌套了另一个完整的分支结构,就是嵌套分支,里面的分支的结构称为内 层分支外面的分支结构称为外层分支。
基本语法
if(){
if(){
}else{
}
}
说明:被包含的可以是单分支,双分支,多分支,嵌套分支不适合过多,建议最多不要超过3层。
实例5- 4 案例要求:出票系统:根据淡旺季的月份和年龄, 打印票价,如下表5-1所示 。
表 5-1 淡旺季的月份和年龄票价对照表
年龄 |
旺季:4-10月份 |
成人(18-60) |
60 |
儿童(<18) |
半价 |
老人(>60) |
票价的1/3 |
|
淡季: |
成人 |
40 |
其他 |
20 |
根据要求,编写代码如下。
#include
int main()
{
int month = 0;
int age = 0;
double price = 60.0;
printf("请输入月份:");
scanf("%d", &month);
printf("请输入年龄:");
scanf("%d", &age);
if(month>=4 && month<=10) {
//旺季
if(age>60) {
printf("旺季年龄大于60岁票价:¥%.2f", price / 3);
} else if(age>=18) {
printf("旺季年龄大于18岁票价:¥%.2f", price);
} else {
printf("¥%.2f", price / 2);
}
} else {
//淡季
if(age>=18&&age<60) {
printf("淡季旺季年龄大18岁小于60岁 ¥40");
} else {
printf("其他年龄的时候票价:¥20");
}
}
getchar();
return 0;
}
设定月份是6月,年龄是16岁输出的结果如图5-13所示。
图5- 13 实例5-4输出结果
上述代码就是用到了if语句的嵌套,首先先根据季节做旺季和淡季的分支,判断之后再对年龄进行分支,这样就是先了案例的要求。
C 语言提供了另外一种多分支处理语句:switch 语句,它比if.....else if....else语句结构、层次结构上看起来更简单。但是它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。比如我输入一月份对应输出冬季,输入八月份输出夏季,通过下面的一段伪代码来描述:
如果月份等于1,输出冬季
如果月份等于2,输出冬季
如月份果等于3,输出夏季
......
对于刚学过if语句的我们来说,立马应该想到用if的多分支可以实现,但是判断较多,实现起来相对于swtich来说不简洁。既然我们说了swtich简洁的处理这个问题,那么接下来我们就来学习switch语句,看它怎么来实现我们的需求。
switch 语句的一般形式:
switch(表达式)
{
case 常量达式 1: 语句 1;
break;
case 常量达式 2: 语句 2; break;
……
case 常量表达式 n: 语句 n; break;
default: 语句 n+1;
}
说明:
(1)switch 小括号中表达式的运算结果必须是整数类型(包括字符类型),比如:long、int、short、char 等等。不能是 float 等其他类型。case 后面的字面量表达式运算结果也必须是整数类型。
(2)switch 下面的括号内是一个语句块。语句块中包含多个以 case 开头、break 结尾的行、最多一个以 default 开头的行出现在语句块的结束部分,并且只能出现一次。
(3)执行的过程:先执行switch后面括号的表达式,然后用此数值依次和各个case后面跟常量表达式进行比较。
(4)如果与常量表达式相等,就执行case后面的语句块,执行遇到break语句就退switch语句,如果没有break语句就继续执行下一个case的语句块,一直到遇到break语句或是”}”才退出switch语句。
(5)如果与常量表达式都不相等,则执行default后面的语句块,然后退出default,执行其他。
执行过程如下图5-14所示。
图5- 14 switch语句执行流程
#include
int main()
{
printf("请输入月份,会输出月份所对应的季节");
int month=8;
scanf("%d",&month);
printf("你输入的是%d月份,对应的季节是",month);
switch(month)
{
case 3:
printf("春天"); break;
case 4:
printf("春天"); break;
case 5:
printf("春天"); break;
case 6:
printf("夏天"); break;
case 7:
printf("夏天"); break;
case 8:
printf("夏天"); break;
case 9:
printf("秋天"); break;
case 10:
printf("秋天"); break;
case 11:
printf("秋天"); break;
case 12:
printf("冬天"); break;
case 1:
printf("冬天"); break;
case 2:
printf("冬天"); break;
default:
printf("月份错误"); break;
}
getchar();
return 0;
}
实例5- 5 使用 switch 实现输入月份对应输出季节。
运行的结果:如图 5-15所示。
图5- 15 实例5-5输出结果
上面的案例中,当表达式的值8与 case 后面的值相等时,就执行该 case 后面的语句,接着执行下一行的break,然后退出整个switch 语句
执行过程如下图所示5-16所示。
图5- 16 实例5-5 代码执行流程
在switch语句中只要有一个 break 语句被执行,就会直接结束整个 switch 语句块,
试验如果忘了写 break 会怎么样。
在switch语句中如果多个case的条件后面的代码是一样的,则该语句书写一次就可以了,这是一种简写的形式。
想一想,上一节的月份输出的案例可不可以优化一下呢?
实例5- 6 优化实例5-5。
#include
int main()
{
printf("请输入月份,会输出月份所对应的季节");
int month=8;
scanf("%d",&month);
printf("你输入的是%d月份,对应的季节是",month);
switch(month)
{
case 3:
case 4:
case 5:
printf("春天"); break;
case 6:
case 7:
case 8:
printf("夏天"); break;
case 9:
case 10:
case 11:
printf("秋天"); break;
case 12:
case 1:
case 2:
printf("冬天"); break;
default:
printf("月份错误"); break;
}
getchar();
return 0;
}
运行的结果:如图 5-17所示。
图5- 17 实例5-6输出结果
上述的案例中因为3-5月份的季节是春天,6-8月份对应的季节是夏天,9-11月份是秋季,1-2和12月份是冬季,其中月份case后面的代码是一样的,我们就可以只书写一次。
在C语言中有一种特殊的运算叫做三元运算有的书上也叫三目运算,它和if…else语句类似,具体语法格式如下:
判断条件 ? 表达式1 : 表达式; 这个运算符的符号是: ? :
执行过程如下图所示5-18所示。
图5- 18三元运算符
语义说明:
先执行表达式1,执行完毕,表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果,否则执行表达式3,运算式的结果是表达式3的结果。
实例5- 7 用if...else和三元运算实现求两个数最大值。
|
if…else语句 nt x = 10; int y = 99; int max; if (x > y) { max = x; } else { max = y; } 输出的结果:max=y |
三元运算 int x = 10; int y = 99; int max; max = x > y ? x : y;
输出的结果:max=y |
|
上述案例中分别是使用了if...else和三元运算分别实现了x和y最大值,结果都是max=y,说明了三元运算可以实现类似if...else这样的分支程序分支。