JavaSE第04篇:Java基礎(chǔ)語法之循環(huán)結(jié)構(gòu)

本篇將會(huì)詳細(xì)講解Java基礎(chǔ)語法中的循環(huán)結(jié)構(gòu)、Random對(duì)象答恶,并帶有不同的練習(xí)囊榜,尤其是循環(huán),在軟件開發(fā)中亥宿,幾乎無處不在。

第一章:循環(huán)結(jié)構(gòu)

1.1-為什么要學(xué)習(xí)循環(huán)結(jié)構(gòu)(了解)

比如現(xiàn)有需求:在命令窗口砂沛,輸出100行"Hello World"烫扼。

若繼續(xù)按照我們以往的方式完成需求,則可能會(huì)是類似以下這樣的代碼:

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");
        // ...
    }
}

以上代碼雖然也可實(shí)現(xiàn)需求的功能碍庵,但是我們細(xì)品映企,會(huì)發(fā)現(xiàn)以下問題:

  1. 簡單的需求,代碼重復(fù)且臃腫静浴。
  2. 若變更輸出內(nèi)容堰氓,不易修改和維護(hù)。

而在實(shí)際工作開發(fā)中苹享,我們不僅只是要完成功能双絮,還要考慮到代碼的質(zhì)量(比如:代碼可以更簡潔一些)。

此時(shí)得问,對(duì)于以上的問題囤攀,歸根到底,就是代碼連續(xù)重復(fù)了宫纬。

如何解決連續(xù)重復(fù)且讓代碼變更加簡單呢焚挠?那就是使用Java語法中提供的循環(huán)語句。

1.2-Java中的循環(huán)語句分類(了解)

循環(huán)語句可以在滿足循環(huán)條件的情況下漓骚,反復(fù)執(zhí)行某一段代碼蝌衔,這段被重復(fù)執(zhí)行的代碼被稱為循環(huán)體語句

當(dāng)反復(fù) 執(zhí)行這個(gè)循環(huán)體時(shí)蝌蹂,需要在合適的時(shí)候把循環(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)

下面硼身,我們逐一來學(xué)習(xí)硅急。

1.3-for循環(huán) (重點(diǎn))

語法格式

for (初始化語句;條件判斷語句;條件控制語句) { 
    循環(huán)體語句; 
}

初始化語句: 用于表示循環(huán)開啟時(shí)的起始狀態(tài),簡單說就是循環(huán)開始的時(shí)候什么樣佳遂。

條件判斷語句:用于表示循環(huán)反復(fù)執(zhí)行的條件营袜,簡單說就是判斷循環(huán)是否能一直執(zhí)行下去。

循環(huán)體語句: 用于表示循環(huán)反復(fù)執(zhí)行的內(nèi)容丑罪,簡單說就是循環(huán)反復(fù)執(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ù)

image

示例1:控制臺(tái)輸出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:在控制臺(tái)輸出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é)果在控制臺(tái)輸出

