# 【選擇結構】
##### 今日復習指南
~~~
1.if語句(1個小時內完成,80%的內容搞定,switch的重要程度比if要低):
(1)第一種格式:Demo01If.java
(2)第二種格式:Demo04IfElseMax.java 獲取兩個int數字最大值
(3)第三種格式:Demo03IfElseIfElseScore.java 判斷成績的區間,給出獎勵的
? ? ? ?
2.switch語句(半個小時內完成,20%的內容搞定):
Demo02SwitchMonth.java 練習根據數字判斷輸出月份
? ? ? ?
~~~
##### 今日內容
~~~
順序結構【了解】
選擇結構之if【重點之重點:應用】
選擇結構之switch【重點:應用】
?
修改類/包的名稱:
? ?1.右鍵/Refactor/Rename
? ?2.快捷鍵: shift + f6
? ?3.直接修改class關鍵字后面的名稱,alt+回車-->Rename file
?
創建包/類/模塊的快捷鍵: alt + insert
? ?有的筆記本電腦insert鍵位的使用需要按住fn鍵
? ?有的筆記本電腦上的insert鍵被簡寫成ins
? ?
自動補全代碼: ctrl + shift + 回車
? ?
向下換行: shift + 回車
? ?
向上換行: ctrl + alt + 回車
~~~
## 第一章 流程控制
##### 1.1 流程控制分類
~~~
流程:簡單來講所謂流程就是完成一件事情的多個步驟組合起來就叫做一個流程
注意: 在一個程序執行的過程中,各條語句的執行順序對程序的結果是有直接影響的。
舉例:
現在你正在學習Java基礎課程
? ?流程: 學習Java的想法 --> 網站和咨詢老師溝通 --> 安排課程 --> 聽課
? ?
流程控制語句分類
? ?1.順序結構: 按照代碼的書寫順序從上到下依次執行
? ?2.選擇結構:
(1)if語句【重點的重點】
(2)switch語句【重點】
3.循環結構:
(1)for循環【重點的重點】
(2)while循環【重點】
(3)do-while循環【了解】
? ?
~~~
##### 1.2 順序結構
~~~
public class DemoSequence {
? ?public static void main(String[] args) {
? ? ? ?System.out.println("開始....");
? ? ? ?System.out.println("今天天氣不錯,挺風和日麗的....1");
? ? ? ?System.out.println("我們上午黑馬java直播課....2");
? ? ? ?System.out.println("這的確挺爽的....3");
? ? ? ?System.out.println("結束....");
? }
}
?
~~~
## 第二章 選擇結構-if【重點】
##### 2.1 if語句的第一種格式介紹
~~~
英文單詞if是: 如果的意思
1.if語句的第一種格式:
if(布爾表達式) {
? 語句體;
? }
其它語句;
?
2.執行流程:
(1)計算if語句()中布爾表達式的結果,看是true,還是false
? (2)如果if語句()中布爾表達式的結果是true,執行if語句()后{}中的語句體,緊接著執行其它語句
? (3)如果if語句()中布爾表達式的結果是false,不執行if語句()后{}中的語句體,直接執行其它語句
? ?
3.注意:
(1)if語句的第一種格式,適用于有一種情況的場景
(2)if后面()中的表達式,不管多么復雜,也不管多么簡單,結果必須是布爾類型
(3)if后面{}中的語句體,要么被執行,要么被跳過
(4)if后面{}中的語句體: 一條或者多條語句
(5)if語句后面()和{}之間沒有分號
(6)if語句后面的{}中如果只有一條語句,那么{}可以省略,但是建議初學者保留
~~~
##### 圖解:

##### 2.2 if語句的第一種格式練習
~~~
練習
需求1:判斷a和b的值是否相等,如果相等,就在控制臺輸出:a等于b
需求2:判斷a和c的值是否相等,如果相等,就在控制臺輸出:a等于c
public class Demo01If {
? ?public static void main(String[] args) {
? ? ? ?System.out.println("開始....");
? ? ? ?//定義2個int變量a和b,并初始化
? ? ? ?int a = 10;
? ? ? ?int b = 20;
?
? ? ? ?//使用if語句第一種格式判斷a和b的值是否相同
? ? ? ?if(a == b) {
? ? ? ? ? ?System.out.println(a+"等于"+b);
? ? ? }
?
? ? ? ?//使用if語句第一種格式判斷a和b的值是否不相同
? ? ? ?if (a != b) {
? ? ? ? ? ?System.out.println(a+"不等于"+b);
? ? ? }
?
? ? ? ?//定義1個int變量c,并初始化
? ? ? ?int c = 10;
?
? ? ? ?//使用if語句第一種格式判斷a和c的值是否相同
? ? ? ?if(a == c) {
? ? ? ? ? ?System.out.println(a+"等于"+c);
? ? ? }
?
? ? ? ?//使用if語句第一種格式判斷a和c的值是否不相同
? ? ? ?if(a != c) {
? ? ? ? ? ?System.out.println(a+"不等于"+c);
? ? ? }
?
? ? ? ?System.out.println("結束....");//模擬其它語句
? }
}
?
~~~
##### 2.3 if語句的第二種格式介紹
~~~
英文單詞if是: 如果的意思
英文單詞else是: 否則的意思
1.if語句的第二種格式:
if(布爾表達式) {
? ? ? ?語句體1;
? } else {
? ? ? ?語句體2;
? }
其它語句;
?
2.執行流程:
(1)計算if語句()中布爾表達式的結果,看是true,還是false
(2)如果if語句()中布爾表達式的結果是true,執行if后面{}中的語句體1,接著執行其它語句
(3)如果if語句()中布爾表達式的結果是false,執行else后面{}中的語句體2,接著執行其它語句
? ?
3.注意:
(1)if語句的第二種格式,適用于有兩種情況的場景
(2)if后面()中的表達式,不管多么復雜,也不管多么簡單,結果必須是布爾類型
(3)語句體1和語句體2,只能有一個被執行,是一個二選一的情況,是一個是與否的情況
(4)if和else后面{}中的語句體: 一條或者多條語句
(5)if語句后面()和{}之間沒有分號,而且else 和 {}之間也沒有分號
(6)if語句后面的{}中如果只有一條語句,那么{}可以省略,但是建議初學者保留 ? ? ?
~~~
##### 圖解:

