流程控制:if、switch、for、while
尚硅谷JavaSE筆記-04
分支控制
if-else
基礎都一樣不多贅述
-
特殊情況有人不加
{}
,這種情境下就近原則且只控制一行(到第一個;
為止)if (1 == 2) System.out.println("a"); System.out.println("b"); System.out.println("c"); 結果為 b c
-
只有單行時可以接
else
且也會就近選擇if (1 == 2) System.out.println("a"); else System.out.println("d"); 結果為d
-
多行時直接報錯
if (1 == 2) System.out.println("a"); System.out.println("b"); System.out.println("c"); else 報錯
-
小結:不加
{}
的全部拖出去打
switch-case
-
結構:
switch (表達式) { case 常量1: // 執行語句 break; case 常量2... ... default: // 預設執行語句 }
-
如果不加
break;
就不會跳出,而是會穿透且之下的語句全都執行一遍 -
基於上述特性,可以合併使用,舉例:
case 1: case 2: case 3: // 執行語句123的情況 break; case 4: ... 也可以用在需要壘加的情況,舉例 case 9: a += 10 case 8: a += 5 case 7: a += 100 ...
-
表達式只能為6種類型: byte、short、char、int、枚舉、string,不能是bool
-
case
後只能放常量,不能是範圍 -
default
不一定要有且位置是靈活可變的,但注意若不擺在最尾需要加入break;
,否則會多執行下一行,很蠢,不建議這樣用
分支控制小結
- 凡是可以用switch-case結構的都能轉成if-else,反之不成立
- 兩種都可用的情況(條件不要太多)優先考慮switch-case,執行效率較高
循環控制
for
-
for的結構
for(初始條件;循環條件;疊代){ 循環體; }
題外話:「疊代」與「迭代」
- 「疊代」:累進取代,不斷重複進行後者加上前者、替換掉前者的動作;
- 「迭代」:替換取代,表示幾個固定的物件彼此輪替取代的動作;
繁體中文兩種用法都存在,迭代用於只有幾個條件在那邊不停輪換的情況,比如四季迭代。一般軟體用的應為疊代。
獲取使用者輸入
Scanner scanner = new Scanner(System.in)
/*
System.in開啟了一個InputStream來獲取使用者的輸入
把使用者的輸入傳給剛剛new建立的scanner物件
這個scanner物件是來自java.util.Scanner包中定義的Scanner類
接著用scanner.next類型()來決定要接收的數據類型,舉例接收i
*/
int number = scanner.nextInt();
for練習題-最大公因數與最小公倍數
輸入m、n,求最大公因數與最小公倍數
Scanner scanner = new Scanner(System.in);
System.out.println("輸入數字m...");
int m = scanner.nextInt();
System.out.println("輸入數字n...");
int n = scanner.nextInt();
int min = 0, max = 0;
for (int i = 1; i > 0; i++) {
if (m % i == 0 && n % i == 0) {
min = i;
}
if (i % m == 0 && i % n == 0) {
max = i;
break;
}
}
System.out.println("數字" + m + "與數字" + n + "之最大公因數為" + min + "最小公倍數為" + max);
// 這個效率不夠高,改進: 先找出輸入的2數誰大
// 最大公因數=for循環從大往小減,遇到第一個就break
for練習題-水仙花數
水仙花數:是指一個n位的正整數(n>=3),它的每個數字的n次冪之和等於它本身。例如:1^3 + 5^3+ 3^3 = 153
for (int i = 100; i < 1000; i++) {
int a = i / 100; // 百位
int b = i % 100 / 10; // 十位
int c = i % 10; // 個位
if (i == (a * a * a + b * b * b + c * c * c)) {
System.out.println(i);
}
循環控制while
其實教學影片中這是第5天的內容,不過while跟for類似所以我筆記寫一起了
-
while的結構
-
初始條件; while(循環條件){ 循環體; 疊代; }
-
for跟while可以互相轉換,他們實際的差別在變量的作用域。
-
因為while的初始條件寫在外面,循環結束也能使用(全局變量與局部變量的區別)
do-while
-
do-while的結構
-
初始條件; do{ 循環體; 疊代; }while(循環條件);
-
上來就至少執行一次循環跟疊代,然後才進入判斷
-
少用
練習題-無限循環
輸入不限制數量的正負整數,直到輸入0為中止,顯示正負整數的數量
Scanner scan = new Scanner(System.in);
int pos = 0;
int neg = 0;
for (; ; ) {
System.out.println("輸入任意正負整數,0為中止...");
int input = scan.nextInt();
if (input == 0) {
System.out.println("中止,正數個數為" + pos + ",負數個數為" + neg);
break;
} else if (input > 0) {
pos++;
} else {
neg++;
}
for ( ; ; )
跟while(true)
相等
小結
- JAVA的if與for用起來跟go的差不多,就switch會穿透要記得
break
- JAVA中聲明變量必須要賦值否則編譯報錯
- 用if多個條件嵌套時正常從涵蓋範圍小往大寫,不要不加
{}
- 從go的角度看while沒啥必要性,do-while簡直邪道,盡量少用
上次修改於 2021-11-19