Java学习第4天:分支结构

二、程序流程控制

流程控制语句是用来控制程序中各语言执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
三种基本流程结构:

顺序结构

程序从上到下逐行执行,中间没有任何判断和跳转。

分支结构

根据条件,选择性地执行某段代码。
有if-else和switch-case两种分支语句。

循环结构

根据循环条件,重复性的执行某段代码。
有while、do……while,for三种循环语句
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。

if-else

所有三元运算符都可以用if-else结构替代,if-else不一定能改成三元运算符。
如果既可以使用三元运算符又可以使用if-else,优先选用三元运算符。原因:简洁、执行效率高。
例如,3个数取最大值
class SanYuan{
public static void main(String[] args){
int n1=12;
int n2=30;
int n3=-43;
int max=((n1>n2?n1:n2)>n3)?(n1>n2?n1:n2):n3;//不建议这么写,可读性差
System.out.println("The max of n1 n2 n3 is " + max);
int max1,max2;
if(n1>n2){
max1=n1;
} else{
max1=n2;
} if(max1>n3){
max2=max1;
} else{
max2=n3;
}
System.out.println("The max of n1 n2 n3 is " + max2);
}
}

if语句三种结构(条件判断结构):

1、if(条件表达式){执行代码块} //只有一种选择
2、if(条件表达式){执行代码块1} else {执行代码块2} //二选一
3、if(条件表达式){执行代码块1} else if(条件表达式2){执行代码块2} else{执行代码块3} 多选一,中间可以多个elseif

&和&&的异同

都是且的关系
左边true,右边都执行
左边false,短路与后面不执行,逻辑与后面执行

Scanner类

从键盘获取不同类型的变量,char型的获取,Scanner没有提供相关办法,只能获取一个字符串。
当输入的值和获取的类型不一致时会报错。
具体实现步骤:
1、导包:import java.util.Scanner;写在类的上面,类Scanner在包util下。
2、Scanner的实例化,Scanner scan=new Scanner(System.in);
3、调用Scanner类的相关方法获取指定类型的变量,int num=scan.nextInt();

例1:

输入一个整数并输出。
import java.util.Scanner;
class Scan{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println("The input number is "+i);
}
}
javac Scanner.java 
$ java Scan
88
The input number is 88

例2:

输入字符串。
import java.util.Scanner;
class ScannerString{
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
System.out.println("请输出你的名字:n");
String userName = sc.next();
System.out.println("欢迎"+userName+"登录系统");
}
}
$ javac ScannerString.java
$ java ScannerString
请输出你的名字:

lisi
欢迎lisi登录系统

例3:

输入期末考试成绩,100分降落宝马,80-99奖励手机,60-80奖励玩具,不及格什么都没有。
import java.util.Scanner;
class IfTest{
public static void main(String[] args){
int score;
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩,在0到100之间");
score=scan.nextInt();
if(score == 100){
System.out.println("奖励一辆BMW");
}else if(score < 100 && score > 80){
System.out.println("奖励一个手机");
}else if(score >= 60 && score <= 80){
System.out.println("奖励一个玩具");
                }
else{
System.out.println("什么都没有");
}
}
}
说明
1、else结构是可选的。
2、针对条件表达式:如果多个条件表达式之间是“互斥”关系,哪个判断在上面或下面都无所谓;如果有交集,应该考虑清楚哪个条件应该在上面;如果条件表达式之间有包含关系,需要将范围小的声明在上面,否则小的永远不会执行,因为if else只有一个出口。

例4:

