一、本章目标
- 掌握switch选择结构
- 能够综合运用if选择结构和switch选择结构解决问题
二、内容
1 swith 选择结构
1.1 为什么使用switch选择结构
问题:
韩嫣参加计算机编程大赛
- 如果获得第一名,将参加麻省理工大学组织的1个月夏令营
- 如果获得第二名,将奖励惠普笔记本电脑一部
- 如果获得第三名,将奖励移动硬盘一个
- 否则,不给任何奖励
public class Compete {
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("没有任何奖励");
}
}
}
问题:看上去比较麻烦,可以使用switch进行简化
1.2 什么switch选择结构
语法
switch (表达式) {
case 常量 1:
语句;
break;
case 常量 2:
语句;
break;
…
default:
语句;
break;
}
![](https://images0.cnblogs.com/blog/773205/201507/101408047838754.png)
过程
- 先计算并获得switch后面小括号里表达式或变量的值
- 然后将计算结果顺序与每个case后的常量比较,当二者相等,执行这个case块中的代码
- 当遇到break,就跳出switch选择结构,执行switch后面的代码
- 如果没有任何一个case后的常量与switch后的小括号中的值相等,则执行switch末尾部分的default块中的代码
注意:
- switch、case、default、break都是java的关键字
- switch:表示“开关”,这个开关就是switch关键字后面括号里的值,小括号里要放一个整型变量(表达式)或字符型变量(表达式)或字符串(jdk1.7)
- case:表示“情况、情型),case后必须是一个整型、字符型或字符串型的常量。如8、'a'、'hello'。case可块可以有多个,顺序可以改变量,但是每个case后常量的值必须不相同。
- default:表示“默认”,即其他情况都不满足。default后要紧跟冒号。default块和case块的先后顺序可以变动。通常default发起人放在末尾,也可以省略
- break:表示“停止”,即跳出当前结构
1.3 如何使用switch选择结构
解决上面的问题
public class Compete2 {
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;
}
}
}
如果省略break
public class Compete3 {
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("没有任何奖励");
}
}
}
注意
- 没有break,程序就会按顺序往下执行。即当某个case后的常量值与switch后小括号中的值相匹配时,执行该case块代码,后面的case块就不再进行条件判断,而直接执行后面所有case块中代码,直到遇到case结事。所以case块后要加break,用来跳出switch选择结构。
- 还可以让多个case执行同一条语名。比如,下面代码:当变量为1、3、5时,输出“奇数”,当变量为2、4、6时,输出“偶数”
public class WeekDay{
public static void main(String[] args) {
String day = "星期一";
switch (day){
case "星期一":
System.out.println("星期一:青菜 ");
break;
case "星期二":
System.out.println("星期二:鱼 ");
break;
case "星期三":
System.out.println("星期三:鱼 ");
break;
case "星期四":
System.out.println("星期四:鱼 ");
break;
case "星期五":
System.out.println("星期五:鱼 ");
break;
default:
System.out.println("自助餐 ");
break;
}
}
}
1.4 switch常见错误
- 如果需要每个case执行完后跳出,在每个case后不要忘记写break;
int mingCi = 1;
switch (mingCi){
case 1:
System.out.println("参加麻省理工大学组织的1个月夏令营");
case 2:
System.out.println("奖励惠普笔记本电脑一部");
case 3:
System.out.println("奖励移动硬盘一个");
default:
System.out.println("没有任何奖励 ");
}
- case后面的常量必须各不相同
int mingCi = 1;
switch (mingCi){
case 1:
System.out.println("参加麻省理工大学组织的1个月夏令营");
case 2:
System.out.println("奖励惠普笔记本电脑一部");
case 2:
System.out.println("奖励移动硬盘一个");
default:
System.out.println("没有任何奖励 ");
}
1.5 补充 switch 后面括号里为字符串
这是JDK1.7特性
public class case7 {
public static void main(String[] args) {
String name="zhangsan";
switch (name) {
case "lisi":
System.out.println("my name is "+name);
break;
case "zhangsan":
System.out.println("My Name is "+name);
break;
default:
break;
}
}
}
如果这个程序报错,可以在MyEclipse进行如下设置,即让程序以jdk1.7进行编译
项目右键-->properties
![](https://images0.cnblogs.com/blog/773205/201507/101408056432327.png)
1.6 技能训练:菜单跳转
需求
使用switch选择结构实现从登录菜单切换到主菜单功能
- 输入数字1:进行主菜单
- 输出数字2:退出并显示“谢谢您的使用!”
- 输出其他数字:显示“输入错误”
![](https://images0.cnblogs.com/blog/773205/201507/101408059715526.jpg)
![](https://images0.cnblogs.com/blog/773205/201507/101408063939697.jpg)
实现思路
- 使用数字标识菜单号
- 获取用户输入的数字
- 执行相应的操作
解决方案
public class LoginMenu {
/*
* 显示我行我素购物管理系统的登录菜单
*/
public static void main(String[] args) {
System.out.println(" 欢迎使用我行我素购物管理系统 ");
System.out.println(" 1. 登 录 系 统 ");
System.out.println(" 2. 退 出 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.print("请选择,输入数字:");
/* 从键盘获取信息,并执行相应操作---新加代码 */
Scanner input = new Scanner(System.in);
int num = input.nextInt();
switch (num) {
case 1:
/* 显示系统主菜单 */
System.out.println(" 欢迎使用我行我素购物管理系统 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.println(" 1. 客 户 信 息 管 理 ");
System.out.println(" 2. 购 物 结 算 ");
System.out.println(" 3. 真 情 回 馈 ");
System.out.println(" 4. 注 销 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.print("请选择,输入数字:");
break;
case 2:
/* 退出系统 */
System.out.println("谢谢您的使用!");
break;
default:
System.out.println("输入错误。");
break;
}
}
}
2 选择结构的总结
2.1 if选择结构
- 基本if选择结构: 处理单一或组合条件的情况
- If-else选择结构:处理简单的条件分支情况
- 多重if选择结构:处理复杂的条件分支情况
- 嵌套if选择结构:用于较为复杂的流程控制
2.2 switch选择结构
- 多重分支并且条件判断是等值判断的情况
2.3 if与switch
- 能使用switch的地方,肯定可以使用if
- switch只能在“等值判断”的情形中
3 处理系统异常
3.1 input.hasNextInt()==true
public class LoginMenu {
/*
* 显示我行我素购物管理系统的登录菜单
*/
public static void main(String[] args) {
System.out.println(" 欢迎使用我行我素购物管理系统 ");
System.out.println(" 1. 登 录 系 统 ");
System.out.println(" 2. 退 出 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.print("请选择,输入数字:");
/* 从键盘获取信息,并执行相应操作---新加代码 */
Scanner input = new Scanner(System.in);
if(input.hasNextInt()){
int num = input.nextInt();
switch (num) {
case 1:
/* 显示系统主菜单 */
System.out.println(" 欢迎使用我行我素购物管理系统 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.println(" 1. 客 户 信 息 管 理 ");
System.out.println(" 2. 购 物 结 算 ");
System.out.println(" 3. 真 情 回 馈 ");
System.out.println(" 4. 注 销 ");
System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * ");
System.out.print("请选择,输入数字:");
break;
case 2:
/* 退出系统 */
System.out.println("谢谢您的使用!");
break;
default:
System.out.println("输入错误。");
break;
}
}else {
System.out.println("输入错误。");
}
}
}
注:
这个知识点主要训练学生养成良好的编程习惯,即所有的输入数据,不能一开始就默认它符合我们数据规范,而应该认为它不符合我们数据规范,然后我们如何处理这些数据,即如何给用户一个友好的提示。
4、技能训练:实现商品换购
需求:
商场推出“换购优惠”,规则如下:
![](https://images0.cnblogs.com/blog/773205/201507/101408070185340.jpg)
思路
- 实现换购时,需要先判断消费金额是否满足选择的换购项目
- 综合应用if语句和switch语句
实现
public class ConsumeSavePlan {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入消费金额:");
double money = input.nextDouble();
double extra = 0; //换购付款
int choice = 0; //换购项目
if(money>=50){
System.out.println("是否参加优惠换购活动:");
System.out.println("1:满50元,加2元换购百事可乐饮料1瓶");
System.out.println("2:满100元,加3元换购500ml可乐一瓶");
System.out.println("3:满100元,加10元换购5公斤面粉");
System.out.println("4:满200元,加10元可换购1个苏泊尔炒菜锅");
System.out.println("5:满200元,加20元可换购欧莱雅爽肤水一瓶");
System.out.println("0:不换购");
System.out.print("请选择:");
if(input.hasNextInt()==true){
choice = input.nextInt();
switch(choice){
case 1:
if(money>=50){
extra = 2;
}
break;
case 2:
if(money>=100){
extra = 3;
}
break;
case 3:
if(money>=100){
extra = 10;
}
break;
case 4:
if(money>=200){
extra = 10;
}
break;
case 5:
if(money>200){
extra = 20;
}
break;
default:
break;
}
}else{
System.out.println("请输入正确的数字!");
}
}
//结账
double total = money + extra;
System.out.println("本次消费总金额:"+ total);
if(choice == 1){
System.out.println("成功换购:" + "百事可乐饮料1瓶。");
}else if(choice ==2 ){
System.out.println("成功换购:" + "500ml可乐一瓶。");
}else if(choice == 3){
System.out.println("成功换购:" + "5公斤面粉。");
}else if(choice == 4){
System.out.println("成功换购:" + "1个苏泊尔炒菜锅。");
}else if(choice == 5){
System.out.println("成功换购:" + "欧莱雅爽肤水一瓶。");
}else {
System.out.println("无换购项目!");
}
}
}
关注我们
![](https://images0.cnblogs.com/blog/773205/201507/101408086117351.jpg)
良师益友工作室一直在致力于帮助编程爱好更加快速方便地学习编程,如果您对我们的成果表示认同并且觉得对你有所帮助,欢迎您对我们捐赠^_^。
![](https://images0.cnblogs.com/blog/773205/201507/101408096112179.jpg)