1. 程式人生 > 其它 >C++尺寸大小計算

C++尺寸大小計算

Java流程控制

目錄

使用者互動Scanner

我們之前學習的基本語法中我們並沒有實現程式和人的互動,但是Java給我們提供了這樣一個工具類,我們可以獲取使用者的輸入。java.util.Scanner 是 Java5 的新特性,我們可以通過 Scanner 類來獲取使用者的輸入

基礎語法:

Scanner scanner = new Scanner(System.in);

通過Scanner 類的 next() 與 nextLine() 方法獲取輸入的字串,在讀取前我們一般需要 使用 hasNext() 與 hasNextLine() 判斷是否還有輸入的資料。

接收字元

  • next()方法:

    1. 一定要讀取到有效字元後才可以結束輸入

    2. 對輸入有效字串之前遇到的空白,next() 方法會自動將其去掉

    3. 只有輸入有效字元之後才將其後面輸入的空白作為分隔符或結束符

    4. next() 不能得到帶有空格的字串

      import java.util.Scanner;
      
      public class Demo01 {
          public static void main(String[] args) {
              // 建立一個掃描物件,用於接收鍵盤資料
              Scanner scanner = new Scanner(System.in);
              System.out.print("使用next()方法接收:");
              // 判斷使用者有沒有輸入字串
              if (scanner.hasNext()) {
                  // 接收使用者的輸入
                  String str = scanner.next(); // 程式會等待使用者輸入完畢再執行
                  System.out.println("輸入的內容為:" + str); // 輸入:Hello World 輸出:Hello
              }
              // 凡是屬於 IO 流的類如果不關閉會一直佔用資源,要養成良好的習慣,用完就關閉
              scanner.close();
          }
      }
      
  • nextLine()方法:

    1. 以Enter作為結束符,也就是說 nextLine() 方法返回的是輸入回車之前的所有字元‘

    2. 可以獲得空白

      import java.util.Scanner;
      
      public class Demo02 {
          public static void main(String[] args) {
              // 從鍵盤接收資料
              Scanner scanner = new Scanner(System.in);
              System.out.print("使用nextLine()方法接收:");
              //判定是否還有輸入
              if (scanner.hasNextLine()) {
                  String str = scanner.nextLine();
                  System.out.println("輸入的內容為:" + str); // Hello World
              }
              scanner.close();
          }
      }
      

常用格式:

import java.util.Scanner;

public class Demo03 {
    public static void main(String[] args) {
        // 從鍵盤接收資料
        Scanner scanner = new Scanner(System.in);

        System.out.print("請輸入資料:");

        String str = scanner.nextLine(); // 接收一行資料

        System.out.println("輸入的內容為:" + str);

        scanner.close(); // 關閉 IO 流
    }
}

接收其他資料型別

除了 hasNext() 方法之外,還有 hasNextInt()、hasNextDouble()、……

當然 next() 方法之外 ,還有 nextInt()、nextDouble()、……

import java.util.Scanner;

public class Demo04 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 從鍵盤接收資料
        int i = 0;
        float f = 0.0f;
        // 接收整數:
        System.out.print("請輸入整數:");
        if (scanner.hasNextInt()) {
            i = scanner.nextInt();
            System.out.println("整數資料:" + i);
        } else {
            System.out.println("您輸入的資料不是整數!");
        }
        // 接收小數:
        System.out.print("請輸入小數:");
        if (scanner.hasNextFloat()) {
            f = scanner.nextFloat();
            System.out.println("小數資料:" + f);
        } else {
            System.out.println("您輸入的資料不是小數!");
        }
        scanner.close();
    }
}

練習

我們可以輸入多個數字,並求出其總和與平均數,每輸入一個數字用回車確認。
通過輸入非數字來結束輸入並輸出執行結果

import java.util.Scanner;