输入3个整数,按小到大输出排序。
import java.util.Scanner;
class SortTest{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("Please insert the first number");
int num1 = scan.nextInt();
System.out.println("Please insert the second number");
                int num2 = scan.nextInt();
System.out.println("Please insert the third number");
                int num3 = scan.nextInt();
if(num1 > num2){
if(num2 > num3){
System.out.println(num3 + "," + num2 + "," + num1);
}else if(num3 > num1){
System.out.println(num2 + "," + num1 + "," + num3);
} else{
System.out.println(num2 + "," + num3 + "," + num1);
      }
} else {
if(num1 > num3){
                System.out.println(num3 + "," + num1 + "," + num2);
                }else if(num3 > num2){
                System.out.println(num1 + "," + num2 + "," + num3);
                } else{
                System.out.println(num1 + "," + num3 + "," + num2);
                      }
}
}
}
$ java SortTest
Please insert the first number
1000
Please insert the second number
0
Please insert the third number
888
0,888,1000
说明:
1、if-else可以互相嵌套,不过一遍不要嵌套3层以上,3层以上自己就晕了。
2、if-else 后面如果只有一行执行语句,可以省略{},一般不建议省略.
Java用法:
String isHandsome=scan.next();
if(isHandsome.equals("是"))

switch-case

结构switch(表达式){
case 常量1:

语句1;
//break;

case 常量2;

语句2;
//break;

case 常量N:

语句N;
//

default:

语句;
//break;

}
分支结构之二:switch-case
说明:
1、根据switch表达式中的值,依次匹配各个case中的常量,一旦匹配成功,会进入相应case中,调用其执行语句。当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句,直到遇到break关键字或到switch-case结构末尾为止结束,后面的case条件不会做判断。

例子:

class SwitchCase{
public static void main(String[] args){
int num1=2;
switch(num1){
case 0:
System.out.println("zero");
case 1:
                        System.out.println("one");
case 2:
                        System.out.println("two");
case 3:
                        System.out.println("three");
default:
System.out.println("others");
}
}
}
$ java SwitchCase
two
three
others
2、break可以用在switch-case结构中,表示一旦执行到次关键字就跳出switch-case结构
3、switch结构中的表达式,只能是如下6中数据类型之一:byte、short、char、int、枚举类型(JDK5.0新增)、String类型(JDK7.0新增)。
4、case后面只能声明常量,不能是范围值。
5、break关键字是可选的,不是必须加的,绝大多数情况都需要加。
6、default相当于if-else中的else,default选项是可选的,而且位置是灵活的,通常放到最后。

例1

switch-case判断成绩,小于60输出不合格,大于等于60输出合格。
class Test{
public static void main(String[] args){
int score=78;
switch(score/60){
case 0:
System.out.println("不及格");
break;
case 1:
System.out.println("及格");
break;
default:
System.out.println("输入值有误");
break;
}
}
}

例2:

输入年月日,计算出是第几天
import java.util.Scanner;
class Date{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份");
int years = scan.nextInt();
System.out.println("请输入月份,1-12");
int months = scan.nextInt();
System.out.println("请输入日期,1-31");
int days = scan.nextInt();
int sum=0;
switch(months){
case 12:
sum += 30;
case 11:
sum += 31;
case 10:
sum += 30;
case 9:
sum += 31;
case 8:
sum += 31;
case 7:
sum += 30;
case 6:
sum += 31;
case 5:
sum += 30;
case 4:
sum += 31;
case 3:
//判断是否闰年
if((years % 4 == 0 && years % 100 != 0)||(years % 400 == 0)){
sum += 29;
}else{
sum += 28;
}
case 2:
sum +=31;
case 1:
sum +=days;
System.out.println(years + "年" + months + "月" + days + "日" + "是当年的第" + sum + "天");
break;
default:
System.out.println("月份输入错误");
}
}
}
$ java Date
请输入年份
2019
请输入月份,1-12
12
请输入日期,1-31
31
2019年12月31日是当年的第365天

总结:

1、凡是可以使用switch-case的结构都可以转换为if-else。反之,不成立。
2、当我们写分支结构时,我们发现既可以使用switch-case,case取值不太多,又可以使用if-else时,优先选择使用switch-case。原因:switch-case执行效率稍高。

上一篇:用户定义函数UDF


下一篇:MaxCompute SQL开发基础