练习:使用 switch 语句实现幸运数字抽奖

练习:使用 switch 语句实现幸运数字抽奖

1. 程序逻辑梳理

本程序模拟一个抽奖活动,参与者选择 1~10 之间的一个数字,程序通过 switch 判断该数字是否为幸运数字,并给出对应奖励提示。

核心流程:

  1. 提示用户输入 1~10 之间的整数
  2. 用 if 校验输入有效性:若 < 1 或 > 10,将choice强制设为11`
  3. switch(choice) 匹配幸运数字(7、2、8),未匹配则走 default
  4. 无效输入(choice == 11)时,先执行 case 11 的提示,然后穿透到 default 输出失败信息

2. 完整代码

#include <stdio.h>

int main(void)
{
  int choice = 0;                 /* 选择的数字 */

  /* 获取用户输入的数字 */
  printf("\n选一个介于1到10之间的数字,你可能会中奖! ");
  scanf("%d", &choice);

  /* 检查输入的值是否有效 */
  if((choice > 10) || (choice < 1))
    choice = 11;                  /* 如果无效 就把它设置为11 下面根据11 进行提示 */

  switch(choice)
  {
    case 7:
      printf("\n恭喜你  !");
      printf("\n你赢得了阿莫斯·格伦图克的作品集。");
      break;                      /* 跳到块的末尾 */

    case 2:
      printf("\n你赢了折叠温度计笔手表伞。");
      break;                      /* 跳到块的末尾 */

    case 8:
      printf("\n你赢得了阿司匹林片的终身供应。");
      break;                      /* 跳到块的末尾 */

    case 11:
      printf("\n尝试在1到10之间。你猜错了。");
      /* 没有中断-所以继续下一个语句(穿透到 default)*/

    default:
      printf("\n对不起,你输了。\n");
      break;             /* 防御性 break */
  }
  return 0;
}Code language: PHP (php)

3. 运行结果示例

输入匹配分支输出内容
7case 7“恭喜你 !” + “你赢得了阿莫斯·格伦图克的作品集。”
2case 2“你赢了折叠温度计笔手表伞。”
8case 8“你赢得了阿司匹林片的终身供应。”
11(输入 0 或 15)case 11 → 穿透 → default“尝试在1到10之间。你猜错了。” + “对不起,你输了。”
3(非幸运数字)default“对不起,你输了。”

4. 核心要点解析

要点说明
输入校验技巧​无效输入不报错退出,而是将 choice 设为 11,利用 case 11 + default 穿透统一处理
故意穿透​case 11 省略 break,让执行流自然落入 default,实现”提示+失败”两条信息连续输出
default 的 break​虽非必须(已在末尾),但写上属于防御性编程,防止后续有人在 default 后新增 case 导致意外穿透
多语句 case​case 7 中包含两个 printf 调用,无需额外 {} 包裹(整个 switch 块本身就是作用域),但加 {} 更规范

5. 注意事项与改进建议

问题一:case 11 穿透可能造成困惑

对阅读代码的人而言,容易误以为是遗漏了 break。可改为更明确的写法:

case 11:
    printf("\n尝试在1到10之间。你猜错了。\n");
    break;
default:
    printf("\n对不起,你输了。\n");
    break;Code language: JavaScript (javascript)

问题二:无效输入提示与失败信息重复

输入 0 时输出”你猜错了”+”你输了”,语义略有重复。可调整文案使其更自然。

改进版本(推荐):

#include <stdio.h>

int main(void)
{
    int choice = 0;
    printf("\n选一个介于1到10之间的数字,你可能会中奖! ");
    scanf("%d", &choice);

    switch(choice)
    {
        case 7:
            printf("\n恭喜你!你赢得了阿莫斯·格伦图克的作品集。\n");
            break;
        case 2:
            printf("\n你赢了折叠温度计笔手表伞。\n");
            break;
        case 8:
            printf("\n你赢得了阿司匹林片的终身供应。\n");
            break;
        default:
            if(choice < 1 || choice > 10)
                printf("\n输入无效!请在1到10之间选择。\n");
            printf("\n对不起,你输了。\n");
            break;
    }
    return 0;
}Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注