Java語(yǔ)法基礎(chǔ)之循環(huán)結(jié)構(gòu)語(yǔ)句詳解
一、循環(huán)結(jié)構(gòu)
循環(huán)語(yǔ)句可以在滿(mǎn)足循環(huán)條件的情況下,反復(fù)執(zhí)行某一段代碼,這段被重復(fù)執(zhí)行的代碼被稱(chēng)為循環(huán)體語(yǔ)句,當(dāng)反復(fù)執(zhí)行這個(gè)循環(huán)體時(shí),需要在合適的時(shí)候把循環(huán)判斷條件修改為false,從而結(jié)束循環(huán),否則循環(huán)將一直執(zhí)行下去,形成死循環(huán)。
循環(huán)語(yǔ)句的組成:
初始化語(yǔ)句:一條或者多條語(yǔ)句,這些語(yǔ)句完成一些初始化操作。
判斷條件語(yǔ)句:這是一個(gè)boolean 表達(dá)式,這個(gè)表達(dá)式能決定是否執(zhí)行循環(huán)體。
循環(huán)體語(yǔ)句:這個(gè)部分是循環(huán)體語(yǔ)句,也就是我們要多次做的事情。
控制條件語(yǔ)句:這個(gè)部分在一次循環(huán)體結(jié)束后,下一次循環(huán)判斷條件執(zhí)行前執(zhí)行。通過(guò)用于控制循環(huán)條件中的變量,使得循環(huán)在合適的時(shí)候結(jié)束。
eg:在控制臺(tái)輸出10次"HelloWorld"時(shí),
初始化語(yǔ)句:定義初始化為第一次。
判斷條件語(yǔ)句:次數(shù)不能超過(guò)10次。
循環(huán)體語(yǔ)句:輸出”HelloWorld”語(yǔ)句。
控制條件語(yǔ)句:次數(shù)變化為下一次。
二、循環(huán)結(jié)構(gòu)(for循環(huán)語(yǔ)句)
for循環(huán)語(yǔ)句格式:
for(初始化語(yǔ)句;判斷條件語(yǔ)句;控制條件語(yǔ)句) {
循環(huán)體語(yǔ)句;
}
執(zhí)行流程:
A:執(zhí)行初始化語(yǔ)句
B:執(zhí)行判斷條件語(yǔ)句,看其結(jié)果是true還是false:如果是false,循環(huán)結(jié)束;如果是true,繼續(xù)執(zhí)行。
C:執(zhí)行循環(huán)體語(yǔ)句
D:執(zhí)行控制條件語(yǔ)句
E:回到B繼續(xù)
流程圖:
注意事項(xiàng):
(1)判斷條件語(yǔ)句的結(jié)果是一個(gè)boolean類(lèi)型
(2)循環(huán)體語(yǔ)句如果是一條語(yǔ)句,大括號(hào)可以省略;如果是多條語(yǔ)句,大括號(hào)不能省略。建議永遠(yuǎn)不要省略。
(3)一般來(lái)說(shuō):有左大括號(hào)就沒(méi)有分號(hào),有分號(hào)就沒(méi)有左大括號(hào)
代碼舉例:
1、求出1-100之間偶數(shù)和:
/* 需求: A:求1-100之和。 B:求出1-100之間偶數(shù)和 */ class ForTest1 { public static void main(String[] args) { //求1-100之和。 int sum1 = 0; for(int x=1; x<=100; x++) { sum1 +=x; } System.out.println("1-100之和是:"+sum1); System.out.println("------------------"); //求出1-100之間偶數(shù)和 //方式1 int sum2 = 0; for(int x=1; x<=100; x++) { if(x%2 == 0) { sum2 += x; } } System.out.println("1-100偶數(shù)之和是:"+sum2); System.out.println("------------------"); //方式2 int sum3 = 0; for(int x=0; x<=100; x+=2) { sum3 += x; } System.out.println("1-100偶數(shù)之和是:"+sum3); System.out.println("------------------"); } }
2、求5的階乘:
/* 需求:求5的階乘。 什么是階乘呢? n! = n*(n-1)! 規(guī)則 n! = n*(n-1)*(n-2)*...*3*2*1 求和思想。 求階乘思想。 */ class ForTest2 { public static void main(String[] args) { //定義最終結(jié)果變量 int jc = 1; //這里的x其實(shí)可以直接從2開(kāi)始 //for(int x=1; x<=5; x++) for(int x=2; x<=5; x++) { jc *=x; } System.out.println("1-5的階乘是:"+jc); } }
3、在控制臺(tái)輸出所有的“水仙花數(shù)”:
/* 需求:在控制臺(tái)輸出所有的”水仙花數(shù)” 分析: 我們都不知道什么叫"水仙花數(shù)",你讓我怎么做呢? 所謂的水仙花數(shù)是指一個(gè)三位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。 舉例:153就是一個(gè)水仙花數(shù)。 153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153 A:三位數(shù)其實(shí)是告訴了我們范圍。 B:通過(guò)for循環(huán)我們就可以實(shí)現(xiàn)獲取每一個(gè)三位數(shù) 但是麻煩是如何獲取這個(gè)三位數(shù)的個(gè),十,百位上的數(shù)據(jù) 我們?nèi)绾潍@取一個(gè)數(shù)據(jù)的個(gè),十,百呢? 假設(shè)有個(gè)一個(gè)數(shù)據(jù):153 ge: 153%10 = 3 shi: 153/10%10 = 5 bai:153/10/10%10 = 1 qian:x/10/10/10%10 wan: x/10/10/10/10%10 ... C:讓ge*ge*ge+shi*shi*shi+bai*bai*bai和該數(shù)據(jù)比較 如果相同,就把該數(shù)據(jù)在控制臺(tái)輸出。 */ class ForTest3 { public static void main(String[] args) { //三位數(shù)其實(shí)是告訴了我們范圍。 for(int x=100; x<1000; x++) { int ge = x%10; int shi = x/10%10; int bai = x/10/10%10; //讓ge*ge*ge+shi*shi*shi+bai*bai*bai和該數(shù)據(jù)比較 if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) { //如果相同,就把該數(shù)據(jù)在控制臺(tái)輸出。 System.out.println(x); } } } }
三、循環(huán)結(jié)構(gòu)(while循環(huán)語(yǔ)句)
while循環(huán)語(yǔ)句格式:
while(判斷條件語(yǔ)句) {
循環(huán)體語(yǔ)句;
}
//擴(kuò)展格式
初始化語(yǔ)句;
while(判斷條件語(yǔ)句) {
循環(huán)體語(yǔ)句;
控制條件語(yǔ)句;
}
流程圖:
for循環(huán)和while循環(huán)的區(qū)別:
for循環(huán)語(yǔ)句和while循環(huán)語(yǔ)句可以等價(jià)轉(zhuǎn)換,但還是有些小區(qū)別的。
(1)使用區(qū)別:
控制條件語(yǔ)句所控制的那個(gè)變量,在for循環(huán)結(jié)束后,就不能再被訪(fǎng)問(wèn)到了,而while循環(huán)結(jié)束還可以繼續(xù)使用,如果你想繼續(xù)使用,就用while,否則推薦使用for。原因是for循環(huán)結(jié)束,該變量就從內(nèi)存中消失,能夠提高內(nèi)存的使用效率。
(2)場(chǎng)景區(qū)別:
for循環(huán)適合針對(duì)一個(gè)范圍判斷進(jìn)行操作while循環(huán)適合判斷次數(shù)不明確操作
代碼舉例:
我國(guó)最高山峰是珠穆朗瑪峰:8848m,我現(xiàn)在有一張足夠大的紙張,厚度為:0.01m。請(qǐng)問(wèn),我折疊多少次,就可以保證厚度不低于珠穆朗瑪峰的高度?
/* 我國(guó)最高山峰是珠穆朗瑪峰:8848m,我現(xiàn)在有一張足夠大的紙張,厚度為:0.01m。 請(qǐng)問(wèn),我折疊多少次,就可以保證厚度不低于珠穆朗瑪峰的高度? 分析: A:定義一個(gè)統(tǒng)計(jì)變量,默認(rèn)值是0 B:最高山峰是珠穆朗瑪峰:8848m這是最終的厚度 我現(xiàn)在有一張足夠大的紙張,厚度為:0.01m這是初始厚度 C:我折疊多少次,就可以保證厚度不低于珠穆朗瑪峰的高度? 折疊一次有什么變化呢?就是厚度是以前的2倍。 D:只要每次變化的厚度沒(méi)有超過(guò)珠穆朗瑪峰的高度,就折疊,統(tǒng)計(jì)變量++ E:輸出統(tǒng)計(jì)變量。 */ class WhileTest01 { public static void main(String[] args) { //定義一個(gè)統(tǒng)計(jì)變量,默認(rèn)值是0 int count = 0; //最高山峰是珠穆朗瑪峰:8848m這是最終的厚度 //我現(xiàn)在有一張足夠大的紙張,厚度為:0.01m這是初始厚度 //為了簡(jiǎn)單,我把0.01變成1,同理8848就變成了884800 int end = 884800; int start = 1; while(start<end) { //只要每次變化的厚度沒(méi)有超過(guò)珠穆朗瑪峰的高度,就折疊,統(tǒng)計(jì)變量++ count++; //折疊一次有什么變化呢?就是厚度是以前的2倍。 start *= 2; System.out.println("第"+count+"次厚度是"+start); } //輸出統(tǒng)計(jì)變量。 System.out.println("要疊"+count+"次"); } }
四、循環(huán)結(jié)構(gòu)(do…while循環(huán)語(yǔ)句)
基本格式:
do {
循環(huán)體語(yǔ)句;
}while((判斷條件語(yǔ)句);[/code]
擴(kuò)展格式:
初始化語(yǔ)句;
do {
循環(huán)體語(yǔ)句;
控制條件語(yǔ)句;
} while((判斷條件語(yǔ)句);[/code]
流程圖:
五、循環(huán)結(jié)構(gòu)的區(qū)別及注意事項(xiàng):
三種循環(huán)語(yǔ)句其實(shí)都可以完成一樣的功能,也就是說(shuō)可以等價(jià)轉(zhuǎn)換,但還是有小區(qū)別的:
do…while循環(huán)至少會(huì)執(zhí)行一次循環(huán)體。for循環(huán)和while循環(huán)只有在條件成立的時(shí)候才會(huì)去執(zhí)行循環(huán)體
1、注意事項(xiàng):
寫(xiě)程序優(yōu)先考慮for循環(huán),再考慮while循環(huán),最后考慮do…while循環(huán)。
如下代碼是死循環(huán):
while(true){}
for(;;){}
2、循環(huán)的嵌套使用:就是循環(huán)語(yǔ)句的循環(huán)體本身是一個(gè)循環(huán)語(yǔ)句
(1)題目一:請(qǐng)輸出一個(gè)4行5列的星星(*)圖案:
提示:外循環(huán)控制行數(shù),內(nèi)循環(huán)控制列數(shù)
/* 需求:請(qǐng)輸出下列的形狀 * ** *** **** ***** 提示:外循環(huán)控制行數(shù),內(nèi)循環(huán)控制列數(shù) */ class ForForTest01 { public static void main(String[] args) { //通過(guò)簡(jiǎn)單的觀(guān)察,我們看到這是一個(gè)行是5,列數(shù)是變化的形狀 //我們先打印出一個(gè)5行5列的形狀 for(int x=0; x<5; x++) { for(int y=0; y<5; y++) { System.out.print("*"); } System.out.println(); } System.out.println("--------------"); //我們實(shí)現(xiàn)了一個(gè)5行5列的形狀 //但是這不是我們想要的 //我們要的是列數(shù)變化的 //列數(shù)是如何變化的呢? //第一行:1列 y=0,y<=0,y++ //第二行:2列 y=0,y<=1,y++ //第三行:3列 y=0,y<=2,y++ //第四行:4列 y=0,y<=3,y++ //第五行:5列 y=0,y<=4,y++ //在看外循環(huán)x的變化,恰好就是x=0,1,2,3,4 //所以這個(gè)最終版的程序就是如下 for(int x=0; x<5; x++) { for(int y=0; y<=x; y++) { System.out.print("*"); } System.out.println(); } } }
(2)題目二:在控制臺(tái)輸出九九乘法表:
/* 需求:在控制臺(tái)輸出九九乘法表。 首先我們寫(xiě)出九九乘法表: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 ... 1*9=9 2*9=18 3*9=27 ... 我們先把這個(gè)九九乘法表看出是這樣的一個(gè)形狀: * ** *** **** ***** ****** ******* ******** ********* 注意: '\x' x表示任意,這種做法叫轉(zhuǎn)移字符。 '\t' 一個(gè)制表符的位置(tabtab鍵) '\r' 回車(chē) '\n' 換行 */ class ForForTest02 { public static void main(String[] args) { for(int x=0; x<9; x++) { for(int y=0; y<=x; y++) { System.out.print("*"); } System.out.println(); } System.out.println("--------------"); //為了使用數(shù)據(jù),我們從1開(kāi)始 for(int x=1; x<=9; x++) { for(int y=1; y<=x; y++) { System.out.print(y+"*"+x+"="+y*x+"\t"); } System.out.println(); } } }
運(yùn)行效果:
六、跳轉(zhuǎn)控制語(yǔ)句:
前面我們已經(jīng)說(shuō)過(guò)了,Java中的goto是保留字,目前不能使用。雖然沒(méi)有g(shù)oto語(yǔ)句可以增強(qiáng)程序的安全性,但是也帶來(lái)很多不便,比如說(shuō),我想在某個(gè)循環(huán)知道到某一步的時(shí)候就結(jié)束,現(xiàn)在就做不了這件事情。為了彌補(bǔ)這個(gè)缺陷,Java就提供了break,continue和return來(lái)實(shí)現(xiàn)控制語(yǔ)句的跳轉(zhuǎn)和中斷。
break 中斷
continue 繼續(xù)
return 返回
1、跳轉(zhuǎn)控制語(yǔ)句(break):
break的使用場(chǎng)景:
~在選擇結(jié)構(gòu)switch語(yǔ)句中
~在循環(huán)語(yǔ)句中(循環(huán)語(yǔ)句中加入了if判斷的情況)
注:離開(kāi)使用場(chǎng)景的存在是沒(méi)有意義的
break的作用:
A:跳出單層循環(huán)
B:跳出多層循環(huán)
要想實(shí)現(xiàn)這個(gè)效果,就必須知道一個(gè)東西。帶標(biāo)簽的語(yǔ)句。標(biāo)簽名要符合Java的命名規(guī)則
格式:
標(biāo)簽名: 語(yǔ)句
代碼舉例:
/* 控制跳轉(zhuǎn)語(yǔ)句: break:中斷 continue:繼續(xù) return:返回 break:中斷的意思 使用場(chǎng)景: A:switch語(yǔ)句中 B:循環(huán)語(yǔ)句中。 (循環(huán)語(yǔ)句中加入了if判斷的情況) 注意:離開(kāi)上面的兩個(gè)場(chǎng)景,無(wú)意義。 如何使用呢? A:跳出單層循環(huán) B:跳出多層循環(huán) 要想實(shí)現(xiàn)這個(gè)效果,就必須知道一個(gè)東西。帶標(biāo)簽的語(yǔ)句。 格式: 標(biāo)簽名: 語(yǔ)句 */ class BreakDemo { public static void main(String[] args) { //在 switch 或 loop 外部中斷 //break; //跳出單層循環(huán) for(int x=0; x<10; x++) { if(x == 3) { break; } System.out.println("HelloWorld"); } System.out.println("over"); System.out.println("-------------"); //跳出多層循環(huán) wc:for(int x=0; x<3; x++) { nc:for(int y=0; y<4; y++) { if(y == 2) { //break nc; break wc; } System.out.print("*"); } System.out.println(); } } }
第38行,我們給外面的循環(huán)加了一個(gè)標(biāo)簽叫wc,然后在第42行跳轉(zhuǎn)出這個(gè)標(biāo)簽。
運(yùn)行效果:
注:實(shí)際開(kāi)發(fā)中,幾乎用不到跳轉(zhuǎn)多層循環(huán)這個(gè)功能。
2、跳轉(zhuǎn)控制語(yǔ)句(continue):
continue的使用場(chǎng)景:
在循環(huán)語(yǔ)句中離開(kāi)使用場(chǎng)景的存在是沒(méi)有意義的
continue和break的區(qū)別:
break 跳出單層循環(huán)continue 跳出一次循環(huán),進(jìn)入下一次的執(zhí)行。
效果如下:
面試題:
for(int x=1; x<=10; x++) { if(x%3==0) { //在此處填寫(xiě)代碼 } System.out.println("Java學(xué)習(xí)"); }
在上面代碼的第4行填入一行代碼,滿(mǎn)足一下條件:
我想在控制臺(tái)輸出2次:"Java學(xué)習(xí)" break;
我想在控制臺(tái)輸出7次:"Java學(xué)習(xí)" continue;
我想在控制臺(tái)輸出13次:"Java學(xué)習(xí)" System.out.println("Java學(xué)習(xí)");
3、跳轉(zhuǎn)控制語(yǔ)句(return)
return關(guān)鍵字不是為了跳轉(zhuǎn)出循環(huán)體,更常用的功能是結(jié)束一個(gè)方法,也就是退出一個(gè)方法,跳轉(zhuǎn)到上層調(diào)用的方法。
說(shuō)白了:return的作用不是結(jié)束循環(huán),而是結(jié)束方法。
效果如下:
循環(huán)語(yǔ)句結(jié)合break的練習(xí):
面試題:小芳的媽媽每天給她2.5元錢(qián),她都會(huì)存起來(lái),但是,每當(dāng)這一天是存錢(qián)的第5天或者5的倍數(shù)的話(huà),她都會(huì)花去6元錢(qián),請(qǐng)問(wèn),經(jīng)過(guò)多少天,小芳才可以存到100元錢(qián)。
代碼實(shí)現(xiàn):
/* 需求:小芳的媽媽每天給她2.5元錢(qián),她都會(huì)存起來(lái),但是, 每當(dāng)這一天是存錢(qián)的第5天或者5的倍數(shù)的話(huà),她都會(huì)花去6元錢(qián), 請(qǐng)問(wèn),經(jīng)過(guò)多少天,小芳才可以存到100元錢(qián)。 分析: A:小芳的媽媽每天給她2.5元錢(qián) double dayMoney = 2.5; B:她都會(huì)存起來(lái) double daySum = 0; C:從第一天開(kāi)始存儲(chǔ) int dayCount = 1; D:經(jīng)過(guò)多少天,小芳才可以存到100元錢(qián)。 double result = 100; E:這一天是存錢(qián)的第5天或者5的倍數(shù)的話(huà),她都會(huì)花去6元錢(qián), 說(shuō)明要判斷dayCount的值,如果對(duì)5整除就減去6元錢(qián)。 daySum -= 6; 由此還隱含了一個(gè)問(wèn)題,就是如果不是5的倍數(shù)天的話(huà),錢(qián)要累加 daySum += dayMoney; F:因?yàn)椴恢朗嵌嗌偬?,所以我用死循環(huán),一旦超過(guò)100元我就退出循環(huán)。 */ class WhileDemo { public static void main(String[] args) { //每天要存儲(chǔ)的錢(qián)是2.5元 double dayMoney = 2.5; //存錢(qián)的初始化值是0 double daySum = 0; //從第一天開(kāi)始存儲(chǔ) int dayCount = 1; //最終存儲(chǔ)不小于100就不存儲(chǔ)了 int result = 100; //因?yàn)椴恢朗嵌嗌偬?,所以我用死循環(huán), while(true) { //累加錢(qián) daySum += dayMoney; //一旦超過(guò)100元我就退出循環(huán)。 if(daySum >= result) { System.out.println("共花了"+dayCount+"天存儲(chǔ)了100元"); break; } if(dayCount%5 == 0) { //花去6元錢(qián) daySum -= 6; System.out.println("第"+dayCount+"天花了6元錢(qián)"); } //天數(shù)變化 dayCount++; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)的使用詳解
- Java流程控制之循環(huán)結(jié)構(gòu)for,增強(qiáng)for循環(huán)
- Java流程控制之循環(huán)結(jié)構(gòu)while、do...while
- java循環(huán)結(jié)構(gòu)、數(shù)組的使用小結(jié)
- 最詳細(xì)的Java循環(huán)結(jié)構(gòu)解析之for循環(huán)教程(適合小白)
- Java代碼的三根頂梁柱:循環(huán)結(jié)構(gòu)
- Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
- 淺析JAVA 循環(huán)結(jié)構(gòu)
- Java基礎(chǔ)知識(shí)精通循環(huán)結(jié)構(gòu)與break及continue
相關(guān)文章
如何通過(guò)Java實(shí)現(xiàn)加密、解密Word文檔
這篇文章主要介紹了如何通過(guò)Java實(shí)現(xiàn)加密、解密Word文檔,對(duì)一些重要文檔,常需要對(duì)文件進(jìn)行加密,查看文件時(shí),需要正確輸入密碼才能打開(kāi)文件。下面介紹了一種比較簡(jiǎn)單的方法給Word文件加密以及如何給已加密的Word文件解除密碼保護(hù),需要的朋友可以參考下2019-07-07maven-assembly-plugin報(bào)紅無(wú)法加載報(bào)錯(cuò):Plugin?‘maven-assembly-plugin
maven-assembly-plugin是一個(gè)常用的打包插件,但是在使用過(guò)程中經(jīng)常會(huì)遇到各種報(bào)錯(cuò),本文就來(lái)介紹一下maven-assembly-plugin報(bào)紅無(wú)法加載報(bào)錯(cuò),具有一定的參考價(jià)值2023-08-08基于Calendar獲取當(dāng)前時(shí)間的性能比較
這篇文章主要介紹了Calendar獲取當(dāng)前時(shí)間的性能比較,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java正則表達(dá)式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
什么是正則表達(dá)式,正則表達(dá)式的作用是什么?這篇文章主要為大家詳細(xì)介紹了Java正則表達(dá)式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05MyBatisPlus利用Service實(shí)現(xiàn)獲取數(shù)據(jù)列表
這篇文章主要為大家詳細(xì)介紹了怎樣使用 IServer 提供的 list 方法查詢(xún)多條數(shù)據(jù),這些方法將根據(jù)查詢(xún)條件獲取多條數(shù)據(jù),感興趣的可以了解一下2022-06-06Spring七大事務(wù)傳遞機(jī)制深入分析實(shí)現(xiàn)原理
實(shí)際項(xiàng)目開(kāi)發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)傳遞機(jī)制的相關(guān)資料,需要的朋友可以參考下2023-03-03Docker 存儲(chǔ)驅(qū)動(dòng)詳細(xì)介紹
這篇文章主要介紹了Docker 存儲(chǔ)驅(qū)動(dòng)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10