一、循環結構:
循環語句可以在滿足循環條件的情況下,反復執行某一段代碼,這段被重復執行的代碼被稱為循環體語句,當反復執行這個循環體時,需要在合適的時候把循環判斷條件修改為false,從而結束循環,否則循環將一直執行下去,形成死循環。
循環語句的組成:
- 初始化語句:一條或者多條語句,這些語句完成一些初始化操作。
- 判斷條件語句:這是一個boolean 表達式,這個表達式能決定是否執行循環體。
- 循環體語句:這個部分是循環體語句,也就是我們要多次做的事情。
- 控制條件語句:這個部分在一次循環體結束后,下一次循環判斷條件執行前執行。通過用於控制循環條件中的變量,使得循環在合適的時候結束。
eg:在控制台輸出10次"HelloWorld"時,
- 初始化語句:定義初始化為第一次。
- 判斷條件語句:次數不能超過10次。
- 循環體語句:輸出”HelloWorld”語句。
- 控制條件語句:次數變化為下一次。
二、循環結構(for循環語句)
for循環語句格式:
for(初始化語句;判斷條件語句;控制條件語句) { 循環體語句; }
執行流程:
A:執行初始化語句
B:執行判斷條件語句,看其結果是true還是false:如果是false,循環結束;如果是true,繼續執行。
C:執行循環體語句
D:執行控制條件語句
E:回到B繼續
流程圖:
注意事項:
(1)判斷條件語句的結果是一個boolean類型
(2)循環體語句如果是一條語句,大括號可以省略;如果是多條語句,大括號不能省略。建議永遠不要省略。
(3)一般來說:有左大括號就沒有分號,有分號就沒有左大括號
代碼舉例:
1、求出1-100之間偶數和:
1 /* 2 需求: 3 A:求1-100之和。 4 B:求出1-100之間偶數和 5 */ 6 class ForTest1 { 7 public static void main(String[] args) { 8 //求1-100之和。 9 int sum1 = 0; 10 11 for(int x=1; x<=100; x++) { 12 sum1 +=x; 13 } 14 15 System.out.println("1-100之和是:"+sum1); 16 System.out.println("------------------"); 17 18 //求出1-100之間偶數和 19 //方式1 20 int sum2 = 0; 21 22 for(int x=1; x<=100; x++) { 23 if(x%2 == 0) { 24 sum2 += x; 25 } 26 } 27 28 System.out.println("1-100偶數之和是:"+sum2); 29 System.out.println("------------------"); 30 31 //方式2 32 int sum3 = 0; 33 34 for(int x=0; x<=100; x+=2) { 35 sum3 += x; 36 } 37 38 System.out.println("1-100偶數之和是:"+sum3); 39 System.out.println("------------------"); 40 } 41 }
2、求5的階乘:
1 /* 2 需求:求5的階乘。 3 4 什么是階乘呢? 5 n! = n*(n-1)! 規則 6 n! = n*(n-1)*(n-2)*...*3*2*1 7 8 求和思想。 9 求階乘思想。 10 */ 11 class ForTest2 { 12 public static void main(String[] args) { 13 //定義最終結果變量 14 int jc = 1; 15 16 //這里的x其實可以直接從2開始 17 //for(int x=1; x<=5; x++) 18 19 for(int x=2; x<=5; x++) { 20 jc *=x; 21 } 22 23 System.out.println("1-5的階乘是:"+jc); 24 } 25 }
3、在控制台輸出所有的“水仙花數”:
1 /* 2 3 需求:在控制台輸出所有的”水仙花數” 4 5 分析: 6 我們都不知道什么叫"水仙花數",你讓我怎么做呢? 7 8 所謂的水仙花數是指一個三位數,其各位數字的立方和等於該數本身。 9 舉例:153就是一個水仙花數。 10 153 = 1*1*1 + 5*5*5 + 3*3*3 = 1 + 125 + 27 = 153 11 12 A:三位數其實是告訴了我們范圍。 13 B:通過for循環我們就可以實現獲取每一個三位數 14 但是麻煩是如何獲取這個三位數的個,十,百位上的數據 15 16 我們如何獲取一個數據的個,十,百呢? 17 假設有個一個數據:153 18 ge: 153%10 = 3 19 shi: 153/10%10 = 5 20 bai:153/10/10%10 = 1 21 qian:x/10/10/10%10 22 wan: x/10/10/10/10%10 23 ... 24 25 C:讓ge*ge*ge+shi*shi*shi+bai*bai*bai和該數據比較 26 如果相同,就把該數據在控制台輸出。 27 */ 28 class ForTest3 { 29 public static void main(String[] args) { 30 //三位數其實是告訴了我們范圍。 31 for(int x=100; x<1000; x++) { 32 int ge = x%10; 33 int shi = x/10%10; 34 int bai = x/10/10%10; 35 36 //讓ge*ge*ge+shi*shi*shi+bai*bai*bai和該數據比較 37 if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)) { 38 //如果相同,就把該數據在控制台輸出。 39 System.out.println(x); 40 } 41 } 42 } 43 }
三、循環結構(while循環語句)
while循環語句格式:
while(判斷條件語句) { 循環體語句; }
//擴展格式 初始化語句; while(判斷條件語句) { 循環體語句; 控制條件語句; }
流程圖:
for循環和while循環的區別:
for循環語句和while循環語句可以等價轉換,但還是有些小區別的。
(1)使用區別:
控制條件語句所控制的那個變量,在for循環結束后,就不能再被訪問到了,而while循環結束還可以繼續使用,如果你想繼續使用,就用while,否則推薦使用for。原因是for循環結束,該變量就從內存中消失,能夠提高內存的使用效率。
(2)場景區別:
- for循環適合針對一個范圍判斷進行操作
- while循環適合判斷次數不明確操作
代碼舉例:
我國最高山峰是珠穆朗瑪峰:8848m,我現在有一張足夠大的紙張,厚度為:0.01m。請問,我折疊多少次,就可以保證厚度不低於珠穆朗瑪峰的高度?
1 /* 2 我國最高山峰是珠穆朗瑪峰:8848m,我現在有一張足夠大的紙張,厚度為:0.01m。 3 請問,我折疊多少次,就可以保證厚度不低於珠穆朗瑪峰的高度? 4 5 分析: 6 A:定義一個統計變量,默認值是0 7 B:最高山峰是珠穆朗瑪峰:8848m這是最終的厚度 8 我現在有一張足夠大的紙張,厚度為:0.01m這是初始厚度 9 C:我折疊多少次,就可以保證厚度不低於珠穆朗瑪峰的高度? 10 折疊一次有什么變化呢?就是厚度是以前的2倍。 11 D:只要每次變化的厚度沒有超過珠穆朗瑪峰的高度,就折疊,統計變量++ 12 E:輸出統計變量。 13 */ 14 15 class WhileTest01 { 16 public static void main(String[] args) { 17 //定義一個統計變量,默認值是0 18 int count = 0; 19 20 //最高山峰是珠穆朗瑪峰:8848m這是最終的厚度 21 //我現在有一張足夠大的紙張,厚度為:0.01m這是初始厚度 22 //為了簡單,我把0.01變成1,同理8848就變成了884800 23 int end = 884800; 24 int start = 1; 25 26 while(start<end) { 27 //只要每次變化的厚度沒有超過珠穆朗瑪峰的高度,就折疊,統計變量++ 28 count++; 29 30 //折疊一次有什么變化呢?就是厚度是以前的2倍。 31 start *= 2; 32 33 System.out.println("第"+count+"次厚度是"+start); 34 } 35 36 //輸出統計變量。 37 System.out.println("要疊"+count+"次"); 38 } 39 }
四、循環結構(do…while循環語句)
基本格式:
do { 循環體語句; }while((判斷條件語句);
擴展格式:
初始化語句; do { 循環體語句; 控制條件語句; } while((判斷條件語句);
流程圖:
五、循環結構的區別及注意事項:
三種循環語句其實都可以完成一樣的功能,也就是說可以等價轉換,但還是有小區別的:
- do…while循環至少會執行一次循環體。
- for循環和while循環只有在條件成立的時候才會去執行循環體
1、注意事項:
寫程序優先考慮for循環,再考慮while循環,最后考慮do…while循環。
如下代碼是死循環:
- while(true){}
- for(;;){}
2、循環的嵌套使用:就是循環語句的循環體本身是一個循環語句
(1)題目一:請輸出一個4行5列的星星(*)圖案:
提示:外循環控制行數,內循環控制列數
1 /* 2 需求:請輸出下列的形狀 3 * 4 ** 5 *** 6 **** 7 ***** 8 9 提示:外循環控制行數,內循環控制列數 10 */ 11 class ForForTest01 { 12 public static void main(String[] args) { 13 //通過簡單的觀察,我們看到這是一個行是5,列數是變化的形狀 14 //我們先打印出一個5行5列的形狀 15 for(int x=0; x<5; x++) { 16 for(int y=0; y<5; y++) { 17 System.out.print("*"); 18 } 19 System.out.println(); 20 } 21 22 System.out.println("--------------"); 23 24 //我們實現了一個5行5列的形狀 25 //但是這不是我們想要的 26 //我們要的是列數變化的 27 //列數是如何變化的呢? 28 //第一行:1列 y=0,y<=0,y++ 29 //第二行:2列 y=0,y<=1,y++ 30 //第三行:3列 y=0,y<=2,y++ 31 //第四行:4列 y=0,y<=3,y++ 32 //第五行:5列 y=0,y<=4,y++ 33 //在看外循環x的變化,恰好就是x=0,1,2,3,4 34 //所以這個最終版的程序就是如下 35 for(int x=0; x<5; x++) { 36 for(int y=0; y<=x; y++) { 37 System.out.print("*"); 38 } 39 System.out.println(); 40 } 41 } 42 }
(2)題目二:在控制台輸出九九乘法表:
1 /* 2 需求:在控制台輸出九九乘法表。 3 4 首先我們寫出九九乘法表: 5 1*1=1 6 1*2=2 2*2=4 7 1*3=3 2*3=6 3*3=9 8 1*4=4 2*4=8 3*4=12 4*4=16 9 ... 10 1*9=9 2*9=18 3*9=27 ... 11 12 我們先把這個九九乘法表看出是這樣的一個形狀: 13 * 14 ** 15 *** 16 **** 17 ***** 18 ****** 19 ******* 20 ******** 21 ********* 22 23 注意: 24 '\x' x表示任意,這種做法叫轉移字符。 25 26 '\t' 一個制表符的位置(tabtab鍵) 27 '\r' 回車 28 '\n' 換行 29 */ 30 class ForForTest02 { 31 public static void main(String[] args) { 32 for(int x=0; x<9; x++) { 33 for(int y=0; y<=x; y++) { 34 System.out.print("*"); 35 } 36 System.out.println(); 37 } 38 System.out.println("--------------"); 39 //為了使用數據,我們從1開始 40 for(int x=1; x<=9; x++) { 41 for(int y=1; y<=x; y++) { 42 System.out.print(y+"*"+x+"="+y*x+"\t"); 43 } 44 System.out.println(); 45 } 46 } 47 }
運行效果:
六、跳轉控制語句:
前面我們已經說過了,Java中的goto是保留字,目前不能使用。雖然沒有goto語句可以增強程序的安全性,但是也帶來很多不便,比如說,我想在某個循環知道到某一步的時候就結束,現在就做不了這件事情。為了彌補這個缺陷,Java就提供了break,continue和return來實現控制語句的跳轉和中斷。
- break 中斷
- continue 繼續
- return 返回
1、跳轉控制語句(break):
break的使用場景:
- 在選擇結構switch語句中
- 在循環語句中(循環語句中加入了if判斷的情況)
注:離開使用場景的存在是沒有意義的
break的作用:
A:跳出單層循環
B:跳出多層循環
要想實現這個效果,就必須知道一個東西。帶標簽的語句。標簽名要符合Java的命名規則
格式:
標簽名: 語句
代碼舉例:
1 /* 2 控制跳轉語句: 3 break:中斷 4 continue:繼續 5 return:返回 6 7 break:中斷的意思 8 使用場景: 9 A:switch語句中 10 B:循環語句中。 11 (循環語句中加入了if判斷的情況) 12 注意:離開上面的兩個場景,無意義。 13 14 如何使用呢? 15 A:跳出單層循環 16 B:跳出多層循環 17 要想實現這個效果,就必須知道一個東西。帶標簽的語句。 18 格式: 19 標簽名: 語句 20 */ 21 class BreakDemo { 22 public static void main(String[] args) { 23 //在 switch 或 loop 外部中斷 24 //break; 25 26 //跳出單層循環 27 for(int x=0; x<10; x++) { 28 if(x == 3) { 29 break; 30 } 31 System.out.println("HelloWorld"); 32 } 33 34 System.out.println("over"); 35 System.out.println("-------------"); 36 37 //跳出多層循環 38 wc:for(int x=0; x<3; x++) { 39 nc:for(int y=0; y<4; y++) { 40 if(y == 2) { 41 //break nc; 42 break wc; 43 } 44 System.out.print("*"); 45 } 46 System.out.println(); 47 } 48 } 49 }
第38行,我們給外面的循環加了一個標簽叫wc,然后在第42行跳轉出這個標簽。
運行效果:
注:實際開發中,幾乎用不到跳轉多層循環這個功能。
2、跳轉控制語句(continue):
continue的使用場景:
- 在循環語句中
- 離開使用場景的存在是沒有意義的
continue和break的區別:
- break 跳出單層循環
- continue 跳出一次循環,進入下一次的執行。
效果如下:
面試題:
1 for(int x=1; x<=10; x++) { 2 if(x%3==0) { 3 //在此處填寫代碼 4 5 } 6 System.out.println("Java學習"); 7 }
在上面代碼的第4行填入一行代碼,滿足一下條件:
- 我想在控制台輸出2次:"Java學習" break;
- 我想在控制台輸出7次:"Java學習" continue;
- 我想在控制台輸出13次:"Java學習" System.out.println("Java學習");
3、跳轉控制語句(return)
return關鍵字不是為了跳轉出循環體,更常用的功能是結束一個方法,也就是退出一個方法,跳轉到上層調用的方法。
說白了:return的作用不是結束循環,而是結束方法。
效果如下:
循環語句結合break的練習:
面試題:小芳的媽媽每天給她2.5元錢,她都會存起來,但是,每當這一天是存錢的第5天或者5的倍數的話,她都會花去6元錢,請問,經過多少天,小芳才可以存到100元錢。
代碼實現:
1 /* 2 需求:小芳的媽媽每天給她2.5元錢,她都會存起來,但是, 3 每當這一天是存錢的第5天或者5的倍數的話,她都會花去6元錢, 4 請問,經過多少天,小芳才可以存到100元錢。 5 6 分析: 7 A:小芳的媽媽每天給她2.5元錢 8 double dayMoney = 2.5; 9 B:她都會存起來 10 double daySum = 0; 11 C:從第一天開始存儲 12 int dayCount = 1; 13 D:經過多少天,小芳才可以存到100元錢。 14 double result = 100; 15 E:這一天是存錢的第5天或者5的倍數的話,她都會花去6元錢, 16 說明要判斷dayCount的值,如果對5整除就減去6元錢。 17 daySum -= 6; 18 由此還隱含了一個問題,就是如果不是5的倍數天的話,錢要累加 19 daySum += dayMoney; 20 F:因為不知道是多少天,所以我用死循環,一旦超過100元我就退出循環。 21 */ 22 class WhileDemo { 23 public static void main(String[] args) { 24 //每天要存儲的錢是2.5元 25 double dayMoney = 2.5; 26 27 //存錢的初始化值是0 28 double daySum = 0; 29 30 //從第一天開始存儲 31 int dayCount = 1; 32 33 //最終存儲不小於100就不存儲了 34 int result = 100; 35 36 //因為不知道是多少天,所以我用死循環, 37 while(true) { 38 //累加錢 39 daySum += dayMoney; 40 41 //一旦超過100元我就退出循環。 42 if(daySum >= result) { 43 System.out.println("共花了"+dayCount+"天存儲了100元"); 44 break; 45 } 46 47 if(dayCount%5 == 0) { 48 //花去6元錢 49 daySum -= 6; 50 System.out.println("第"+dayCount+"天花了6元錢"); 51 } 52 53 //天數變化 54 dayCount++; 55 } 56 } 57 }
我的公眾號
想學習代碼之外的軟技能?不妨關注我的微信公眾號:生命團隊(id:vitateam)。
掃一掃,你將發現另一個全新的世界,而這將是一場美麗的意外: