Java程式邏輯控制詳談

2020-10-08 11:00:29

邏輯控制

1.1順序結構

順序結構比較簡單. 像我們之前寫過的程式碼就是順序結構的,程式是按照程式碼書寫的順序一行一行來執行。

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
// 執行結果
aaa
bbb
ccc

如果調整程式碼的書寫順序,則執行順序也會發生變化
System.out.println("aaa");
System.out.println("ccc");
System.out.println("bbb");
// 執行結果
aaa
ccc
bbb

1.2 分支結構

1.2.1 if 語句

基本語法格式1:

//注意,java中最好第一個花括號跟在if語句後面
if(布林表示式){
    //條件滿足時執行程式碼
}

基本語法格式2:

if(布林表示式){
    //條件滿足時執行程式碼
}else{
    //條件不滿足時執行程式碼
}

基本語法格式3:

if(布林表示式){
    //條件滿足時執行程式碼
}else if(布林表示式){
    //條件滿足時執行程式碼
}else{
    //條件都不滿足時執行程式碼
}
注意事項1:懸垂else問題
int x = 20;
int y = 10;
if (x == 10) 
 	if (y == 10)
 		System.out.println("aaa");
else
 	System.out.println("bbb");

 //猜一猜最終會列印出 aaa 還是 bbb?
 //答案是什麼都不列印,這段程式碼最終的樣子是這樣的。
int x = 20;
int y = 10;
if (x == 10)  //第一層條件不滿足,所以後面直接不看
 	if (y == 10)
 		System.out.println("aaa");
	else
 		System.out.println("bbb");

結論:

  1. if / else 語句中可以不加 大括號。但是也可以寫語句(只能寫一條語句)。
  2. 如果 if 語句不加大括號,此時 else 是和最接近的 if 匹配。但是實際開發中我們不建議這麼寫,最好加上大括號。
注意事項2:布林表示式寫法問題
//比如說判斷一個數num是否小於20大於10
//有的同學可能會這麼寫:
if(10 <= num <= 20)
//這樣寫是不行的,正確做法是:
if(num >= 10 && num <= 20)
注意事項3:程式碼風格問題
// 風格1
int x = 10;
if (x == 10) {
    // 滿足條件
} else {
    // 不滿足條件
}
// 風格2
int x = 10;
if (x == 10)
{
    // 滿足條件
}
else
{
    // 不滿足條件
}

