CC++ & Algorithm

switch多分支语句

困难6
语言版本:C++
概述:用“自动售货机”的比喻,教大家如何用switch语句让程序快速做出多个选择。

用自动售货机的方式做多选一:switch语句

想象你站在一台自动售货机前,投币后按下按钮(比如A3),机器立刻把对应的薯片推出来。如果按了不存在的按钮,它就显示“没这个商品”。在C++中,switch语句就是这样一台“自动售货机”:你给它一个值,它根据这个值立刻跳转到对应的“商品”(代码块)去执行。

switch专门用来处理多分支选择,比如:

  • 输入数字1~7,输出今天是星期几。
  • 根据考试成绩的等级(A、B、C、D)给出不同评语。
  • 根据你选择的零食编号(1代表巧克力,2代表薯片……),输出价格。

如果用if-else写这种逻辑,代码会变成一长串“如果……否则如果……”的阶梯,既不好看也不好改。switch让代码清晰又高效。

switch语句的“机关”结构

switch的基本语法就像这样:

switch (表达式) {
    case 常量1:
        语句1;
        break;   // 跳出switch,不再往下执行
    case 常量2:
        语句2;
        break;
    // 可以有很多case
    default:
        默认语句;
        break;
}

每个零件的作用:

  • 表达式:一个整型或字符型的值(比如int daychar grade)。注意:不能是浮点数(如3.14)或字符串。
  • case 常量:你预想的“按钮”。如果表达式的值等于这个常量,就执行它后面的语句。
  • break:执行完当前case后,告诉程序“可以离开switch了”。没有break,程序会继续往下执行下一个case(这叫“穿透”)。
  • default:相当于“其他”按钮。如果所有case都不匹配,就执行default里的内容。可以省略,但建议加上,能处理意外输入。

注意:每个case后面的常量必须是唯一的,不能有两个相同的case值。比如不能同时写case 1:case 1:

生活中的多选一:实战例子

1. 星期几的美食计划(保留原有示例,增加注释)

#include <iostream>
using namespace std;

int main() {
    int day;         // 存储用户输入的星期几
    cout << "请输入今天是星期几(1-7):";
    cin >> day;

    switch (day) {
        case 1:
            cout << "星期一:吃面条" << endl;
            break;
        case 2:
            cout << "星期二:吃饺子" << endl;
            break;
        case 3:
            cout << "星期三:吃汉堡" << endl;
            break;
        case 4:
            cout << "星期四:吃披萨" << endl;
            break;
        case 5:
            cout << "星期五:吃炸鸡" << endl;
            break;
        case 6:    // 这里没有break!会穿透到case 7
        case 7:
            cout << "周末:吃大餐!" << endl;  // case 6和7共用这一行
            break;
        default:
            cout << "输入错误,没有这一天" << endl;
            break;
    }

    return 0;
}

2. 零食自动售货机

#include <iostream>
using namespace std;

int main() {
    int choice;      // 用户选择的零食编号
    cout << "自动售货机——请选择零食编号(1=巧克力,2=薯片,3=可乐):";
    cin >> choice;

    switch (choice) {
        case 1:
            cout << "巧克力 5元,好吃又补充能量!" << endl;
            break;
        case 2:
            cout << "薯片 3元,咔嚓咔嚓真脆!" << endl;
            break;
        case 3:
            cout << "可乐 2元,冰爽一夏!" << endl;
            break;
        default:
            cout << "没有这个编号,请重新输入" << endl;
            break;
    }

    return 0;
}

小心“穿透”现象 —— 有时是好帮手,有时是坑

当某个case后面没有break时,执行完这个case的代码后,不会跳出switch,而是继续执行下一个case的代码,直到遇到break或switch结束。这叫case穿透

什么时候利用穿透?
当多个不同值需要执行同一段代码时,可以把它们叠在一起,就像上面的case 6和case 7。再比如,输入成绩等级'A'、'B'、'C'都算“及格”,可以这样写:

char grade;    // 存储成绩等级
cout << "请输入成绩等级(A/B/C/D):";
cin >> grade;

switch (grade) {
    case 'A':
    case 'B':
    case 'C':
        cout << "及格,继续加油!" << endl;
        break;
    case 'D':
        cout << "不及格,需要补考。" << endl;
        break;
    default:
        cout << "等级输入错误" << endl;
        break;
}

