1. 程式人生 > >java基礎:Scanner、Random、流程控制語句

java基礎:Scanner、Random、流程控制語句

隨機數 常用 表達 引用數據類型 padding and 其中 n+1 是否

內容介紹

u 引用數據數據類型(Scanner、Random)

u 流程控制語句(if、for、while、dowhile、break、continue)

第1章 引用數據類型

1.1 隨機數類Random

我們來學習下,用來產生隨機數的類Random,它也屬於引用數據類型。

這個Random類,它可以產生多種數據類型的隨機數,在這裏我們主要介紹生成整數與小數的方式。

l 方法簡介

public int nextInt(int maxValue) 產生[0,maxValue)範圍的隨機整數,包含0,不包含maxValue;

public double nextDouble() 產生[0,1)範圍的隨機小數,包含0.0,不包含1.0。

引用數據類型的使用方式,在學習鍵盤錄入Scanner時,我們已經學習過,在這裏,再次回顧一下:

l Random使用方式:

n import導包:所屬包java.util.Random

n 創建實例格式:Random 變量名 = new Random();

接下來,通過一段代碼,一起學習下Random類的使用,RandomDemo.java

import java.util.Random;

public class RandomDemo {

public static void main(String[] args) {

// 創建Random類的實例

Random r = new Random();

// 得到0-100範圍內的隨機整數,將產生的隨機整數賦值給i變量

int i = r.nextInt(100);

//得到0.0-1.0範圍內的隨機小數,將產生的隨機小數賦值給d變量

double d = r.nextDouble();

System.out.println(i);

System.out.println(d);

}

}

運行結果如下圖所示:

圖1-2 運行結果

第2章 流程控制語句

2.1 選擇結構if

接下來要學習的if條件語句分為三種語法格式,每一種格式都有它自身的特點,下面我們分別進行介紹。

2.1.1 if語句

if語句是指如果滿足某種條件,就進行某種處理。例如,小明媽媽跟小明說“如果你考試得了100分,星期天就帶你去遊樂場玩”。這句話可以通過下面的一段偽代碼來描述。

如果小明考試得了100分

媽媽星期天帶小明去遊樂場

在上面的偽代碼中,“如果”相當於Java中的關鍵字if,“小明考試得了100分”是判斷條件,需要用()括起來,“媽媽星期天帶小明去遊樂場”是執行語句,需要放在{}中。修改後的偽代碼如下:

if (小明考試得了100分) {

媽媽星期天帶小明去遊樂場

}

上面的例子就描述了if語句的用法,在Java中,if語句的具體語法格式如下:

if (條件語句){

執行語句;

……

}

上述格式中,判斷條件是一個布爾值,當判斷條件為true時,{}中的執行語句才會執行。if語句的執行流程如下圖所示。

圖1-3 if語句流程圖

接下來通過一段代碼,學習一下if語句的具體用法,IfDemo01.java

public class IfDemo01 {

public static void main(String[] args) {

int x = 5;

if (x < 10) {

x++;

}

System.out.println("x=" + x);

}

}

運行結果如下圖所示。

圖1-4 運行結果

在上述代碼中,定義了一個變量x,其初始值為5。在if語句的判斷條件中判斷x的值是否小於10,很明顯條件成立,{}中的語句會被執行,變量x的值將進行自增。從運行結果可以看出,x的值已由原來的5變成了6。

2.1.2 if…else語句

if…else語句是指如果滿足某種條件,就進行某種處理,否則就進行另一種處理。例如,要判斷一個正整數的奇偶,如果該數字能被2整除則是一個偶數,否則該數字就是一個奇數。if…else語句具體語法格式如下:

if (判斷條件){

執行語句1

……

}else{

執行語句2

……

}

上述格式中,判斷條件是一個布爾值。當判斷條件為true時,if後面{}中的執行語句1會執行。當判斷條件為false時,else後面{}中的執行語句2會執行。if…else語句的執行流程如下圖所示。

圖1-5 if…else語句流程圖

接下來通過一段代碼,來實現判斷奇偶數的程序,IfDemo02.java

public class IfDemo02 {

public static void main(String[] args) {

int num = 19;

if (num % 2 == 0) {

// 判斷條件成立,num被2整除

System.out.println("num是一個偶數");

} else {

System.out.println("num是一個奇數");

}

}

}

運行結果如下圖所示。

圖1-6 運行結果

上述代碼中,變量num的值為19,模以2的結果為1,不等於0,判斷條件不成立。因此會執行else後面{}中的語句,打印“num是一個奇數”。

2.1.3 if…else if…else語句

if…else if…else語句用於對多個條件進行判斷,進行多種不同的處理。例如,對一個學生的考試成績進行等級的劃分,如果分數大於80分等級為優,否則,如果分數大於70分等級為良,否則,如果分數大於60分等級為中,否則,等級為差。if…else if…else語句具體語法格式如下:

if (判斷條件1) {

執行語句1

} else if (判斷條件2) {

執行語句2

}

...

else if (判斷條件n) {

執行語句n

} else {

執行語句n+1

}

上述格式中,判斷條件是一個布爾值。當判斷條件1為true時,if後面{}中的執行語句1會執行。當判斷條件1為false時,會繼續執行判斷條件2,如果為true則執行語句2,以此類推,如果所有的判斷條件都為false,則意味著所有條件均未滿足,else後面{}中的執行語句n+1會執行。if…else if…else語句的執行流程如下圖所示。

圖1-7 if…else if…else語句的流程圖

接下來通過一段代碼,來實現對學生考試成績進行等級劃分的程序,IfDemo03.java

public class IfDemo03 {

public static void main(String[] args) {

int grade = 75; // 定義學生成績

if (grade > 80) {

// 滿足條件 grade > 80

System.out.println("該成績的等級為優");

} else if (grade > 70) {

// 不滿足條件 grade > 80 ,但滿足條件 grade > 70

System.out.println("該成績的等級為良");

} else if (grade > 60) {

// 不滿足條件 grade > 70 ,但滿足條件 grade > 60

System.out.println("該成績的等級為中");

} else {

// 不滿足條件 grade > 60

System.out.println("該成績的等級為差");

}

}

}

運行結果如下圖所示。

圖1-8 運行結果

上述代碼中,定義了學生成績grade為75。它不滿足第一個判斷條件grade>80,會執行第二個判斷條件grade>70,條件成立,因此會打印“該成績的等級為良”。

2.1.4 選擇結構if語句與三元運算轉換

三元運算符,它和if-else語句類似,語法如下:

判斷條件 ? 表達式1 : 表達式2

三元運算符會得到一個結果,通常用於對某個變量進行賦值,當判斷條件成立時,運算結果為表達式1的值,否則結果為表達式2的值。

例如求兩個數x、y中的較大者,如果用if…else語句來實現,具體代碼如下:

int x = 0;

int y = 1;

int max;

if (x > y) {

max = x;

} else {

max = y;

}

上面的代碼運行之後,變量max的值為1。其中3-8行的代碼可以使用下面的三元運算來替換。

int max = x > y ? x : y;

2.2 循環語句while

while循環語句和選擇結構if語句有些相似,都是根據條件判斷來決定是否執行大括號內的執行語句。區別在於,while語句會反復地進行條件判斷,只要條件成立,{}內的執行語句就會執行,直到條件不成立,while循環結束。while循環語句的語法結構如下:

while(循環條件){

執行語句

………

}

在上面的語法結構中,{}中的執行語句被稱作循環體,循環體是否執行取決於循環條件。當循環條件為true時,循環體就會執行。循環體執行完畢時會繼續判斷循環條件,如條件仍為true則會繼續執行,直到循環條件為false時,整個循環過程才會結束。

while循環的執行流程如下圖所示。

