/* 分支结构之二:switch-case
1.格式 switch(表达式){ case 常量1: 执行语句1; //break;
case 常量2: 执行语句2; //break;
…
default: 执行语句n; //break;
}
2.说明: ① 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或此switch-case结构末尾结束为止。
② break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
③ switch结构中的表达式,只能是如下的6种数据类型之一:byte 、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)
④ case 之后只能声明常量。不能声明范围。
⑤ break关键字是可选的。
⑥ default:相当于if-else结构中的else. default结构是可选的,而且位置是灵活的。 */
class SwitchCaseTest { public static void main(String[] args) {
int number = 5; switch(number){ case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; case 3: System.out.println("three"); break; default: System.out.println("other"); //break; } String season = "summer"; switch (season) { case "spring": System.out.println("春暖花开"); break; case "summer": System.out.println("夏日炎炎"); break; case "autumn": System.out.println("秋高气爽"); break; case "winter": System.out.println("冬雪皑皑"); break; default: System.out.println("季节输入有误"); break; } //**************如下的两种情况都编译不通过********************* //情况一 /* boolean isHandsome = true; switch(isHandsome){ case true: System.out.println("我好帅啊~~~"); break; case false: System.out.println("我好丑啊~~~"); break; default: System.out.println("输入有误~~~"); } */ //情况二 /* int age = 10; switch(age){ case age > 18: System.out.println("成年了"); break; default: System.out.println("未成年"); } */ }}
例题 /* 例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
说明:如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。 */ class SwitchCaseTest1 { public static void main(String[] args) {
/* int score = 78; switch(score){ case 0: case 1: case 2: ... case 100: } */ /* int score = 78; if(score >= 60){ }else{ } */ int score = 78; switch(score / 10){ case 0: case 1: case 2: case 3: case 4: case 5: System.out.println("不及格"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("及格"); break; } //更优的解决方案: switch(score / 60){ case 0: System.out.println("不及格"); break; case 1: System.out.println("及格"); break; } }}
/* 编写程序:从键盘上输入2019年的“month”和“day”,要求通过程序输出输入的日期为2019年的第几天。
2 15: 31 + 15
5 7: 31 + 28 + 31 + 30 + 7
…
说明:break在switch-case中是可选的 */ import java.util.Scanner; class SwitchCaseTest2 { public static void main(String[] args) {
Scanner scan = new Scanner(System.in); System.out.println("请输入2019年的month:"); int month = scan.nextInt(); System.out.println("请输入2019年的day:"); int day = scan.nextInt(); //定义一个变量来保存总天数 int sumDays = 0; //方式一:冗余 /* if(month == 1){ sumDays = day; }else if(month == 2){ sumDays = 31 + day; }else if(month == 3){ sumDays = 31 + 28 + day; }else if(month == 4){ sumDays = 31 + 28 + 31 + day; } //... else{//month == 12 //sumDays = ..... + day; } */ //方式二:冗余 /* switch(month){ case 1: sumDays = day; break; case 2: sumDays = 31 + day; break; case 3: sumDays = 31 + 28 + day; break; ... } */ switch(month){ case 12: sumDays += 30; case 11: sumDays += 31; case 10: sumDays += 30; case 9: sumDays += 31; case 8: sumDays += 31; case 7: sumDays += 30; case 6: sumDays += 31; case 5: sumDays += 30; case 4: sumDays += 31; case 3: sumDays += 28; case 2: sumDays += 31; case 1: sumDays += day; } System.out.println("2019年" + month + "月" + day + "日是当年的第" + sumDays + "天"); }}
/* 从键盘分别输入年、月、日,判断这一天是当年的第几天
注:判断一年是否是闰年的标准: 1)可以被4整除,但不可被100整除 或 2)可以被400整除
说明:
凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多), 又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。*/ import java.util.Scanner; class SwitchCaseExer { public static void main(String[] args) {
Scanner scan = new Scanner(System.in); System.out.println("请输入year:"); int year = scan.nextInt(); System.out.println("请输入month:"); int month = scan.nextInt(); System.out.println("请输入day:"); int day = scan.nextInt(); //定义一个变量来保存总天数 int sumDays = 0; switch(month){ case 12: sumDays += 30; case 11: sumDays += 31; case 10: sumDays += 30; case 9: sumDays += 31; case 8: sumDays += 31; case 7: sumDays += 30; case 6: sumDays += 31; case 5: sumDays += 30; case 4: sumDays += 31; case 3: //sumDays += 28; //判断year是否是闰年 if((year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0){ sumDays += 29; }else{ sumDays += 28; } case 2: sumDays += 31; case 1: sumDays += day; } System.out.println(year + "年" + month + "月" + day + "日是当年的第" + sumDays + "天"); }} if和switch语句很像,具体什么场景下,应用哪个语句呢? 如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。 也就是说,使用switch-case的,都可以改写为if-else。反之不成立。