4级流程控制
前情回顾:在3级的时候,我们学习到的技能有:运算符的分类、运算符的优先级...
概念
什么是流程控制?
选择语句
if 单分支选择
if...else... 双分支选择
if...else if...else 多分支选择
switch 多分支选择
循环语句
for 语句
while 语句
do...while 语句
概念
什么是流程控制?
答:在C语言中,流程控制是指通过特定的语句和结构来控制程序的执行顺序,使程序能够按照预定的逻辑顺序运行,而不是简单地从头到尾顺序执行代码。
选择语句
if 单分支选择
基本形式如下:
if(表达式)
{
语句1;
语句2;
}
当表达式为真时,将进入if语句的语句块中,从头到尾按顺序执行语句;当表达式为假时,不进入if语句块。现在来写一个程序,了解if语句。
程序:
#include <stdio.h> int main()
{int a=5;if(a>2){printf("判断条件成立:");printf("a是大于2的数");} printf("\n");if(a) //等价于if(a>0) {printf("判断条件成立:");printf("a是大于0的数");}
}
结果:
当if语句块中只有一条语句时,简写格式为:
if(表达式) 语句;
#include <stdio.h> int main()
{int a=5;if(a<0) printf("我可能会出来哦\n");printf("我一定出来哦\n");
}
解析:printf("我可能会出来哦\n");属于if语句范围,而printf("我一定出来哦\n");不属于所以一定会执行
结果:
if...else... 双分支选择
基本形式如下:
if(表达式)
{
成立语句1;
成立语句2;
}else{
不成立语句1;
不成立语句2;
}
当表达式为真时,它只会进入第一个花括号{}的语句块里执行;当表达式为假时,它只会进入第二个花括号{}的语句块里执行。现在来写一个程序,来了解if..else语句。
程序:
#include <stdio.h> int main()
{int a=5;if(a<0){printf("判断条件成立:");printf("a是一个负数"); }else{printf("判断条件不成立:");printf("a是一个正数"); }
}
行结果:
当语句块中只有一条语句时,也有简写的格式:
if(表达式) 成立语句;
else 不成立语句;
#include <stdio.h> int main()
{int a=-2;if(a<0) printf("a是一个负数"); else printf("a是一个正数"); return 0;
}
结果:
if...else if...else 多分支选择
if
...else if...else 可以实现多种表达式进行选择,基本形式如下:
if(表达式1)
{
语句1-1;
语句1-2;
}else if(表达式2){
语句2-1;
语句2-2;
}else{
全不成立语句;
}
首先判断表达式1的结果是否成立,成立就执行,不成立就判断下一个表达式....如此往复,直到所有的表达式都不成立时,就执行else。根据这个特性,我们来写一个程序。
目的:输入成绩,查看成绩的评级
程序:
#include <stdio.h> int main()
{int score;printf("请输入你的成绩:");scanf("%d",&score);if(score>=90){ //当score>=90时成立 printf("优秀的成绩");}else if(score>=80){ //当 80<=score<90 时成立 printf("良好的成绩");}else if(score>=60){ //当 60<=score<80 时成立 printf("中等的成绩");}else{ // 当 score<60 时成立 printf("不及格!");}return 0;
}
结果:
观察每个都只执行一条语句,可以使用简写格式:
#include <stdio.h> int main()
{int score = 70;if(score>=90) printf("优秀的成绩"); else if(score>=80) printf("良好的成绩"); else if(score>=60) printf("中等的成绩"); else printf("不及格!"); return 0;
}
switch 多分支选择
switch
语句也是一种多分支选择结构,优点是结构清晰,基本格式:
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
// 可以有多个case
default:
// 默认代码块
}
可以看到switch使用了break,而break作用是跳出switch语句。在下面会详细讲解一下不使用break的情况。现在写个练习程序,了解switch语句。
目的:判断今天是星期几
程序:
#include <stdio.h> int main()
{int day;scanf("%d",&day);switch(day){case 1:printf("今天是星期一");break;case 2:printf("今天是星期二");break;case 3:printf("今天是星期三");break;case 4:printf("今天是星期四");break;case 5:printf("今天是星期五");break;case 6:printf("今天是星期六");break;case 7:printf("今天是星期天");break;default:printf("输入不正规!");}return 0;
}
执行顺序:首先定义一个int类型的变量day,用来存储数字。然后使用scanf函数让用户输入一个数字,并且用day存这个数。紧接着执行switch语句,假设此时day的值是5,则会进入case 5的代码块中执行,执行printf函数输出"今天是星期五",然后遇上了break。跳出了整个switch语句, 程序结束。
结果:
现在我们来了解假如不使用break的情况,如下面格式所示:
switch (expression) {
case value1: // 代码块1
case value2: // 代码块2
default:
// 默认代码块
}
假设此时expression值为value1,进入case1里面执行完代码块1,没有遇到break就往下执行代码块2(中间也不会判断expression值),然后一直往下执行,结束有两种情况:1、遇到break跳出2、执行完下面所有代码块。
大多数情况都是会使用break来跳出,而有时不使用break也能使代码更加简洁。现在我们来写一段程序。
目的:输入星期几,判断今天是工作日,还是休息日?
程序:
#include <stdio.h> int main()
{int day;scanf("%d",&day);switch(day){case 1:case 2:case 3:case 4:case 5:printf("今天是工作日");break;case 6:case 7:printf("休息日!!!"); }return 0;
}
程序思路:目前了解到星期1~星期5都是工作日,星期6~星期7都是休息日。它们之间具有连续共同特性,所以相邻之间可以不写代码,直接在队尾写代码并break跳出,即可使用多个case都执行一段相同代码,这减少了一大部分代码量。
结果:
注意事项:
switch语句中case 后面的常量必须是唯一的,也就是不能还在其他case出现。
case后可跟的常量值:如整型变量(case 1、case 0x01...)、字符常量(case 'a'、case 'A')、枚举常量、常量表达式(case 1+2、case 'b'-'a')
循环语句
for 语句
for语句用于重复执行一段语句块。通常会使用一个增量计数器递增和终止循环。常用于数组遍历等。其基本格式:
for(表达式1; 表达式2; 表达式3)
{
语句块
}
for语句的执行过程如下:
1.先执行表达式1
2.执行表达式2,若其值为真(非0),则执行 {} 括号中的语句块,否则将结束循环
3.每一次执行完语句块后,再执行表达式3
4.重复执行步骤 2 和 3,直到表达式2值为假(0),即循环结束
用流程图表示如下:
现在我们来写一个练习程序,了解一下for语句。
目的:求0~100的数累加的和
#include <stdio.h> int main()
{int sum=0;for(int i=0;i<=100;i++){sum += i;} printf("0~100的累加和=%d",sum);return 0;
}
注意:在for的循环过程中,只有当i<=100不成立时才结束循环,也就是i=101时
运行结果:
观察到for语言循环的语句只有一句,同样有简写格式
#include <stdio.h> int main()
{int sum=0;for(int i=0;i<=100;i++)sum += i;printf("0~100的累加和=%d",sum);return 0;
}
while 语句
while语句创建了一个循环,重复执行直到测试表达式为假或0。while语句是一种入口条件循环,也就是说,在执行多次循环之前已决定是否执行循环(这就是和下面do...while的区别)。因此,循环有可能不被执行。其基本格式:
while (表达式)
{
循环语句;
}
for语句等价while语句。现在我们将上面for语句实现的 求0~100数的累加的和 程序 改成while语句。代码:
#include <stdio.h> int main()
{int sum=0,i=0;while(i<=100){sum += i;i++; }printf("while实现:0~100的累加和=%d",sum);return 0;
}
结果:
执行顺序的流程图如下:
我们同样可以将其while语句实现的程序,进行简写格式,我们只需要稍微修改一下表达式即可,如下所示:
#include <stdio.h> int main()
{int sum=0,i=0;while(++i<=100)sum += i;printf("while实现:0~100的累加和=%d",sum);return 0;
}
解析:我们可以把i的自增放进while的表达式中,因为每次循环都会执行表达式,达到自增的效果。注意这里要使用前自增,因为我们需要i自增后的值来进行关系(<=100)的运算,而不是使用后自增。
do...while 语句
do...while 语句也是循环语句,对比while语句,只有一个区别:不管是否需要循环,那就是do...while语句中的循环体必定会执行一次!其基本格式:
do
{
循环体;
}while(表达式);
值得注意的是do...while语句的while后要加分号;
程序:
#include <stdio.h> int main()
{do{printf("我必定来一次!");}while(0);return 0;
}
结果:
可以看到,哪怕do...while语句的表达式一开始就是假,其循环体还是执行了一次,这也就do的原因。
牢记口诀:do...while语句,不管三七二十一,先do了再说!
在该系列中,文章的前部分采用简短的白话文讲解用法,而后部分采用更深入的角度讲解原理。思考是人类的结晶~如果你觉得有用,给我个点赞、收藏+关注哦~持续更新