public class Demo05 {
    public static void main(String[] args) {
        // 接收鍵盤錄入
        Scanner scanner = new Scanner(System.in);
        // 記錄總和
        double sum = 0;
        // 記錄輸入的次數
        int m = 0;
        //迴圈輸入
        while (scanner.hasNextDouble()) {
            // 輸入一次,sum就加上輸入的數
            sum += scanner.nextDouble();
            // 記錄數自增1
            m++;
            System.out.println("第" + m + "次輸入,當前和為:" + sum);
        }
        System.out.println("一共輸入了:" + m + "次");
        System.out.println("和為:" + sum);
        System.out.println("平均數是:" + (sum / m));
        // 關閉 IO 流
        scanner.close();
    }
}

順序結構

Java的基本結構就是順序結構,除非特別指明,否則就按照一句一句從上往下依次執行。

順序結構是最簡單的演算法結構

語句與語句之間,框與框之間是按從上到下的順序進行,它是由若干個依次執行的處理步驟組成的

它是一個任何演算法都離不開的一種基本演算法結構

public class OrderDemo {
    public static void main(String[] args) {
        System.out.println("Hello1");
        System.out.println("Hello2");
        System.out.println("Hello3");
        System.out.println("Hello4");
        System.out.println("Hello5");
        // 從Hello1 依次執行到 Hello5
    }
}

選擇結構

if單選擇結構

我們很多時候需要去判斷一個東西是否可行,然後我們才去執行,這樣一個過程在持續中用if語句來表示

語法:

if (布林表示式) {
    // 如果布林表示式為true將執行的語句
}

程式碼:

public class IfDemo01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入一個內容:");
        String s = scanner.nextLine();
        // equals: 判斷字串是否一致
        if ("hello".equals(s)){
            // 如果輸入的字串是hello,就執行下面的語句
            System.out.println(s);
        }
        System.out.println("End");
        scanner.close();
    }
}

if雙選擇結構

那現在有個需求,考試分數大於60分及格,小於60分就不及格。這樣的需求用一個if就搞不定了,我們需要有兩個判斷,需要一個雙選擇結構,所以就有了if-else結構。

語法:

if (布林表示式) {
    // 如果布林表示式的值為true
} else {
    // 如果布林表示式的值為false
}

程式碼:

public class IfDemo02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入成績:");
        double score = scanner.nextDouble();
        if (score >= 60) {
            System.out.println("成績及格");
        } else {
            System.out.println("成績不及格");
        }
        scanner.close();
    }
}

if多選擇結構

我們發現剛才的程式碼不符合實際情況,真實的情況還可能存在ABCD,存在區間多級判斷。比如90-100就是A,80-90 就是B……等等,在生活中我們很多時候的選擇也不僅僅只有兩個,所以我們需要一個多選擇結構來處理這類問題!

if 語句至少有 1 個 else 語句,else 語句必須在所有的 else if 語句之後

if 語句可以有若干個 else if 語句,它們在 else 語句之前

一旦其中一個 else if 語句檢測為 true,其他的 else if 以及 else 語句都將跳過執行

語法:

if (布林表示式1) {
    // 如果布林表示式1的值為true執行程式碼
} else if (布林表示式2) {
    // 如果布林表示式2的值為true執行程式碼
} else if (布林表示式3) {
    // 如果布林表示式3的值為true執行程式碼
} else {
    // 如果以上布林表示式的值都不為true執行程式碼
}

程式碼:

public class IfDemo03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入成績:");
        double score = scanner.nextDouble();
        if (score == 100) {
            System.out.println("S");
        } else if (score < 100 && score >= 90) {
            System.out.println("A級");
        } else if (score < 90 && score >= 80) {
            System.out.println("B級");
        } else if (score < 80 && score >= 70) {
            System.out.println("C級");
        } else if (score < 70 && score >= 60) {
            System.out.println("D級");
        } else if (score >= 0 && score < 60) {
            System.out.println("不及格");
        } else {
            System.out.println("成績不合法");
        }
        scanner.close();
    }
}

巢狀的if結構

使用巢狀的if...else語句是合法的。也就是說你可以在另一個if或者else if語句中使用if或者else if 語句。你可以像if語句一樣巢狀else if...else。

