C语言流程控制
C语言中按照程序的执行程序的不同,分为顺序结构、分支结构、和循环结构。下面就用一个简单的案例来展示C语言的3种流程结构。
一、顺序结构
顺序结构是最简单的一种流程结构,它采用自上而下的方式逐条执行各语句。
#include<stdio.h>
int main()
{
int a,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函数以保留两位有效小数的方式将信息打印在控制窗口上。
二、分支结构
C语言的分支结构可以控制程序的部分流程是否执行,或是从多条执行路径中选择一条来执行。
1.if语句
格式:
if(表达式)
语句
小括号内的表达式为判断条件,当表达式的值为真时,执行语句;当表达式的值为假时,不执行语句。
代码:
#include<stdio.h>
int main()
{
int a,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部分,形成了二选一的流程 执行情形。
代码:
#include<stdio.h>
int main()
{
int a,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语句嵌套
通过对if…else语句的嵌套使用,就可以让程序实现除多选一的流程执行情形。
#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语句
它的执行流程和利用if…else语句嵌套的执行流程一样,完全可以认为if…else if…else语句就是对if…else语句嵌套的一种变形写法。
#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语句
通过它同样能实现多选一的效果,而且使代码的逻辑更加清晰。
#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(表达式)
语句
#include<stdio.h>
int main()
{
int i,n,score,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(表达式);
#include<stdio.h>
int main()
{
int i,n,score,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);
语句
#include<stdio.h>
int main()
{
int i,n,score,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.循环的嵌套使用
#include<stdio.h>
int main()
{
int n;
printf("Please enter a data!\n");
scanf("%d",&n);
for(int i=1;i <= n; ++i)
{
if(i % 2)
continue;
printf("%d ",i);
}
return 0;
}
外层for语句的循环中,除了一个内层的for语句外,还有一条printf函数调用语句,它会在内层for语句执行完毕(内层循环体被执行9次)后,进行一个换行的操作。
四、流程控制语句
1.continue语句
特点:
格式:
continue;
for(int i = 1; i <= 10; ++i)
{
if(i & 2)
continue;
printf("%d",i);
}
打印结果:
当变量i的值为奇数时,该表达式的值为真,这会导致continue语句被执行。一旦continue语句被执行,那么其后的printf函数调用语句就不再被执行。
2.break语句
对付死循环的利器。
要注意的点:
for(int i = 1; i <= 10; ++i)
{
if(i > 5)
break;
printf("%d",i);
}
结果:
3.return语句
return语句能够起到强制中止函数的功能,也就是在函数中如果有return语句被执行,即使后面还有其它语句,整个函数的执行流程也将结束。
#include<stdio.h>
int main()
{
printf("AA\n");
return 0;
printf("BB\n");
}
结果:
return语句必须在函数内使用,不论是在顺序结构、分支结构、还是循环结构,都会造成函数的执行流程被强制结束,如果被关闭的是主函数,则会导致整个程序的结束。