本章工作任务
实现购物菜单选择功能
实现换购功能
本章技能目标
掌握 switch 选择结构
能够综合运用 if 选择结构和 switch 选择结构解决问题
本章简介
上一章学习了基本的 if 选择结构、多重 if 选择结构和嵌套 if 选择结构,能够使用 if 选择结构解决分支问题。
本章将在上一章课程的基础上学习 switch 选择结构,并对选择结构的各种实现形式进行总结,进一步理解和掌握每种选择结构的用法和适用场合。另外,培养大家思考程序中可能发生的异常状况,并对于可能出现的问题进行处理,如输出相应的信息、给用户友好的提示。通过对异常状况的考虑和处理,增加程序的健壮性。
预习作业
指导:请按以下步骤预习本章内容:
1. 阅读、学习本章内容。
2. 标注出本章看不懂或存在疑惑的部分。
3. 整理、记录学习中的问题。
4. 熟记本章的英文单词。
1.背诵英文单词
请在预习时找出下列单词在教材中的用法,了解它们的含义和发音。
(1) case [keɪs]: n. 情况;实例;箱;案例;机箱。
(2) switch [swɪtʃ]: n. 开关;转变;交换机;
(3) default [dɪˈfɔːlt,ˈdiːfɔːlt]:n. 违约,拖欠;系统默认值;常规做法;缺席
(4) exit [ˈeksɪt,ˈeɡzɪt]:n. 出口,通道;退场vi. 退出;离去
(5) consume [kənˈsuːm]:vt. 消耗,消费;使…着迷;挥霍vi. 耗尽,毁灭;耗尽生命
(6) exception [ɪkˈsepʃn]:n. 例外;异议
2.预习并回答以下问题
请阅读本章内容,在作业本上完成以下简答题。
(1) switch 选择结构的语法和执行顺序是什么?
(2) switch 选择结构和多重 if 选择结构在使用上有什么区别?
(3) 阅读以下代码,并写出输出结果。
public static void main(String [ ] args) { int day = 3; switch(day){ case 1: System, out .printin ( "学钢琴 ! ” ); break; case 2: System.out.printin ("学英语!"); default: System. out. printin ( ,’休息哦!"); } }
3. 预习并完成编码题
(1) 编写并完成本章中所有示例代码。
(2) 请使用 Java 语言编写代码,完成以下功能。
为手机设置单键拨号功能,按 1 表示爸爸的手机号码,按 2 表示妈妈的手机号码,按其他数字提示"按键错误"。
4.1 技术内容
4.1.1 为什么使用 switch 选择结构
问题:韩嫣参加计算机编程大赛:
如果获得第一名,将参加麻省理工大学组织的一个月夏令营;
如果获得第二名,将奖励惠普笔记本电脑一部;
如果获得第三名,将奖励移动硬盘一个;
否则,没有任何奖励。
分析:这个问题可以用多重 if 选择结构来解决。的确,使用多重 if 选择结构完全可以解决,代码如示例 1 所示。
示例1:
package cn.jbit.ifdemo; public class Complete { public static void main(String[] args) { int mingCi = 3; //名次 if (mingCi == 1) { System.out.println("参加麻省理工大学计算机学院组织1个月夏令营"); } else if (mingCi == 2) { System.out.println("奖励hp笔记本一部"); } else if (mingCi == 3) { System.out.println("奖励移动硬盘一部"); } else { System.out.println("没有任何奖励"); } } }
示例 1 解决了这个问题,可是看上去很烦琐。这个问题跟前面的问题比起来有什么不同?显然,这个问题是等值的判断,之前的问题是区间判断。对此 Java 提供了另一种结构,可以方便地解决等值判断问题,这就是 switch 选择结构。
4.1.2 什么是 switch 选择结构
switch 选择结构可以更好地解决等值判断问题。
语法:
switch (表达式) { case 常量1: //代码块1; break; case 常量2: //代码块2; break; …… default: //代码块n; break; }
这里switch、case、default、break都是Java的关键字。
解释:switch 选择结构用到了四个关键字,下面将——介绍。
switch:表示“开关”,这个开关就是switch关键字后面小括号里表达式的值,JDK1.7后,switch语句小括号里可以是int、short、byte、char、枚举类型、String类型表达式。
case:表示“情况、情形”,case后可以是int、short、byte、char、枚举、String类型,通常是一个固定的值。case块可以有多个,顺序可以改变,但是每个case后常量的值必须各不相同。
default:表示“默认”,即其他情况都不满足。default后要紧跟冒号。default块和case块的先后顺序可以变动,不会影响程序执行的结果。通常,default块放在末尾,也可以省略。
break:表示“停止”,即跳出当前结构。
知道了switch 选择结构的语法,那么它的执行过程是怎样的呢?具体如下所述。
先计算并获得 switch 后面小括号里的表达式或变量的值,然后将计算结果顺序与每个 case 后的常量比较,当二者相等时,执行这个 case 块中的代码;当遇到 break 时,就跳出 switch 选择结构,执行 switch 选择结构之后的代码。如果没有任何一个 case 后的常量与 switch 后的小括号中的值相等,则执行 switch 末尾部分的default 块中的代码。
4.1.3 如何使用 switch 选择结构
了解了 switch 选择结构的语法及它的执行过程之后,下面就来用 switch 选择结构解决等值判断的问题,具体代码如示例 2 所示。
示例2
package cn.jbit.ifdemo; public class Complete2 { public static void main(String[] args) { int mingCi = 1; //名次 switch (mingCi){ case 1: System.out.println("参观麻省理工大学计算机学院组织1个月夏令营"); break; case 2: System.out.println("奖励hp笔记本一部"); break; case 3: System.out.println("奖励移动硬盘一部"); break; default: System.out.println("没有任何奖励"); break; } } }
程序运行结果如图 4.1 所示。
可见,括号中的 mingCi 的值为 1 , 与第一个 case 块中的常量值匹配,因此执行它后面的代码,输出"参加麻省理工大学组织的 1 个月夏令营",然后执行语句 "break;", 执行结果是跳出整个 switch选择结构。
与示例 1 比起来,示例 2 看起来更清晰一些,它们完成的功能其实是完全一样的。但是,并非所有的多重 if 选择结构都可以用 switch 选择结构代替。通过观察,可以看出, switch 选择结构的条件只能是等值的判断,而且只能是整型或字符型的等值判断。也就是说, switch 选择结构只能用于判断一个整型变量或表达式是否等于某个整数值的情况,或者一个字符型变量或表达式是否等于某个字符的情况,并且每一个 case 后面的常量值都不同。而多重 if 选择结构既可以用于判断条件是等值的情况,也可以用于判断条件是区间的情况。
如果这里省略了break,结果会怎样呢?运行示例 3, 观察结果。
示例3
package cn.jbit.ifdemo; public class Complete3 { public static void main(String[] args) { int mingCi = 1; switch (mingCi){ case 1: System.out.println("参观麻省理工大学计算机学院组织1个月夏令营"); case 2: System.out.println("奖励hp笔记本一部"); case 3: System.out.println("奖励移动硬盘一部"); default: System.out.println("没有任何奖励"); } } }
程序运行结果如图 4.2 所示。
图 4.1 示例 2 的运行结果 图 4.2 示例 3 的运行结果
虽然 break 语句是可以省略的,但是省略后会带来一些问题。省略 break 的后果如下:当某个 case后的常量值与 switch 后小括号中的值相匹配时,执行该 case 块的代码,后面的 case 就不再进行条件判断,而直接执行后面所有 case 块中的代码,直到遇到 break 结束。所以在编写 switch 选择结构时不要忘记在每个 case 块后加上一个 “break;”, 用来跳出 switch 选择结构。
注意:
每个case后的代码块可以有多个语句,即可以有一组语句,而且不需要用“括起来。case和default后都有一个冒号,不能漏写,否则编译不通过。对于每个case的结尾,都要想一想是否需要从这里跳出整个switch选择结构。如果需要,一定不要忘记写“break;”。
在case后面的代码块中,break语句是可以省略的,还可以让多个case执行同一语句。例如,在下面的代码中,当变量day的值为1、3、5时,都将输出“奇数!”;当变量day的值为2、4、6时,都将输出“偶数!”。
int day = 1; switch (day){ case 1: case 3:
case 5:
System.out.println("奇数!"); break; case 2:
case 4:
case 6:
System.out.println("偶数!"); break; }
小结:到此,大家会发现多重 if 选择结构和 switch 选择结构很相似,它们都是用来处理多分支条件的结构,但是 switch 选择结构只能用于等值条件判断的情况。
4.2 技能训练1
上机练习1
指导——升级“我行我素购物管理系统”,实现购物菜单的选择功能
需求说明
“我行我素购物管理系统”各菜单级联结构如图 4.3 所示。
图 4.3 “我行我素购物管理系统”各菜单级联结构
使用 switch 选择结构实现从登录菜单切换到主菜单功能。
输入数字 1; 进入主菜单。
输入数字 2: 退出并显示"谢谢您的使用!",如图 4.4 所示。
输入其他数字:显示“输入错误”。
图 4.4 输入数字 2 的运行结果
实现思路及关键代码
(1) 使用数字标识所选择的菜单号:1 为登录系统,2 为退出。
(2) 从控制台获取用户输入的数字。
(3) 根据用户选择的菜单号,执行相应的操作。
使用 switch 选择结构来实现,代码如下。
switch (num) { case 1: //输出系统主菜单 case 2: //输出“谢谢您的使用” default: //输出“输入错误” }
(4) 实现系统主菜单的相关代码已经在第 1 章上机练习 4 中实现,可以直接粘贴过来使用。
参考解决方案
package cn.jbit.ifdemo; import java.util.Scanner; public class LoginMenu2 { /* * 显示我行我素购物管理系统的登录菜单 */ public static void main(String[] args) { System.out.println("\n\t\t欢迎使用我行我素购物管理系统\n"); System.out.println("\t\t\t 1. 登 录 系 统\n"); System.out.println("\t\t\t 2. 退 出\n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * *\n"); System.out.print("请选择,输入数字:"); /* 从键盘获取信息,并执行相应操作---新加代码 */ Scanner input = new Scanner(System.in); int num = input.nextInt(); switch (num) { case 1: /* 显示系统主菜单 */ System.out.println("\n\t\t欢迎使用我行我素购物管理系统\n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * \n"); System.out.println("\t\t\t\t 1. 客 户 信 息 管 理\n"); System.out.println("\t\t\t 2. 购 物 结 算\n"); System.out.println("\t\t\t 3. 真 情 回 馈\n"); System.out.println("\t\t\t 4. 注 销\n"); System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * \n"); System.out.print("请选择,输入数字:"); break; case 2: /* 退出系统 */ System.out.println("谢谢您的使用!"); break; default: System.out.println("输入错误。"); break; } } }
小技巧:在程序开发过程中,需要考虑使程序具有较高的容错性。例如,这里已实现了输入 “1”或 “2” 时所执行的操作,如果用户错误地输入了其他数字,那么程序该做出怎样的反应呢?上述代码就考虑了这个问题,发生这种情况时会输出“输入错误”,友好地提示用户。不然,用户只看到程序结束了,不知道到底发生了什么。