天天看點

JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner

5.1 使用者互動Scanner

  • 使用者互動Scanner
  • 順序結構
  • 選擇結構
  • 循環結構
  • break & continue
  • 練習
Scanner 的學習,是讓我們 和 計算機 有基本的互動,比如說 “輸入” 和 “輸出”,程式擷取我們使用者輸入的東西,并且回報輸出給我們一些有用的資訊。在C/C++中我們一般采用 scanf&printf 、 cin&cout。

Java5 引入 Scanner 類,為了 支援 最基本的 人機互動。

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

5.1.1 hasNext && next

import java.util.Scanner;

public class 輸入和輸出 {
    public static void main(String[] args) {
        //建立一個掃描器對象,用于接收 鍵盤資料
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用next方式接收:");

        //判斷使用者有沒有 輸入字元串
        if(scanner.hasNext()){
            //使用 nex 方式接收
            String str = scanner.next();
            System.out.println("輸出的内容為:"+str);
        }
        //凡是屬于 IO流 的類 如果不關閉,會一直占用資源,要養成好習慣,用完就關!
        scanner.close();//直接釋放掉 就行。
    }
}
           

next() 遇到 空格 将會終止,不再讀取字元串!

但是如果你不輸入 有效地字元串,那麼會一直讓你輸入下去,輸入了有效字元串之後,再輸入空格和回車才會被終止!

JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner

5.1.2 hasNextLine && nextLine

nextLine() 直接擷取一行,不會遇到空格終止,會讀取空格!

package Scanner;

import java.util.Scanner;

public class hasNextLineAndnextLine {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("hasNextLine接收:");
        if(scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println(str);
        }
        scanner.close();
    }
}
           
JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner

5.1.3 Scanner進階用法

實際上 Scanner 掃描器 功能還是很強大的,它可以直接 判斷和接收 準确類型的資料。

比如:nextInt() 隻擷取 整數

nextFloat() 隻擷取小數

package Scanner;

import java.util.Scanner;

public class 進階方法 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = 0;
        float f = 0;
        System.out.println("請輸入整數:");
        //來判斷輸入的是否是 整數
        if(scanner.hasNextInt())
        {
            i = scanner.nextInt();
            //如果是整數,那就擷取 這個整數資料
            System.out.println("整數資料為:"+i);

        }else
        {
            String str = scanner.next();
            //如果不是整數,那也要把這個資料繼續擷取下來,否則下一個的 小數擷取 還會從目前 IO流位置 進行!!!
            System.out.println("你輸入的不是整數資料!");
        }

        System.out.println("請輸入小數:");
        if(scanner.hasNextFloat())
        {
            f  = scanner.nextFloat();
            System.out.println("小數資料為:" + f);
        }else
        {
            System.out.println("你輸入的不是小數資料!");
        }
    }
}
           
JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner

注意事項:IO流是從開頭往下順着來的,如果你不讓光标位置移動,那麼光标會一直停在那個位置,而對于我們新手而言,目前能讓光标移動的方法就是擷取/讀取 輸入的資料,擷取一行,光标就會移動到下一行!!!

如果不讓光标移動,會出現什麼情況?

//String str = scanner.next();

//如果不是整數,那也要把這個資料繼續擷取下來,否則下一個的 小數擷取 還會從目前 IO流位置 進行!!!

System.out.println(“你輸入的不是整數資料!”);

我們在這裡,不去進行讀取資料,那麼如果第一個資料不是整數,光标就會一直在開頭的位置,那麼小數的讀取就還會讀取第一個資料!!!

JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner
JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner
就會導緻 這樣的 情況 發生,是以 以後 出現這種情況,很明顯 是因為 IO流的 光标位置 并沒有 像我們 想的那樣 進行移動或退回!!!

5.1.4 練習:sum && average

package Scanner;

import java.util.Scanner;

public class 練習 {
    public static void main(String[] args) {
        double sum = 0;
        int m = 0;
        int num1 = 0;
        double num2 = 0;

        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入幾個數:");
        while (true)//循環一直進行着,死循環,這樣才能一直接收資料
        {
            if(scanner.hasNextInt())//可能是整數
            {
                num1 = scanner.nextInt();
                m++;
                sum+=num1;
            }
            else if(scanner.hasNextDouble()) {//也可能是小數
                num2 = scanner.nextDouble();
                m++;
                sum += num2;
            }
            else if(scanner.hasNext())//如果既不是整數,也不是小數,那就要判斷是否是 字元串 break,如果是 則退出!
            {
                  String str = scanner.next();
                if(str.equals("break"))
                {
                    System.out.println("已結束錄入資料!");
                    break;
                }
            }
            else
            {
                System.out.println("出現異常情況!請開發者處理!");
            }
        System.out.println("總數:"+sum);
        System.out.println("平均數:"+sum/m);
        scanner.close();//别忘了 釋放掉喲 ~ ~   
    }
}

           
JavaSE 26 流程控制 → Scanner5.1 使用者互動Scanner