一、分支结构:if-else结构
情况一:
if (条件表达式){
执行语句;
}
int n =10;
int m = 12;
if(m>n){
System.out.println("m比n大");
}
情况二:二选一
if(条件表达式){
执行语句1;
}else{
执行语句2;
}
int age = 121;
if(age<18){
System.out.println("多看动画片!");
}else{
System.out.println("多看电影!");
}
情况三:多选一
if(条件表达式1){
执行语句1;
}else if(条件表达式2){
执行语句2;
}else if(条件表达式3){
执行语句3;
}
...
else{
执行语句n;
}
if(age<0){
System.out.println("数据非法");
}else if(age <18){
System.out.println("你未成年");
}else if(age <40){
System.out.println("正直壮年");
}else if(age<120){
System.out.println("老年");
}else{
System.out.println("修仙");
}
说明:
1. if(条件表达式)中的条件表达式必须是布尔表达式、布尔变量。else 结构是可选的。
2. 针对于条件表达式:
> 如果多个条件表达式之间是“互斥”关系(或没有交集的关系),哪个判断和执行语句声明在上面还是下面,无所谓。
> 如果多个条件表达式之间有交集的关系,需要根据实际情况,考虑清楚应该将哪个结构声明在上面。
> 如果多个条件表达式之间有包含的关系,通常情况下,需要将范围小的声明在范围大的上面。否则,范围小的就没机会执行了。
3. if-else结构是可以相互嵌套的。
4. 如果if-else结构中的执行语句只有一行时,对应的一对{}可以省略的。但是,不建议大家省略。
经典例题:由键盘输入三个整数分别存入变量num1、num2、num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出。
Scanner scan = new Scanner(System.in);
System.out.print("请输入第一个整数:");
int num1 = scan.nextInt();
System.out.print("请输入第二个整数:");
int num2 = scan.nextInt();
System.out.print("请输入第三个整数:");
int num3 = scan.nextInt();
if(num1>num2){
if(num2>num3){
System.out.println(num3);
System.out.println(num2);
System.out.println(num1);
}else{
System.out.println(num2);
System.out.println(num3);
System.out.println(num1);
}
}else if(num2>num1){
if(num1>num3){
System.out.println(num3);
System.out.println(num1);
System.out.println(num2);
}else {
if(num2>num3){
System.out.println(num1);
System.out.println(num3);
System.out.println(num2);
}else{
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
}
}
}
运行结果:
二、分支结构:switch-case选择结构
1.结构:
switch(表达式){
case 常量1:
执行语句1;
break;
case 常量2:
执行语句2;
break;
...
case 常量n:
执行语句n;
break;
default:
执行语句;
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结构是可选的,而且位置是灵活的。
特别说明:如果switch-case中case的几个执行语句都相同,那么前几个case的执行语句可以省略。
经典例题:
1.使用 switch 把小写类型的char型转为大写。只转换 a, b, c, d, e. 其它的输出 “other”。
Scanner scan = new Scanner(System.in);
System.out.print("请输入需要转化的字母:");
char alphabet = scan.next().charAt(0);
switch(alphabet){
case 'a':
System.out.println('A');
break;
case 'b':
System.out.println('B');
break;
case 'c':
System.out.println('C');
break;
case 'd':
System.out.println('D');
break;
case 'e':
System.out.println('E');
default:
System.out.println("other");
//break;
}
运行结果:
2.对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
int score = 61;
switch(score/60){
case 0:
System.out.println("不及格!");
break;
case 1:
System.out.println("及格");
break;
default:
System.out.println("成绩错误");
//break;
}
运行结果:
3.从键盘上输入2019年的“month”和“day”,要求通过程序 输出输入的日期为2019年的第几天。
Scanner scan = new Scanner(System.in);
System.out.print("请输入月份:");
int month = scan.nextInt();
System.out.print("请输入日期:");
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;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(month + "月" + day + "日,是2019年的第" + sumDays + "天" );
运行结果:
例题改进:从键盘分别输入年、月、日,判断这一天是当年的第几天 。
Scanner scan = new Scanner(System.in);
System.out.print("请输入年份:");
int year = scan.nextInt();
System.out.print("请输入月份:");
int month = scan.nextInt();
System.out.print("请输入日期:");
int day = scan.nextInt();
int sumDays = 0;
if((year % 4 ==0 && year % 100 != 0) || year % 400 == 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 += 29;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
}
else{
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(year + "年" + month + "月" + day + "日,是" + year + "年的第" + sumDays + "天" );
运行结果:
分支结构的选择:
①如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
②其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。也就是说,使用switch-case的,都可以改写为if-else。反之不成立。
三元运算符与分支结构选择:
①如果既可以使用三元运算符又可以使用if-else,那么优先使用三元运算符,因为三元运算符效率高。但是三元运算符一次只能有两个选择结构if-else结构域可以多选一
②如果既可以用switch-case又可以用if-else结构,那么优先使用switch-case,因为switch-case效率高。但是switch-case结构中表达式的只能使用六种数据类型,且不能是范围取值,所以如果范围教大优先使用if-else。