什么时候是bug?
如果你忘记写break,每个case之间应该独立执行,却发生了穿透,就会导致错误。比如,某同学的代码:

switch (day) {
    case 1:
        cout << "星期一" << endl;
        // 忘记写break!
    case 2:
        cout << "星期二" << endl;
        break;
    ...
}

如果输入1,会输出“星期一”和“星期二”两行,因为执行完case 1后直接掉进了case 2。所以大多数情况下每个case最后都要写break,除非你故意要穿透。

新手常犯的错误

  1. 忘记break —— 导致穿透,程序行为不符合预期。
  2. case常量重复 —— 编译会报错。比如两个case 1:
  3. 表达式类型用错 —— switch只支持整型(int, char, short, long, bool等)和枚举(enum),不支持浮点数(double, float)或字符串(string)。
  4. case后面跟变量或表达式 —— case后面必须是常量(字面值或const常量),不能是变量或计算式。比如case a:是错误的(a是变量)。
  5. 遗漏default —— 如果所有case都不匹配,程序会跳过整个switch,没有提示。最好加上default处理意外输入。

完整可运行示例:成绩等级评价

下面是一个结合switch和用户输入的完整程序,用成绩分数判断等级(要求输入整数,用if先转换范围,然后switch输出评语):

#include <iostream>
using namespace std;

int main() {
    int score;       // 存储考试分数(0~100)
    int level;       // 等级编号:1优秀,2良好,3中等,4及格,5不及格

    cout << "请输入你的考试分数(0~100):";
    cin >> score;

    // 先判断分数属于哪个等级
    if (score >= 90 && score <= 100) {
        level = 1;
    } else if (score >= 80 && score < 90) {
        level = 2;
    } else if (score >= 70 && score < 80) {
        level = 3;
    } else if (score >= 60 && score < 70) {
        level = 4;
    } else if (score >= 0 && score < 60) {
        level = 5;
    } else {
        level = 0;  // 非法分数
    }

    // 用switch输出评语
    switch (level) {
        case 1:
            cout << "优秀!真棒!" << endl;
            break;
        case 2:
            cout << "良好!继续进步!" << endl;
            break;
        case 3:
            cout << "中等,还要加把劲。" << endl;
            break;
        case 4:
            cout << "及格了,危险边缘!" << endl;
            break;
        case 5:
            cout << "不及格,需要补考。" << endl;
            break;
        default:
            cout << "分数输入无效,请输入0~100之间的整数。" << endl;
            break;
    }

    return 0;
}

这个例子展示了switch最常用的场景:用整数做多分支。注意,这里switch的表达式是level,一个整型变量。

课后小练习

用switch写一个程序,输入数字1~5,分别输出“优秀”、“良好”、“中等”、“及格”、“不及格”。(提示:直接用数字做判断即可,不用先转换。)

相关知识点指引

  • if-else分支结构:switch只能做“等于”判断,而if可以判断范围、条件组合。当分支多且都是相等判断时,switch更清晰。
  • 逻辑运算符 && 和 ||:配合if可以实现复杂条件,比如判断分数在某个区间。
  • break语句:不仅用于switch,还用于循环(for、while)中提前跳出。
  • 枚举类型:如果case常量很多,且都是相关的固定值,可以用枚举给它们起个名字,让代码更可读。

掌握了switch,你的程序就能像自动售货机一样快速响应各种选择,是不是很酷?快去试试吧!

例题精讲

1单选题

在C++中,switch语句的表达式(即括号内的变量)必须是什么类型?

A只能是整型(int)
B可以是整型、字符型或枚举类型
C只能是整型和字符型
D可以是任何类型,包括浮点型和字符串
2判断题

在C++的switch语句中,每个case分支的末尾必须写break语句,否则程序会报错。

3填空题
以下代码根据输入数字x输出对应单词,请补充使当x=1时只输出"One",x=2时只输出"Two",不能发生穿透:\nswitch(x) {\n  case 1: cout << "One"; ___\n  case 2: cout << "Two"; ___\n}
4单选题

关于switch语句中的default关键字,以下说法正确的是?

Adefault必须放在所有case之后
Bdefault可以放在switch内的任何位置,且不影响执行顺序
Cdefault必须放在switch的开头
Ddefault只能出现一次,且必须放在最后
5判断题

在C++中,switch的case标签后面可以跟变量名,例如:case n: 是合法的。