##### 2.4 if語句的第二種格式練習判斷大小
~~~
需求:
? ?判斷a是否大于b,如果是,在控制臺輸出:a的值大于b,否則,在控制臺輸出:a的值不大于b
? ?
實現步驟:
1.定義2個int變量a和b,并初始化
2.因為有兩種輸出結果,所以使用if語句第二種格式對a和b的大小進行判斷,并輸出不同的結果
public class Demo02IfElse {
? ?public static void main(String[] args) {
? ? ? ?System.out.println("開始....");
?
? ? ? ?//1.定義2個int變量a和b,并初始化
? ? ? ?int a = 30, b = 20;
?
? ? ? ?//2.因為有兩種輸出結果,所以使用if語句第二種格式對a和b的大小進行判斷,并輸出不同的結果
? ? ? ?//30>20:true
? ? ? ?if(a > b) {
? ? ? ? ? ?System.out.println(a+"的值大于"+b);
? ? ? } else {
? ? ? ? ? ?System.out.println(a+"的值不大于"+b);
? ? ? }
?
? ? ? ?System.out.println("結束....");//模擬其它語句
? }
}
~~~
##### 2.5 if語句的第二種格式練習判斷奇偶數
~~~
需求:
任意給出一個整數,請用程序實現判斷該整數是奇數還是偶數,并在控制臺輸出該整數是奇數還是偶數。
實現步驟:
1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
2.獲取鍵盤錄入的一個整數數字,保存到int變量num中
3.使用if語句的第二種格式,判斷num中數字的奇偶性,并輸出不同的結果
(1)偶數: num%2==0
(2)奇數: num%2!=0
public class Demo03IfElseJiOu {
public static void main(String[] args) {
System.out.println("開始....");
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的一個整數數字,保存到int變量num中
System.out.println("請您輸入一個整數數字: ");
int num = sc.nextInt();
//3.使用if語句的第二種格式,判斷num中數字的奇偶性,并輸出不同的結果
//把判斷num是偶數作為條件
/*if (num % 2 == 0) {
System.out.println(num+"是一個偶數數字");
} else {
System.out.println(num+"是一個奇數數字");
}*/
//把判斷num是奇數作為條件
if(num%2 != 0) {
System.out.println(num+"是一個奇數數字");
} else {
System.out.println(num+"是一個偶數數字");
}
System.out.println("結束....");//模擬其它語句
}
}
~~~
~~~
需求:
任意給出兩個整數,請用程序實現求出兩個整數的最大值,并輸出到控制臺。
實現步驟:
1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
2.獲取鍵盤錄入的兩個個整數數字,保存到兩個int變量a和b中
3.定義int變量max,作用保存兩個數字的最大值的
4.使用if語句第二種格式計算a和b的最大值,保存到變量max中
5.打印max的值
public class Demo04IfElseMax {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的兩個個整數數字,保存到兩個int變量a和b中
System.out.println("請輸入第一個整數數字: ");
int a = sc.nextInt();
System.out.println("請輸入第二個整數數字: ");
int b = sc.nextInt();
//3.定義int變量max,作用保存兩個數字的最大值的
int max;
//4.使用if語句第二種格式計算a和b的最大值,保存到變量max中
if (a > b) {//a > b: true 說明a是最大的
//把變量a中的值,賦值給變量max
max = a;
} else {//a > b: false 說明b是最大的
//把變量b中的值,賦值給變量max
max = b;
}
//5.打印max的值
System.out.println(a+"和"+b+"的最大值是: "+max);
}
}
~~~
##### 圖解分析:

##### 2.6 if語句的第三種格式介紹
~~~
英文單詞if是: 如果的意思
英文單詞else是: 否則的意思
1.if語句的第三種格式:
if(布爾表達式1) {
語句體1;
} else if(布爾表達式2) {
語句體2;
}
...
else if(布爾表達式n) {
語句體n;
} else {
語句體n+1;
}
其它語句;
2.執行流程:
(1)首先計算布爾表達式1的值
(2)如果值為true就執行語句體1;如果值為false就計算布爾表達式2的值
(3)如果值為true就執行語句體2;如果值為false就計算布爾表達式3的值
(4)...
(5)如果沒有任何布爾表達式為true,就執行語句體n+1。
3.注意:
(1)if語句的第三種格式,適用于有多種情況(至少兩種以上)的場景
(2)if后面()中的表達式,不管多么復雜,也不管多么簡單,結果必須是布爾類型
(3)語句體1到語句體n+1,只能有一個被執行,是一個多選一的情況
(4)if和else后面{}中的語句體: 一條或者多條語句
(5)if語句后面()和{}之間沒有分號,而且else 和 {}之間也沒有分號
(6)if語句后面的{}中如果只有一條語句,那么{}可以省略,但是建議初學者保留
(7)只能在if后面寫條件,沒有if就不能寫條件,不能直接在else后面寫(條件)
(8)最后一個else后面沒有if,是用來兜底的
如果上面的所有的if都不成立,就執行最后一個else中{}中的代碼
~~~
圖解:

##### 2.7 if語句的第三種格式練習根據數字輸出對應的星期
~~~
需求:
鍵盤錄入一個星期數(1,2,...7),輸出對應的星期一,星期二,...星期日
演示效果:
輸入 1 輸出 星期一
輸入 2 輸出 星期二
輸入 3 輸出 星期三
輸入 4 輸出 星期四
輸入 5 輸出 星期五
輸入 6 輸出 星期六
輸入 7 輸出 星期日
輸入 其它數字 輸出 數字有誤
實現步驟:
1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
2.獲取鍵盤錄入的1-7之間的一個整數數字(代表星期數),保存到一個int變量week中
3.因為week中的數字有7+1中情況,所以使用if語句第三種格式對week中的數據進行判斷,并輸出不同的結果
public class Demo01IfElseIfElseWeek {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的1-7之間的一個整數數字(代表星期數),保存到一個int變量week中
System.out.println("請輸入一個1到7之間的整數數字(代表星期數): ");
int week = sc.nextInt();
//3.因為week中的數字有7+1中情況,所以使用if語句第三種格式對week中的數據進行判斷,并輸出不同的結果
if(week == 1) {
System.out.println("星期一");
} else if(week == 2) {
System.out.println("星期二");
} else if(week == 3) {
System.out.println("星期三");
} else if(week == 4) {
System.out.println("星期四");
} else if(week == 5) {
System.out.println("星期五");
} else if(week == 6) {
System.out.println("星期六");
} else if(week == 7) {
System.out.println("星期日");
} else /*if(week<1 || week>7)*/ {//隱藏條件: week<1 || week >7
System.out.println("您輸入的代表星期數的數字: "+week
+" 是不存在的,哥屋恩...");
}
System.out.println("結束....");
}
}
public class Demo02IfElseIfElseWeek {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的1-7之間的一個整數數字(代表星期數),保存到一個int變量week中
System.out.println("請輸入一個1到7之間的整數數字(代表星期數): ");
int week = sc.nextInt();
//3.因為week中的數字有7+1中情況,所以使用if語句第三種格式對week中的數據進行判斷,并輸出不同的結果
//排除非法數據
if(week<1 || week>7) {
System.out.println("您輸入的代表星期數的數字: "+week
+" 是不存在的,哥屋恩...");
} else if(week == 1) {//代碼只要執行到這里說明: week>=1 && week<=7
System.out.println("星期一");
} else if(week == 2) {
System.out.println("星期二");
} else if(week == 3) {
System.out.println("星期三");
} else if(week == 4) {
System.out.println("星期四");
} else if(week == 5) {
System.out.println("星期五");
} else if(week == 6) {
System.out.println("星期六");
} else/*if(week == 7)*/ {//隱藏條件: week == 7
System.out.println("星期日");
}
System.out.println("結束....");
}
}
~~~
##### 2.8 if語句的第三種格式練習根據成績進行獎勵
~~~
需求:
小明快要期末考試了,小明爸爸對他說,會根據他不同的考試成績,送他不同的禮物,
假如你可以控制小明的得分,請用程序實現小明到底該獲得什么樣的禮物,并在控制臺輸出。
獎勵規則:
95~100 山地自行車一輛 包含95和100的 數學中[95,100] 表示95到100之間,包含95,包含100
90~94 游樂場玩一次 包含90和94的 數學中(95,100) 表示95到100之間,不包含95,不包含100
80~89 變形金剛玩具一個 包含80和89的
80以下 胖揍一頓 不包含80分的
實現步驟:
1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
2.獲取鍵盤錄入的一個0到100之間的整數數字代表成績,保存到int變量score中
3.因為score中的數字有4+1中情況,所以使用if語句第三種格式對score中的數據進行判斷,并輸出不同的結果
public class Demo03IfElseIfElseScore {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的一個0到100之間的整數數字代表成績,保存到int變量score中
System.out.println("請輸入0到100之間的整數數字(代表成績): ");
int score = sc.nextInt();
//3.因為score中的數字有4+1中情況,所以使用if語句第三種格式對score中的數據進行判斷,并輸出不同的結果
if(score>=95 && score<=100) {
System.out.println("獎勵山地自行車一輛");
} else if(score>=90 && score<=94) {
System.out.println("獎勵游樂場玩一次");
} else if (score >= 80 && score <= 89) {
System.out.println("獎勵變形金剛玩具一個");
} else if(score>=0 && score<80 ) {
System.out.println("獎勵胖揍一頓");
} else /*if(score<0 || score>100)*/ {//隱藏條件: score<0 || score>100
System.out.println("您輸入的成績是非法的,哥屋恩....");
}
System.out.println("結束...");
}
}
public class Demo04IfElseIfElseScore {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的一個0到100之間的整數數字代表成績,保存到int變量score中
System.out.println("請輸入0到100之間的整數數字(代表成績): ");
int score = sc.nextInt();
//3.因為score中的數字有4+1中情況,所以使用if語句第三種格式對score中的數據進行判斷,并輸出不同的結果
//判斷非法數據
if(score<0 || score>100) {
System.out.println("您輸入的成績是非法的,哥屋恩....");
} else if(score>=95 && score<=100) {//執行到這個位置: score>=0 && score<=100
System.out.println("獎勵山地自行車一輛");
} else if(score>=90 && score<=94) {
System.out.println("獎勵游樂場玩一次");
} else if (score >= 80 && score <= 89) {
System.out.println("獎勵變形金剛玩具一個");
} else /*if(score>=0 && score<80 )*/ {//隱藏條件: score>=0 && score<80
System.out.println("獎勵胖揍一頓");
}
System.out.println("結束...");
}
}
~~~
##### 圖解:

## 第三章 選擇結構-switch【重點】
##### 3.1 switch語句格式和介紹
~~~
1.switch語句的格式:
switch(表達式) {
case 常量值1:
語句體1;
break;
case 常量值2:
語句體2;
breeak;
...
case 常量值n:
語句體n;
break;
default:
語句體n+1;
break;
}
其它語句;
2.執行流程:
(1)首先計算出表達式的值
(2)其次,和case依次比較,一旦有對應的值,就會執行相應的語句,在執行的過程中,遇到break就會結束。
(3)最后,如果所有的case都和表達式的值不匹配,就會執行default語句體部分,然后程序結束掉。
3.注意事項:
(1)switch后面()中表達式的數據類型,只能是以下幾種類型:
byte/short/char/int String/枚舉
(2)break: 作用是用來結束switch的,只要執行break,直接從switch語句中跳出來,
執行switch語句后續的其它代碼
(3)case后面只能寫常量,而且不能重復
(4)如果所有的case和default后面的都有break,那么case和default的書寫順序無所謂
(5)default也是用來兜底的,如果所有case中常量值和表達式的值都不相同,直接執行default中的代碼
(6)如果default寫在了最后,則可以省略default中的break
~~~
##### 執行流程

~~~
public class Demo01Switch {
public static void main(String[] args) {
int num = 2;
switch (num) {
case 1:
System.out.println("你好");
break;
case 2:
System.out.println("我好");
break;
case 3:
System.out.println("大家好,才是真的好");
break;
default:
System.out.println("他/她好,我也好");
//break;
}
System.out.println("結束....");
}
}
~~~
##### 3.2 switch練習根據月份輸出對應的季節
~~~
需求:
一年有12個月,分屬于春夏秋冬4個季節,
鍵盤錄入一個月份,請用程序實現判斷該月份屬于哪個季節,并輸出。
演示效果
輸入: 1、2、12 輸出:冬季
輸入: 3、4、5 輸出:春季
輸入: 6、7、8 輸出:夏季
輸入: 9、10、11 輸出:秋季
輸入: 其它數字 輸出:數字有誤
實現步驟(本案例使用switch):
1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
2.獲取鍵盤錄入的1-12之間的一個整數數字(代表月份),保存到int變量month中
3.因為month中的數據有12+1種情況,所以使用switch判斷month中的值,根據不同的值輸出不同的結果
public class Demo02SwitchMonth {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的1-12之間的一個整數數字(代表月份),保存到int變量month中
System.out.println("請輸入一個1-12的整數數字(代表月份): ");
int month = sc.nextInt();
//3.因為month中的數據有12+1種情況,所以使用switch判斷month中的值,根據不同的值輸出不同的結果
switch (month) {
case 1:
System.out.println("冬季");
break;
case 2:
System.out.println("冬季");
break;
case 12:
System.out.println("冬季");
break;
case 3:
System.out.println("春季");
break;
case 4:
System.out.println("春季");
break;
case 5:
System.out.println("春季");
break;
case 6:
System.out.println("夏季");
break;
case 7:
System.out.println("夏季");
break;
case 8:
System.out.println("夏季");
break;
case 9:
System.out.println("秋季");
break;
case 10:
System.out.println("秋季");
break;
case 11:
System.out.println("秋季");
break;
default:
System.out.println("您輸入的月份不存在,哥屋恩...");
break;
}
System.out.println("結束....");
}
}
~~~
##### 3.3 使用case穿透優化根據月份輸出對應的季節的案例
~~~
使用case穿透優化根據月份輸出對應的季節的案例
發現問題:
前面Demo02SwitchMonth.java文件中出現了大量的重復的代碼
1,2,12代碼重復,3,4,5代碼重復,6,7,8代碼重復,9,10,11代碼重復
每三個case中的代碼都是相同的
解決方案使用case穿透:
如果多個連續的case中具有相同的代碼和break,可以只保留最后一個case的代碼和break,前面的多個case中的代碼和break省略不寫
在switch語句中,如果case的后面不寫break,將出現穿透現象,也就是不會在判斷下一個case的值,直接向后
運行,直到遇到break,或者整體switch結束。
執行步驟:
(1)找到case入口: 常量值和表達式值相同的那個case
(2)從case入口進來執行代碼,只要當前case代碼中沒有break,直接穿透進入下一個case(不會再判斷常量值和表達式結果是否相同)中的代碼執行,直到遇到break,才會結束switch語句
public class Demo03SwitchMonthBetter {
public static void main(String[] args) {
//1.創建鍵盤錄入Scanner類的對象(1.導包 2.創建)
Scanner sc = new Scanner(System.in);
//2.獲取鍵盤錄入的1-12之間的一個整數數字(代表月份),保存到int變量month中
System.out.println("請輸入一個1-12的整數數字(代表月份): ");
int month = sc.nextInt();
//3.因為month中的數據有12+1種情況,所以使用switch判斷month中的值,根據不同的值輸出不同的結果
switch (month) {//3
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("您輸入的月份不存在,哥屋恩...");
break;
}
System.out.println("結束....");
}
}
~~~
## 總結
~~~
能夠使用if語句完成獲取兩個數中較大值
int a = 10, b = 20;//可以使用鍵盤錄入
//定義int變量max,保存最大值的
int max;
//使用if-else對于a和b的大小進行判斷
if(a>b) {
max = a;
} else {
max = b;
}
能夠使用if語句完成根據分數輸出對應級別
舉例:
[95,100] "卓越"
[90,95) "優秀"
[80,90) "良好"
[70,80) "一般"
[60,70) "及格"
[0,60) "不及格"
其它情況 "數字錯誤"
int score = ...;//可以使用鍵盤錄入
if(score>=95 && score<=100) {
sout("卓越");
} else if(score>=90 && score<95) {
sout("優秀");
} else if(score>=80 && score<90) {
sout("良好");
} else if(score>=70 && score<80) {
sout("一般");
} else if(score>=60 && score<70) {
sout("及格");
} else if(score>=0 && score<60) {
sout("不及格");
} else {//隱藏條件: score<0 || score>1000 不用單獨加if寫條件了
sout("數字錯誤");
}
能夠使用switch語句完成根據月份輸出對應季節
int month = ...;//可以使用鍵盤錄入
switch(month) {
case 1:
sout("冬季");
break;
case 2:
sout("冬季");
break;
case 12:
sout("冬季");
break;
//...
default :
sout("數字錯誤");
break;
}
~~~