0x00 概述
本篇內容包括switch語句,for循環,while循環,random函數。
0x01 switch語句
1.1 switch語句結構
格式
switch(表達式) { case 1: 語句體1; break; case 2: 語句體2; break; ... default: 語句體n+1; break; }
執行流程
/*
1. 首先計算出表達式的值 2. 其次,和case依次比較,一旦有對應的值,就會執行相應的語句,在執行過程中,遇到break就會結束 3. 最后,如果所有的case都和表達式的值不匹配,就會執行default語句體部分,然后程序結束 */
/* switch語句 格式: switch(表達式) { case 值1: 語句體1; break; case 值2: 語句體2; break; … default: 語句體n+1; [break;] } 格式說明: 表達式:取值為byte、short、int、char,JDK5以后可以是枚舉,JDK7以后可以是String。 case:后面跟的是要和表達式進行比較的值。 break:表示中斷,結束的意思,用來結束switch語句。 default:表示所有情況都不匹配的時候,就執行該處的內容,和if語句的else相似。 執行流程: 首先計算表達式的值。 依次和case后面的值進行比較,如果有對應的值,就會執行相應的語句,在執行的過程中,遇到break就會結束。 如果所有的case后面的值和表達式的值都不匹配,就會執行default里面的語句體,然后程序結束掉。 */ import java.util.Scanner; public class SwitchDemo { public static void main(String[] args) { System.out.println("開始"); //需求:鍵盤錄入一個星期數(1,2,...7),輸出對應的星期一,星期二,...星期日 Scanner sc = new Scanner(System.in); System.out.println("請輸入一個星期數(1-7):"); int week = sc.nextInt(); switch(week) { case 1: System.out.println("星期一"); break; case 2: System.out.println("星期二"); break; case 3: System.out.println("星期三"); break; case 4: System.out.println("星期四"); break; case 5: System.out.println("星期五"); break; case 6: System.out.println("星期六"); break; case 7: System.out.println("星期日"); break; default: System.out.println("你輸入的星期數有誤"); break; } System.out.println("結束"); } }
1.2 switch語句聯系-春夏秋冬
需求: 一年有12個月,分屬於春夏秋冬4個季節,鍵盤錄入月份,請用程序實現判斷該月份屬於哪個季節,並輸出。
/* 春:3,4,5 夏:6,7,8 秋:9,10,11 東:12,1,2 */
示例
import java.util.Scanner; public class demo1 { public static void main(String[] args) { // 鍵盤錄入月份數據,使用變量接收 Scanner sc = new Scanner(System.in); System.out.println("請輸入一個月份: "); int month = sc.nextInt(); // case穿透 switch (month) { case 1: case 2: case 12: System.out.println("冬季"); break; case 3: case 4: case 5: System.out.println("春季"); break; case 6: case 7: case 8: System.out.println("夏季"); break; case 9: case 10: case 11: System.out.println("秋季"); break; default: System.out.println("你輸入的月份有誤"); } } }
注意:如果switch中的case,沒有break的話,則會出現case穿透現象。
0x02 for循環
2.1 for循環結構
循環:
循環語句可以在滿足循環條件的情況下,反復執行某一段代碼,這段被重復執行的代碼被稱為循環體語句,
當反復 執行這個循環體時,需要在合適的時候把循環判斷條件修改為false,從而結束循環,否則循環將一直執行下去,形 成死循環。
for循環格式:
for(初始化語句;條件判斷語句;條件控制語句) { 循環體語句; }
格式解釋:
- 初始化語句:用於表示循環開啟時的起始狀態,簡單說就是循環開始的時候什么樣
- 條件判斷語句:用於表示循環反復執行的條件,簡單說就是判斷循環能否一直執行下去
- 循環體語句:用於表示循環反復執行的內容,簡單說就是循環反復執行的事情
- 條件控制語句:用於表示循環執行中每次變化的內容,簡單說就是控制循環是否能執行下去
執行流程:
- 執行初始化語句
- 執行條件判斷語句,看其結果是true還是false,如果是false,循環結束,如果是true,繼續執行
- 執行循環體語句
- 執行條件控制語句
- 回到2繼續
2.2 for循環練習-輸出數據
需求:在控制台輸出1-5和5-1的數據
示例
public class fortest01 { public static void main(String[] args) { //需求:輸出數據1-5 for(int i = 1; i <= 5; i++) { System.out.println(i); } System.out.println("--------------------"); for(int j = 5; j >= 1; j--) { System.out.println(j); } } }
2.3 循環練習-求和
需求:求1-5之間的數據和,並把求和結果在控制台輸出
示例:
public class forTest02 { public static void main(String[] args) { //求和的最終結果必須保存起來,需要定義一個變量,用於保存求和的結果,初始值為 int sum = 0; // 從1凱斯到5結束,使用循環結構 for(int i = 1; i <= 5; i++) { // 將反復進行的事情寫入循環結構內部 // 此處反復進行的事情是將數據i,加到用於保存最終求和的變量sum中 sum += i; /* sum += i; sum = sum + i; 第一次: sum = sum + i = 0 + 1 = 1; 第二次: sum = sum + i = 1 + 2 = 3; 第三次: sum = sum + i = 3 + 3 = 6; ... 第五次: sum = sum + i = 10 + 5 =15 */ } // 當循環執行完畢時,將最終數據打印出來 System.out.println("1-5之間的數據和是: " + sum); } }
本題要點:
- 今后遇到的需求中,如果帶有求和二字,請立即聯想到求和變量,用於寄存數據;
- 求和變量的定義位置,必須在循環外部,如果在循環內部則計算出的數據是錯誤的;
2.4 for循環練習-求偶數和
需求:求1-100之間的偶數之和,並把求和結果在控制台輸出
示例
public class forTest03 { public static void main(String[] args) { // 求和的最終結果必須保存起來,需要定義一個變量,用於保存求和的結果,初始值為 int sum = 0; // 對1-100的數據求和和對1-5的數據求和幾乎完全一樣,僅僅是結束條件不同 for (int i = 1; i <= 100; i++) { // 對1-100的偶數求和,需要對求和操作添加限制條件,判斷是否是偶數 if (i %2 == 0) { sum += i; } } // 當循環執行完畢時,將最終數據打印出來 System.out.println("1-100之間的偶數之和是:" + sum); } }
2.5 for循環練習-水仙花
需求:在控制台輸出100-1000之內所有的“水仙花數”
解釋: 水仙花數是指,一個三位數,其個位,十位,百位的數字立方和等於原數;例如3*3*3 + 5*5*5 + 1*1*1 = 153
思路:
- 獲取100-1000之內所有的三位數,准備進行篩選,最小的三位數是100,最大的三位數是999,使用for循環獲取
- 獲取每個三位數的個位,十位,百位,做if語句判斷是否是水仙花數
示例:
public class forTest04 { public static void main(String[] args) { // 輸出所有水仙花數必然使用到循環,遍歷所有的三位數,三位數從100開始,到999結束 for(int i = 100; i < 1000; i++) { // 在計算之前獲取三位數中個,十,百位上的數值 int ge = i % 10; int shi = i /10 %10; int bai = i /10 /10 %10; // 判斷條件是將三位書中的每個數值取出來,計算立方和后與原始數字比較是否相等 if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { System.out.println(i); } } } }
2.6 for循環練習-統計水仙花數的個數
需求:輸出水仙花數的個數
示例:
public class fortest05 { public static void main(String[] args) { // 定義變量count,用於保存"水仙花數"的數量,初始值為0 int count = 0; // 輸出所有的水仙花數使用循環,遍歷所有三位數,100-999 for (int i = 100; i < 1000; i++) { // 獲取個 十 百 位上的數值 int ge = i % 10; int shi = i / 10 % 10; int bai = i / 10 / 10 %10; //在判斷水仙花數的過程中,滿足條件就不再輸出,此處變更為更新count值,使count+1 if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) { count++; } } // 打印輸出最終的count值 System.out.println("水仙花共有:" + count + "個") } }
本題要點:
- 今后如果有需求帶有統計xxxx,請先想到計算器變量
- 計算器變量定義的位置,必須在循環外部
0x03 while循環
3.1 while結構
while的循環的完整格式:
初始化語句; while(條件判斷語句) { 循環體語句; 條件控制語句; }
while循環執行流程:
- 執行初始化語句
- 執行條件判斷語句,看其結果是true還是false;如果是false,循環結束;如果是true,繼續執行
- 執行循環體語句
- 執行條件控制語句
- 回到2繼續
public class whiledemo { public static void main(String[] args) { // 需求:在控制台輸出5次helloworld // 使用for循環實現 for (int i = 1; i <= 5; i++) { System.out.println("HelloWorld"); } System.out.println("---------------"); // 使用while循環實現 int j = 1; while(j <= 5) { System.out.println("HelloWorld"); j ++; } } }
3.2 while循環-珠穆朗瑪峰
需求:世界最高峰珠穆朗瑪峰高度位8843.43米=8843430毫米,假如我有一張足夠大的紙張,他的厚度為0.1毫米;請問折疊多少次,可以超過珠峰的高度
示例:
public class whiletest { public static void main(String[] args) { // 定義一個計算器,初始值為0 int count = 0; // 定義紙張厚度 double paper = 0.1; // 定義珠峰高度 int zf = 8844430; // 因為要反復折疊,所以要使用循環,但是不知道要折疊多少次,這種情況下使用while循環比較合適 // 折疊的過程中,當紙張的厚度大於珠峰就停止,因此繼續執行的要求是紙張厚度小於珠峰高度 while (paper < zf) { // 循環的執行過程中每次紙張折疊,紙張的厚度翻倍 paper *= 2; // 在循環中執行累加,對應折疊了多少次 count++; } // 打印計數器的值 System.out.println("需要折疊的次數:"+count+" 次"); } }
0x04 循環細節
4.1 do...while循環結構
格式
初始化語句; do { 循環體語句; 條件控制語句; } while(條件判斷語句);
執行流程:
- 執行初始化語句
- 執行循環體語句
- 執行條件控制語句
- 執行條件判斷語句,看其結果是true還是false,如果是false,循環結束,如果是true,繼續執行
- 回到2繼續
public class dowhileDemo { public static void main(String[] args) { // 需求:在控制台輸出5次helloworld // for循環實現 for (int i = 1; i <= 5; i++) { System.out.println("HelloWorld"); } System.out.println("--------------"); // do...while實現 int j = 1; do { System.out.println("HelloWorld"); j++; }while(j <= 5); } }
4.2 三種循環的區別
- 三種循環的區別
/* for循環和while循環先判斷條件是否成立,然后決定是否執行循環體(先判斷后執行) do...while循環先執行一次循環體,然后判斷條件是否成立,是否繼續執行循環體(先執行后判斷) */
- for循環和while循環的區別
/* 條件控制語句所控制的自增變量,因為歸屬for循環的語法結構中,在for循環結束后,就不能再次被訪問到了 條件控制語句所控制的自增變量,對於while循環來說不歸屬其語法結構中,在while循環結束后,該變量還可以繼續使用 */
- 死循環(無限循環)的三種格式
/* 1. for(;;) {} 2. while(true){} 3. do {} while(true); */
示例
/* 三種循環的區別 */ public class LoopTest { public static void main(String[] args) { //for循環 for(int i = 3; i<3; i++) { System.out.println("我愛Java"); } System.out.println("--------"); //while循環 int j = 3; while(j<3) { System.out.println("我愛Java"); j++; } System.out.println("--------"); //do...while循環 int k = 3; do { System.out.println("我愛Java"); k++; }while(k<3); //for循環 for(int i = 1; i<3; i++) { System.out.println("我愛Java"); } // 此處無法打印出i的值,i僅限上面for循環內不使用,外部無法調用 //System.out.println(i); System.out.println("--------"); //while循環 int j = 1; while(j<3) { System.out.println("我愛Java"); j++; } // 此處打印j的值正常,while循環外,j值可以被調用 System.out.println(j); System.out.println("--------"); */ //死循環 /* for(;;) { System.out.println("for"); } */ /* while(true) { System.out.println("while"); } */ /* do { System.out.println("do...while"); }while(true); */ } }
4.3 跳轉控制語句
/* 跳轉控制語句(break)跳出循環,結束循環 跳轉控制語句(continue),跳過本次循環,繼續下次循環 注意: continue只能在循環中進行使用! */
示例
/* continue:用在循環中,基於條件控制,跳過某次循環體內容的執行,繼續下一次的執行 break:用在循環中,基於條件控制,終止循環體內容的執行,也就是說結束當前的整個循環 */ public class ControlDemo { public static void main(String[] args) { for(int i = 1; i<=5; i++) { if(i%2 == 0) { //continue; break; } System.out.println(i); } } }
4.4 循環嵌套
/* 請反復理解這句話(整個內循環,就是外循環的一個循環體,內部循環體沒有執行完畢,外循環是不會繼續向下執行的)結論: 外循環執行一次,內循環執行一圈 */
示例
/* 循環嵌套: 循環語句中包含循環語句 需求: 在控制台輸出一天的小時和分鍾 分鍾和小時的范圍: 分鍾:0 <= minute < 60 小時:0 <= hour < 24 */ public class ForForDemo { public static void main(String[] args) { /* System.out.println("0時0分"); System.out.println("0時1分"); System.out.println("0時2分"); System.out.println("0時3分"); System.out.println("--------"); System.out.println("1時0分"); System.out.println("1時1分"); System.out.println("1時2分"); System.out.println("1時3分"); System.out.println("--------"); System.out.println("2時0分"); System.out.println("2時1分"); System.out.println("2時2分"); System.out.println("2時3分"); */ //循環改進 /* for(int minute=0; minute<4; minute++) { System.out.println("0時" + minute + "分"); } System.out.println("--------"); for(int minute=0; minute<4; minute++) { System.out.println("1時" + minute + "分"); } System.out.println("--------"); for(int minute=0; minute<4; minute++) { System.out.println("2時" + minute + "分"); } System.out.println("--------"); */ //外循環控制小時的范圍,內循環控制分鍾的范圍 /* for(int hour=0; hour<3; hour++) { for(int minute=0; minute<4; minute++) { System.out.println(hour + "時" + minute + "分"); } System.out.println("--------"); } */ for(int hour=0; hour<24; hour++) { for(int minute=0; minute<60; minute++) { System.out.println(hour + "時" + minute + "分"); } System.out.println("--------"); } } }
0x05 Random函數
5.1 Random產生隨機數
Random類似Scanner,也是Java提供好的API,內部提供了產生隨機數的功能
API后續課程詳細講解,現在可以簡單理解為Java已經寫好的代碼,使用步驟:
1. 導入包
import java.util.Random;
2. 創建對象
Random r = new Random();
3. 產生隨機數
int num = r.nextInt(10); /* 解釋: 10代表的是一個范圍,如果括號寫10,產生的隨機數就是0-9,括號寫20,參數的隨機數則是0-19 */
示例
import java.util.Random; public class randomDemo { public static void main(String[] args) { //創建對象 Random r = new Random(); // 使用循環獲取10個隨機數 for (int i = 0; i < 10; i++) { // 獲取隨機數 int num = r.nextInt(10); System.out.println("number: "+num); } // 需求:獲取一個1-100之間的隨機數 int x = r.nextInt(100) + 1; System.out.println(x); } }
5.2 Random練習-猜數字
需求:程序自動生成一個1-100之間的數字,使用程序實現猜出這個數字是多少;
當猜錯的時候根據不同情況給出相應的提示
- 如果猜的數字比真實數字大,提示你猜的數據大了
- 如果猜的數字比真實數字小,提示你猜的數據小了
- 如果猜的數字與真實數字相等,提示恭喜你猜中了示例代碼:
import java.util.Random; import java.util.Scanner; public class randomTest { public static void main(String[] args) { //要完成猜數字游戲,首先需要有一個要猜的數字,使用隨機數生成該數字,范圍1-100 Random r = new Random(); int num = r.nextInt(100) + 1; while(true) { // 使用程序實現猜數字,每次均要輸入猜測的數字值,需要使用鍵盤錄入實現 Scanner sc = new Scanner(System.in); System.out.println("請輸入你要猜的數字: "); int guessNum = sc.nextInt(); // 比較輸入的數字和系統產生的數據,需要使用分支語句 // 這里使用if...else..if..格式,根據不同情況進行猜測結果顯示 if(guessNum > num) { System.out.println("你猜的數字"+guessNum+"大了。"); } else if(guessNum < num) { System.out.println("你猜的數字"+guessNum+"小了。"); } else { System.out.println(); break; } } } }