C语言流程控制
C语言中按照程序的执行程序的不同,分为 顺序结构、分支结构、和循环结构。下面就用一个简单的案例来展示C语言的3种流程结构。
一、顺序结构
顺序结构是最简单的一种流程结构,它采用自上而下的方式逐条执行各语句。
/*
* @file division.c
* @brief 求两个整数相除(要求结果保留两位有效小数)
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int a;
int b;
float quotient;
printf("Please enter two integer:\n");
scanf("%d%d", &a, &b);
quotient = (float)a / b;
printf("a / b = %.2f\n",quotient);
return 0;
}
程序在计算结果的时候,用到了类型转换运算符,它把int类型变量a的类型转换为float类型,这么做的目的是为了运算结果能得到一个拥有小数点的小数值。由于变量a被转换为float类型,所以变量b也会自动地转换为float类型,自然就会得到一个float类型的运算结果。并把这个结果赋值给了变量quotient。最后通过printf函数以保留两位有效小数的方式将信息打印在控制窗口上。
这个程序的执行流程为:
1.将标准库头文件“stdio.h”包含进来。
2.执行主函数。
3.定义两个int类型变量a和b。
4.定义float类型变量quotient。
5.使用printf函数打印一条提示信息。
6.使用scanf函数获取用户的输入,并保存到变量a和b中。
7.对a和b使用除法运算符进行运算,并将结果赋值给quotient。
8.使用printf函数打印最终结果
9.退出主函数,程序执行完毕
可以看出,整个程序是按照自上而下逐句执行的。
二、分支结构
C语言的分支结构可以控制程序的部分流程是否执行,或是从多条执行路径中选择一条来执行。
1.if语句
格式:
if(表达式)
语句
小括号内的表达式为判断条件,当表达式的值为真时,执行语句;当表达式的值为假时,不执行语句。
代码:
/*
* @file if_division.c
* @brief 通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int a;
int b;
float quotient;
printf("Please enter two integer:\n");
scanf("%d%d", &a, &b);
if (b)
{
quotient = (float)a / b;
printf("a / b = %.2f\n", quotient);
}
return 0;
}
除数为零
除数不为零
可以通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算。
if(b)与if(b!=0)它同样是判断变量b的值是否不等于0,而使用if(b)的方式会让代码显得更加简练。它们的 作用实际是一样的。
2.if…else语句
格式:
if(表达式)
语句1
else
语句2
if…else语句和if语句相比,多了else部分,形成了二选一的流程 执行情形。
代码:
/*
* @file if_division_1.c
* @brief 通过if语句来对除数为0的情况进行检查,只有除数不为0时,才会进行除法运算,除数为0时,打
* 印一条信息明确告知用户
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int a;
int b;
float quotient;
printf("Please enter two integer:\n");
scanf("%d%d",&a,&b);
if (b)
{
quotient = (float)a / b;
printf("a / b = %.2f\n",quotient);
}
else
{
printf("Data is error!\n");
}
return 0;
}
当除数不为0时,程序打印输出正常的结果,除数为0时,打印一条信息明确告知用户。
3.if…else语句嵌套
要求用户输入一个0到100的整数,以表示学生的考试分数,程序能根据这个分数评定出相应的等级,共有A,B,C,D四个等级,其中90分及以上为优秀(用A表示),80到89分为良好(用B表示),60到79分为及格(用C表示),60分以下为不及格(用D表示)。
/*
* @file if_division_2.c
* @brief 通过对if...else语句的嵌套使用,就可以让程序实现除多选一的流程执行情形。
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int score;
printf("Please enter a score between 0 and 100:\n");
scanf("%d", &score);
if ((score >= 0) && (score <= 100))
{
if (score >= 90)
{
printf("A\n");
}
else
{
if(score >= 80)
{
printf("B\n");
}
else
{
if(score >= 60)
{
printf("C\n");
}
else
{
printf("D\n");
}
}
}
}
else
{
printf("Data is error!\n");
}
return 0;
}
4.if…else if…else语句
/*
* @file if_division_3.c
* @brief 它的执行流程和利用if...else语句嵌套的执行流程一样,完全可以认为if...else if...else语句
* 就是对if...else语句嵌套的一种变形写法。
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int score;
printf("Please enter a score between 0 and 100:\n");
scanf("%d", &score);
if ((score >= 0) && (score <= 100))
{
if (score >= 90)
{
printf("A\n");
}
else if (score >= 80)
{
printf("B\n");
}
else if (score >= 60)
{
printf("C\n");
}
else
{
printf("D\n");
}
}
else
{
printf("Data is error!\n");
}
return 0;
}
5.switch…case语句
/*
* @file if_division_4.c
* @brief 通过它同样能实现多选一的效果,而且使代码的逻辑更加清晰。
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int score;
printf("Please enter a score between 0 and 100:\n");
scanf("%d", &score);
if ((score >= 0) && (score <= 100))
{
switch (score / 10)
{
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
case 6:
printf("C\n");
break;
default:
printf("D\n");
break;
}
}
else
{
printf("Data is error!\n");
}
return 0;
}
break
语句可以终止switch...case
语句语句的执行,如果在某处漏掉了必要的break
,则switch...case
语句不会被终止,程序会继续执行后面的语句,直到遇见break
语句或者代表整个switch...case
语句结束的右大括号。
整型表达式为score/10
,就是把原来0到100的分数,换算到0到10的范围。
default
标签可以放置在任何位置,甚至可以出现在所有case
标签之前,所以default
标签下的break
语句不要随意省略。
三、循环结构
C语言中的循环结构就是让语句能够重复、多次地被执行的一种流程结构。
1.while语句
格式:
while(表达式)
语句
/*
* @file while_aver.c
* @brief 计算n个学生的平均分
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int i;
int n;
int score;
int sum = 0;
float aver;
printf("Please enter the number of students:\n");
scanf("%d", &n);
printf("Please enter the scores of %d students:\n",n);
i = n;
while (i--)
{
scanf("%d", &score);
sum += score;
}
aver = (float)sum / n;
printf("Total:%d , Average:%.2f\n", sum, aver);
return 0;
}
在while
语句之前,通过i=n
,把变量n
的值赋给了变量i
,因为我们要保存好学生数量,后面计算平均分时还需要用到它。即while
语句中我们操作和修改的只是变量i
,不会对变量n
有影响。
在sum
变量定义时必须对它进行初始化的操作,即让变量sum
的初始值为0
,若不这样做的话,初始时sum
变量的值未知,即使将学生的成绩都累加进去,最终计算出的总分也不会正确。
2.do…while语句
do...while
语句和while
语句差不多,do...while
是先执行循环体,然后才去检查表达式的值。
格式:
do
语句
while(表达式);
/*
* @file do_while_aver.c
* @brief do...while计算n个学生的平均分
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int i;
int n;
int score;
int sum = 0;
float aver;
printf("Please enter the number of students:\n");
scanf("%d", &n);
printf("Please enter the scores of %d students:\n",n);
i = n;
do
{
scanf("%d", &score);
sum += score;
}while(--i);
aver = (float)sum / n;
printf("Total:%d , Average:%.2f\n", sum, aver);
return 0;
}
3.for语句
格式:
for(表达式1;表达式2;表达式3);
语句
表达式1 通常在此对循环变量进行初始化或赋值(初始化时执行一次)
表达式2 表达式的值为真时执行循环体,为假时结束for语句(循环体执行前)
表达式3 通常在此对循环变量进行修改、更新操作(循环体执行后)
如果表达式2被省略,则表示条件永远为真,这样它就变成了一个无限执行的循环,导致for语句无法结束,我们通常将这种无限执行的循环称之为死循环。
/*
* @file do_while_aver.c
* @brief for循环计算n个学生的平均分
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int i;
int n;
int score;
int sum = 0;
float aver;
printf("Please enter the number of students:\n");
scanf("%d", &n);
printf("Please enter the scores of %d students:\n",n);
for (i = 0; i < n; ++i)
{
scanf("%d",&score);
sum += score;
}
aver = (float)sum / n;
printf("Total:%d , Average:%.2f\n", sum, aver);
return 0;
}
4.循环的嵌套使用
/*
* @file for_even.c
* @brief 打印偶数
* @version 1.1 无
* @author 北豼
* @date 2022年1月28日
*/
#include<stdio.h>
int main()
{
int n;
int i;
printf("Please enter a data!\n");
scanf("%d", &n);
for (i=1; i <= n; ++i)
{
if (i % 2)
{
continue;
}
printf("%d ", i);
}
return 0;
}
四、流程控制语句
1.continue语句
特点:
1.只能用在循环结构的语句中
2.通常和if
语句搭配使用
3.一旦被执行,则会跳过其后的语句,直接进入下一次迭代
4.只会对包含它的循环起作用
格式:
continue;
for (int i = 1; i <= 10; ++i)
{
if (i & 2)
{
continue;
}
printf("%d", i);
}
打印结果:
2 4 6 8 10
当变量i
的值为奇数时,该表达式的值为真,这会导致continue
语句被执行。一旦continue
语句被执行,那么其后的printf函数调用语句就不再被执行。
2.break语句
对付死循环的利器。
要注意的点:
1.只能用在
switch...case
语句或循环结构的语句中
2.通常搭配if
语句使用
3.一旦被执行,则会强制中断流程,结束语句的执行
for (int i = 1; i <= 10; ++i)
{
if (i > 5)
{
break;
}
printf("%d", i);
}
结果:
1 2 3 4 5
3.return语句
return
语句能够起到强制中止函数的功能,也就是在函数中如果有return
语句被执行,即使后面还有其它语句,整个函数的执行流程也将结束。
#include<stdio.h>
int main()
{
printf("AA\n");
return 0;
printf("BB\n");
}
结果:
AA
return
语句必须在函数内使用,不论是在顺序结构、分支结构、还是循环结构,都会造成函数的执行流程被强制结束,如果被关闭的是主函数,则会导致整个程序的结束。