雖然兩種方式都是可取的,但是在java中更推薦使用風格1,{ 放在 if / else 同一行。

注意事項4:分號問題
int x = 20;
if (x == 10); {
    System.out.println("hehe");
}
// 執行結果
hehe
//可以看成這樣
int x = 20;
if (x == 10); //這一句已經結束了

{
    System.out.println("hehe");
}

結論:
分號在java中表示的一個語句的結束,此處多寫了一個分號,導致分號成了 if 語句的語句體,而 { } 中的程式碼已經成為了一個和 if 語句無關的程式碼塊,所以不管怎麼樣,這句程式碼都會執行。

1.2.2 switch 語句

基本語法:

switch(整數|列舉|字元|字串){
 case 內容1 : {
// 內容滿足時執行語句;
 break;
 }
 case 內容2 : {
 //內容滿足時執行語句;
 break;
 }
 ...
 default:{
 //內容都不滿足時執行語句;
 break;
 } 
}
  1. switch 語句中引數最大隻能是整型,也就是 int 、char 、byte 、short型別可以做引數,而double 、float 、boolean 、long型別不能做引數。
  2. 根據 switch 中值的不同, 會執行對應的case 語句。遇到 break 就會結束該 case 語句。
  3. 如果 switch 中的值沒有匹配的 case, 就會執行 default 中的語句。建議一個 switch 語句最好都要帶上 default
注意事項1:break 不要遺漏, 否則會失去"多分支選擇的結果"
int day = 1;
switch(day) {
    case 1:
        System.out.println("星期一");
    case 2:
        System.out.println("星期二");
        break; }
// 執行結果
星期一
星期二

結論:
可以發現,如果不寫 break,case 語句會依次向下執行,從而失去了多分支的效果。

注意事項2:switch 中的值只能是 整數|列舉|字元|字串型別
double num = 1.0;
switch(num) {
    case 1.0:
        System.out.println("hehe");
        break;
    case 2.0:
        System.out.println("haha");
        break; }
// 編譯出錯
Test.java:4: 錯誤: 不相容的型別: 從double轉換到int可能會有損失
                switch(num) {
                        ^ 
1 個錯誤
注意事項3:switch 不能表達複雜的條件
// 例如: 如果 num 的值在 10 到 20 之間, 就列印 hehe
// 這樣的程式碼使用 if 很容易表達, 但是使用 switch 就無法表示. 
if (num > 10 && num < 20) {
 System.out.println("hehe");
}
注意事項4:switch 雖然支援巢狀, 但是很醜~
int x = 1; 
int y = 1; 
switch(x) { 
 	case 1: 
 		switch(y) { 
 			case 1: 
 				System.out.println("hehe"); 
 				break; 
 } 
 		break; 
 	case 2: 
 		System.out.println("haha"); 
 		break; 
}

程式碼的美觀程度也是一個重要標準,綜上可以發現,switch 的使用侷限性是比較大的。

1.3 迴圈結構

1.3.1 while 迴圈

基本語法格式:

while(迴圈條件){ 
	迴圈語句; 
}
迴圈條件為true ,則執行迴圈語句,否則結束迴圈。注意這裡迴圈條件也必須為布林表示式
程式碼範例1:計算5的階乘
int n = 1; 
int result = 1; 
while (n <= 5) { 
 	result *= n; 
 	n++; 
} 
System.out.println(result); 
// 執行結果
120
程式碼範例2:計算 1!+2!+3!+4!+5!的和
//此時就需要用到迴圈巢狀
	int n = 1; 
	int sum = 0;
	while(n <= 5) {
		int result = 1; 
		int i = 1;
		while (i <= n) { 
			result *= i; 
			i++; 
		}
		sum += result;
		n++;
	}
		System.out.println(sum);
//執行結果:
153

注意事項:

  1. 和 if 類似, while 下面的語句可以不寫 { } , 但是不寫的時候只能支援一條語句. 建議還是加上 { }。
  2. 和 if 類似, while 後面的 { 建議和 while 寫在同一行。
  3. 和 if 類似, while 後面不要多寫 分號, 否則可能導致迴圈不能正確執行。
程式碼範例:
int num = 1; 
while (num <= 10); { 
 System.out.println(num); 
 num++; 
} 
// 執行結果
[無任何輸出, 程式死迴圈]

此時 ; 為 while 的語句體(這是一個空語句), 實際的 { } 部分和迴圈無關。此時迴圈條件 num <= 10 恆成立, 導致程式碼死迴圈了。

1.3.2 break

break 的功能是讓迴圈提前結束。
程式碼範例:
找到 100 - 200 中第一個 3 的倍數。

int num = 100; 
while (num <= 200) { 
 	if (num % 3 == 0) { 
		 System.out.println("找到了 3 的倍數, 為:" + num); 
 		 break; 
 } 
 	num++; 
} 
// 執行結果
找到了3的倍數,為:102
1.3.3 continue

continue 的功能是跳過這次迴圈, 立即進入下次迴圈。
程式碼範例:
找到100 - 200 中所有3的倍數。

int num = 100; 
while (num <= 200) { 
 	if (num % 3 != 0) { 
 		num++; // 這裡的 ++ 不要忘記! 否則會死迴圈. 
 		continue;  //跳過本次迴圈,繼續下一次迴圈
 } 
 	System.out.println("找到了 3 的倍數, 為:" + num); 
 	num++; 
}

可以發現,執行到 continue 語句的時候, 就會立刻進入下次迴圈(判定迴圈條件),從而不會執行下方的列印語句。

1.3.4 for 迴圈

基本語法:

for(表示式1;表示式2;表示式3){ 
迴圈體; 
}
表示式1: 用於初始化迴圈變數.
表示式2: 迴圈條件
表示式3: 更新迴圈變數.
相比於 while 迴圈, for迴圈將這三個部分合並在一起,寫程式碼時不容易遺漏。
程式碼範例1:計算5的階乘
int result = 0; 
for (int i = 1; i <= 5; i++) { 
	 result *= i; 
} 
System.out.println("result = " + result);
程式碼範例2:計算 1! + 2! + 3! + 4! + 5!
int sum = 0; 
for (int i = 1; i <= 5; i++) { 
	 int tmp = 1; 
 for (int j = 1; j <= i; j++) { 
 		tmp *= j; 
 } 
	 sum += tmp; 
} 
System.out.println("sum = " + sum);
注意:(和while迴圈類似)
  1. 和 if 類似, for 下面的語句可以不寫 { } , 但是不寫的時候只能支援一條語句.,建議還是加上 { }。
  2. 和 if 類似, for 後面的 { 建議和 while 寫在同一行。
  3. 和 if 類似, for 後面不要多寫分號,否則可能導致迴圈不能正確執行。
1.3.5 do while 迴圈

基本語法:

do{ 
迴圈語句; 
}while(迴圈條件);
先執行迴圈語句,在判定迴圈條件。
程式碼範例:
int num = 10;
do {
	System.out.println("666");
}while(num <= 1);
//執行結果 666,可見雖然條件不成立,但是已經執行了一次

注意:

  1. do while 迴圈最後的分號不要忘記。
  2. 一般 do while 很少用到, 更推薦使用 for 和 while。

1.4 輸入輸出

基本語法:

System.out.println(msg); // 輸出一個字串, 帶換行
System.out.print(msg); // 輸出一個字串, 不帶換行
System.out.printf(format, msg); // 格式化輸出

注意:

  1. println 輸出的內容自帶 \n, print 不帶 \n。
  2. printf 的格式化輸出方式和 C 語言的printf是基本一致的。
程式碼範例:
System.out.println("hello world"); 
int x = 10; 
System.out.printf("x = %d\n",x);
格式化字串:

如圖所示:
在這裡插入圖片描述

這個表格沒必要記住,用到的時候根據需要查一下就行。

1.4.2 從鍵盤輸入(瞭解會使用就行)

就目前來看最適合的方法就是使用 Scanner 讀取字串/整數/浮點數。

程式碼範例:
import java.util.Scanner; // 需要匯入 util 包
Scanner sc = new Scanner(System.in); 
System.out.println("請輸入你的姓名:"); 
String name = sc.nextLine();  //讀取一行,讀入上一個回車
System.out.println("請輸入你的年齡:"); 
int age = sc.nextInt(); 
System.out.println("請輸入你的工資:"); 
float salary = sc.nextFloat(); 
System.out.println("你的資訊如下:"); 
System.out.println("姓名: "+name+"\n"+"年齡:"+age+"\n"+"工資:"+salary); 
sc.close(); // 注意, 要記得呼叫關閉方法

// 執行結果
請輸入你的姓名:
張三
請輸入你的年齡:
18 
請輸入你的工資:
1000 
你的資訊如下:
姓名: 張三
年齡:18 
工資:1000.0
使用Scanner迴圈讀取 N個數位:
Scanner sc = new Scanner(System.in); 
double sum = 0.0; 
int num = 0; 
while (sc.hasNextDouble()) { 
 double tmp = sc.nextDouble(); 
 sum += tmp; 
 num++; 
}
ystem.out.println("sum = " + sum); 
System.out.println("avg = " + sum / num); 
sc.close(); 
// 執行結果
10 
40.0 
50.5 
^Z 
sum = 150.5 
avg = 30.1

注意:
當迴圈輸入多個資料的時候, 使用 ctrl + z 來結束輸入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl +d)。