本篇將會詳細講解Java基礎語法中的循環(huán)結(jié)構(gòu)、Random對象,并帶有不同的練習,尤其是循環(huán),在軟件開發(fā)中,幾乎無處不在。
第一章:循環(huán)結(jié)構(gòu)
1.1-為什么要學習循環(huán)結(jié)構(gòu)(了解)
比如現(xiàn)有需求:在命令窗口,輸出100行"Hello World"。
若繼續(xù)按照我們以往的方式完成需求,則可能會是類似以下這樣的代碼:
public class Test01 {
public static void main(String[]args){
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
System.out.println("Hello World");
// ...
}
}
以上代碼雖然也可實現(xiàn)需求的功能,但是我們細品,會發(fā)現(xiàn)以下問題:
- 簡單的需求,代碼重復且臃腫。
- 若變更輸出內(nèi)容,不易修改和維護。
而在實際工作開發(fā)中,我們不僅只是要完成功能,還要考慮到代碼的質(zhì)量(比如:代碼可以更簡潔一些)。
此時,對于以上的問題,歸根到底,就是代碼連續(xù)重復了。
如何解決連續(xù)重復且讓代碼變更加簡單呢?那就是使用Java語法中提供的循環(huán)語句。
1.2-Java中的循環(huán)語句分類(了解)
循環(huán)語句可以在滿足循環(huán)條件的情況下,反復執(zhí)行某一段代碼,這段被重復執(zhí)行的代碼被稱為循環(huán)體語句,
當反復 執(zhí)行這個循環(huán)體時,需要在合適的時候把循環(huán)判斷條件修改為false,從而結(jié)束循環(huán),否則循環(huán)將一直
執(zhí)行下去,形 成死循環(huán)。
java中有三種循環(huán)結(jié)構(gòu),分別是:
-
for循環(huán) -
while循環(huán) -
do while循環(huán)
下面,我們逐一來學習。
1.3-for循環(huán) (重點)
語法格式
for (初始化語句;條件判斷語句;條件控制語句) {
循環(huán)體語句;
}
初始化語句: 用于表示循環(huán)開啟時的起始狀態(tài),簡單說就是循環(huán)開始的時候什么樣。
條件判斷語句:用于表示循環(huán)反復執(zhí)行的條件,簡單說就是判斷循環(huán)是否能一直執(zhí)行下去。
循環(huán)體語句: 用于表示循環(huán)反復執(zhí)行的內(nèi)容,簡單說就是循環(huán)反復執(zhí)行的事情。
條件控制語句:用于表示循環(huán)執(zhí)行中每次變化的內(nèi)容,簡單說就是控制循環(huán)是否能執(zhí)行下去。
執(zhí)行流程
① 執(zhí)行初始化語句
② 執(zhí)行條件判斷語句,看其結(jié)果是true還是false
如果是false,循環(huán)結(jié)束
如果是true,繼續(xù)執(zhí)行
③ 執(zhí)行循環(huán)體語句
④ 執(zhí)行條件控制語句
⑤ 回到②繼續(xù)

示例1:控制臺輸出100行"Hello World"
public class Test01 {
public static void main(String[]args){
/*
int i = 1 初始化語句
i<=100 條件判斷語句
{ System.out.println("Hello World"); } 循環(huán)體語句
i++ 條件控制語句
*/
for(int i = 1; i<=100; i++){
System.out.println("Hello World");
}
}
}
示例2:在控制臺輸出1-5和5-1的數(shù)據(jù)
public class Test02 {
public static void main(String[]args){
// 定義循環(huán),循環(huán)輸出1-5之間所有的整數(shù),順序輸出
for(int i = 1; i<=5; i++){
System.out.println(i);
}
// 定義循環(huán),循環(huán)輸出1-5之間所有的整數(shù),倒序輸出
for(int i = 5; i>=1; i--){
System.out.println(i);
}
}
}
示例3:求1-5之間的數(shù)據(jù)和,并把求和結(jié)果在控制臺輸出
public class Test03 {
public static void main(String[]args){
// 定義變量sum,表示總和,初始化為0
int sum = 0;
// 循環(huán)遍歷1-5之間所有的數(shù)字,并累計達到變量sum,包括1和5
for(int i = 1; i<=5; i++){
sum = sum + i;
}
// 輸出結(jié)果:15
System.out.println(sum);
}
}
今后遇到的需求中,如果帶有求和二字,請立即聯(lián)想到求和變量
求和變量的定義位置,必須在循環(huán)外部,如果在循環(huán)內(nèi)部則計算出的數(shù)據(jù)將是錯誤的
示例4:求1-100之間的偶數(shù)和,并把求和結(jié)果在控制臺輸出
public class Test04 {
public static void main(String[] args) {
// 求和的最終結(jié)果必須保存起來,需要定義一個變量,用于保存求和的結(jié)果,初始值為0
int sum = 0;
// 對1-100的數(shù)據(jù)求和與1-5的數(shù)據(jù)求和幾乎完全一樣,僅僅是結(jié)束條件不同
for(int i=1; i<=100; i++) {
//對1-100的偶數(shù)求和,需要對求和操作添加限制條件,判斷是否是偶數(shù)
if(i%2 == 0) {
sum += i;
}
}
//當循環(huán)執(zhí)行完畢時,將最終數(shù)據(jù)打印出來 結(jié)果:2250
System.out.println("1-100之間的偶數(shù)和是:" + sum);
}
}
示例5:在控制臺輸出所有的“水仙花數(shù)”
解釋:什么是水仙花數(shù)?
水仙花數(shù),指的是一個三位數(shù),個位、十位、百位的數(shù)字立方和等于原數(shù)
例如 153,
3*3*3 + 5*5*5 + 1*1*1 = 153
實現(xiàn)思路:
獲取所有的三位數(shù),準備進行篩選,最小的三位數(shù)為100,最大的三位數(shù)為999,使用for循環(huán)獲取
獲取每一個三位數(shù)的個位,十位,百位,做if語句判斷是否是水仙花數(shù)
public class Test04 {
public static void main(String[] args) {
// 輸出所有的水仙花數(shù)必然要使用到循環(huán),遍歷所有的三位數(shù),三位數(shù)從100開始,到999結(jié)束
for(int i=100; i<1000; i++) {
//在計算之前獲取三位數(shù)中每個位上的值
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
//判定條件是將三位數(shù)中的每個數(shù)值取出來,計算立方和后與原始數(shù)字比較是否相等
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
//輸出滿足條件的數(shù)字就是水仙花數(shù)
System.out.println(i);
}
}
}
}
示例6:統(tǒng)計“水仙花數(shù)”一共有多少個,并在控制臺輸出個數(shù)
public class Test04 {
public static void main(String[] args) {
//定義變量count,用于保存“水仙花數(shù)”的數(shù)量,初始值為0
int count = 0;
// 輸出所有的水仙花數(shù)必然要使用到循環(huán),遍歷所有的三位數(shù),三位數(shù)從100開始,到999結(jié)束
for(int i=100; i<1000; i++) {
// 在計算之前獲取三位數(shù)中每個位上的值
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
// 在判定水仙花數(shù)的過程中,滿足條件不再輸出,更改為修改count的值,使count+1
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
count++;
}
}
//打印輸出最終結(jié)果
System.out.println("水仙花共有:" + count + "個");
}
}
今后如果需求帶有統(tǒng)計xxx,請先想到計數(shù)器變量
計數(shù)器變量定義的位置,必須在循環(huán)外部
1.4-while循環(huán)(重點)
語法格式
初始化語句;
while (條件判斷語句) {
循環(huán)體語句;
條件控制語句;
}
執(zhí)行流程
① 執(zhí)行初始化語句
② 執(zhí)行條件判斷語句,看其結(jié)果是true還是false
如果是false,循環(huán)結(jié)束
如果是true,繼續(xù)執(zhí)行
③ 執(zhí)行循環(huán)體語句
④ 執(zhí)行條件控制語句
⑤ 回到②繼續(xù)