public class Test03 {
    public static void main(String[]args){
        // 定義變量sum嘲驾,表示總和淌哟,初始化為0
        int sum = 0;
        // 循環(huán)遍歷1-5之間所有的數(shù)字,并累計(jì)達(dá)到變量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)部則計(jì)算出的數(shù)據(jù)將是錯(cuò)誤的

示例4:求1-100之間的偶數(shù)和,并把求和結(jié)果在控制臺(tái)輸出

public class Test04 { 
    public static void main(String[] args) { 
        // 求和的最終結(jié)果必須保存起來彤枢,需要定義一個(gè)變量狰晚,用于保存求和的結(jié)果,初始值為0 
        int sum = 0; 
        // 對(duì)1-100的數(shù)據(jù)求和與1-5的數(shù)據(jù)求和幾乎完全一樣缴啡,僅僅是結(jié)束條件不同 
        for(int i=1; i<=100; i++) {     
            //對(duì)1-100的偶數(shù)求和壁晒,需要對(duì)求和操作添加限制條件,判斷是否是偶數(shù) 
            if(i%2 == 0) { 
                sum += i; 
            }
        }
        //當(dāng)循環(huán)執(zhí)行完畢時(shí)业栅,將最終數(shù)據(jù)打印出來 結(jié)果:2250
        System.out.println("1-100之間的偶數(shù)和是:" + sum); 
    } 
}

示例5:在控制臺(tái)輸出所有的“水仙花數(shù)”

解釋:什么是水仙花數(shù)秒咐?

  • 水仙花數(shù),指的是一個(gè)三位數(shù)碘裕,個(gè)位携取、十位、百位的數(shù)字立方和等于原數(shù)

  • 例如 153帮孔, 3*3*3 + 5*5*5 + 1*1*1 = 153

實(shí)現(xiàn)思路:

  1. 獲取所有的三位數(shù)雷滋,準(zhǔn)備進(jìn)行篩選,最小的三位數(shù)為100文兢,最大的三位數(shù)為999晤斩,使用for循環(huán)獲取

  2. 獲取每一個(gè)三位數(shù)的個(gè)位,十位姆坚,百位澳泵,做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++) { 
            //在計(jì)算之前獲取三位數(shù)中每個(gè)位上的值
            int ge = i%10;
            int shi = i/10%10; 
            int bai = i/10/10%10;
            //判定條件是將三位數(shù)中的每個(gè)數(shù)值取出來腊敲,計(jì)算立方和后與原始數(shù)字比較是否相等 
            if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { 
                //輸出滿足條件的數(shù)字就是水仙花數(shù) 
                System.out.println(i); 
            }
        }
    } 
}

示例6:統(tǒng)計(jì)“水仙花數(shù)”一共有多少個(gè),并在控制臺(tái)輸出個(gè)數(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++) { 
            // 在計(jì)算之前獲取三位數(shù)中每個(gè)位上的值
            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 + "個(gè)");
    } 
}

今后如果需求帶有統(tǒng)計(jì)xxx饿序,請先想到計(jì)數(shù)器變量

計(jì)數(shù)器變量定義的位置勉失,必須在循環(huán)外部

1.4-while循環(huán)(重點(diǎn))

語法格式

初始化語句; 
while (條件判斷語句) { 
    循環(huán)體語句; 
    條件控制語句; 
}

執(zhí)行流程

① 執(zhí)行初始化語句

② 執(zhí)行條件判斷語句,看其結(jié)果是true還是false

  • 如果是false原探,循環(huán)結(jié)束

  • 如果是true乱凿,繼續(xù)執(zhí)行

③ 執(zhí)行循環(huán)體語句

④ 執(zhí)行條件控制語句

⑤ 回到②繼續(xù)

image

示例1:控制臺(tái)輸出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) {
        //定義一個(gè)計(jì)數(shù)器段审,初始值為0
        int count = 0;
        //定義紙張厚度
        double paper = 0.1;
        //定義珠穆朗瑪峰的高度
        int zf = 8844430;
        //因?yàn)橐磸?fù)折疊,所以要使用循環(huán)闹蒜,但是不知道折疊多少次寺枉,這種情況下更適合使用while循環(huán)
        //折疊的過程中當(dāng)紙張厚度大于珠峰就停止了,因此繼續(xù)執(zhí)行的要求是紙張厚度小于珠峰高度
        while(paper <= zf) {
            //循環(huán)的執(zhí)行過程中每次紙張折疊绷落,紙張的厚度要加倍
            paper *= 2;
            //在循環(huán)中執(zhí)行累加姥闪,對(duì)應(yīng)折疊了多少次
            count++;
        }
        //打印計(jì)數(shù)器的值
        System.out.println("需要折疊:" + count + "次");
    }
}

1.5-do while循環(huán)(重點(diǎn))

語法格式:

初始化語句;
do {
    循環(huán)體語句;
    條件控制語句;
}while(條件判斷語句);

執(zhí)行流程:

① 執(zhí)行初始化語句

② 執(zhí)行循環(huán)體語句

③ 執(zhí)行條件控制語句

