问题分析
我们需要明确业务逻辑,奖金提成是根据员工的销售额(或业绩)分不同档次来计算的。switch 语句最适合处理这种基于固定区间或固定值的分支逻辑。

(图片来源网络,侵删)
假设我们公司的奖金提成规则如下:
| 销售额 (元) | 提成比例 |
|---|---|
sale < 10000 |
0% |
10000 <= sale < 20000 |
5% |
20000 <= sale < 50000 |
10% |
50000 <= sale < 100000 |
15% |
sale >= 100000 |
20% |
核心思路:如何用 switch 处理区间?
switch 语句本身不能直接处理像 sale >= 10000 && sale < 20000 这样的范围判断,它的判断对象是一个整型表达式或枚举类型,我们需要一个技巧:将连续的区间离散化,映射到几个固定的整数值上。
观察我们的销售额区间,我们可以将销售额除以一个基数(例如10000),然后利用整数除法的特点,将不同的区间映射到不同的 case 标签上。
sale < 10000->sale / 10000的结果是010000 <= sale < 20000->sale / 10000的结果是120000 <= sale < 50000->sale / 10000的结果是2或3或450000 <= sale < 100000->sale / 10000的结果是5,6,7,8,9sale >= 100000->sale / 10000的结果是10或更大
这样,问题就转化为了对 sale / 10000 这个整型表达式的判断。

(图片来源网络,侵删)
C 语言代码实现
下面是完整的 C 语言代码,包含了详细的注释。
#include <stdio.h>
int main() {
double sale; // 销售额,使用 double 类型以支持小数
double bonus = 0; // 奖金,初始为0
int level; // 用于 switch 判断的等级
// 1. 提示用户输入销售额
printf("请输入员工的销售额(单位:元):");
scanf("%lf", &sale);
// 2. 将销售额映射到等级 (level)
// 使用整数除法,将连续的区间映射到离散的整数值
level = (int)(sale / 10000); // 将 sale/10000 的结果强制转换为整型
// 3. 使用 switch 语句计算奖金
switch (level) {
case 0:
// sale < 10000
bonus = sale * 0.0;
break; // 必须使用 break 来跳出 switch,否则会继续执行下一个 case
case 1:
// 10000 <= sale < 20000
bonus = sale * 0.05;
break;
case 2:
case 3:
case 4:
// 20000 <= sale < 50000
// 当 sale/10000 的结果是 2, 3, 4 时,都执行同一段代码
bonus = sale * 0.10;
break;
case 5:
case 6:
case 7:
case 8:
case 9:
// 50000 <= sale < 100000
// 当 sale/10000 的结果是 5, 6, 7, 8, 9 时,都执行同一段代码
bonus = sale * 0.15;
break;
default:
// sale >= 100000
// default 处理所有未被上面 case 捕获的情况
bonus = sale * 0.20;
break;
}
// 4. 输出结果
printf("根据销售额 %.2f 元,应得奖金为:%.2f 元\n", sale, bonus);
return 0;
}
代码详解
-
变量定义:
double sale;: 销售额可能是小数,所以用double类型。double bonus = 0;: 奖金同样用double,并初始化为0,防止未定义行为。int level;: 定义一个整型变量level,它就是我们switch的判断依据。
-
输入:
- 使用
scanf从键盘获取用户输入的销售额,并存入sale变量。
- 使用
-
核心转换:
(图片来源网络,侵删)level = (int)(sale / 10000);这是整个程序的“灵魂”。- 它将销售额
sale除以 10000,然后通过(int)强制类型转换,将结果截断为整数。 - 如果
sale是15000,sale / 10000是5,强制转换为整数后level1。switch就会匹配case 1。
-
switch语句结构:switch (level): 括号里是我们要判断的变量。case 0:: 当level的值为0时执行的代码。break;: 至关重要!break语句会立即终止switch语句的执行,如果没有break,程序会“穿透”(fall-through)并继续执行下一个case的代码,这通常不是我们想要的结果。case 2: case 3: case 4:: 这种写法是一种优化。level是2,3,4中的任何一个,都会执行相同的代码块(计算10%的提成),避免了代码重复。default::default是一个“默认”分支。level的值不匹配任何一个case标签,程序就会执行default后面的代码,它完美地处理了sale >= 100000的情况。
-
输出:
- 使用
printf格式化输出销售额和计算出的奖金。%.2f表示输出一个浮点数,并保留两位小数,适合货币计算。
- 使用
运行示例
示例 1: 销售额在 1 万到 2 万之间
请输入员工的销售额(单位:元):15000
根据销售额 15000.00 元,应得奖金为:750.00 元
- 计算:
15000 / 10000 = 1.5->level = 1-> 匹配case 1->bonus = 15000 * 0.05 = 750。
示例 2: 销售额在 5 万到 10 万之间
请输入员工的销售额(单位:元):75000
根据销售额 75000.00 元,应得奖金为:11250.00 元
- 计算:
75000 / 10000 = 7.5->level = 7-> 匹配case 7->bonus = 75000 * 0.15 = 11250。
示例 3: 销售额超过 10 万
请输入员工的销售额(单位:元):120000
根据销售额 120000.00 元,应得奖金为:24000.00 元
- 计算:
120000 / 10000 = 12->level = 12-> 不匹配任何case-> 执行default->bonus = 120000 * 0.20 = 24000。
使用 switch 语句计算奖金提成是一个非常棒的方法,它有以下优点:
- 逻辑清晰: 将复杂的区间判断转换成了简单的整数匹配,代码结构一目了然。
- 可读性强: 相比于多个
if-else if-else语句嵌套,switch的结构在处理这种多分支情况时更易于阅读和维护。 - 性能较好: 在某些编译器和架构上,
switch语句(特别是基于跳转表的实现)可能比一长串的if-else判断效率更高。
这个案例是理解 switch 语句强大功能和典型用法的绝佳范例。
