============================================================================= =============================================================================
涉及到的知識點有: 1:switch語句(掌握) 2:循環語句(掌握) 3:循環結構(循環嵌套使用) 4:控制跳轉語句(掌握)
============================================================================= ============================================================================= 1:switch語句(掌握) (1)格式: switch(表達式) { case 值1: 語句體1; break; case 值2: 語句體2; break; ...... ...... case 值n: 語句體n; break; default: 語句體n+1; break; //該break可以省略。 } 格式解釋說明: switch:說明這是switch語句。 表達式:可以是byte,short,int,char。 JDK5以後表達式可以是枚舉。 JDK7以後表達式可以是字符串。 case:後面的值就是要和表達式進行比較的值。 語句體部分:可以是一條或多條語句。 break:表示程序到這裏中斷,跳出switch語句了。 default:如果所有的情況都不匹配,就執行這裏的,相當於if語句中的else。 (2)面試題: switch語句的表達式可以是byte嗎?可以是long嗎?可以是String嗎? 可以,不可以,JDK7以後可以。 (3)執行流程: A:首先,計算表達式的值; B:其次,和每一個case的值進行匹配,如果有就執行對應的語句體,看到break就結束。 C:如果沒有匹配,就執行default的語句體n+1。 (4)注意事項: A:case後面只能是常量,不能是變量;而且,多個case後面的值不能出現相同的。 B:default可以省略嗎? 可以省略,但是不建議,因爲它的作用是對不正確的情況給出提示。 特殊情況: case就可以把值固定(即:判斷的值是固定的)。 例如:做單選題:A,B,C,D只有四個選項。 C:break可以省略嗎? default後面的break可以省略。但是其餘case後面的break不可以省略,否則出現的結果可能不是我們想要的。 即:會出現一個現象:case穿透。 最終我們建議都不要省略。 D:default一定要在最後嗎? 不是,可以在任意位置。但是建議放在最後。因爲default表示其它的情況。也即:default不是程序結束的標誌。 E:switch語句的兩種結束標誌: a:遇到break就表示結束了。 b:如果一直沒有遇到break,那就執行到程序的末尾才表示結束了。 特別注意一個情況:如下圖所示01:
(5)案例: A:鍵盤錄入一個數字(1-7),輸出對應的星期幾。(表達式是byte,int,short的情況) B:單項選擇題。(表達式是char的情況) //由於我們現在沒有辦法鍵盤錄入得到一個'A','B','C','D' //此時需要強制轉換爲字符類型。 Scanner sc = new Scanner(System.in); int choiceNumber = sc.nextInt(); char choice = (char) choiceNumber; C:鍵盤錄入一個字符串的問題。(表達式是字符串的情況) String s = sc.nextLine(); D:根據給定的月份,輸出對應的季節。(可以使用case穿透簡化代碼) (6)if語句和switch語句各自的使用場景: A:if語句 針對boolean類型的判斷。 針對一個範圍的判斷。 針對幾個常量的判斷。 B:switch語句 針對幾個常量的判斷。 ----------------------------------------------------------------------------- 2:循環語句(掌握)
(1)有三種:for循環,while循環,do...while循環。 注意:反覆執行這個循環體時,需要在合適的時候把循環判斷條件修改爲false,從而結束循環。 --------------------------------------- (2)for循環語句 A:格式: for(初始化語句;判斷條件語句;控制條件語句) { 循環體語句; } 執行流程: a:執行初始化語句(只做一次); b:執行判斷條件語句; 如果這裏是true,就繼續。 如果這裏是false,循環就結束。 c:執行循環體語句; d:執行控制條件語句; e:回到b繼續。 B:注意事項: a:判斷條件語句無論是簡單還是複雜,結果都是boolean類型。 b:循環體語句如果是一條,可以省略大括號,但是不建議省略。 c:一般來說:有分號就沒有左大括號,有左大括號就沒有分號。 C:案例: a:輸出10次HelloWorld。 b:輸出1-10的數據。 c:輸出10-1的數據。 d:求1-10的和。(循環的求和思想) 如下圖所示02:
e:求1-100的和,求1-100的偶數和,求1-100的奇數和。 f:求5的階乘。 n! = n * (n - 1)! n! = n * (n - 1) *(n -2) * (n - 3) * ... * 3 * 2 * 1 g:在控制檯打印水仙花數。 何爲水仙花數?答:一個三位數,其各位數字的立方和等於該數本身。 ge: 153/1%10 = 3 shi: 153/10%10 = 5 bai: 153/100%10 = 1 qian: x/10000%10 wan: x/10000%10 ...... 小結: 如果想把某數的個位取出來,就用該數除以1取整後再對10取餘; 如果想把某數的十位取出來,就用該數除以10取整後再對10取餘; 如果想把某數的百位取出來,就用該數除以100取整後再對10取餘; 其餘位以此類推。 h:統計水仙花個數。 循環的統計思想。 i:改進版的迴文數。 一個五位數:12621 個位 = 萬位 十位 = 千位 個位 + 十位 + 千位 + 萬位 = 百位 j:統計1-1000之間同時滿足如下條件的數據有多少個。 x%3==2 x%5==3 x%7==2 --------------------------------------- (3)while循環 A:基本格式: while(判斷條件語句) { 循環體語句; } --------------------------------------- 擴展格式: 初始化語句; while(判斷條件語句) { 循環體語句; 控制條件語句; } --------------------------------------- for(初始化語句;判斷條件語句;控制條件語句) { 循環體語句; } --------------------------------------- 通過查看這個格式,我們就知道while循環可以和for循環等價轉換。 B:while的練習: 把for語句的練習用while改進。 C:for和while的區別: a:使用上的區別: 如果想在循環結束後,繼續使用控制條件語句所控制的那個變量,用while循環,否則用for循環。不知道的時候用for循環。 因爲變量要及早的從內存中消失,可以提高內存的使用效率。 b:理解上的區別: for適合於一個範圍內的判斷。 while適合次數不明確的判斷。 舉例:吃葡萄。 D:案例: a:珠穆朗瑪峯問題。(不知道次數用while) b:小芳存錢問題(break以後才能做)。 --------------------------------------- (4)do...while循環 A:基本格式: do { 循環體語句; }while(判斷條件語句); --------------------------------------- 擴展格式: 初始化語句; do { 循環體語句; 控制條件語句; }while(判斷條件語句); --------------------------------------- for(初始化語句;判斷條件語句;控制條件語句) { 循環體語句; } --------------------------------------- 通過查看格式,我們就可以看出其實三種循環的格式可以是統一的。 B:三種循環的區別: a:do...while循環至少執行一次循環體。 b:for和while必須先判斷條件是否是true,然後才能決定是否執行循環體。 c:我們一般優先考慮for,其次考慮while,最後考慮do...while。 --------------------------------------- (5)循環使用的注意事項(死循環) A:一定要注意修改控制條件語句,否則容易出現死循環。 B:最簡單的死循環格式: a:while(true){...} b:for(;;){...} ----------------------------------------------------------------------------- 3:循環結構(循環嵌套使用) 循環嵌套:循環語句的循環體本身就是一個循環語句。 (1)請輸出一個4行5列的星星(*)圖案. ***** ***** ***** ***** for (int x = 0; x < 4; x++) { //外循環控制行數。 for (int y = 0; y < 5; y++) { //內循環控制列數。 System.out.print("*"); } System.out.println(); } (2)請輸出如下圖形. * ** *** **** ***** for (int x = 0; x < 5; x++) { //外循環控制行數。 for (int y = 0; y <= x; y++) { //內循環控制列數。 System.out.print("*"); } System.out.println(); } (3)在控制檯輸出九九乘法表。 * ** *** **** ***** ****** ******* ******** ********* for (int x = 0; x < 9; x++) { //外循環控制行數。 for (int y = 0; y <= x; y++) { //內循環控制列數。 System.out.print("*"); } System.out.println(); } --------------------------------------- 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 4*9=36 ... 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(); } (4)注意事項: '\x' x表示任意,這種做法叫轉移字符。 '\t' tab鍵的位置 '\r' 回車(回到舊行的開端) '\n' 換行(換到新行的開端) ----------------------------------------------------------------------------- 4:控制跳轉語句(掌握) (1)break:中斷的意思 A:用在循環(loop)語句中加入了if判斷的情況和switch語句中,離開此應用場景無意義。 B:作用: a:跳出單層循環。 b:跳出多層循環,需要與標籤語句的配合。即給循環起個名字。但是呢,幾乎不用,跳出多層循環。應用:break配合標籤使用,可以通過內循環控制外循環。 格式:標籤名:語句 例如: 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(); } --------------------------------------- (2)continue:繼續的意思 A:用在循環中,離開此應用場景無意義。 B:作用: break:跳出單層循環,循環結束,不在繼續下去了。 continue:跳出一次單層循環,但循環沒有結束,繼續下一次循環。特別注意:在while循環的循環體中使用continue,可能使程序停不下來。 C:填空題 (1) for(int x = 1; x < 10; x++) { if(x == 3) { //break; //1 2 continue; //1 2 4 5 6 7 8 9 } System.out.println(x); } (2) for(int x = 1; x <= 10; x++) { if(x%3 == 0) { //在此處填寫代碼 } System.out.println(“Java基礎班”); } 如何讓控制檯輸出2次:Java基礎班 break; 如何讓控制檯輸出7次:Java基礎班 continue; 如何讓控制檯輸出13次:Java基礎班 System.out.println(“Java基礎班”); --------------------------------------- (3)return:返回的意思 return關鍵字不是爲了跳轉出循環體,更常用的功能是結束一個方法,也就是退出一個方法。 A:用於結束方法的,後面還會在繼續講解和使用。 B:一旦遇到return,程序就不會在繼續往後執行。 --------------------------------------- (4)用while語句和break結合使用:小芳存錢案例。
1 /* 2 需求:小芳的媽媽每天給她2.5元錢,她都會存起來,但是, 3 每當這一天是存錢的第5天或者5的倍數的話,她都會花去6元錢, 4 請問,經過多少天,小芳纔可以存到100元錢。 5 分析: 6 A:小芳的媽媽每天給她2.5元錢。 7 double dayMoney = 2.5; 8 B:她都會存起來 9 double daySum = 0; 10 C:從第一天開始存儲。 11 int dayCount = 1; 12 D:經過多少天,小芳纔可以存到100元錢。 13 double result = 100; 14 E:這一天是存錢的第5天或者5的倍數的話,她都會花去6元錢, 15 說明要判斷dayCount的值,如果對5整除就減去6元錢。 16 daySum -= 6; 17 由此還隱含了一個問題,就是要判斷dayCount的值,如果不是5的倍數天的話,錢要累加。 18 daySum += dayMoney; 19 F:因爲不知道是多少天,所以我用死循環,一旦超過100元我就退出循環。 20 */ 21 class WhileDemo { 22 public static void main(String[] args) { 23 //每天要存儲的錢是2.5元 24 double dayMoney = 2.5; 25 26 //存錢的初始化值是0 27 double daySum = 0; 28 29 //從第一天開始存儲 30 int dayCount = 1; 31 32 //最終存儲不小於100就不存儲了 33 int result = 100; 34 35 //因爲不知道是多少天,所以我用死循環, 36 while(true) { 37 //累加錢 38 daySum += dayMoney; 39 40 //一旦超過100元我就退出循環。 41 if(daySum >= result) { 42 System.out.println("共花了"+dayCount+"天存儲了100元"); 43 break; 44 } 45 46 if(dayCount%5 == 0) { 47 //花去6元錢 48 daySum -= 6; 49 System.out.println("第"+dayCount+"天花了6元錢"); 50 } 51 52 //天數變化 53 dayCount++; 54 } 55 } 56 }
=============================================================================