語法:

if (布林表示式1) {
    // 如果布林表示式1的值為true執行程式碼
    if (布林表示式2) { 
        // 如果布林表示式2的值為true執行程式碼
	}
}

switch多選擇結構

多選擇結構還有一個實現方式就是switch case語句。

switch case語句判斷一個變數與一系列值中某個值是否相等,每個值稱為一個分支。

語法:

switch(expression){
    case value:
        // 語句
        break; // 可選
    case value:
		// 語句
		break; // 可選
    // 你可以有任意數量的case語句
    default : // 可選
        // 語句
        break;
}

switch 語句中的變數型別可以是:

  • byte、short、int 或者 char
  • 從Java SE 7 開始
  • switch 支援字串 String 型別了
  • 同時 case 標籤必須為字串常量或字面量

程式碼:

public class SwitchDemo01 {
    public static void main(String[] args) {
        char grade = 'C';
        // switch 匹配一個具體的值
        switch (grade) {
            case 'A':
                System.out.println("優秀");
                break; // 可選
            // case 穿透 執行完一個case,如果沒有break,就會繼續執行下一條 case 或 break
            case 'B':
                System.out.println("良好");
            case 'C':
                System.out.println("及格");
            case 'D':
                System.out.println("再接再厲");
                break;
            case 'E':
                System.out.println("掛科");
            default:
                System.out.println("未知等級");
                break;
        }
    }
}

反編譯

Java檔案:

package com.jh.struct;

public class SwitchDemo02 {
    public static void main(String[] args) {
        String name = "study";
        // JDK7的新特性,表示式的結果可以是字串!!!
        // 字元的本質還是數字
        /*
        反編譯 java -- class(位元組碼檔案) --- 反編譯(IDEA)
         */
        switch(name){
            case "hello":
                System.out.println("你好");
                break;
            case "study":
                System.out.println("study");
              break;
            default :
                System.out.println("無法匹配");
                break;
        }
    }
}

class檔案反編譯後:

package com.jh.struct;

public class SwitchDemo02 {
    public SwitchDemo02() {
    }
    public static void main(String[] args) {
        String name = "study";
        byte var3 = -1;
        switch(name.hashCode()) {
        case 99162322:
            if (name.equals("hello")) {
                var3 = 0;
            }
            break;
        case 109776329:
            if (name.equals("study")) {
                var3 = 1;
            }
        }
        switch(var3) {
        case 0:
            System.out.println("你好");
            break;
        case 1:
            System.out.println("study");
            break;
        default:
            System.out.println("無法匹配");
        }
    }
}

迴圈結構

為了執行程式碼中的重複步驟,減少程式碼的冗餘,使程式碼簡潔明瞭

while 迴圈

while 是最基本的迴圈

結構:

while (布林表示式) {
    // 迴圈內容
}

只要布林表示式為 true,迴圈就會一直執行下去

我們大多數情況是會讓迴圈停止下來的,我們需要一個讓表示式失效的方法來結束迴圈

少部分情況需要迴圈一直執行,比如伺服器的請求響應監聽等

迴圈條件一直為true就會造成無限迴圈【死迴圈】我們正常的業務程式設計中應該儘量避免死迴圈。會影響程式效能或者造成程式卡死崩潰!

程式碼:

public class WhileDemo01 {
    public static void main(String[] args) {
        // 輸出1~100
        int i = 0;
        while (i < 100) { // 迴圈結束條件
            i++;
            System.out.println(i);
        }
    }
}

死迴圈程式碼:

public class WhileDemo02 {
    public static void main(String[] args) {
        // 死迴圈
        while (true){
            // 等到客戶端連線
            // 定時檢查任務
            // ……
        }
    }
}

練習:計算 1 + 2 + 3 + …… + 100 = ?

高斯的故事:首項加末項乘以項數除以2