圖1-9 while循環的流程圖

接下來通過一段代碼,來實現打印1~4之間的自然數,WhileDemo.java

public class WhileDemo {

public static void main(String[] args) {

int x = 1; // 定義變量x,初始值為1

while (x <= 4) { // 循環條件

System.out.println("x = " + x); // 條件成立,打印x的值

x++; // x進行自增

}

}

}

運行結果如下圖所示。

圖1-10 運行結果

在上述代碼中,x初始值為1,在滿足循環條件x <= 4的情況下,循環體會重復執行,打印x的值並讓x進行自增。因此打印結果中x的值分別為1、2、3、4。

大家要註意的是,代碼x++用於在每次循環時改變變量x的值,從而達到最終改變循環條件的目的。如果沒有這行代碼,整個循環會進入無限循環的狀態,永遠不會結束。

2.3 循環語句for

for循環語句是最常用的循環語句,一般用在循環次數已知的情況下。for循環語句的語法格式如下:

for(初始化表達式; 循環條件; 操作表達式){

執行語句

………

}

在上面的語法結構中,for關鍵字後面()中包括了三部分內容:初始化表達式、循環條件和操作表達式,它們之間用“;”分隔,{}中的執行語句為循環體。

接下來分別用①表示初始化表達式、②表示循環條件、③表示操作表達式、④表示循環體,通過序號來具體分析for循環的執行流程。具體如下:

for(① ; ② ; ③){

}

第一步,執行①

第二步,執行②,如果判斷結果為true,執行第三步,如果判斷結果為false,執行第五步

第三步,執行④

第四步,執行③,然後重復執行第二步

第五步,退出循環

接下來通過一個案例對自然數1~4進行求和,如下所示。ForDemo01.java

public class ForDemo01 {

public static void main(String[] args) {

int sum = 0; // 定義變量sum,用於記住累加的和

for (int i = 1; i <= 4; i++) { // i的值會在1~4之間變化

sum += i; // 實現sum與i的累加

}

System.out.println("sum = " + sum); // 打印累加的和

}

}

運行結果如下圖所示。

圖1-11 運行結果

上述代碼中,變量i的初始值為1,在判斷條件i<=4為true的情況下,會執行循環體sum+=i,執行完畢後,會執行操作表達式i++,i的值變為2,然後繼續進行條件判斷,開始下一次循環,直到i=5時,條件i<=4為false,結束循環,執行for循環後面的代碼,打印“sum=10”。

為了讓初學者能熟悉整個for循環的執行過程,現將上述代碼運行期間每次循環中變量sum和i的值通過表2-11羅列出來。

表2-1 sum和i循環中的值

循環次數

sum

i

第一次

1

1

第二次

3

2

第三次

6

3

第四次

10

4

2.4 循環語句do…while

do…while循環語句和while循環語句功能類似,其語法結構如下:

do {

執行語句

………

} while(循環條件);

在上面的語法結構中,關鍵字do後面{}中的執行語句是循環體。do…while循環語句將循環條件放在了循環體的後面。這也就意味著,循環體會無條件執行一次,然後再根據循環條件來決定是否繼續執行。

do…while循環的執行流程如下圖所示。

圖1-12 do…while循環的執行流程

接下來使用do…while循環語句來實現打印1~4之間的自然數DoWhileDemo.java。

public class DoWhileDemo {

public static void main(String[] args) {

int x = 1; // 定義變量x,初始值為1

do {

System.out.println("x = " + x); // 打印x的值

x++; // 將x的值自增

} while (x <= 4); // 循環條件

}

}

運行結果如下圖所示。

圖1-13 運行結果

