流程控制: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