练习:使用 switch 语句实现幸运数字抽奖
1. 程序逻辑梳理
本程序模拟一个抽奖活动,参与者选择 1~10 之间的一个数字,程序通过 switch 判断该数字是否为幸运数字,并给出对应奖励提示。
核心流程:
- 提示用户输入 1~10 之间的整数
- 用
if校验输入有效性:若< 1或 > 10,将choice强制设为11` switch(choice)匹配幸运数字(7、2、8),未匹配则走default- 无效输入(
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. 运行结果示例
| 输入 | 匹配分支 | 输出内容 |
|---|---|---|
| 7 | case 7 | “恭喜你 !” + “你赢得了阿莫斯·格伦图克的作品集。” |
| 2 | case 2 | “你赢了折叠温度计笔手表伞。” |
| 8 | case 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)
Previous: switch
Next: 练习:使用 switch 判断 Y/N 确认输入