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() 遇到 空格 将會終止,不再讀取字元串!
但是如果你不輸入 有效地字元串,那麼會一直讓你輸入下去,輸入了有效字元串之後,再輸入空格和回車才會被終止!
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();
}
}
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("你輸入的不是小數資料!");
}
}
}
注意事項:IO流是從開頭往下順着來的,如果你不讓光标位置移動,那麼光标會一直停在那個位置,而對于我們新手而言,目前能讓光标移動的方法就是擷取/讀取 輸入的資料,擷取一行,光标就會移動到下一行!!!
如果不讓光标移動,會出現什麼情況?
//String str = scanner.next();
//如果不是整數,那也要把這個資料繼續擷取下來,否則下一個的 小數擷取 還會從目前 IO流位置 進行!!!
System.out.println(“你輸入的不是整數資料!”);
我們在這裡,不去進行讀取資料,那麼如果第一個資料不是整數,光标就會一直在開頭的位置,那麼小數的讀取就還會讀取第一個資料!!!
就會導緻 這樣的 情況 發生,是以 以後 出現這種情況,很明顯 是因為 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();//别忘了 釋放掉喲 ~ ~
}
}