1. switch語句
1.1 分支語句switch語句
-
格式
switch (表示式) { case 1: 語句體1; break; case 2: 語句體2; break; ... default: 語句體n+1; break; }
-
執行流程:
- 首先計算出表示式的值
- 其次,和case依次比較,一旦有對應的值,就會執行相應的語句,在執行的過程中,遇到break就會結 束。
- 最後,如果所有的case都和表示式的值不匹配,就會執行default語句體部分,然後程式結束掉。
1.2 switch案例-減肥計劃
- 需求:鍵盤錄入星期數,顯示今天的減肥活動
週一:跑步
週二:游泳
週三:慢走
週四:動感單車
週五:拳擊
週六:爬山
週日:好好吃一頓
- 示例程式碼:
public static void main(String[] args){
// 1. 鍵盤錄入星期資料,使用變數接收
Scanner sc = new Scanner(System.in);
System.out.println("請輸入");
int week = sc.nextInt();
// 2. 多情況判斷,採用switch語句實現
switch(week){
// 3. 在不同的case中,輸出對應的減肥計劃
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;
}
}
}
1.3 switch語句case穿透
- 概述 : 如果switch語句中,case省略了break語句, 就會開始case穿透
- 需求 : 鍵盤錄入星期數,輸出工作日、休息日 (1-5)工作日,(6-7)休息日
- 示例程式碼:
/*
case穿透是如何產生的?
如果switch語句中,case省略了break語句, 就會開始case穿透.
現象:
當開始case穿透,後續的case就不會具有匹配效果,內部的語句都會執行
直到看見break,或者將整體switch語句執行完畢,才會結束。
*/
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("請輸入星期數:");
int week = sc.nextInt();
switch(week){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("您的輸入有誤");
break;
}
}
}
2. for迴圈
2.1 迴圈語句-for迴圈
-
迴圈:
迴圈語句可以在滿足迴圈條件的情況下,反覆執行某一段程式碼,這段被重複執行的程式碼被稱為迴圈體語句,當反覆 執行這個迴圈體時,需要在合適的時候把迴圈判斷條件修改為false,從而結束迴圈,否則迴圈將一直執行下去,形 成死迴圈。
-
for迴圈格式:
for (初始化語句;條件判斷語句;條件控制語句) {
迴圈體語句;
}
-
格式解釋:
- 初始化語句: 用於表示迴圈開啟時的起始狀態,簡單說就是迴圈開始的時候什麼樣
- 條件判斷語句:用於表示迴圈反覆執行的條件,簡單說就是判斷迴圈是否能一直執行下去
- 迴圈體語句: 用於表示迴圈反覆執行的內容,簡單說就是迴圈反覆執行的事情
- 條件控制語句:用於表示迴圈執行中每次變化的內容,簡單說就是控制迴圈是否能執行下去
-
執行流程:
①執行初始化語句
②執行條件判斷語句,看其結果是true還是false
如果是false,迴圈結束
如果是true,繼續執行
③執行迴圈體語句
④執行條件控制語句
⑤回到②繼續
2.2 for迴圈案例-輸出資料1-5和5-1
- 需求:在控制檯輸出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("--------");
//需求:輸出資料5-1
for(int i=5; i>=1; i--) {
System.out.println(i);
}
}
}
2.3 for迴圈案例-求1-5資料和
- 需求:求1-5之間的資料和,並把求和結果在控制檯輸出
- 示例程式碼:
public class ForTest02 {
public static void main(String[] args) {
//求和的最終結果必須儲存起來,需要定義一個變數,用於儲存求和的結果,初始值為0
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 = 6 + 4 = 10;
第五次:sum = sum + i = 10 + 5 = 15;
*/
}
//當迴圈執行完畢時,將最終資料列印出來
System.out.println("1-5之間的資料和是:" + sum);
}
}
- 本題要點:
- 今後遇到的需求中,如果帶有求和二字,請立即聯想到求和變數
- 求和變數的定義位置,必須在迴圈外部,如果在迴圈內部則計算出的資料將是錯誤的
2.4 for迴圈案例-求1-100偶數和
- 需求:求1-100之間的偶數和,並把求和結果在控制檯輸出 }
- 示例程式碼:
public class ForTest03 {
public static void main(String[] args) {
//求和的最終結果必須儲存起來,需要定義一個變數,用於儲存求和的結果,初始值為0
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迴圈案例-水仙花數
- 需求:在控制檯輸出所有的“水仙花數”
- 解釋:什麼是水仙花數?
- 水仙花數,指的是一個三位數,個位、十位、百位的數字立方和等於原數
- 例如
153 3*3*3 + 5*5*5 + 1*1*1 = 153
- 例如
- 水仙花數,指的是一個三位數,個位、十位、百位的數字立方和等於原數
- 思路:
- 獲取所有的三位數,準備進行篩選,最小的三位數為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迴圈案例-每行列印2個水仙花數(統計)
- 需求:在控制檯輸出所有的“水仙花數”,要求每行列印2個
- 示例程式碼:
public class Demo6For {
/*
需求:在控制檯輸出所有的“水仙花數”,要求每行列印2個
System.out.print (列印內容); 列印後不換行
System.out.println(列印內容); 列印後換行
分析:
1. 定義變數count,用於儲存“列印過”的數量,初始值為0
2. 在判定和列印水仙花數的過程中,拼接空格, 但不換行,並在列印後讓count變數+1,記錄列印過的數量
3. 在每一次count變數+1後,判斷是否到達了2的倍數,是的話,換行。
*/
public static void main(String[] args){
// 1. 定義變數count,用於儲存“列印過”的數量,初始值為0
int count = 0;
for(int i = 100; i <= 999; 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){
// 2. 在判定和列印水仙花數的過程中,拼接空格, 但不換行,並在列印後讓count變數+1,記錄列印過的數量
System.out.print(i + " ");
count++;
// 3. 在每一次count變數+1後,判斷是否到達了2的倍數,是的話,換行
if(count % 2 == 0){
System.out.println();
}
}
}
}
}
- 本題要點:
- 今後如果需求帶有統計xxx,請先想到計數器變數
- 計數器變數定義的位置,必須在迴圈外部
3. while迴圈
3.1 迴圈語句-while迴圈
-
while迴圈完整格式:
初始化語句; while (條件判斷語句) { 迴圈體語句; 條件控制語句; }
-
while迴圈執行流程:
①執行初始化語句
②執行條件判斷語句,看其結果是true還是false
如果是false,迴圈結束
如果是true,繼續執行
③執行迴圈體語句
④執行條件控制語句
⑤回到②繼續
-
示例程式碼:
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迴圈案例-珠穆朗瑪峰
- 需求:世界最高山峰是珠穆朗瑪峰(8844.43米=8844430毫米),假如我有一張足夠大的紙,它的厚度是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 + "次");
}
}
4. 迴圈細節
4.1 迴圈語句-dowhile迴圈
-
完整格式:
初始化語句; do { 迴圈體語句; 條件控制語句; }while(條件判斷語句);
-
執行流程:
① 執行初始化語句
② 執行迴圈體語句
③ 執行條件控制語句
④ 執行條件判斷語句,看其結果是true還是false
如果是false,迴圈結束
如果是true,繼續執行
⑤ 回到②繼續
-
示例程式碼:
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迴圈結束後,該變數還可以繼續使用
- 死迴圈(無限迴圈)的三種格式
- for(;?{}
- while(true){}
- do {} while(true);
4.3 死迴圈
-
死迴圈格式
for死迴圈格式 : for(;;){ } while死迴圈格式 : while(true){ } do..while死迴圈格式 : do{ }while(true);
-
死迴圈案例
/*
問題: 死迴圈有應用場景嗎?
例如: 鍵盤錄入一個1-100之間的整數
顧慮: 鍵盤錄入是使用者操作的, 使用者就可能會出現一些誤操作的現象
*/
public static void main(String[] args) {
/*
for(;;){
System.out.println("我停不下來了~");
}
*/
/*
while(true){
System.out.println("我停不下來了~");
}
*/
do{
System.out.println("我停不下來了~");
}while(true);
System.out.println("看看我能被執行嗎?~"); // 無法訪問的語句
}
}
4.4 跳轉控制語句
- 跳轉控制語句(break)
- 跳出迴圈,結束迴圈
- 跳轉控制語句(continue)
- 跳過本次迴圈,繼續下次迴圈
- 注意: continue只能在迴圈中進行使用!
public class Demo1Continue {
/*
continue : 跳過某次迴圈體內容的執行
注意:使用是基於條件控制, 在迴圈內部使用.
需求: 模擬電梯上行的過程 1-24層, 4層不停.
*/
public static void main(String[] args){
for(int i = 1; i <= 24; i++){
if(i == 4){
continue;
}
System.out.println(i + "層到了~");
}
}
}
public class Demo2Break {
/*
break : 終止迴圈體內容的執行
注意:使用是基於條件控制的
break語句只能在迴圈和switch中進行使用.
需求: 模擬20歲工作到80歲, 60歲退休.
*/
public static void main(String[] args){
for(int i = 20; i <= 80; i++){
if(i == 60){
break; // 結束整個迴圈
}
System.out.println(i + "歲正在上班");
}
}
}
import java.util.Scanner;
public class Test {
/*
需求:程式執行後,使用者可多次查詢星期對應的減肥計劃,直到輸入0,程式結束
步驟:
1. 不明確使用者操作幾次, 使用死迴圈包裹業務邏輯
2. 匹配到0的時候,使用break結束迴圈死迴圈
*/
public static void main (String[] args){
lo:while(true){
System.out.println("請輸入您要檢視的星期數:");
System.out.println("(如無需繼續檢視,請輸入0退出程式)");
// 1. 鍵盤錄入星期資料,使用變數接收
Scanner sc = new Scanner(System.in);
int week = sc.nextInt();
// 2. 多情況判斷,採用switch語句實現
switch(week){
// 3. 在不同的case中,輸出對應的減肥計劃
case 0:
System.out.println("感謝您的使用");
break lo;
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;
}
}
}
}
5. Random
5.1 Random產生隨機數(掌握)
-
概述:
- Random類似Scanner,也是Java提供好的API,內部提供了產生隨機數的功能
- API後續課程詳細講解,現在可以簡單理解為Java已經寫好的程式碼
- Random類似Scanner,也是Java提供好的API,內部提供了產生隨機數的功能
-
使用步驟:
-
匯入包
import java.util.Random;
-
建立物件
Random r = new Random();
-
產生隨機數
int num = r.nextInt(10);
解釋: 10代表的是一個範圍,如果括號寫10,產生的隨機數就是0-9,括號寫20,引數的隨機數則是0-19
-
-
示例程式碼:
import java.util.Random;
public class Demo1Random {
/*
Random : 產生隨機數
1. 導包 : import java.util.Random;
導包的動作必須出現在類定義的上面
2. 建立物件 : Random r = new Random();
上面這個格式裡面,r 是變數名,可以變,其他的都不允許變
3. 獲取隨機數 : int number = r.nextInt(10); //獲取資料的範圍:[0,10) 包括0,不包括10
上面這個格式裡面,number是變數名,可以變,數字10可以變。其他的都不允許變
需求: 產生隨機數1-10之間的
*/
public static void main(String[] args){
// 2. 建立物件
Random r = new Random();
for(int i = 1; i <= 10; i++){
// 3. 獲取隨機數
int num = r.nextInt(10) + 1; // 1-10
System.out.println(num);
}
}
}
5.3 Random練習-猜數字(應用)
-
需求:
程式自動生成一個1-100之間的數字,使用程式實現猜出這個數字是多少?
當猜錯的時候根據不同情況給出相應的提示
A. 如果猜的數字比真實數字大,提示你猜的資料大了
B. 如果猜的數字比真實數字小,提示你猜的資料小了
C. 如果猜的數字與真實數字相等,提示恭喜你猜中了
-
示例程式碼:
import java.util.Scanner;
import java.util.Random;
public class Test {
/*
需求:程式自動生成一個1-100之間的數字,使用程式實現猜出這個數字是多少?
當猜錯的時候根據不同情況給出相應的提示
如果猜的數字比真實數字大,提示你猜的資料大了
如果猜的數字比真實數字小,提示你猜的資料小了
如果猜的數字與真實數字相等,提示恭喜你猜中了
1. 準備Random和Scanner物件, 分別用於產生隨機數和鍵盤錄入
2. 使用Random產生一個1-100之間的數, 作為要猜的數
3. 鍵盤錄入使用者猜的的資料
4. 使用錄入的資料(使用者猜的資料)和隨機數(要猜的資料)進行比較, 並給出提示
5. 以上內容需要多次進行, 但無法預估使用者輸入幾次可以猜測正確, 使用while(true)死迴圈包裹
6. 猜對之後, break結束.
*/
public static void main(String[] args){
// 1. 準備Random和Scanner物件, 分別用於產生隨機數和鍵盤錄入
Random r = new Random();
Scanner sc = new Scanner(System.in);
// 2. 使用Random產生一個1-100之間的數, 作為要猜的數
int randomNum = r.nextInt(100) + 1;
// 5. 以上內容需要多次進行, 但無法預估使用者輸入幾次可以猜測正確, 使用while(true)死迴圈包裹
while(true){
// 3. 鍵盤錄入使用者猜的的資料
System.out.println("請輸入您猜的資料:");
int num = sc.nextInt();
// 4. 使用錄入的資料(使用者猜的資料)和隨機數(要猜的資料)進行比較, 並給出提示
if(num > randomNum){
System.out.println("猜大了");
}else if(num < randomNum){
System.out.println("猜小了");
}else{
// 6. 猜對之後, break結束.
System.out.println("恭喜,猜中了");
break;
}
}
System.out.println("感謝您的使用");
}
}