④ 執(zhí)行條件判斷語句,看其結(jié)果是true還是false

  • 如果是false砌烁,循環(huán)結(jié)束

  • 如果是true筐喳,繼續(xù)執(zhí)行

⑤ 回到②繼續(xù)

image

示例:控制臺(tái)輸出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ū)別
    • 條件控制語句所控制的自增變量,因?yàn)闅w屬for循環(huán)的語法結(jié)構(gòu)中函似,在for循環(huán)結(jié)束后槐脏,就不能再次被訪問到了

1.7-死循環(huán)(了解)

死循環(huán),就是循環(huán)永遠(yuǎn)不會(huì)終止撇寞。這里可以推薦一部電影《恐怖游輪》顿天,很是刺激堂氯。

死循環(huán)(無限循環(huán))的三種格式

  1. for(;;){}
  2. while(true){}
  3. do {} while(true);

1.8-跳轉(zhuǎn)控制語句(重點(diǎn))

break和continue

  • 跳轉(zhuǎn)控制語句(break)
    • 跳出循環(huán),結(jié)束循環(huán)
  • 跳轉(zhuǎn)控制語句(continue)
    • 跳過本次循環(huán)牌废,繼續(xù)下次循環(huán)
  • 注意: continue只能在循環(huán)中進(jìn)行使用咽白!

示例

/* break 關(guān)鍵字 */
// 如:連續(xù)吃5個(gè)包子,吃到第3個(gè)鸟缕,吃飽了晶框,后面第包子就不吃了
for(int i = 1; i <=5; i++){
    if(i==3){
        System.out.println("吃飽了");
        break;
    }
    System.out.println("吃第" + i + "個(gè)包子");
}

/* continue關(guān)鍵字 */
// 如:連續(xù)吃5個(gè)包子,吃到第3個(gè)時(shí)掉地上了懂从,則第3個(gè)包子就不吃了授段,繼續(xù)吃后面的包子
for (int i = 1; i <=5 ; i++) {
    if(i==3){
        System.out.println("第" + i+ "包子掉地上了");
        continue;
    }
    System.out.println("吃第" + i + "個(gè)包子");
    
}

1.9-循環(huán)嵌套(理解)

在循環(huán)中,繼續(xù)定義循環(huán)番甩,就是循環(huán)嵌套侵贵。

需求:在控制臺(tái)輸出一天24小中,每一個(gè)小時(shí)對(duì)應(yīng)的每一分鐘缘薛。

如:
0時(shí)0分
0時(shí)1分
...
23時(shí)0分
23時(shí)1分

代碼示例

    public static void main(String[] args) {
        //外循環(huán)控制小時(shí)的范圍窍育,內(nèi)循環(huán)控制分鐘的范圍
        for (int hour = 0; hour < 24; hour++) {
            for (int minute = 0; minute < 60; minute++) {
                System.out.println(hour + "時(shí)" + minute + "分");
            }
            System.out.println("--------");
        }
    }

請反復(fù)理解這句話(整個(gè)內(nèi)循環(huán),就是外循環(huán)的一個(gè)循環(huán)體宴胧,內(nèi)部循環(huán)體沒有執(zhí)行完畢漱抓,外循環(huán)是不會(huì)繼續(xù)向下執(zhí)行的)。

外循環(huán)執(zhí)行一次恕齐,內(nèi)循環(huán)執(zhí)行一圈乞娄。

第二章:Random

2.1-Random是什么(了解)

Random類似Scanner,也是Java提供好的API显歧,內(nèi)部提供了產(chǎn)生隨機(jī)數(shù)的功能补胚。

關(guān)于API,我們后續(xù)會(huì)詳解講解追迟,現(xiàn)在可以簡單把API理解為Java已經(jīng)寫好的代碼溶其,我們可以直接按照步驟使用。

2.2-Random使用步驟(重點(diǎn))

步驟

步驟1:導(dǎo)入包

import java.util.Random;

步驟2:創(chuàng)建對(duì)象

Random r = new Random();

