本篇將會(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)以下問題:
- 簡單的需求,代碼重復(fù)且臃腫静浴。
- 若變更輸出內(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ù)
示例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)思路:
獲取所有的三位數(shù)雷滋,準(zhǔn)備進(jìn)行篩選,最小的三位數(shù)為100文兢,最大的三位數(shù)為999晤斩,使用for循環(huán)獲取
獲取每一個(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ù)
示例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ù)
示例:控制臺(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))的三種格式
- for(;;){}
- while(true){}
- 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;
}
}
}
}