public class WhileDemo03 {
    public static void main(String[] args) {
        int i = 0; // 初始值
        int sum = 0; //總和
        while (i <= 100) { // 迴圈條件
            sum += i; // 執行一次 sum 就加上 i
            i++; // i自增
        }
        System.out.println(sum); // 5050
    }
}

do...while 迴圈

對於 while 語句而言,如果不滿足條件,則不能進入迴圈。但有時候我們需要即使不滿足條件,也至少執行一次

do...while 迴圈和 while 迴圈相似,不同的是,do...while 迴圈至少會執行一次

語法:

do {
    // 程式碼語句
} while (布林值表示式);

while 和 do-while 的區別:

  • while先判斷後執行。do-while是先執行後判斷!
  • do ... while 總是保證迴圈體會被至少執行一次!

程式碼:

public class DoWhileDemo01 {
    public static void main(String[] args) {
        int i = 0;
        int sum = 0;
        do {
            sum += i;
            i++;
        } while (i <= 100);
        System.out.println(sum);
    }
}

while 和 do...while 對比:

public class DoWhileDemo02 {
    public static void main(String[] args) {
        int i = 0;
        while (i < 0) {
            System.out.println(i);
        }
        System.out.println("==========");
        do {
            System.out.println(i);
        } while (i < 0);
    }
}
// 輸出
==========
0

for 迴圈

雖然所有迴圈結構都可以用 while 或者 do...while表示,但 Java 提供了另一種語句 ----- for 迴圈,使一些迴圈結構變得更加簡單

for 迴圈語句是支援迭代的一種通用結構,是最有效、最靈活的迴圈結構

for 迴圈執行的次數是在執行前就確定的

語法:

for (初始值; 布林表示式; 更新) {
    // 程式碼語句
}

for 迴圈特點:

  1. 最先執行初始化步驟。可以宣告一種型別,但可初始化一個或多個迴圈控制變數,也可以是空語句
  2. 然後,檢測布林表示式的值。如果為true,迴圈體被執行。如果alse,迴圈終止,開始執行迴圈體後面的語句
  3. 執行一次迴圈後,更新迴圈控制變數(迭代因子控制迴圈變數的地減)
  4. 再次檢測布林表示式。箭環執行上面的過程

程式碼:

public class ForDemo01 {
    public static void main(String[] args) {
        int a = 1; // 初始化條件
        while (a <= 100) { // 條件判斷
            System.out.println(a); //迴圈體內容
            a++; // 迭代
        }
        System.out.println("while迴圈結束!");
        // 初始化條件;條件判斷;迭代
        for (int i = 1; i <= 100; i++) {
            System.out.println(i);
        }
        System.out.println("for迴圈結束!");
    }
}

for 迴圈的死迴圈寫法:

for (; ; ) {
    
}

for迴圈練習

計算0到100之間的偶數和奇數的和

public class ForDemo02 {
    public static void main(String[] args) {
        // 計算0到100之間的偶數和奇數的和
        int oddSum = 0;
        int evenSum = 0;

        for (int i = 0; i <= 100; i++) {
            if (i % 2 != 0) { // 奇數
                oddSum += i;
            } else { // 偶數
                evenSum += i;
            }
        }
        System.out.println("奇數和:" + oddSum); // 2500
        System.out.println("偶數和:" + evenSum); // 2550
    }
}

用 while 或 for 迴圈輸出 1~1000 之間能被5整除的數,並且每行輸出3個

public class ForDemo03 {
    public static void main(String[] args) {
        // 用 while 或 for 迴圈輸出 1~1000 之間能被5整除的數,並且每行輸出3個
        for (int i = 1; i <= 1000; i++) {
            if (i % 5 == 0) { // 被5整除
                System.out.print(i + "\t");
            }
            if (i % (5 * 3) == 0) { // 每行三個 換行
                System.out.println();
            }
        }
    }
}

列印九九乘法表

