- 了解順序結構的相關概述
- 掌握選擇結構之if語句相關知識點
- 掌握選擇結構之switch語句相關知識點
1. 流程控制
1.1 概述
在一個程序執行的過程中,各條語句的執行順序對程序的結果是有直接影響的。所以,我們必須清楚每條語句的執行流程。而且,很多時候要通過控制語句的執行順序來實現我們想要的功能。
例如: 某些代碼是滿足特定條件的情況下, 才會被執行. 而有些代碼, 在滿足某些條件的情況下, 需要重復執行, 這些, 都需要用到流程控制語句.
1.2 分類
- 順序結構
- 選擇結構(if語句, switch.case語句)
- 循環結構(for循環, while循環, do.while循環)
1.3 順序結構
概述
順序結構指的是代碼是按照從上往下, 從左往右的順序, 依次逐行執行的, 且順序結構也是Java程序的默認結構.
圖解
需求
定義類OrderDemo01, 在類中定義main方法, 打印如下數據:
//start
//HelloWorld1
//HelloWorld2
//HelloWorld3
//end
參考代碼
public class OrderDemo01 {
public static void main(String[] args) {
//打印指定的數據
System.out.println("start");
System.out.println("HelloWorld1");
System.out.println("HelloWorld2");
System.out.println("HelloWorld13");
System.out.println("end");
}
}
2. 選擇結構之if語句
2.1 概述
如果我們想某些代碼是在滿足條件的情況下, 才能被執行, 此時就需要用到選擇結構了, 選擇結構也叫分支結構, 主要分為以下兩種:
- if語句
- switch.case語句
2.2 分類
if語句一般用于范圍
的判斷, 例如: 如果當前時間是0~8點, 小黑就和你說: 早上好
, 如果當前時間是9 ~12點, 小黑就和你說: 中午好
. 根據應用場景的不同(即: 分支個數不同), if語句的格式主要分為以下三種:
- if語句(也叫: 單分支)
- if.else語句(也叫: 雙分支)
- if.else if語句(也叫: 多分支)
2.3 單分支
單分支結構一般用來判斷一種情況
, 格式如下:
格式
if(關系表達式) {
//語句體;
}
執行流程
- 先執行關系表達式, 看其結果是true還是false.
- 如果是true, 則執行
大括號
中的語句體. - 如果是false, 則
大括號
中的語句體不執行.
圖解
需求
定義變量time表示時間, 如果它的范圍是在[0,8]之間, 就打印早上好
, 否則不操作.
解釋: [0, 8], 意思是說 0~8之間, 包含0, 也包含8, 這種寫法屬于"前閉后閉".
[0, 8), 意思是: 0~8之間, 包含0, 不包含8, 這種寫法屬于"前閉后開", 也叫: 包左不包右.
參考代碼
public class IfDemo01 {
public static void main(String[] args) {
int time = 5;
if(time >= 0 && time <= 8) {
System.out.println("早上好");
}
}
}
2.4 雙分支
雙分支結構指的是if. else語句, 一般用來判斷兩種情況
, 格式如下:
2.4.1 格式
if(關系表達式) { //if的意思: 如果
//語句體1;
} else { //否則...
//語句體2;
}
2.4.2 執行流程
- 先執行關系表達式, 看其結果是true還是false.
- 如果是true, 則執行語句體1.
- 如果是false, 則執行語句體2.
2.4.3 圖解
2.4.5 案例一: if格式二入門
需求
定義變量time表示時間, 如果它的范圍是在0~8之間, 就打印早上好
, 否則就打印中午好
.
參考代碼
public class IfDemo02 {
public static void main(String[] args) {
int time = 5;
if(time >= 0 && time <= 8) {
System.out.println("早上好");
} else {
System.out.println("中午好");
}
}
}
2.4.6 案例二: 判斷奇偶數
需求
- 提示用戶鍵盤錄入一個數據并接收.
- 判斷該數據是奇數還是偶數, 并將結果打印到控制臺上.
參考代碼
public class IfDemo03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個整數: ");
int num = sc.nextInt();
if (num % 2 == 0) {
System.out.println(num + "是偶數");
} else {
System.out.println(num + "是奇數");
}
}
}
記憶
-
if語句控制的語句體如果只有一行代碼, 則該大括號可以省略不寫.
例如:
if(5 > 3)
? System.out.println("夯哥最純潔!");
-
if語句控制的語句體如果只有一行代碼, 則該大括號可以省略不寫, 定義變量的語法除外.
例如:
if(5 > 3)
int a = 10; //這樣寫會報錯, jvm會識別這樣代碼為兩行: int a; a = 10;
上述的代碼就相當于:
if(5 > 3) {
? int a;
}
a = 10; //這樣寫肯定會報錯.
-
你省略if后邊的大括號時, 有個問題一定要注意, 不要亂寫
分號
.例如:
if(5 > 3) ; //這里如果寫分號了, 就意味著if語句結束了.
System.out.println("本意: 這行代碼只有條件成立才會被執行");
2.5 多分支
多分支結構指的是if. else if語句, 一般用來判斷多種情況
, 格式如下:
2.5.1 格式
if(關系表達式1) {
//語句體1;
} else if(關系表達式2){
//語句體2;
} else if(關系表達式3){ //這里可以根據需求, 有多個else if語句
//語句體3;
} else {
//語句體n;
}
2.4.2 執行流程
- 先執行關系表達式1, 看其結果是true還是false.
- 如果是true, 則執行語句體1, 整個if語句結束.
- 如果是false, 則判斷關系表達式2, 看其結果是true還是false.
- 如果是true, 則執行語句體2, 整個if語句結束.
- 如果是false, 則判斷關系表達式3, ...以此類推.
- 如果所有的關系表達式都不成立, 則執行else語句的語句體n, 整個if語句結束.
2.4.3 圖解
2.4.4 案例一: 打印星期
需求
- 提示用戶錄入[1, 7]之間的數字, 并接收.
- 根據用戶錄入的數字, 打印對應的星期, 格式如下:
- 用戶錄入1, 打印"星期一"
- 用戶錄入2, 打印"星期二"
- ...以此類推
- 用戶錄入非法數字, 打印"沒有這樣的日期"
參考代碼
import java.util.Scanner;
public class IfDemo04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個1 - 7之間的整數: ");
int week = sc.nextInt();
if (week == 1) {
} 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 {
System.out.println("沒有這樣的日期, 你是從火星來的吧!");
}
}
}
2.4.5 案例二: 發放獎勵
需求
- 小明快要期末考試了,小明爸爸對他說,會根據他的考試成績,送他不同的禮物.
- 假如你可以控制小明的得分,請用程序實現小明到底該獲得什么樣的禮物,并在控制臺輸出。
- 禮物標準如下:
- 95~100 山地自行車一輛
- 90~94 游樂場玩一次
- 80~89 變形金剛玩具一個
- 80以下 胖揍一頓
參考代碼
import java.util.Scanner;
public class IfDemo05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入小明的考試成績: ");
int score = sc.nextInt();
if (score >= 95 && score <= 100) {
System.out.println("獎勵小明: 山地自行車一輛");
} else if(score >= 90 && score < 95) {
System.out.println("獎勵小明: 游樂場玩兒一次");
} else if(score >= 80 && score < 90) {
System.out.println("獎勵小明: 變形金剛玩具一個");
} else if(score >= 0 && score < 80){
System.out.println("獎勵小明: 男女雙混組合拳 + 掃帚棒法");
} else {
System.out.println("考試成績錄入有誤.");
}
}
}
2.4.6 案例三: 獲取最大值
需求
- 提示用戶錄入3個整數, 并接收.
- 通過if語句獲取這三個整數的最大值.
- 將結果打印到控制臺上.
參考代碼
import java.util.Scanner;
public class IfDemo06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入第一個整數: ");
int a = sc.nextInt();
System.out.println("請錄入第二個整數: ");
int b = sc.nextInt();
System.out.println("請錄入第三個整數: ");
int c = sc.nextInt();
//方式一: if嵌套實現.
int max = a;
int max2 = a;
if (a > b) {
if (a > c) {
max = a;
} else {
max = c;
}
} else {
if(b > c) {
max = b;
} else {
max = c;
}
}
System.out.println("最大值: " + max);
//方式二: if. else.if語句實現
if (a > b && a > c) {
max2 = a;
} else if(b > a && b > c) {
max2 = b;
} else {
max2 = c;
}
System.out.println("最大值: " + max2);
}
}
3. 選擇結構之switch語句
3.1 概述
switch語句, 一般是用于做固定值
判斷的, 在實際開發中, 用到的頻率也非常高, 所以也是要求大家掌握的知識點.
3.2 格式
switch(表達式) {
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
case 值3:
語句體3;
break;
... //根據需求, 可以寫多組case.
default:
語句體n;
break;
}
3.4 格式詳解
3.5 執行流程
先計算表達式的值, 然后按照從上往下的順序依次和每一個case對應的值相匹配.
如果能匹配成功, 則執行該case對應的語句體, 然后執行break, 至此, 整個switch語句結束.
-
如果和所有的case值都不匹配, 則執行default對應的語句體, 然后執行break, 至此, 整個switch語句結束.
解釋: default語句就類似于
if. else語句中的else
, 當所有條件都不滿足時才會執行.
3.6 執行流程圖解
3.7 示例一: 春夏秋冬
需求
- 一年有12個月, 分屬于春夏秋冬4個季節, 鍵盤錄入一個月份, 請用程序實現判斷該月份屬于哪個季節, 并輸出。
- 具體標準如下:
- 輸入: 1、2、12 輸出:冬季
- 輸入: 3、4、5 輸出:春季
- 輸入: 6、7、8 輸出:夏季
- 輸入: 9、10、11 輸出:秋季
- 輸入:其它數字 輸出:數字有誤
參考代碼
import java.util.Scanner;
public class SwitchDemo07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個月份: ");
int month = sc.nextInt();
switch (month) {
case 12:
System.out.println("冬季");
break;
case 1:
System.out.println("冬季");
break;
case 2:
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;
}
}
}
3.8 case穿透
概述
在switch語句中,如果case的后面不寫break,將出現case穿透現象,也就是不會在判斷下一個case的值,直接向后運行,直到遇到break,或者整體switch結束。
格式
switch(表達式) {
case 值1:
語句體1; //假設表達式的值 = 值1, 則執行完語句體1后, 不會判斷第二個case, 直接執行語句體2;
break;
case 值2:
語句體2;
break;
case 值3:
語句體3;
break;
... //根據需求, 可以寫多組case.
default:
語句體n;
break;
}
需求
通過case穿透
, 優化剛才的春夏秋冬
案例.
參考代碼
import java.util.Scanner;
public class SwitchDemo08 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個月份: ");
int month = sc.nextInt();
switch (month) {
case 12:
case 1:
case 2:
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;
}
}
}
3.9 思考題
- switch語句的小括號中, 可以放什么?
- default語句必須放到switch語句的最后嗎?
- break關鍵字可以省略嗎? 對執行結果是否有影響?
3.10 案例二: 發放獎勵
需求
- 小明快要期末考試了,小明爸爸對他說,會根據他的考試成績,送他不同的禮物.
- 假如你可以控制小明的得分,請用程序實現小明到底該獲得什么樣的禮物,并在控制臺輸出。
- 禮物標準如下:
- 90~100 山地自行車一輛
- 80~89 游樂場玩一次
- 70~79 變形金剛玩具一個
- 70以下 胖揍一頓
參考代碼
import java.util.Scanner;
public class SwitchDemo09 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請錄入小明的考試成績: ");
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
//合法成績
switch (score / 10) {
case 10:
case 9:
System.out.println("獎勵小明: 山地自行車一輛");
break;
case 8:
System.out.println("獎勵小明: 游樂場玩兒一次");
break;
case 7:
System.out.println("獎勵小明: 變形金剛玩具一個");
break;
default:
System.out.println("獎勵小明: 男女雙混組合拳 + 掃帚棒法");
break;
}
} else {
//非法成績
System.out.println("您錄入的成績有誤!");
}
}
}
4 練習題
4.1 案例一: 漲工資.
需求
根據工齡(整數)給員工漲工資(整數), 工齡和基本工資通過鍵盤錄入
-
漲工資的條件如下:
- [10-15) +5000
- [5-10) +2500
- [3~5) +1000
- [1~3) +500
- [0~1) +200
-
打印格式如下:
您目前工作了10年,基本工資為 3000元, 應漲工資 5000元,漲后工資 8000元
參考代碼
public static void main(String[] args) {
// 1.創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
// 2.定義變量age表示工齡(假設為int類型),定義變量salary表示基本工資(假設為int類型)
// int age,salary;
// 3.通過鍵盤錄入給工齡age賦值和基本工資salary賦值
// age = sc.nextInt();
// salary = sc.nextInt();
int age = sc.nextInt();
int salary = sc.nextInt();
int addSalary = 0;
// 4.對工齡進行邏輯判斷,根據不同的工齡區間,進行漲工資salary+=n;(n表示:漲工資的數量)
if(age>=15||age<0) {
System.out.println("您輸入的工齡不合法~");
return ;
}
//[10-15) +5000
if(age>=10&&age<15) {
addSalary = 5000;
} else if(age>=5&&age<10){//[5-10) +2500
addSalary = 2500;
} else if(age>=3&&age<5) {//[3~5) +1000
addSalary = 1000;
} else if(age>=1&&age<3) {//[1~3) +500
addSalary = 500;
} else if(age>=0&&age<1) {//[0~1) +200
addSalary = 200;
}
// 5.按照格式進行打印
System.out.println("您目前工作了"+age+"年,基本工資為 "+salary+"元, 應漲工資 "+addSalary+"元,漲后工資 "+(salary+addSalary)+"元");
}
4.2 案例二: 定義計算器
-
需求:
1.功能描述:模擬計算器功能,對鍵盤錄入的兩個int類型的數據進行加、減、乘、除的運算,并打印運算結果
2.要求:
(1)鍵盤錄入三個整數,其中前兩個整數代表參加運算的數據, 第三個整數為要進行的運算(0:表示加法運算,1:表示減法運算,2:表示乘法運算,3:表示除法運算) (2)使用今天所學知識完成功能 (3)演示格式如下: 請輸入第一個整數:30 請輸入第二個整數:40 請輸入您要進行的運算(0:表示加法運算,1:表示減法運算,2:表示乘法運算,3:表示除法運算):0 控制臺輸出:30+40=70
實現步驟:
代碼:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入第一個數據");
int a = sc.nextInt();
System.out.println("請輸入第二個數據");
int b = sc.nextInt();
System.out.println("請輸入您要進行的運算(0:表示加法運算,1:表示減法運算,2:表示乘法運算,3:表示除法運算):");
int type = sc.nextInt();
//定義變量用于接收結果
double result = 0;
switch(type) {
case 0://做加法
result = a + b;
System.out.println(a+"+"+b+"="+result);
break;
case 1:
result = a - b;
System.out.println(a+"-"+b+"="+result);
break;
case 2:
result = a * b;
System.out.println(a+"*"+b+"="+result);
break;
case 3:
result = a / (b + 0.0);
System.out.println(a+"/"+b+"="+result);
break;
default:
System.out.println("您輸入有誤");
}
}
4.3 案例三: 水仙花數
-
需求:
鍵盤錄入一個三位數字,輸出該三位數字是否是水仙花數字?
水仙花數字要求: 指的是一個三位數,個位、十位、百位的數字立方和等于原數
例如
153 3*3*3 + 5*5*5 + 1*1*1 = 27 + 125 + 1 = 153
-
實現步驟:
1.創建鍵盤錄入對象
2.獲取一個int數字
3.獲取個位,十位,百位
4.求個位,十位,百位的立方和
5.利用if語句判斷立方和是否等于該數字本身,并輸出結果
代碼實現:
public static void main(String[] args) {
//1.創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//2.獲取一個int數字
System.out.println("請輸入一個三位整數");
int num = sc.nextInt();
//3.獲取個位,十位,百位
int ge = num%10;
int shi = num/10%10;
int bai = num/100%10;
//4.求個位,十位,百位的立方和
int sum = ge*ge*ge + shi*shi*shi + bai*bai*bai;
//5.利用if語句判斷立方和是否等于該數字本身,并輸出結果
if(sum == num) {
System.out.println(num+"是水仙花數字 ");
} else {
System.out.println(num+"不是水仙花數字 ");
}
}
今日目標
- 掌握運算符的用法
- 掌握鍵盤錄入功能
- 獨立完成IDEA的安裝和配置
- 掌握紙牌案例
1. 關系運算符
1.1 概述
關系運算符就是用來描述兩個變量或者常量之間的關系的.
主要分為以下6種:
符號 | 說明 |
---|---|
== | a==b,判斷a和b的值是否相等,成立為true,不成立為false |
!= | a!=b,判斷a和b的值是否不相等,成立為true,不成立為false |
> | a>b,判斷a是否大于b,成立為true,不成立為false |
>= | a>=b,判斷a是否大于等于b,成立為true,不成立為false |
< | a<b,判斷a是否小于b,成立為true,不成立為false |
<= | a<=b,判斷a是否小于等于b,成立為true,不成立為false |
1.2 注意事項
- 關系運算符的結果都是boolean類型,要么是true,要么是false。
- 千萬不要把
==
寫成了=
, 否則結果可能不是你想要的.
1.3 案例
需求
- 定義兩個int類型的變量a和b, 分別賦值為10和5.
- 通過
關系運算符
比較這兩個變量之間的關系, 并打印結果.
參考代碼
public class OperatorDemo01 {
public static void main(String[] args) {
//定義兩個int類型的變量a和b, 分別賦值為10和5.
int a = 10;
int b = 5;
//通過`關系運算符`比較這兩個變量之間的關系, 并打印結果.
System.out.println(a > b);
System.out.println(5 >= 5);
System.out.println(a < b);
System.out.println(5 <= 5);
System.out.println(a != b);
System.out.println(a == b);
System.out.println(a = b);
//關系運算符的最終結果是boolean類型, 所以我們也可以用boolean類型的變量接收.
boolean flag = 10 < 5;
System.out.println(flag);
}
}
2. 邏輯運算符
2.1 概述
邏輯運算符是用來判斷并且, 或者, 除非等邏輯關系的符號.
-
該符號兩端一般連接值為布爾類型的關系表達式
例如: 某企業招工, 要求年齡必須在 20 ~ 65歲之間.
2.2 分類
注意: 假設下表中的a和b, 都是boolean類型的值.
符號 | 作用 | 說明 |
---|---|---|
& | 邏輯與 | a&b,并且的意思. 有false則整體為false, 都為true, 則整體為true. |
| | 邏輯或 | a|b,或者的意思, 有true則整體為true, 都為false, 則整體為false. |
! | 邏輯非 | !a,取反的意思, 以前為true, 取反后為false, 以前為false, 取反后為true. |
^ | 邏輯異或 | a^b,異同的意思, 相同為false, 不同為true. |
小技巧:
對一個布爾數據, 偶數次取反, 該數據值不變.
!true = false
2.3 示例: 邏輯運算符入門
需求
- 定義三個int類型的變量a, b, c, 它們的初始化值分別為10, 20, 30.
- 通過上述的三個變量, 演示各個邏輯運算符.
參考代碼
public class OperatorDemo02 {
public static void main(String[] args) {
int a = 10, b = 20, c = 30;
//&: 邏輯與, 并且的意思, 有false則整體為false.
//相當于: 班長找女朋友, 要求長得漂亮, 并且身材好.
System.out.println((a > b) & (a > c)); //false & false
System.out.println((a < b) & (a > c)); //true & false
System.out.println((a > b) & (a < c)); //false & true
System.out.println((a < b) & (a < c)); //true & true
System.out.println("-----------------");
//|: 邏輯或, 或者的意思, 有true則整體為true.
//相當于: 降低條件了, 要么長得漂亮, 要么身材好.
System.out.println((a > b) | (a > c)); //false | false
System.out.println((a < b) | (a > c)); //true | false
System.out.println((a > b) | (a < c)); //false | true
System.out.println((a < b) | (a < c)); //true | true
System.out.println("-----------------");
//!: 邏輯非, 取反的意思
//相當于: 只要不是男的就行.
System.out.println(!(a > b)); //!false
System.out.println(!(a < b)); //!true
System.out.println("-----------------");
//邏輯異或, 異同的意思, 相同為false, 不同為true.
//相當于: 最后還是找了個男的, 但是領不了證.
//法律規定: 一夫一妻, 一男一女, 必須是異性才能領證.
System.out.println((a > b) ^ (a > c)); //false ^ false
System.out.println((a < b) ^ (a > c)); //true ^ false
System.out.println((a > b) ^ (a < c)); //false ^ true
System.out.println((a < b) ^ (a < c)); //true ^ true
}
}
2.4 短路邏輯運算符
在實際開發中, 并且, 或者
這樣的操作是非常多的, 但是上述的&(邏輯與), !(邏輯或)
運算符沒有短路效應
, 所以效率相對較低, 針對這種情況, 我們可以使用&&(短路與), ||(短路或)
來優化.
2.4.1 格式
符號 | 作用 | 說明 |
---|---|---|
&& | 短路與 | 作用和&相同,但是有短路效果, 前邊出現false, 后邊不執行. |
|| | 短路或 | 作用和|相同,但是有短路效果, 前邊出現true, 后邊不執行. |
2.4.2 解釋
- 在短路與運算中,只要有一個表達式的值為false,那么結果就可以判定為false了,沒有必要將所有表達式的值都計算出來,短路與運算符就有這樣的效果,可以提高效率。
- 同理在短路或運算中,一旦發現值為true,右邊的表達式將不再參與運算。
2.4.3 短路和非短路之間的區別
-
邏輯與 和 短路與之間的區別
- 邏輯與&(也叫單與): 無論左邊真假,右邊都要執行。
- 短路與&&(也叫雙與): 如果左邊為真,右邊執行;如果左邊為假,右邊不執行。
-
邏輯或 和 短路或之間的區別
- 邏輯或|(也叫單或): 無論左邊真假,右邊都要執行。
- 短路或||(也叫雙或): 如果左邊為假,右邊執行;如果左邊為真,右邊不執行。
記憶: 在實際開發中, 我們用的最多的邏輯運算符就是: &&, ||, !
2.4.4 案例
需求
參考代碼
public class OperatorDemo03 {
public static void main(String[] args) {
//1. 定義兩個int類型的變量a和b, 初始化值分別為: 2, 5
int a = 2, b = 5;
//2. 演示邏輯與(&)
/* System.out.println((a++ > 2) & (b++ < 7)); //兩個表達式都會執行.
System.out.println(a);
System.out.println(b);*/
System.out.println("------------------");
//3. 演示短路與(&&)
System.out.println((a++ > 2) && (b++ < 7)); //左邊表達式結果為false, 右邊不執行.
System.out.println(a);
System.out.println(b);
}
}
3. 三元運算符
3.1 格式
三元運算符也叫三目運算符
,即由三部分組成,格式如下:
(關系表達式) ? 表達式1:表達式2;
3.2 執行流程
- 先執行關系表達式, 看其結果是true還是false.
- 如果是
true
, 則執行表達式1
- 如果是
false
, 則執行表達式2
3.3 案例一: 入門案例
需求
- 定義兩個int類型的變量a. b, 初始化值分別為10, 20
- 通過三元運算符, 獲取變量a和b的最大值.
- 將結果(最大值)打印到控制臺上.
參考代碼
public class OperatorDemo04 {
public static void main(String[] args) {
//1. 定義兩個int類型的變量a. b, 初始化值分別為10, 20
int a = 10, b = 20;
//2. 通過三元運算符, 獲取變量a和b的最大值.
int max = a < b ? b : a;
//3. 將結果(最大值)打印到控制臺上.
System.out.println(max);
}
}
3.4 案例二: 判斷老虎體重
需求
動物園里有兩只老虎,已知兩只老虎的體重分別為180kg、200kg,請用程序實現判斷兩只老虎的體重是否相同。
參考代碼
public class OperatorDemo05 {
public static void main(String[] args) {
//1:定義兩個變量用于保存老虎的體重,單位為kg,這里僅僅體現數值即可。
int weight1 = 180;
int weight2 = 200;
//2:用三元運算符實現老虎體重的判斷,體重相同,返回true,否則,返回false。
boolean flag = weight1 == weight2 ? true : false;
//3:輸出結果
System.out.println("flag:" + flag);
}
}
3.5 案例三: 獲取和尚的最高身高
需求
一座寺廟里住著三個和尚,已知他們的身高分別為150cm、210cm、165cm.
請用程序實現獲取這三個和尚的最高身高。
參考代碼
public class OperatorDemo06 {
public static void main(String[] args) {
//1:定義三個變量用于保存和尚的身高,單位為cm,這里僅僅體現數值即可。
int h1 = 150;
int h2 = 210;
int h3 = 165;
//2:用三元運算符獲取前兩個和尚的較高身高值,并用臨時身高變量保存起來。
int temp = h1 > h2 ? h1 : h2;
//3:用三元運算符獲取臨時身高值和第三個和尚身高較高值,并用最大身高變量保存。
int max = temp > h3 ? temp : h3;
//4:輸出結果
System.out.println("這三個和尚中身高最高的是:" + max +"cm");
}
}
4. 鍵盤錄入
4.1 概述
之前我們涉及到的數據都是寫死的, 固定的數據
, 這樣做用戶體驗并不好, 我們就想著, 能不能讓用戶錄入數據, 我們通過特定的代碼來接收, 這樣做就非常好玩兒了, 針對于這種情況, 我們可以通過鍵盤錄入
來實現.
即: Java中鍵盤錄入功能指的就是Scanner類, 我們可以通過它的一些方法, 來獲取用戶錄入的數據.
4.2 使用步驟
-
導包. 包就是文件夾.
注意:
Scanner類是java.util包下的類, 使用之前必須要先導包.
-
導包的語句是定義在類的上面的, 格式如下:
import java.util.Scanner;
-
創建Scanner類的對象, 格式為:
//暫時先理解為固定格式, 也就是必須這么寫. Scanner sc = new Scanner(System.in);
-
通過
Scanner類的nextInt()方法
接收用戶錄入的數據.int a = sc.nextInt();
4.3 案例一: Scanner入門
需求
- 提示用戶錄入他/她的年齡.
- 通過鍵盤錄入功能, 接收用戶錄入的年齡.
- 將用戶錄入的數據(年齡)打印到控制臺上.
參考代碼
//導包
import java.util.Scanner;
public class ScannerDemo01 {
public static void main(String[] args) {
//1. 提示用戶錄入他/她的年齡.
System.out.println("請錄入您的年齡: ");
//2. 通過鍵盤錄入功能, 接收用戶錄入的年齡.
Scanner sc = new Scanner(System.in);
int age = sc.nextInt();
//3. 將用戶錄入的數據(年齡)打印到控制臺上.
System.out.println("age: " + age);
}
}
4.4 案例二: 鍵盤錄入版和尚身高
需求
- 提示用戶錄入第一個和尚的身高, 并接收
- 提示用戶錄入第二個和尚的身高, 并接收
- 提示用戶錄入第三個和尚的身高, 并接收.
- 通過三元運算符, 獲取三個和尚中身高最矮的那個和尚的身高.
- 將結果(最低身高)打印到控制臺上.
參考代碼
import java.util.Scanner;
public class ScannerDemo02 {
public static void main(String[] args) {
//身高未知,采用鍵盤錄入實現。首先導包,然后創建對象。
Scanner sc = new Scanner(System.in);
//鍵盤錄入三個身高分別賦值給三個變量。
System.out.println("請輸入第一個和尚的身高:");
int h1 = sc.nextInt();
System.out.println("請輸入第二個和尚的身高:");
int h2 = sc.nextInt();
System.out.println("請輸入第三個和尚的身高:");
int h3 = sc.nextInt();
//用三元運算符獲取前兩個和尚的較低身高值,并用臨時身高變量保存起來。
int temp = h1 < h2 ? h1 : h2;
//用三元運算符獲取臨時身高值和第三個和尚身高較低值,并用最低身高變量保存。
int min = temp < h3 ? temp : h3;
//輸出結果。
System.out.println("這三個和尚中身高最低的是:" + min +"cm");
}
}
IDEA常用快捷鍵
快捷鍵 | 功能 |
---|---|
Alt+Enter |
導入包,自動修正代碼 |
Ctrl+Y |
刪除光標所在行 |
Ctrl+D |
復制光標所在行的內容,插入光標位置下面 |
Ctrl+Alt+L |
格式化代碼 |
Ctrl+/ |
單行注釋 |
Ctrl+Shift+/ |
選中代碼注釋,多行注釋,再按取消注釋 |
Alt+Shift+上下箭頭 |
移動當前代碼行 |
4.1 練習1
需求:
小明左、右手中分別拿兩張紙牌(比如:黑桃10和紅桃8,數字10和8可通過鍵盤錄入),要求編寫代碼交換小明手中的牌
運行效果:
請輸入小明左手中的紙牌:10
請輸入小明右手中的紙牌:8
互換前小明手中的紙牌:
左手中的紙牌:10
右手中的紙牌:8
互換后小明手中的紙牌:
左手中的紙牌:8
右手中的紙牌:10
實現步驟:
1.創建鍵盤錄入對象
2.定義int類型的變量left和right,并通過nextInt()方法給left和right賦值
3.定義臨時變量temp實現left和right變量值得交換
4.按格式打印交換后的結果
代碼實現:
public class Task01 {
public static void main(String[] args) {
//創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//錄入左手中的紙牌數字
System.out.print("請輸入小明左手中的紙牌:");
int left = sc.nextInt();
//錄入右手中的紙牌數字
System.out.print("請輸入小明右手中的紙牌:");
int right = sc.nextInt();
//打印互換前的紙牌
System.out.println();
System.out.println("互換前小明手中的紙牌:");
System.out.println("左手中的紙牌:"+left);
System.out.println("右手中的紙牌:"+right);
System.out.println();
// 定義一個臨時變量temp,保存left的值
int temp = left;
// 將right的值賦值給left
left = right;
// 將臨時變量temp的值賦值給right
right = temp;
// 打印交換后紙牌
System.out.println("互換后小明手中的紙牌:");
System.out.println("左手中的紙牌:"+left);
System.out.println("右手中的紙牌:"+right);
}
}
4.2 練習2
需求:
定義一個int類型的變量,初始化值為123,求這個數的個位,十位,百位分別是多少?
運行效果:
123的個位是3,十位是2,百位是1
實現步驟:
1.定義一個變量,值為123
2.獲取該數字中個位、十位、百位的數字
3.打印結果
代碼實現:
public class Task02 {
public static void main(String[] args) {
//1.定義一個變量,值為123
int n = 123;
//2.獲取該數字中個位、十位、百位的數字
// 個位: 數字 % 10
int ge = n % 10;
// 十位: 數字 / 10 % 10;
int shi = n / 10 % 10;
// 百位: 數字 / 100 % 10;
int bai = n /100 % 10;
//3.打印結果
//123的個位是3,十位是2,百位是1
System.out.println(n + "的個位是"+ ge +",十位是"+ shi +",百位是" + bai);
}
}
4.3 練習3
需求:
鍵盤錄入一個三位數字,輸出該三位數字是否是水仙花數字?
水仙花數字要求: 指的是一個三位數,個位、十位、百位的數字立方和等于原數
例如 `153 3*3*3 + 5*5*5 + 1*1*1 = 27 + 125 + 1 = 153`
運行效果:
153是水仙花數字嗎? true
實現步驟:
1.創建鍵盤錄入對象
2.獲取一個int數字
3.獲取個位,十位,百位
4.求個位,十位,百位的立方和
5.利用三元運算符求立方和是否等于該數字本身
6.打印結果
代碼實現:
public class Task03 {
public static void main(String[] args) {
//1.創建鍵盤錄入對象
Scanner sc = new Scanner(System.in);
//2.獲取一個int數字
System.out.println("請輸入一個三位整數");
int num = sc.nextInt();
//3.獲取個位,十位,百位
int ge = num%10;
int shi = num/10%10;
int bai = num/100%10;
//4.求個位,十位,百位的立方和
int sum = ge*ge*ge + shi*shi*shi + bai*bai*bai;
//5.利用三元運算符求立方和是否等于該數字本身
boolean flag = (sum==num)?true:false;
//6.打印結果
System.out.println(num+"是水仙花數字嗎? "+flag);
}
}
循環
- 理解循環的概述和分類
- 掌握for循環的用法
- 掌握while循環的用法
- 了解do.while循環的用法
1. 循環結構
1.1 概述
循環,即事物周而復始的變化。循環結構指的是,使一部分代碼按照次數或一定的條件反復執行的一種代碼結構. 有些時候, 我們想代碼是在滿足某些條件的情況下, 重復(循環)執行的, 就需要用到循環結構了.
例如: 打印100次HelloWorld
. 如果不用循環實現的話, 輸出語句我們就需要寫100次, 我們發現這樣做是非常繁瑣的. 于是, 我們可以通過循環來優化它.
1.2 組成
-
初始化條件.
假設用
int類型的變量x記錄循環次數
,x從1開始數, 數到100剛好100次, 1在這里充當的角色就是: 初始化條件. -
判斷條件.
變量x從1開始數, 數到100結束. 即: x <= 100, 這就是判斷條件, 用來決定循環是否繼續執行的.
-
控制條件.
用來控制變量x變化的. 每循環一次, 變量x的值+1. 即: x++就是控制條件.
-
循環體.
指的是需要重復執行的代碼, 例如: System.out.println("Hello World!");
1.3 分類
-
for循環
一般適用于
循環次數固定
的情況. -
while循環
一般適用于
循環次數不固定
的情況. -
do.while循環
我們在實際開發中, 基本不用. 適用于
先執行一次, 然后判斷
的情況.
2. for循環
for循環是我們在實際開發中應用到的最多的循環, 它一般適用于循環次數固定
的情況.
2.1 格式
for(初始化條件1; 判斷條件2; 控制條件3) {
//循環體4;
}
解釋:
- 初始化條件: 用來記錄 循環的初始狀態的. 即: 從哪開始循環.
- 判斷條件: 用來決定循環是否繼續執行的, 條件成立, 則循環繼續執行, 條件不成立, 整個循環就結束了.
- 控制條件: 用來控制初始化條件變化的, 一般是每循環一次, 初始化條件+1.
- 循環體: 需要用來重復做的事情(代碼).
2.2 執行流程
- 先執行初始化條件.
- 然后執行判斷條件, 看其結果是true, 還是false.
- 如果是false, 則整個循環結束.
- 如果是true, 則執行循環體.
- 執行控制條件.
- 返回第2步, 繼續往下重復執行.
簡單理解:
- 第一次執行: 1, 2, 4, 3.
假設判斷條件成立.
- 重復執行: 2, 4, 3.
- 最后一次執行: 2
判斷條件不成立, 循環結束.
2.3 圖解
2.4 案例一: for循環入門
需求
通過for循環, 打印10次"Hello World!".
參考代碼
//需求: 打印10次HelloWorld
public class ForDemo01 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("Hello World!");
}
}
}
2.5 案例二: 打印數字
需求
- 通過for循環, 打印1~5之間的數字.
- 通過for循環, 打印5~1之間的數字.
參考代碼
public class ForDemo02 {
public static void main(String[] args) {
//1. 通過for循環, 打印1~5之間的數字.
for (int i = 1; i <= 5 ; i++) {
System.out.println(i);
}
System.out.println("--------------");
//2. 通過for循環, 打印5~1之間的數字.
//ritar
for (int i = 5; i >= 1; i--) {
System.out.println(i);
}
}
}
2.6 案例三: 求和案例
需求
通過for循環, 獲取1 ~ 5之間的數字之和.
參考代碼
public class ForDemo03 {
public static void main(String[] args) {
//1. 定義變量sum, 用來記錄數據和.
int sum = 0;
//2. 通過for循環, 依次獲取到1~5之間的數字.
for (int i = 1; i <= 5; i++) {
//3. 將獲取到的數字, 累加給變量sum.
sum += i;
}
System.out.println("1 - 5之間的數字之和是: " + sum);
}
}
細節: 求和變量必須定義到for循環的外邊, 如果定義到for循環的內容, 則每次循環都會被重置.
2.7 案例四: 求偶數和
需求
求1-100之間的偶數和,并把求和結果打印到控制臺上.
參考代碼
public class ForDemo04 {
public static void main(String[] args) {
//1. 定義變量sum, 用來記錄數據和.
int sum = 0;
//2. 通過for循環, 依次獲取到1 - 100之間的數字.
for (int i = 1; i <= 100; i++) {
//3. 判斷當前遍歷到的數字是否是偶數.
if (i % 2 == 0) {
//4. 走到這里, 說明是偶數, 累加給變量sum.
sum += i;
}
}
//5. 打印結果.
System.out.println("1 - 100之間的偶數之和是: " + sum);
}
}
2.8 案例五: 獲取水仙花數
需求
獲取到所有的水仙花數, 并將結果打印到控制臺上.
解釋:
- 水仙花數是一個3位數的整數.
- 該數字的各個位數立方和相加等于它本身.
- 例如: 153就是水仙花數, 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 = 153
參考代碼
public class ForDemo05 {
public static void main(String[] args) {
int ge, shi, bai;
for (int i = 100; i < 1000; i++) {
ge = i / 1 % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai)
System.out.println(i);
}
}
}
2.9 案例六: 計數思想
需求
統計所有水仙花數的個數, 并將其打印到控制臺上.
參考代碼
public class ForDemo06 {
public static void main(String[] args) {
int ge, shi, bai,count = 0;
for (int i = 100; i < 1000; i++) {
ge = i / 1 % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
if (i == ge * ge * ge + shi * shi * shi + bai * bai * bai)
count++;
}
System.out.println("水仙花數的個數為: " + count);
}
}
2.10 案例七: 求和 + 計數
需求
獲取1 - 100之間的奇數和, 以及奇數的個數.
參考代碼
//需求: 獲取1 - 100之間的奇數和, 以及奇數的個數.
public class ForDemo07 {
public static void main(String[] args) {
int count = 0;
int sum = 0;
for (int i = 1; i <= 100 ; i++) {
if (i % 2 != 0) {
sum += i;
count++;
}
}
System.out.println("1-100之間的奇數個數為: " + count + ", 這些奇數的總和為: " + sum);
}
}
2.11 案例八: 換行輸出
需求
把1~100之間的數字, 按照6個一行的格式進行輸出.
參考代碼
public class ForDemo08 {
public static void main(String[] args) {
int flag = 6;
int count = 0;
for (int i = 1; i <= 100 ; i++) {
System.out.print(i + "\t");
if (++count % flag == 0)
System.out.println();
}
}
}
3. while循環
while循環也是我們在實際開發中應用到的比較多的循環, 它一般適用于循環次數不固定
的情況.
3.1 格式
初始化條件1;
while(判斷條件2) {
//循環體3;
//控制條件4;
}
解釋:
- 初始化條件: 用來記錄 循環的初始狀態的. 即: 從哪開始循環.
- 判斷條件: 用來決定循環是否繼續執行的, 條件成立, 則循環繼續執行, 條件不成立, 整個循環就結束了.
- 控制條件: 用來控制初始化條件變化的, 一般是每循環一次, 初始化條件+1.
- 循環體: 需要用來重復做的事情(代碼).
3.2 執行流程
- 先執行初始化條件.
- 然后執行判斷條件, 看其結果是true, 還是false.
- 如果是false, 則整個循環結束.
- 如果是true, 則執行循環體.
- 執行控制條件.
- 返回第2步, 繼續往下重復執行.
簡單理解:
- 第一次執行: 1, 2, 3, 4.
假設判斷條件成立.
- 重復執行: 2, 3, 4.
- 最后一次執行: 2
判斷條件不成立, 循環結束.
3.3 圖解
3.4 案例一: while循環入門
需求
在控制臺打印10次HelloWorld
.
參考代碼
public class WhileDemo01 {
public static void main(String[] args) {
int i = 0;
while(i < 10) {
System.out.println("Hello World!");
i++;
}
}
}
3.5 案例二: 求和
需求
獲取1~100之間所有偶數和, 并將結果打印到控制臺上.
參考代碼
//需求: 獲取1 - 100之間的偶數和.
public class WhileDemo02 {
public static void main(String[] args) {
int sum = 0;
int i = 1;
while (i <= 100) {
if (i % 2 == 0)
sum += i;
i++;
}
System.out.println("1-100之間的偶數和為: " + sum);
}
}
3.6 案例三: 珠穆朗瑪峰
需求
已知世界最高山峰是珠穆朗瑪峰(8844.43米=8844430毫米).
假如我有一張足夠大的紙,它的厚度是0.1毫米.
-
請問,我折疊多少次,可以折成珠穆朗瑪峰的高度?
即: 紙張的厚度 >= 珠穆朗瑪峰的高度
參考代碼
//案例: 珠穆朗瑪峰
public class WhileDemo03 {
public static void main(String[] args) {
//1. 定義變量, 記錄紙張的厚度.
double paper = 0.1;
//2. 定義變量, 記錄珠峰的高度.
int zf = 8844430;
//3. 定義變量, 記錄紙張的折疊次數.
int count = 0;
//4. 通過while循環實現, 獲取折疊次數.
while (paper < zf) {
paper *= 2;
count++;
}
//5. 打印結果.
System.out.println("折疊次數為: " + count);
}
}
4. do.while循環
do.while循環在實際開發中應用到的并不是特別多, 所以我們簡單的了解下它的用法即可.
4.1 格式
初始化條件;
do {
循環體;
控制條件;
} while(判斷條件);
解釋:
- 初始化條件: 用來記錄 循環的初始狀態的. 即: 從哪開始循環.
- 判斷條件: 用來決定循環是否繼續執行的, 條件成立, 則循環繼續執行, 條件不成立, 整個循環就結束了.
- 控制條件: 用來控制初始化條件變化的, 一般是每循環一次, 初始化條件+1.
- 循環體: 需要用來重復做的事情(代碼).
4.2 執行流程
- 先執行初始化條件.
- 再執行循環體.
- 再執行控制條件.
- 執行判斷條件, 看其結果是true還是false.
- 如果是false, 則整個循環結束.
- 如果是true, 則返回第2步重復往下執行.
簡單理解:
- 第一次執行: 1, 2, 3, 4.
假設判斷條件成立.
- 重復執行: 2, 3, 4.
- 最后一次執行: 2
判斷條件不成立, 循環結束.
4.3 圖解
4.4 案例: 打印HelloWorld
需求
通過do.while循環, 在控制臺打印10次Hello World!
參考代碼
public class DoWhileDemo01 {
public static void main(String[] args) {
int i = 1;
do{
System.out.println("Hello World! " + i);
i++;
}while(i <= 10);
}
}
5. 循環擴展
5.1 三種循環之間的區別
- do.while循環和其他兩個循環之間的區別
- do.while循環是先執行一次, 后判斷.
- 而其他兩個循環都是先執行判斷條件, 然后決定是否執行循環體.
- for循環和其他兩個循環之間的區別
- for循環執行結束后, 初始化條件就不能繼續使用了.
- 而其他兩個循環執行結束后, 初始化條件還可以繼續使用.
5.2 死循環
5.2.1 概述
所謂的死循環指的是永不會結束的循環, 也就是循環的判斷條件永遠為true,
在后期的開發中,會出現使用死循環的場景,例如:我們需要讀取用戶輸入的輸入,但是用戶輸入多少數據我們并不清楚,也只能使用死循環,當用戶不想輸入數據了,就可以結束循環了,如何去結束一個死循環呢,就需要使用到跳出語句了。
5.2.2 分類
在Java中, 死循環的寫法格式主要有以下3種:
- for(;;) { }
- while(true){ }
- do { } while(true)
5.2.3 參考代碼
public class DeadLoop {
public static void main(String[] args) {
/*for(;;) {
System.out.println("Hello World!");
}*/
/*while(true) {
System.out.println("Hello World!");
}*/
do {
System.out.println("Hello World!");
} while(true);
}
}
6. 練習
6.1 案例一
需求
按照從大到小的順序輸出四位數中的個位+百位=十位+千位(3553,2332,1166,8228,3773)的數字及個數.
每行輸出5個滿足條件的數,之間用空格分隔
如:9999 9988 9977 9966 9955
參考代碼
6.2 案例二
需求
從鍵盤上錄入一個大于100的三位數,求出100到該數字之間滿足如下要求的數字之和, 要求如下:
- 數字的個位數不為7;
- 數字的十位數不為5;
- 數字的百位數不為3;
參考代碼