c语言switch语言奖金提成

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

问题分析

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

c语言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 的结果是 0
  • 10000 <= sale < 20000 -> sale / 10000 的结果是 1
  • 20000 <= sale < 50000 -> sale / 10000 的结果是 234
  • 50000 <= sale < 100000 -> sale / 10000 的结果是 5, 6, 7, 8, 9
  • sale >= 100000 -> sale / 10000 的结果是 10 或更大

这样,问题就转化为了对 sale / 10000 这个整型表达式的判断。

c语言switch语言奖金提成
(图片来源网络,侵删)

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;
}

代码详解

  1. 变量定义:

    • double sale;: 销售额可能是小数,所以用 double 类型。
    • double bonus = 0;: 奖金同样用 double,并初始化为0,防止未定义行为。
    • int level;: 定义一个整型变量 level,它就是我们 switch 的判断依据。
  2. 输入:

    • 使用 scanf 从键盘获取用户输入的销售额,并存入 sale 变量。
  3. 核心转换:

    c语言switch语言奖金提成
    (图片来源网络,侵删)
    • level = (int)(sale / 10000); 这是整个程序的“灵魂”。
    • 它将销售额 sale 除以 10000,然后通过 (int) 强制类型转换,将结果截断为整数。
    • 如果 sale15000sale / 100005,强制转换为整数后 level 1switch 就会匹配 case 1
  4. switch 语句结构:

    • switch (level): 括号里是我们要判断的变量。
    • case 0:: 当 level 的值为 0 时执行的代码。
    • break;: 至关重要! break 语句会立即终止 switch 语句的执行,如果没有 break,程序会“穿透”(fall-through)并继续执行下一个 case 的代码,这通常不是我们想要的结果。
    • case 2: case 3: case 4:: 这种写法是一种优化。level2, 3, 4 中的任何一个,都会执行相同的代码块(计算10%的提成),避免了代码重复。
    • default:: default 是一个“默认”分支。level 的值不匹配任何一个 case 标签,程序就会执行 default 后面的代码,它完美地处理了 sale >= 100000 的情况。
  5. 输出:

    • 使用 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 语句强大功能和典型用法的绝佳范例。

-- 展开阅读全文 --
头像
织梦 typeid all
« 上一篇 01-02
dede建站如何实现多个首页模板切换?
下一篇 » 01-02

相关文章

取消
微信二维码
支付宝二维码

目录[+]