public class ForDemo04 {
    public static void main(String[] args) {
        // 外圍for迴圈 控制列
        // 內層for迴圈 控制每列列印幾行
        // 每列列印的行數就是對應的第幾列 (1列1行、2列2行、3列3行、……)
        for (int i = 1; i <= 9; i++) { // 控制列
            for (int j = 1; j <= i; j++) { // 控制行
                System.out.print(j + "*" + i + "=" + (i * j) + "\t"); // 輸出
            }
            System.out.println(); // 換行
        }
    }
}

增強for迴圈

在Java5中引入了一種主要用於陣列或集合的增強型for迴圈

語法:

for (宣告語句 : 表示式) {
   // 程式碼語句
}

宣告語句:宣告新的區域性變數,該變數的型別必須和資料元素的型別匹配。其作用域限定在迴圈語句塊,其值於此時陣列元素的值相等。

表示式:表示式是要訪問的陣列名,或者是返回值為陣列的方法。

程式碼:

public class ForDemo05 {
    public static void main(String[] args) {
        // 定義一個數組
        int[] numbers = new int[]{10, 20, 30, 40, 50};
        // for迴圈 遍歷陣列的元素
        for (int i = 0; i < numbers.length; i++) {
            System.out.println(numbers[i]);
        }
        // foreach 遍歷陣列的元素
        for (int number : numbers) {
            System.out.println(number);
        }
    }
}

break和continue

break在任何迴圈語句的主體部分,均可用break控制迴圈的流程。break用於強行退出迴圈,不執行迴圈中剩餘的語句。(break語句也在switch語句中使用)。

break:

public class BreakDemo {
    public static void main(String[] args) {
        int i = 0;
        while (i < 100) {
            i++;
            System.out.println(i);
            if (i == 30) {
                break; // 終止迴圈
            }
        }
        // 終止迴圈後,不影響後面語句的執行
        System.out.println("123"); 
    }
}

continue語句用在迴圈語句體中,用於終止某次迴圈過程,即跳過迴圈體中尚未執行的語句,接著進行下一次是否執行迴圈的判定。

continue:

public class ContinueDemo {
    public static void main(String[] args) {
        int i = 0;
        while (i < 100) {
            i++;
            if (i % 10 == 0) {
                System.out.println();
                continue; // 終止本次迴圈,開始下一次迴圈
            }
            System.out.println(i);
        }
    }
}

關於goto關鍵字

goto關鍵字很早就在程式設計語言中出現。儘管goto仍是Java的一個保留字,但並未在語言中得到正式使用;Java沒有goto。然而,在break和continue這兩個關鍵字的身上,我們仍然能看出一些goto的影子---帶標籤的break和continue。

“標籤”是指後面跟一個冒號的識別符號,例如​ ​:label:

對Java來說唯一用到標籤的地方是在迴圈語句之前。而在迴圈之前設定標籤的唯一理由是:我們希望在其中巢狀另-個迴圈,由於break和continue關鍵字通常只中斷當前迴圈,但若隨同標籤使用,它們就會中斷到存在標籤的地方。

程式碼:

public class LabelDemo {
    public static void main(String[] args) {
        // 列印101~150之間的所有質數
        // 質數,大於1的自然數中,除了1和它本身以外不再有其他因數的自然數
        int count = 0;
        // 不建議使用
        outer:for (int i = 101; i < 150; i++) {
            for (int j = 2; j < i / 2; j++) {
                if (i % j == 0){
                    continue outer;
                }
            }
            System.out.println(i);
        }
        System.out.println(count);
    }
}

流程控制練習

列印三角形

public class TestDemo {
    /*
            *
           ***
          *****
         *******
        *********
     */
    public static void main(String[] args) {
        // 列印三角形 5行
        int row = 5;
        for (int i = 1; i <= row; i++) { // 控制行
            for (int j = row; j >= i ; j--) { // 列印最左邊空白三角形
                System.out.print(" ");
            }
            for (int j = 1; j <= i ; j++) { // 列印右直角三角形
                System.out.print("*");
            }
            for (int j = 1; j < i ; j++) { // 列印左直角三角形
                System.out.print("*");
            }
            System.out.println(); // 換行
        }
    }
}