我們發現WhileDemo.java與DoWhileDemo.java運行的結果一致,這說明什麽呢?這說明do …while循環和while循環能實現同樣的功能。然而在程序運行過程中,這兩種語句還是有差別的。如果循環條件在循環語句開始時就不成立,那麽while循環的循環體一次都不會執行,而do…while循環的循環體還是會執行一次。若將DoWhileDemo.java中的循環條件x<=4改為x < 1,DoWhileDemo.java運行結果會打印x=1,而WhileDemo.java運行結果什麽也不會打印。

2.5 無限循環

最簡單無限循環格式:

while(true){}

for(;;){}

無限循環存在的原因是並不知道循環多少次,而是根據某些條件,來控制循環。

2.6 循環嵌套

嵌套循環是指在一個循環語句的循環體中再定義一個循環語句的語法結構。while、do…while、for循環語句都可以進行嵌套,並且它們之間也可以互相嵌套,如最常見的在for循環中嵌套for循環,格式如下:

for(初始化表達式; 循環條件; 操作表達式) {

………

for(初始化表達式; 循環條件; 操作表達式) {

執行語句

………

}

………

}

接下來通過一個練習,來實現使用“*”打印直角三角形,如下所示。ForForDemo.java

1 public class ForForDemo {

2 public static void main(String[] args) {

3 int i, j; // 定義兩個循環變量

4 for (i = 1; i <= 9; i++) { // 外層循環

5 for (j = 1; j <= i; j++) { // 內層循環

6 System.out.print("*"); // 打印*

7 }

8 System.out.print("\n"); // 換行

9 }

10 }

11 }

運行結果如下所示。

圖1-14 運行結果

在上述代碼中定義了兩層for循環,分別為外層循環和內層循環,外層循環用於控制打印的行數,內層循環用於打印“*”,每一行的“*”個數逐行增加,最後輸出一個直角三角形。由於嵌套循環程序比較復雜,下面分步驟進行詳細地講解,具體如下:

第一步,在第3行代碼定義了兩個循環變量i和j,其中i為外層循環變量,j為內層循環變量。

第二步,在第4行代碼將i初始化為1,條件i <= 9為true,首次進入外層循環的循環體。

第三步,在第5行代碼將j初始化為1,由於此時i的值為1,條件j <= i為true,首次進入內層循環的循環體,打印一個“*”。

第四步,執行第5行代碼中內層循環的操作表達式j++,將j的值自增為2。

第五步,執行第5行代碼中的判斷條件j<=i,判斷結果為false,內層循環結束。執行後面的代碼,打印換行符。

第六步,執行第4行代碼中外層循環的操作表達式i++,將i的值自增為2。

第七步,執行第4行代碼中的判斷條件i<=9,判斷結果為true,進入外層循環的循環體,繼續執行內層循環。

第八步,由於i的值為2,內層循環會執行兩次,即在第2行打印兩個“*”。在內層循環結束時會打印換行符。

第九步,以此類推,在第3行會打印3個“*”,逐行遞增,直到i的值為10時,外層循環的判斷條件i <= 9結果為false,外層循環結束,整個程序也就結束了。

2.7 跳轉語句(break、continue)

跳轉語句用於實現循環執行過程中程序流程的跳轉,在Java中的跳轉語句有break語句和continue語句。接下來分別進行詳細地講解。

1、 break語句

在switch條件語句和循環語句中都可以使用break語句。當它出現在switch條件語句中時,作用是終止某個case並跳出switch結構。當它出現在循環語句中,作用是跳出循環語句,執行後面的代碼。關於在switch語句中使用break前面的例程已經用過了,接下來通過下面一段代碼,實現將當變量x的值為3時,使用break語句跳出循環,代碼如下所示。BreakDemo.java

public class BreakDemo {

public static void main(String[] args) {

int x = 1; // 定義變量x,初始值為1

while (x <= 4) { // 循環條件

System.out.println("x = " + x); // 條件成立,打印x的值

if (x == 3) {

break;

}

x++; // x進行自增

}

}

}

運行結果如下圖所示。

圖1-15 運行結果

