流程控制語句
順序結構
//範例:
public class Test {
public static void main(String[] args) {
System.out.println("努力做主人喜歡的事");
System.out.println("大小姐駕到!通通閃開!");
System.out.println("凌冬已至,故鄉的梅花開了嗎");
System.out.println("心懷不懼,方能翱翔於天際");
}
}
順序結構語句是Java程式預設的執行流程,按照程式碼的先後順序,從上到下依次執行
分支結構
If語句
If語句在程式中是用來判斷的
第一種格式(單條件判斷)
格式:
if (關係表示式) {
語句體;
}
舉例:
if (酒量 > 2) {
System.out.println("小夥子,不錯!");
}
執行流程:
- 首先計算關係表示式的值
- 如果關係表示式的值為true就執行語句體
- 如果關係表示式的值為false就不執行語句體
- 繼續執行後面的其他語句
練習--老丈人選女婿
需求:鍵盤錄入女婿酒量,如果大於2斤,老丈人給出回應,反之不回應
import java.util.Scanner;
public class IfDemo1 {
public static void main(String[] args) {
//需求:鍵盤錄入女婿酒量,如果大於2斤,老丈人給出回應,反之不回應
//分析:
//1.鍵盤錄入女婿的酒量
Scanner sc = new Scanner(System.in);
System.out.println("請輸入女婿的酒量");
int wine = sc.nextInt();
//2.對酒量進行判斷
if (wine > 2) {
System.out.println("小夥子,不錯呦!!");
}
}
}
if的注意點:
- 大括號的開頭可以另起一行書寫,但是建議寫在第一行的末尾
- 在語句體中,如果只有一句程式碼,大括號可以省略不寫。(個人建議,大括號還是不要省略的)
- 如果對一個布林型別的變數進行判斷,建議不要用號(因為可能會把寫成=),直接把變數寫在小括號即可
練習--考試獎勵
小紅:如果你這次考試全班第一,我就做你女朋友。
public class Test1 {
public static void main(String[] args) {
//小紅:如果你這次考試全班第一,我就做你女朋友。
//分析:
//1.定義變數記錄小明的名次
int ranking = 1;
//2.對小明的名次進行判斷
if(ranking == 1){
System.out.println("小紅成為了小明的女朋友");
}
}
}
練習--自動駕駛
需求:紅燈停,綠燈行,黃燈請你等一等
public class Test2 {
public static void main(String[] args) {
//需求:紅燈停,綠燈行,黃燈請你等一等
//1.定義三個變數表示燈的狀態
//true 亮 false 滅
boolean isLightGreen = false;
boolean isLightYellow = false;
boolean isLightRed = true;
//2.判斷
//紅燈亮,就停止
//黃燈亮,就減速
//綠燈亮,就行駛
if(isLightGreen){
System.out.println("Go!");
}
if(isLightYellow){
System.out.println("slow!");
}
if(isLightRed){
System.out.println("stop!");
}
}
}
第二種格式(雙條件判斷)
格式:
if (關係表示式) {
語句體1;
} else {
語句體2;
}
執行流程:
- 首先計算關係表示式的值
- 如果關係表示式的值為true就執行語句體1
- 如果關係表示式的值為false就執行語句體2
- 繼續執行後面的其他語句
練習--吃飯
需求:
鍵盤錄入一個整數,表示身上的錢。
如果大於等於100塊,就吃網紅餐廳。
否則,就吃經濟實惠的沙縣小吃。
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
/*需求:鍵盤錄入一個整數,表示身上的錢。
如果大於等於100塊,就吃網紅餐廳。
否則,就吃經濟實惠的沙縣小吃。*/
//分析:
//1.鍵盤錄入一個整數,表示身上的錢。
Scanner sc = new Scanner(System.in);
System.out.println("請錄入身上的錢");
int money = sc.nextInt();
//2.對錢進行判斷(二選一)
if(money >= 100){
System.out.println("吃網紅餐廳");
}else{
System.out.println("吃經濟實惠的沙縣小吃");
}
}
}
練習--商品付款
需求:
假設,使用者在超市實際購買,商品總價為:600元。
鍵盤錄入一個整數表示使用者實際支付的錢。
如果付款大於等於600,表示付款成功。否則付款失敗。
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
/*需求:
假設,使用者在超市實際購買,商品總價為:600元。
鍵盤錄入一個整數表示使用者實際支付的錢。
如果付款大於等於600,表示付款成功。否則付款失敗。
*/
//分析:
//1.鍵盤錄入一個整數表示使用者實際支付的錢。
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個整數表示實際支付的錢");
int money = sc.nextInt();
//2.判斷
if(money >= 600){
System.out.println("支付成功");
}else{
System.out.println("支付失敗");
}
}
}
練習--影院選座
需求:
假設某影院收買了100張票,跑的序號為1~100。
其中奇數票號坐左側,偶數票號坐右側。
鍵盤錄入一個整數表示電影票的票號。
根據不同情況,給出不同的提示:
如果票號為奇數,那麼列印坐左邊
如果票號為偶數,那麼列印坐右邊。
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
/*假設某影院收買了100張票,跑的序號為1~100。
其中奇數票號坐左側,偶數票號坐右側。
鍵盤錄入一個整數表示電影票的票號。
根據不同情況,給出不同的提示:
如果票號為奇數,那麼列印坐左邊
如果票號為偶數,那麼列印坐右邊。
*/
//分析:
//1.鍵盤錄入一個整數表示電影票的票號。
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個票號");
int ticket = sc.nextInt();
//只有當ticket在0~100之間,才是真是有效的票
//if的巢狀
if(ticket >= 0 && ticket <= 100){
//2.判斷票號是奇數還是偶數
if (ticket % 2 == 1) {
System.out.println("坐左邊");
} else {
System.out.println("坐右邊");
}
}
}
}
第三種格式(多條件判斷)
格式:
if (關係表示式1) {
語句體1;
} else if (關係表示式2) {
語句體2;
}
...
else {
語句體 n + 1;
}
執行流程:
- 首先計算關係表示式1的值
- 如果為true就執行語句體1;如果為false就計算關係表示式2的值
- 如果為true就執行語句體2;如果為false就計算關係表示式3的值
- ......
- 如果關係表示式結果都為false,就執行語句體n+1。
練習--小明的禮物
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
/*
根據不同的分數送不同的禮物。
95~100分,送一輛腳踏車
90~94分,遊樂場玩一天
80~89分,送一個變形金剛
80分一下,揍一頓。
*/
//分析:
//1.鍵盤錄入小明的成績
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個整數表示小明的成績");
int score = sc.nextInt();
//2.根據不同的成績,給出不同的獎勵
if(score >= 0 && score <= 100) {
if (score >= 95 && score <= 100) {
System.out.println("送一輛腳踏車");
} else if (score >= 90 && score <= 94) {
System.out.println("遊樂場玩一天");
} else if (score >= 80 && score <= 89) {
System.out.println("送一個變形金剛");
} else {
System.out.println("揍一頓");
}
}else {
System.out.println("當前錄入的成績不合法");
}
}
}
練習--商品的價格
需求:
商場都會有VIP的會員制,根據不同的會員會有不同的折扣。
假設商品總價為1000。
鍵盤錄入會員級別,並計算出實際支付的錢。
會員1級:打9折。
會員2級:打8折。
會員3級:打7折。
非會員:不打折。
import java.util.Scanner;
public class Test7 {
public static void main(String[] args) {
/*
需求:
商場都會有VIP的會員制,根據不同的會員會有不同的折扣。
假設商品總價為1000。
鍵盤錄入會員級別,並計算出實際支付的錢。
會員1級:打9折。
會員2級:打8折。
會員3級:打7折。
非會員:不打折。
*/
//分析:
//1.定義變數記錄總價
int price = 1000;
//2.鍵盤錄入會員的級別
Scanner sc = new Scanner(System.in);
System.out.println("請錄入會員的級別");
int vip = sc.nextInt();
//3.根據級別來計算實際要支付的錢
if(vip == 1){
System.out.println("實際支付的錢為" + (price * 0.9));
}else if(vip == 2){
System.out.println("實際支付的錢為" + (price * 0.8));
}else if(vip == 3){
System.out.println("實際支付的錢為" + (price * 0.7));
}else{
System.out.println("實際支付的錢為" + price);
}
}
}
switch語句
switch
格式:
switch(表示式) {
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
...
default:
語句體n+1;
break;
}
執行流程:
- 首先計算表示式的值。
- 依次和case後面的值進行比較,如果有對應的值,就會執行相應的語句,在執行的過程中,遇到break就會結束。
- 如果所有的case後面的值和表示式的值都不匹配,就會執行default裡面的語句體,然後結束整個switch語句。
格式說明:
- 表示式: (將要匹配的值)取值為byte、short. int、 char。JDK5以後可以是列舉,JDK7以後可以是String。
- case: 後面跟的是要和表示式進行比較的值(被匹配的值)。
- break: 表示中斷,結束的意思,用來結束switch語句。
- default: 表示所有情況都不匹配的時候,就執行該處的內容,和if語句的else相似。
- case後面的值只能是字面量,不能是變數
- case給出的值不允許重複
//範例:
public class SwitchDemo1 {
public static void main(String[] args) {
//蘭州拉麵、武漢熱乾麵、北京炸醬麵、陝西油潑面
//1.定義變數記錄我心裡想吃的面
String noodles = "蘭州拉麵";
//2.拿著這個面利用switch跟四種麵條匹配
switch (noodles){
case "蘭州拉麵":
System.out.println("吃蘭州拉麵");
break;
case "武漢熱乾麵":
System.out.println("吃武漢熱乾麵");
break;
case "北京炸醬麵":
System.out.println("吃北京炸醬麵");
break;
case "陝西油潑面":
System.out.println("吃陝西油潑面");
break;
}
}
}
練習--運動計劃
需求:鍵盤錄入星期數,顯示今天的減肥活動。
週一:跑步
週二:游泳
週三:慢走
週四:動感單車
週五:拳擊
週六:爬山
週日:好好吃一頓
import java.util.Scanner;
public class Test8 {
public static void main(String[] args) {
/*需求:鍵盤錄入星期數,顯示今天的減肥活動。
週一:跑步
週二:游泳
週三:慢走
週四:動感單車
週五:拳擊
週六:爬山
週日:好好吃一頓
*/
//分析:
//1.鍵盤錄入星期數
Scanner sc = new Scanner(System.in);
System.out.println("情錄入星期");
int week = sc.nextInt();
//2.利用switch語句對星期進行匹配
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;
}
}
}
switch其他知識點
-
default的位置和省略
- 位置:default不一定是寫在最下面的,可以寫在任意位置。
- 省略:default可以省略,語法不會有問題,但是不建議省略。
-
case穿透
-
就是語句體中沒有寫break導致的。
-
執行流程:
首先還是會拿著小括號中表示式的值跟下面每一個case進行匹配。
如果匹配上了,就會執行對應的語句體,如果此時發現了break,那麼結束整個switch語句。
如果沒有發現break,那麼程式會繼續執行下一個case的語句體,一直遇到break或者右大括號為止。
-
使用場景:
如果多個case的語句體重複了,那麼我們考慮利用case穿透去簡化程式碼。
-
-
switch新特性
-
switch(表示式) { case 值1 -> { 語句體1; } case 值2 -> { 語句體2; } ... default -> { 語句體n+1; } }
(大括號內如果只有一行程式碼,可以去掉大括號。)
-
-
switch和if第三種格式各自的使用場景
- if的第三種格式:一般用於對範圍的判斷
- switch:把有限個資料一列舉出來,讓我們任選其一
練習--休息日和工作日
需求:鍵盤錄入星期數,輸出工作日、休息日。
(1-5)工作日,(6-7)休息日。
import java.util.Scanner;
public class Test9 {
public static void main(String[] args) {
/*需求:鍵盤錄入星期數,輸出工作日、休息日。
(1-5)工作日,(6-7)休息日。
*/
//分析:
//1.鍵盤錄入星期數
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個整數表示星期");
int week = sc.nextInt();
//2.利用switch語句來進行選擇
switch (week){
case 1,2,3,4,5 -> System.out.println("工作日");
case 6,7 -> System.out.println("休息日");
default -> System.out.println("沒有這個星期");
}
}
}
練習--使用者選擇
在實際開發中,如果我們需要在多種情況下選擇其中一個,就可以使用switch語句。
當我們撥打了某些服務電話時,一般都會有按鍵選擇。
假設現在我們撥打了一一個機票預定電話。
電話中語音提示:
1機票查詢
2機票預訂
3機票改簽
4退出服務
其他按鍵也是退出服務。請使用switch模擬該業務邏輯。
import java.util.Scanner;
public class Test10 {
public static void main(String[] args) {
/*在實際開發中,如果我們需要在多種情況下選擇其中一個,就可以使用switch語句。
當我們撥打了某些服務電話時,一般都會有按鍵選擇。
假設現在我們撥打了一一個機票預定電話。
電話中語音提示:
1機票查詢
2機票預訂
3機票改簽
4退出服務
其他按鍵也是退出服務。請使用switch模擬該業務邏輯。
*/
//分析:
//1.鍵盤錄入一個整數表示我們的選擇
Scanner sc = new Scanner(System.in);
System.out.println("請輸入您的選擇");
int choose = sc.nextInt();
//2.根據選擇執行不同的程式碼
switch (choose){
case 1 -> System.out.println("機票查詢");
case 2 -> System.out.println("機票預訂");
case 3 -> System.out.println("機票改簽");
default -> System.out.println("退出服務");
}
}
}
迴圈結構
迴圈的分類
- for
- while
- do...while
for迴圈
格式:
for (初始化語句;條件判斷語句;條件控制語句){
迴圈體語句;
}
範例:
for (int i == 1;i <= 10;i++){
System.out.println("HelloWorld")
}
執行流程:
① 執行初始化語句
② 執行條件判斷語句,看其結果是true還是false
- 如果是false,迴圈結束
- 如果是true,執行迴圈體語句
③ 執行條件控制語句
④ 回到②繼續執行條件判斷語句
練習
基礎案例1:輸出HelloWorld
需求:列印5次HelloWorld
public class ForDemo1 {
public static void main(String[] args) {
//1.需求:列印5次HelloWorld
//分析:
//i 1 ~ 5
for( int i = 1;i <= 5;i++){
System.out.println("HelloWoeld");
}
}
}
基礎練習2:輸出數字/基礎練習3:倒著輸出數字
需求:列印15/列印51
public class Test11 {
public static void main(String[] args) {
//需求1:列印1~5
//分析:
//開始條件:1
//結束條件:5
for(int i = 1;i <= 5;i++){
System.out.println(i);
}
//需求2:列印5~1
//分析:
//開始條件:5
//結束條件:1
for (int i = 5; i >= 1; i--) {
System.out.println(i);
}
}
}
案例4:斷線重連
在實際開發中,需要重複執行的程式碼,會選擇迴圈實現。
比如:玩遊戲的時候,如果網不好那麼會經常斷線重連。那麼斷線重連這個業務邏輯就需要重複執行。
假設現在公司要求,斷線重連的業務邏輯最多隻寫5次。
請用程式碼實現。
備註:斷線重連的業務邏輯可以用輸出語句替代。
public class Test12 {
public static void main(String[] args) {
/*在實際開發中,需要重複執行的程式碼,會選擇迴圈實現。
比如:玩遊戲的時候,如果網不好那麼會經常斷線重連。那麼斷線重連這個業務邏輯就需要重複執行。
假設現在公司要求,斷線重連的業務邏輯最多隻寫5次。
請用程式碼實現。
備註:斷線重連的業務邏輯可以用輸出語句替代。
*/
//分析:
//迴圈的次數5次
//開始條件:1
//結束條件:5
for(int i = 1;i <= 5;i++){
System.out.println("第" + i + "次執行斷線重連的業務邏輯");
}
}
}
案例5:求和
需求:在實際開發中,如果要獲取一個範圍中的每一個資料時,也會用到迴圈。
比如:求1-5之間的和
public class Test13 {
public static void main(String[] args) {
/*需求:在實際開發中,如果要獲取一個範圍中的每一個資料時,也會用到迴圈。
比如:求1-5之間的和
*/
//分析:
//1.迴圈1~5得到裡面的每一個數字
//開始條件:1
//結束條件:5
//用來進行累加
int sum = 0;
for(int i = 1;i <= 5;i++){
sum = sum + i;//或sum +=i;
}
System.out.println(sum);//當迴圈結束之後,表示已經把1~5累加到變數sum當中
//擴充套件小點:
//1.求和的變數不能定義在迴圈的裡面,因為變數只在所屬的大括號裡有效
//2.如果我們把變數定義在迴圈的裡面,那麼當前變數只能在本次迴圈中有效。
//當本次迴圈結束之後,變數就會在記憶體中消失。
//第二次迴圈開始的時候,又會重新定義一個新的變數。
//結論:如果以後我們要寫累加求和的變數。可以吧變數定義在迴圈的外面。
}
}
案例6:求和
需求:在實際開發中,如果要獲取一個範圍中的每-個資料時,會用到迴圈。
但是此時,大多情況下,不會獲取所有的資料,而是獲取其中符合要求的資料。
此時就需要迴圈和其他語句結合使用了。
比如:求1-100之間的偶數和
public class Test14 {
public static void main(String[] args) {
/*需求:在實際開發中,如果要獲取一個範圍中的每-個資料時,會用到迴圈。
但是此時,大多情況下,不會獲取所有的資料,而是獲取其中符合要求的資料。
此時就需要迴圈和其他語句結合使用了。
比如:求1-100之間的偶數和
*/
//分析:
//1.獲取1~100之間的每個數
int sum = 0;
for (int i = 0; i <= 100; i++) {
//2.累加求和(先判斷,再求和)
if(i % 2 == 0){
sum += i;
}
}
//列印sum
System.out.println(sum);
}
}
案例7:統計滿足條件的數字
需求:鍵盤錄入兩個數字,表示一個範圍。
統計這個範圍中。
既能被3整除,又能被5整除數字有多少個?
import java.util.Scanner;
public class Test15 {
public static void main(String[] args) {
/*需求:鍵盤錄入兩個數字,表示一個範圍。
統計這個範圍中。
既能被3整除,又能被5整除數字有多少個?
*/
//分析:
//1.鍵盤錄入兩個數字
Scanner sc = new Scanner(System.in);
System.out.println("請錄入一個數字表示範圍的開始");
int statr = sc.nextInt();
System.out.println("請錄入一個數字表示範圍的結束");
int end = sc.nextInt();
//統計變數
//簡單理解:統計符合要求的數字的個數
int count = 0;
//2.利用迴圈獲取這個範圍中的每一個數字
//開始條件:start
//結束條件:end
for (int i = statr; i <= end; i++) {
//3.對每一個數字進行判斷,統計有多少歌滿足要求的數字
if (i % 3 == 0 && i % 5 == 0){
count++;
}
}
System.out.println(count);
}
}
while迴圈
格式:
初始化語句;
while(條件判斷語句){
迴圈體語句;
條件控制語句;
}
- 初始化語句只執行依次
- 判斷語句為true,迴圈繼續
- 判斷語句為false,迴圈結束
練習
需求:利用while迴圈列印1~100
public class WhileDemo1 {
public static void main(String[] args) {
//需求:利用while迴圈列印1~100
//分析:
//開始條件:1
//結束條件:100
int i = 1;
while(i <= 100){
System.out.println(i);
i++;
}
}
}
for和while的對比
➢相同點:執行規則都是一樣的
for和while的區別:
➢for迴圈中, 控制迴圈的變數,因為歸屬for迴圈的語法結構中,在for迴圈結束後,就不能再次被訪問到了
➢while迴圈中,控制迴圈的變數,對於while迴圈來說不歸屬其語法結構中,在while迴圈結束後,該變數還可以繼續使用
for:
for(int i = 0;i < 4;i++){
System.out.println(i);
}
while:
int i = 0;
while(i < 4){
i++;
}
System.out.println(i);
for和while的區別:
➢for迴圈中:知道迴圈次數或者迴圈的範圍
➢while迴圈:不知道迴圈的次數和範圍,只知道迴圈的結束條件。
練習
案例1:列印摺紙的次數
需求:世界最高山峰是珠穆朗瑪峰(8844.43米=8844430毫米),假如我有一張足夠大的紙,它的厚度是0.1毫米。
請問,我摺疊多少次,可以折成珠穆朗瑪峰的高度?
public class Test16 {
public static void main(String[] args) {
/*需求:世界最高山峰是珠穆朗瑪峰(8844.43米=8844430毫米),假如我有一張足夠大的紙,它的厚度是0.1毫米。
請問,我摺疊多少次,可以折成珠穆朗瑪峰的高度?
*/
//分析:每一次摺疊紙張的厚度都是原先的兩倍
//1.定義一個變數用來記錄山峰的高度
double height = 8844430;
//2.定義一個變數用來記錄紙張的初始厚度
double paper = 0.1;
//3.定義一個變數用來統計次數
int count = 0;
//4.迴圈摺疊紙張,只要紙張的厚度小於等於山峰的高度,那麼迴圈就繼續
//每摺疊一次,統計次數就要++
while(paper <= height){
paper *= 2;
count++;
}
System.out.println(count);
}
}
案例2:迴文數
需求:給你一個整數X。如果x是一個迴文整數,列印true,否則,返回false。
解釋:迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
(例如,121是迴文,而123不是。)
import java.util.Scanner;
public class Test17 {
public static void main(String[] args) {
/*需求:給你一個整數X。如果x是一個迴文整數,列印true,否則,返回false。
解釋:迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
(例如,121是迴文,而123不是。)
*/
//鍵盤錄入
System.out.println("請輸入一個整數");
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int temp = x;
int num = 0;
while(x != 0){//當x不為0時,結束迴圈
int ge = x % 10;//取個位數
x = x / 10;//x由n位數變為n-1位數,用於進入下一個迴圈
num = num * 10 + ge;//求倒序後的數
}
System.out.println(temp == num);//X==0,temp==num
}
}
案例3:求商和餘數
需求:給定兩個整數,被除數和除數(都是正數,且不超過int的範圍 )。
將兩數相除,要求不使用乘法、除法和%運算子。
得到商和餘數。
import java.util.Scanner;
public class Test18 {
public static void main(String[] args) {
/*需求:給定兩個整數,被除數和除數(都是正數,且不超過int的範圍 )。
將兩數相除,要求不使用乘法、除法和%運算子。
得到商和餘數。
*/
//分析:
//被除數 / 除數 = 商 ... 餘數
//1.鍵盤錄入
System.out.println("請輸入被除數");
Scanner sc = new Scanner(System.in);
int dividend = sc.nextInt();
System.out.println("請輸入除數");
int divisor = sc.nextInt();
//2.定義一個變數用來統計相減了多殺次
int count = 0;
//3.迴圈 while
//在迴圈中,不斷的用被除數 - 除數
//只要被除數是大於等於除數的,那麼就一直迴圈
while(dividend >= divisor){
dividend -= divisor;
count++;//減一次,統計變數自增一次
}
//當迴圈結束之後count變數記錄的就是商
System.out.println("商為:" + count);
//當迴圈結束之後dividend變數記錄的就是餘數
System.out.println("餘數為:" + dividend);
}
}
do...while迴圈
格式:
初始化語句;
do{
迴圈體語句;
條件控制語句;
}while(條件判斷語句);
特點:
先執行後判斷