本节书摘来自华章出版社《C语言程序设计与实践(第2版)》一书中的第2章,第2.2节,作者:凌云等著,更多章节内容可以访问云栖社区“华章计算机”公众号查看
2.2 分支语句
2.2.1 if语句
例2-2中程序的功能是统计C语言程序设计课程期末考试各分数段的人数。按照五级制统计可分成以下几档:
90~100 A
80~89 B
70~79 C
60~69 D
0~59 E
要求输出各分数段的具体人数。
例2-2 用if语句统计各分数段的人数。
#include <stdio.h>
/* 统计各分数段人数*/
int main()
{
int score, i;
int grade[5];
for (i = 0; i < 5; i++)
grade[i] = 0; /* 各分数段人数初始值设置为0 */
printf("请输入第一位学生的成绩:\n"); /* 在屏幕上输出提示信息 */
scanf("%d", &score); /* 调用scanf函数输入第一位学生的成绩 */
while (score != -1) /* 当score等于-1时退出循环 */
{
if (score >= 0 && score < 60)
grade[0]++; /* 成绩为E的人数加1 */
else if (score >= 60 && score < 70)
grade[1]++; /* 成绩为D的人数加1 */
else if (score >= 70 && score < 80)
grade[2]++; /* 成绩为C的人数加1 */
else if (score >= 80 && score < 90)
grade[3]++; /* 成绩为B的人数加1 */
else if (score >= 90 && score <= 100)
grade[4]++; /* 成绩为A的人数加1 */
else
printf("输入的成绩非法\n");
printf("请输入下一位学生的成绩(输入-1表示结束输入):\n");
scanf("%d", &score); /* 调用scanf函数输入下一位学生的成绩 */
}
printf("各分数段的人数分别如下:\n");
for (i = 0; i < 5; i++)
printf("%d\n", grade[i]); /* 输出各分数段的人数 */
return 0;
}
在程序的控制过程中,我们通常会对满足不同条件的数据进行不同的处理,在例2-2中,程序要求根据不同的输入进行数据的统计,其中用于成绩人数分布统计的语句就是一组if语句。
在C语言程序中经常会采用如下模式来表示多路判定:
if (条件1)
语句1
else if (条件2)
语句2
...
else
语句n
这就是C语言中的if语句。在if语句中,各个条件从前往后依次求值,直到满足某个条件,这时执行对应的语句部分,执行完毕后,整个if结构结束。注意:其中语句1~n中的任何语句都可以是括在花括号中的若干条语句。如果其中没有一个条件满足,那么就执行位于最后一个else之后的语句。如果没有最后一个else及对应的语句,那么这个if结构就不执行任何动作。在第一个if与最后一个else之间可以有0个或多个else if (条件)
语句
就风格而言,我们建议读者采用缩进格式。
2.2.2 switch语句
C语言中的多路分支,也可以用switch语句完成。例2-2中的if语句完全可以用switch语句替换,替换后的程序如例2-3所示。
例2-3 用switch语句统计各分数段的人数。
#include <stdio.h>
/* 统计各分数段人数*/
int main()
{
int score, i;
int grade[5];
int index;
for (i = 0; i < 5; i++)
grade[i] = 0; /* 各分数段人数初始值设置为0 */
printf("请输入第一位学生的成绩:\n"); /* 在屏幕上输出提示信息 */
scanf("%d", &score); /* 调用scanf函数输入第一位学生的成绩 */
while (score != -1) /* 当score等于-1时退出循环 */
{
if (score < 0 || score > 100)
printf("输入的成绩非法\n");
else
{
index = score < 60 ? 0 : 1 + (score – 60) / 10;
switch (index)
{
case 0:
grade[0]++; /* 成绩为E的人数加1 */
break;
case 1:
grade[1]++; /* 成绩为D的人数加1 */
break;
case 2:
grade[2]++; /* 成绩为C的人数加1 */
break;
case 3:
grade[3]++; /* 成绩为B的人数加1 */
break;
case 4:
case 5:
grade[4]++; /* 成绩为A的人数加1 */
break;
default:;
}
}
printf("请输入下一位学生的成绩(输入-1表示结束输入):\n");
scanf("%d", &score); /* 调用scanf函数输入下一位的学生成绩 */
}
printf("各分数段的人数分别如下:\n");
for (i = 0; i < 5; i++)
printf("%d\n", grade[i]); /* 输出各分数段的人数 */
return 0;
}
其中加粗斜体显示的switch语句完成了例2-2中的if…else…语句的功能。switch语句的通用用法如下:
switch(表达式)
{
case 表达式1:语句1
case 表达式2:语句2
...
case 表达式n:语句n
default: 语句n+1
}
执行switch语句时,先计算表达式的值,然后依次与表达式1~表达式n的值进行比较。如果与某一个表达式的值匹配,就执行其后的所有语句,如果没有与任何一个表达式匹配成功,则执行default后面的语句n+1。default语句也可以不出现,如果不出现,则语句不执行任何动作。