示例1:控制臺輸出100行"Hello World"
public class Test05 {
public static void main(String[] args) {
int i = 1;
while(i<=100){
System.out.println("Hello World");
i++;
}
}
}
示例2:珠穆拉瑪峰
需求:世界最高山峰是珠穆朗瑪峰(8844.43米=8844430毫米),假如我有一張足夠大的紙,它的厚度是0.1毫米。請問,我折疊多少次,可以折成珠穆朗瑪峰的高度?
public class Test06 {
public static void main(String[] args) {
//定義一個計數(shù)器,初始值為0
int count = 0;
//定義紙張厚度
double paper = 0.1;
//定義珠穆朗瑪峰的高度
int zf = 8844430;
//因為要反復折疊,所以要使用循環(huán),但是不知道折疊多少次,這種情況下更適合使用while循環(huán)
//折疊的過程中當紙張厚度大于珠峰就停止了,因此繼續(xù)執(zhí)行的要求是紙張厚度小于珠峰高度
while(paper <= zf) {
//循環(huán)的執(zhí)行過程中每次紙張折疊,紙張的厚度要加倍
paper *= 2;
//在循環(huán)中執(zhí)行累加,對應折疊了多少次
count++;
}
//打印計數(shù)器的值
System.out.println("需要折疊:" + count + "次");
}
}
1.5-do while循環(huán)(重點)
語法格式:
初始化語句;
do {
循環(huán)體語句;
條件控制語句;
}while(條件判斷語句);
執(zhí)行流程:
① 執(zhí)行初始化語句
② 執(zhí)行循環(huán)體語句
③ 執(zhí)行條件控制語句
④ 執(zhí)行條件判斷語句,看其結(jié)果是true還是false
如果是false,循環(huán)結(jié)束
如果是true,繼續(xù)執(zhí)行
⑤ 回到②繼續(xù)

示例:控制臺輸出100行"Hello World"
public class Test07 {
public static void main(String[] args) {
int j = 1;
do {
System.out.println("Hello World");
j++;
}while(j<=100);
}
}
1.6-三種循環(huán)的區(qū)別(了解)
- 三種循環(huán)的區(qū)別
- for循環(huán)和while循環(huán)先判斷條件是否成立,然后決定是否執(zhí)行循環(huán)體(先判斷后執(zhí)行)
- do...while循環(huán)先執(zhí)行一次循環(huán)體,然后判斷條件是否成立,是否繼續(xù)執(zhí)行循環(huán)體(先執(zhí)行后判斷)
- for循環(huán)和while的區(qū)別
- 條件控制語句所控制的自增變量,因為歸屬for循環(huán)的語法結(jié)構(gòu)中,在for循環(huán)結(jié)束后,就不能再次被訪問到了
1.7-死循環(huán)(了解)
死循環(huán),就是循環(huán)永遠不會終止。這里可以推薦一部電影《恐怖游輪》,很是刺激。
死循環(huán)(無限循環(huán))的三種格式
- for(;;){}
- while(true){}
- do {} while(true);
1.8-跳轉(zhuǎn)控制語句(重點)
break和continue
- 跳轉(zhuǎn)控制語句(break)
- 跳出循環(huán),結(jié)束循環(huán)
- 跳轉(zhuǎn)控制語句(continue)
- 跳過本次循環(huán),繼續(xù)下次循環(huán)
- 注意: continue只能在循環(huán)中進行使用!
示例
/* break 關鍵字 */
// 如:連續(xù)吃5個包子,吃到第3個,吃飽了,后面第包子就不吃了
for(int i = 1; i <=5; i++){
if(i==3){
System.out.println("吃飽了");
break;
}
System.out.println("吃第" + i + "個包子");
}
/* continue關鍵字 */
// 如:連續(xù)吃5個包子,吃到第3個時掉地上了,則第3個包子就不吃了,繼續(xù)吃后面的包子
for (int i = 1; i <=5 ; i++) {
if(i==3){
System.out.println("第" + i+ "包子掉地上了");
continue;
}
System.out.println("吃第" + i + "個包子");
}
1.9-循環(huán)嵌套(理解)
在循環(huán)中,繼續(xù)定義循環(huán),就是循環(huán)嵌套。
需求:在控制臺輸出一天24小中,每一個小時對應的每一分鐘。
如:
0時0分
0時1分
...
23時0分
23時1分
代碼示例
public static void main(String[] args) {
//外循環(huán)控制小時的范圍,內(nèi)循環(huán)控制分鐘的范圍
for (int hour = 0; hour < 24; hour++) {
for (int minute = 0; minute < 60; minute++) {
System.out.println(hour + "時" + minute + "分");
}
System.out.println("--------");
}
}
請反復理解這句話(整個內(nèi)循環(huán),就是外循環(huán)的一個循環(huán)體,內(nèi)部循環(huán)體沒有執(zhí)行完畢,外循環(huán)是不會繼續(xù)向下執(zhí)行的)。
外循環(huán)執(zhí)行一次,內(nèi)循環(huán)執(zhí)行一圈。
第二章:Random
2.1-Random是什么(了解)
Random類似Scanner,也是Java提供好的API,內(nèi)部提供了產(chǎn)生隨機數(shù)的功能。
關于API,我們后續(xù)會詳解講解,現(xiàn)在可以簡單把API理解為Java已經(jīng)寫好的代碼,我們可以直接按照步驟使用。
2.2-Random使用步驟(重點)
步驟
步驟1:導入包
import java.util.Random;
步驟2:創(chuàng)建對象
Random r = new Random();
步驟3:產(chǎn)生隨機數(shù)
int num = r.nextInt(10);
解釋: 10代表的是一個范圍,如果括號寫10,產(chǎn)生的隨機數(shù)就是0-9,括號寫20,參數(shù)的隨機數(shù)則是0-19
代碼
// 導包
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
// 創(chuàng)建對象
Random r = new Random();
// 用循環(huán)獲取10個隨機數(shù)
for(int i=0; i<10; i++) {
// 獲取隨機數(shù)
int number = r.nextInt(10);
System.out.println("number:" + number);
}
// 需求:獲取一個1-100之間的隨機數(shù)
int x = r.nextInt(100) + 1;
System.out.println(x);
}
}
2.3-案例-猜數(shù)字(練習)
需求:
程序自動生成一個1-100之間的數(shù)字,使用程序?qū)崿F(xiàn)猜出這個數(shù)字是多少?
當猜錯的時候根據(jù)不同情況給出相應的提示
A. 如果猜的數(shù)字比真實數(shù)字大,提示你猜的數(shù)據(jù)大了
B. 如果猜的數(shù)字比真實數(shù)字小,提示你猜的數(shù)據(jù)小了
C. 如果猜的數(shù)字與真實數(shù)字相等,提示恭喜你猜中了
代碼
import java.util.Random;
import java.util.Scanner;
public class RandomTest {
public static void main(String[] args) {
//要完成猜數(shù)字的游戲,首先需要有一個要猜的數(shù)字,使用隨機數(shù)生成該數(shù)字,范圍1到100
Random r = new Random();
int number = r.nextInt(100) + 1;
while(true) {
//使用程序?qū)崿F(xiàn)猜數(shù)字,每次均要輸入猜測的數(shù)字值,需要使用鍵盤錄入實現(xiàn)
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你要猜的數(shù)字:");
int guessNumber = sc.nextInt();
// 比較輸入的數(shù)字和系統(tǒng)產(chǎn)生的數(shù)據(jù),需要使用分支語句。
// 這里使用if..else..if..格式,根據(jù)不同情況進行猜測結(jié)果顯示
if(guessNumber > number) {
System.out.println("你猜的數(shù)字" + guessNumber + "大了");
} else if(guessNumber < number) {
System.out.println("你猜的數(shù)字" + guessNumber + "小了");
} else {
System.out.println("恭喜你猜中了");
break;
}
}
}
}