在上述帶代碼中,通過while循環打印x的值,當x的值為3時使用break語句跳出循環。因此打印結果中並沒有出現“x=4”。

2、 標記

當break語句出現在嵌套循環中的內層循環時,它只能跳出內層循環,如果想使用break語句跳出外層循環則需要對外層循環添加標記。接下來將ForForDemo.java稍作修改,控制程序只打印4行“*”,如下所示。BreakDemo02.java

public class BreakDemo02 {

public static void main(String[] args) {

int i, j; // 定義兩個循環變量

itcast: for (i = 1; i <= 9; i++) { // 外層循環

for (j = 1; j <= i; j++) { // 內層循環

if (i > 4) { // 判斷i的值是否大於4

break itcast; // 跳出外層循環

}

System.out.print("*"); // 打印*

}

System.out.print("\n"); // 換行

}

}

}

運行結果如下圖所示。

圖1-16 運行結果

BreakDemo02.java與ForForDemo.java實現原理類似,只是在外層for循環前面增加了標記“itcast”。當i>4時,使用break itcast;語句跳出外層循環。因此程序只打印了4行“*”。

3、 continue語句

continue語句用在循環語句中,它的作用是終止本次循環,執行下一次循環。接下來通過一個練習對1~100之內的奇數求和,ContinueDemo.java

public class ContinueDemo {

public static void main(String[] args) {

int sum = 0; // 定義變量sum,用於記住和

for (int i = 1; i <= 100; i++) {

if (i % 2 == 0) { // i是一個偶數,不累加

continue; // 結束本次循環

}

sum += i; // 實現sum和i的累加

}

System.out.println("sum = " + sum);

}

}

運行結果如下圖所示。

圖1-17 運行結果

上述代碼中,使用for循環讓變量i的值在1~100之間循環,在循環過程中,當i的值為偶數時,將執行continue語句結束本次循環,進入下一次循環。當i的值為奇數時,sum和i進行累加,最終得到1~100之間所有奇數的和,打印“sum = 2500”。

在嵌套循環語句中,continue語句後面也可以通過使用標記的方式結束本次外層循環,用法與break語句相似,在此不再舉例說明。

第3章 猜數字案例

3.1 案例介紹

我們在日常生活中,經常與朋友們玩猜數字的遊戲,非常的有趣。現在我們通過java把這個猜數字遊戲編寫出來。

猜數字案例是要完成什麽樣的功能呢?顧名思義,這個遊戲就是你出個數字、我來猜。

遊戲操作如下:

l 後臺預先生成一個1-100之間的隨機數,用戶鍵盤錄入猜數字

l 如果猜對了,打印“恭喜您,答對了”

l 如果猜錯了

猜大了:打印“sorry,您猜大了!”

猜小了:打印“sorry,您猜小了!”

l 直到數字猜到為止

在案例開始之前,我們先要學習如下知識點:

l 隨機數類Random

l 選擇結構if

l 循環結構while

3.2 案例需求分析、

猜數字案例的需求如下:

l 後臺預先生成一個1-100之間的隨機數,用戶鍵盤錄入猜數字

l 如果猜對了,打印“恭喜您,答對了”

l 如果猜錯了

猜大了:打印“sorry,您猜大了!”

猜小了:打印“sorry,您猜小了!”

l 直到數字猜到為止

我們經過分析,得出如下的分析結果:

l 1.通過Random類中方法nextInt(),生成一個1-100之間的隨機數

l 2.輸入猜的數字

l 3.通過while循環,進行猜數字對錯判斷

n 猜對,跳出循環,遊戲結束

n 猜錯了,根據結果,給出提示,接著猜數字,遊戲繼續

u 如果猜大了,打印sorry,您猜大了!繼續下一次循環

u 如果猜小了,打印sorry,您猜小了!繼續下一次循環

3.3 實現代碼步驟

分析完畢之後,在main()方法中,我們一起來完成代碼的編寫:GuessNumber.java

public class GuessNumber {

public static void main(String[] args) {

//1.通過Random類中方法nextInt(),生成一個1-100之間的隨機數

int randomNumber = new Random().nextInt(100);

System.out.println("隨機數已生成!");

//2.輸入猜的數字

System.out.println("----請輸入您猜的數字:----");

Scanner sc = new Scanner(System.in);

int enterNumber = sc.nextInt();

//3.通過while循環,進行猜數字對錯判斷

//猜對,跳出循環,遊戲結束

while(enterNumber != randomNumber){

//猜錯了,根據結果,給出提示,接著猜數字,遊戲繼續

if(enterNumber>randomNumber) {

//如果猜大了,打印sorry,您猜大了!繼續下一次循環

System.out.println("sorry,您猜大了!繼續下一次循環");

}else {

//如果猜小了,打印sorry,您猜小了!繼續下一次循環

System.out.println("sorry,您猜小了!繼續下一次循環");

}

//輸入猜的數字

System.out.println("----請輸入您猜的數字:----");

enterNumber = sc.nextInt();

}

System.out.println("恭喜您,答對了!");

}

}

第4章 總結

4.1 知識點總結

l 選擇結構 if

n 方式1:

格式:

if(條件表達式) {

語句體;

}

執行流程:

如果條件表達式值為true, 執行語句體

如果條件表達式值為false,不執行語句體

n 方式2:

格式:

if(條件表達式) {

語句體1;

} else {

語句體2;

}

執行流程:

如果條件表達式值為true, 執行語句體1

如果條件表達式值為fales,執行語句體2

n 方式3:

格式:

if(條件表達式1) {

語句體1;

} else if (條件表達式2) {

語句體2;

} else if (條件表達式n...) {

語句體n...

}

...

else {

語句體n+1;

}

執行流程:

哪一個條件表達式成立,執行對應的語句體,

如果所有的條件表達式都不成立,執行最後else中的語句體

n 註意事項:

1,條件表達式無論是簡單還是復雜,結果都是boolean類型的值

2, 如果語句體只有一條語句,大括號可以省略,

如果是多條語句,大括號不能省略,建議什麽時候都寫上大括號

l 循環語句For

n 格式:

for (初始化表達式;條件表達式; 控制條件表達式) {

語句體;

}

n 執行流程:

1,初始化表達式;

2,條件表達式

如果結果為true, 執行語句體

如果結果為flase, 循環結束

3, 當語句體執行後, 執行控制條件表達式

4,接下來,回到第二步, 直到條件表達式為false 循環結束

l 循環語句 while

n 格式:

初始化表達式;

while (條件表達式) {

語句體;

控制條件表達式;

}

n 執行流程;

1,初始化表達式;

2,條件表達式

如果結果為true, 執行語句體

如果結果為flase, 循環結束

3, 當語句體執行後, 執行控制條件表達式

4,接下來,回到第二步, 直到條件表達式為false 循環結束跳轉語句(break、continue)

l 循環語句 do...while

n 格式:

初始化表達式;

do {

語句體;

控制條件表達式;

} while (條件表達式);

n 執行流程:

1,初始化表達式;

2, 執行語句體

3, 執行控制條件表達式

4, 執行條件表達式,

如果結果為true, 繼續執行語句體

如果結果為false, 循環結束

l 跳轉控制語句

break; 跳出循環

continue; 結束本次循環

l Scanner類

n 獲取鍵盤錄入的數據,對獲取數據的具體操作進行了封裝,只需要調用方法,即可得到鍵盤錄入的數據。

n 常用的方法

public int nextInt():獲取鍵盤錄入的數據,返回int類型值

public String next():獲取鍵盤錄入的數據,返回String類型值

l Random類:隨機數類,用來產生多種類型的隨機數

n 方法:

public int nextInt(int n) 返回一個,在 0(包括)和指定值(不包括)之間int隨機數

java基礎:Scanner、Random、流程控制語句