用if-else语句可以实现二分支和多分支结构。
1、二分支结构和if-else语句
二分支结构主要有两种形式,流程图如下,即if-else语句和省略else的if语句。
图(a)是if-else语句实现,其一般形式为:
if (表达式)语句1;else语句2;
该语句的执行流程:先求解表达式,如果表达式的值为“真”,就执行语句1;否则(即表达式的值为“假”),就执行语句2。语句1和语句2总要执行一个,且只执行一个。
图(b)是用省略else的if语句实现的,该语句的一般形式是:
if (表达式)语句1;
其执行流程:先求解表达式,如果表达式的值为“真”,就执行语句1;否则(表达式的值为“假”),则什么也不做。
例1:奇偶分家。
奇偶分家。输入一个正整数n,再输入n个非负整数,统计奇数和偶数各有多少个?
#include <stdio.h>int main(void){int count_odd, count_even, i, n, number;count_odd = 0;/*count_odd记录奇数的个数*/count_even = 0;/*count_even记录偶数的个数*/printf("Enter n:");scanf("%d", &n);printf("Enter %d numbers:", n);/*提示输入n个数*/for (i=1; i<=n; i++){scanf("%d", &number);if (number%2 != 0){/*若number除以2的余数不是0,则为奇数*/count_odd++;/*统计奇数的个数*/} else {count_even++;/*统计偶数的个数*/}}printf("Odd:%d, Even:%d\n", count_odd, count_even);return 0;}
运行效果:
Enter n:6‾\underline{6}6
Enter 6 numbers:23 34 324 44 2 23
Odd:2, Even:4
这里使用的就是图(a)的if-else语句,输入的6个非负整数中间可以加空格,也可以后回车键。
例2:计算平均分
统计指定数量学生的平均成绩与不及格人数。输入一个非负整数n,再输入n个学生的成绩,计算平均分,并统计不及格成绩的学生人数。
#include <stdio.h>int main(void){int count, i, n;/*count记录不及格成绩的个数*/ double score, total;/*score存放输入的成绩,total保存成绩之和*/printf("Enter n:");scanf("%d", &n);total = 0;count = 0;for (i=1; i<=n; i++){printf("Enter score #%d:", i);/*提示输入第i个成绩*/scanf("%lf", &score);/*输入第i个成绩*/total = total+score;/*累加成绩*/ if (score < 60){/*统计不及格成绩的学生人数*/count++;}}if (n != 0){printf("Average = %.2f\n", total/n);/*分母不能为0*/} else {printf("Average = %.2f\n", 0.0);/*当n为0时,平均分为0*/}printf("Number of failures = %d\n", count);return 0;}
运行效果:
Enter n:4
Enter score #1:45
Enter score #2:67
Enter score #3:87
Enter score #4:34
Average = 58.25
Number of failures = 2
该段程序的分支结构使用的是图(b)的省略else的if语句。C语言中除数不能为0,要注意变量做除数时分母不能为0。
2、多分支结构和else-if语句
else-if语句是最常用的多分支结构,这是if-else语句的级联用法,其一般形式为:
if (表达式1)语句1;else if (表达式2)语句2;...else if (表达式n-1)语句n-1;else语句n;
其流程图如下:
执行流程:首先求解表达式1,如果表达式1的值为“真”,则执行语句1,并结束整个if语句的执行,否则,求解表达式2......最后的else处理给出条件都不满足的情况,即表达式1、表达式2......表达式n-1的值都为“假”时,执行语句n。
例1:猜数游戏
输入你猜的整数(假定1~100),与计算机产生的被猜数比较,若相等,显示猜中;若不相等,显示与被猜数的大小关系。
int main(void){int mynumber = 38;/*计算机指定被猜的数*/int yournumber;printf("Input your number:");/*提示输出你所采的整数*/scanf("%d", &yournumber);if (yournumber == mynumber){/*若相等,显示猜中*/printf("Good Guess!\n");} else if (yournumber > mynumber){/*若不等,比较大小*/printf("Too big!\n");} else {printf("Too small!\n");} return 0;}
运行效果:
Input your number:35
Too small!
Input your number:38
Good Guess!
这里使用了else-if语句来判断多路分支。多路分支只执行一路。
例2:阶梯水费
分段计算居民的水费。按以下公式计算水费,增加了用水量x小于0的情况,确保程序运行时出现误输入的情况,放置计算出错。
y=f(x)={0x<04x30≤x≤152.5x−10.5x>15y=f(x) = \begin{cases}0 & x<0 \\ \frac{4x}{3} & 0\leq x \leq 15 \\ 2.5x-10.5 & x > 15 \end{cases} y=f(x)=⎩⎪⎨⎪⎧034x2.5x−10.5x<00≤x≤15x>15
#include <stdio.h> int main(void){double x, y;printf("Enter x:");scanf("%lf", &x);/*输入double型数据用%lf*/if (x < 0){y = 0;/*满足x<0*/} else if (x <= 15){y = 4*x/3;/*不满足x<0,但满足x<=15,即满足0<=x<=15*/} else{y = 2.5*x-10.5;/*既不满足x<0,也不满足x<=15,即满足x>15*/}printf("f(%.2f) = %.2f\n", x, y);return 0;}
运行结果:
Enter x:-0.8
f(-0.80) = 0.00
Enter x:4.6
f(4.60) = 6.13
Enter x:43.21
f(43.21) = 97.53
参考 C语言程序设计(第4版)/何钦铭,颜晖
例题及课后习题参考程序/sgxgitee/mooc-c