步驟3:產(chǎn)生隨機(jī)數(shù)

int num = r.nextInt(10);

解釋: 10代表的是一個(gè)范圍敦间,如果括號(hào)寫10瓶逃,產(chǎn)生的隨機(jī)數(shù)就是0-9,括號(hào)寫20廓块,參數(shù)的隨機(jī)數(shù)則是0-19

代碼

// 導(dǎo)包
import java.util.Random;
public class RandomDemo {
    public static void main(String[] args) {
        // 創(chuàng)建對(duì)象
        Random r = new Random();
        // 用循環(huán)獲取10個(gè)隨機(jī)數(shù)
        for(int i=0; i<10; i++) {
            // 獲取隨機(jī)數(shù)
            int number = r.nextInt(10);
            System.out.println("number:" + number);
        }
        // 需求:獲取一個(gè)1-100之間的隨機(jī)數(shù)
        int x = r.nextInt(100) + 1;
        System.out.println(x);
    }
}

2.3-案例-猜數(shù)字(練習(xí))

需求:

程序自動(dòng)生成一個(gè)1-100之間的數(shù)字厢绝,使用程序?qū)崿F(xiàn)猜出這個(gè)數(shù)字是多少?

當(dāng)猜錯(cuò)的時(shí)候根據(jù)不同情況給出相應(yīng)的提示

  • A. 如果猜的數(shù)字比真實(shí)數(shù)字大带猴,提示你猜的數(shù)據(jù)大了

  • B. 如果猜的數(shù)字比真實(shí)數(shù)字小昔汉,提示你猜的數(shù)據(jù)小了

  • C. 如果猜的數(shù)字與真實(shí)數(shù)字相等,提示恭喜你猜中了

代碼

import java.util.Random;
import java.util.Scanner;

public class RandomTest {
    public static void main(String[] args) {
        //要完成猜數(shù)字的游戲拴清,首先需要有一個(gè)要猜的數(shù)字靶病,使用隨機(jī)數(shù)生成該數(shù)字会通,范圍1到100
        Random r = new Random();
        int number = r.nextInt(100) + 1;
        
        while(true) {
            //使用程序?qū)崿F(xiàn)猜數(shù)字,每次均要輸入猜測的數(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ù)不同情況進(jìn)行猜測結(jié)果顯示
            if(guessNumber > number) {
                System.out.println("你猜的數(shù)字" + guessNumber + "大了");
            } else if(guessNumber < number) {
                System.out.println("你猜的數(shù)字" + guessNumber + "小了");
            } else {
                System.out.println("恭喜你猜中了");
                break;
            }
        }
        
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裳涛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子众辨,更是在濱河造成了極大的恐慌端三,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃彻,死亡現(xiàn)場離奇詭異技肩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浮声,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旋奢,“玉大人泳挥,你說我怎么就攤上這事≈晾剩” “怎么了屉符?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锹引。 經(jīng)常有香客問我矗钟,道長,這世上最難降的妖魔是什么嫌变? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任吨艇,我火速辦了婚禮,結(jié)果婚禮上腾啥,老公的妹妹穿的比我還像新娘东涡。我一直安慰自己,他們只是感情好倘待,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布疮跑。 她就那樣靜靜地躺著,像睡著了一般凸舵。 火紅的嫁衣襯著肌膚如雪祖娘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天啊奄,我揣著相機(jī)與錄音渐苏,去河邊找鬼掀潮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛整以,可吹牛的內(nèi)容都是我干的胧辽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼公黑,長吁一口氣:“原來是場噩夢啊……” “哼邑商!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凡蚜,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤人断,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朝蜘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恶迈,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谱醇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暇仲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡副渴,死狀恐怖奈附,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煮剧,我是刑警寧澤斥滤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勉盅,受9級(jí)特大地震影響佑颇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜草娜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一挑胸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宰闰,春花似錦嗜暴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咐容,卻和暖如春舆逃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工路狮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虫啥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓奄妨,卻偏偏與公主長得像涂籽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砸抛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355