1. 程式人生 > 實用技巧 >Java基礎:第二章、流程控制

Java基礎:第二章、流程控制

第二章、Java流程控制

1、使用者互動Scanner物件

  • 之前我們學的基本語法中我們並沒有實現程式與人的互動,但是Java給我們提供了這樣一個工具類,我們可以獲取使用者的輸入。java.util.Scanner是Java5的新特性,我們可以通過Scanner類來獲取使用者的輸入

  • 基本語法

    Scanner s = new Scanner(System.in);
    
  • 通過Scanner類的next()與nextLine()方法獲取輸入的字元,在讀取前我們一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的資料

next與nextLine的區別

  • next():

    • 1、一定要讀取到有效字元後才可以結束輸入
    • 2、對輸入有效字元之前遇到的空白,next()方法會自動將其去掉
    • 3、只有輸入有效字元後才將其後面輸入的空白作為分隔符或者結束符
    • 4、next()不能得到帶有空格的字串
    package whysff.com.cnblogs.scanner;
    
    import java.util.Scanner;
    
    /**
     * 掃描器01
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.23 下午 3:58
     */
    public class Demo01 {
        public static void main(String[] args){
            //建立一個掃描器,用於接收鍵盤資料
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("使用next方法接收");
    
            //判斷使用者有沒有輸入字串
            if(scanner.hasNext()){
                //使用next方法接收
                String str = scanner.next();//程式會等待使用者輸入
                System.out.println("輸入的內容為:" + str);
            }
            //凡是屬於IO流的類使用完畢,及時關閉,否則會佔用記憶體資源
            scanner.close();
        }
    }
    
    
  • nextLine():

    • 1、以Enter為結束符,也就是說nextLine()方法返回的是輸入回車之前的所有字元
    • 2、可以獲得空白
    package whysff.com.cnblogs.scanner;
    
    import java.util.Scanner;
    
    /**
     * nextLine
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.23 下午 4:07
     */
    public class Demo02 {
        public static void main(String[] args){
            //新建一個掃描器,用來接收建安輸入
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("=====測試使用nextLine方法接收=====");
    
            if(scanner.hasNextLine()){
                //使用nextLine方法接收
                String str = scanner.nextLine();
                System.out.println("輸入的內容為:" + str);
            }
            scanner.close();
        }
    }
    
    

Scanner進階:使用這個類對一串陣列求和、求平均值

package whysff.com.cnblogs.scanner;

import java.util.Scanner;

/**
 * 小案例:求和求平均值
 *
 * @author xLiu
 * @version 1.0
 * @create 2020.07.23 下午 5:02
 */
public class Demo05 {
    public static void main(String[] args){
        // 輸入多個數字,並求和、平均數,每輸入一個數字用回車確認,通過輸入非數字來結束輸入並輸出最後結果

        // 先建立一個掃描器,接收鍵盤輸入
        Scanner scanner = new Scanner(System.in);
        // 視窗提示請連續的輸入幾個數字,每個數字使用回車確認
        System.out.println("=====求和、求平均值=====");
        System.out.println("請連續的輸入幾個數字,並使用回車確認:");
        // 定義和
        double sum = 0.0;
        // 定義輸入數字的個數
        int m = 0;
        // while迴圈
        while(scanner.hasNextDouble()){
            //接收鍵盤的輸入
            double x = scanner.nextDouble();
            //個數+1
            m = m + 1;
            //求和
            sum = sum + x;
            //輸出第幾個數,目前的和是多少
            System.out.println("接收到的第" + m + "個數是" + x + ",目前的sum是:" + sum);
        }
        //輸出結果
        System.out.println("一共接收到" + m + "個數字");
        System.out.println("這些數字的和為:" + sum);
        System.out.println("這些數字的平均值為:" + sum/m);
        //關閉掃描器
        scanner.close();
    }
}

2、順序結構

  • JAVA的基本結構就是順序結構,除非特別指明,否則就按照順序一句一句執行

  • 順序結構是最簡單的演算法結構

  • 語句與語句之間,框與框之間都是按從上到下的順序進行的,它是由若干個依次執行的處理步驟組成的,它是任何一個演算法都離不開的一種基本演算法結構

3、選擇結構

if單選擇結構

  • 很多時候需要去判斷一個東西是否可行,然後我們才去執行,這樣一個過程用if語句表示

  • 語法

    if(布林表示式){
      //如果布林表示式為true將執行的語句
    }
    

    package whysff.com.cnblogs.struct;
    
    import java.util.Scanner;
    
    /**
     * if單選擇
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.23 下午 10:21
     */
    public class IfDemo01 {
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            System.out.println("請輸入內容:");
            String s = scanner.nextLine();
    
            // equals:判斷字串是否相等
            if(s.equals("Hello")){
                System.out.println(s);
            }
            System.out.println("End");
    
            scanner.close();
        }
    }
    
    

if雙選擇結構

  • 現在有一個需求,公司要收購一個軟體,成功了就給人支付100W,失敗了就自己找人開發。這樣的需求用一個if就搞不定了,我們需要有兩個判斷,需要一個雙選擇結構,所以就有了if-else結構

  • 語法:

    if(布林表示式){
      //如果布林表示式的值為true執行的語句
    }else{
      //如果布林表示式的值為false執行的語句
    }
    

    package whysff.com.cnblogs.struct;
    
    import java.util.Scanner;
    
    /**
     * if雙選擇
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.23 下午 10:31
     */
    public class IfDemo02 {
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            System.out.println("請輸入你選擇的方式:0=收購,1=開發");
            String i = scanner.nextLine();
            if(i == "0"){
                System.out.println("我們選擇收購公司!");
            }else{
                System.out.println("我們選擇自主研發!");
            }
            scanner.close();
        }
    }
    
    

if多選擇結構

  • 現實情況中,還可能存在ABCD多級判斷,比如成績的優良中差,所以我們也要引入一種多選擇機構處理這類問題

  • 語法:

    if(布林表示式1){
      //如果布林表示式1的值為true執行的語句
    }else if(布林表示式2){
      //如果布林表示式2的值為true執行的語句
    }else if(布林表示式3){
      //如果布林表示式3的值為true執行的語句
    }else{
    	//如果以上布林表示式的值都不為true執行的語句
    }
    

    package whysff.com.cnblogs.struct;
    
    import java.util.Scanner;
    
    /**
     * if多級判斷
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.23 下午 11:39
     */
    public class IfDemo03 {
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            System.out.println("請輸入你的成績(0-100):");
            double score = scanner.nextDouble();
    
            /*
                if 語句中至多隻有一個else語句,else 語句在所有的 else if 語句之後
                if 語句可以有若干個 else if 語句,它必須在 else 語句前
                一旦其中一個 else if 語句檢測為true ,其他的 else if 語句 else 都會跳過
             */
            if(score >= 0 && score <= 100){
                if(score >= 90 && score <= 100){
                    System.out.println("你的成績" + score + "是優秀!");
                }else if(score >= 70 && score < 90){
                    System.out.println("你的成績" + score + "是良好!");
                }else if(score >= 60 && score < 70){
                    System.out.println("你的成績" + score + "是中等!");
                }else{
                    System.out.println("你的成績" + score + "是差!");
                }
            }else{
                System.out.println("你的輸入不合法,請重新輸入");
            }
    
            scanner.close();
        }
    }
    
    

switch多選擇結構

  • 多選擇機構還有一個實現方法就是switch case語句。

  • switch case 語句判斷一個變數與一些列值中某個值是否相等,每個值稱為一個分支。

  • switch語句中的變數型別可以是:

    • byte、short、int、char
    • 從Java SE 7 開始,switch支援字串String了
    • 同時case標籤必須為字串常量或者字面量
  • 語法:

    switch(expression){
      	case value : 
        		//語句
        		break;
     	  case value : 
        		//語句
       	  	break;
        //中間可以有任意數量的case語句
      	default :
        		//語句
    }
    

檢視class檔案!!!

​ 眾所周知,java程式是需要編譯器編譯為class檔案,然後虛擬機器執行class檔案。有編譯那麼也一定有反編譯。一個合格的程式設計師一定要有看原始碼的思想,為什麼JDK7前Switch不支援string型別,但是JDK7就支援了嗎?這不奇怪嗎?它是如何實現的?再結合前面提到的,字元的本質其實還是數字能不能有點思路?我們帶著這樣一個疑惑去嘗試開啟class檔案看一看。

​ 但是class直接通過記事本開啟是一堆亂碼,這裡我就藉助IDEA進行反編譯:

​ 開啟Project Structure——>開啟專案的輸出目錄——>找到某個檔案的class檔案——>在Project選中某個java檔案——>Show in Explorer——>將class檔案拖動至對應的java檔案所在位置。

​ 重新整理一下IDEA中的專案,就會發現多出來一個.class檔案,這就是反編譯之後的檔案。

4、迴圈結構

while迴圈

  • while是最基本的迴圈,它的機構是:

    while(布林表示式){
    	// 迴圈內容
    }
    
  • 只要布林表示式為true,迴圈就會一直執行下去

  • 大多數情況是會讓迴圈停止,所以我們需要一個讓表示式失效的方式來結束迴圈

  • 少部分情況需要迴圈一直執行,比如伺服器的請求響應監聽等

  • 迴圈條件一直為true就會造成無線迴圈【死迴圈】,這點要避免

    package whysff.com.cnblogs.struct;
    
    /**
     * 求和1-100
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 3:42
     */
    public class WhileDemo03 {
        public static void main(String[] args){
            // 數學王子高斯在九歲的時候解答的問題
    
            // 定義一個和
            int sum = 0;
            //記錄迴圈的次數
            int m = 1;
            //迴圈條件是
            while(m <=100 ){
                sum = sum + m;
                m++;
            }
            System.out.println("從1加到100的結果為:" + sum);
        }
    }
    
    

do...while迴圈

  • 對於while語句而言,如果不滿足條件,則不能進入迴圈。但現實中也有這樣一種情況:即使不滿足情況也需要執行一次。

  • do...while迴圈和while迴圈相似,不同的是,do...while迴圈至少會執行一次

    do{
      //code
    }while(布林表示式);
    
  • While和do-While的區別:

    • while先判斷後執行;do-while先執行後判斷
    • while至少執行0次;do-while至少執行1次
    package whysff.com.cnblogs.struct;
    
    /**
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 3:58
     */
    public class DoWhileDemo02 {
    
        public static void main(String[] args){
            int a = 0;
            while(a<0){
                System.out.println(a);
            }
            System.out.println("=====================");
            do{
                System.out.println(a);
            }while(a<0);
        }
    }
    
    

for迴圈(重點!!!)

  • 雖然所有迴圈結構都可以用while或者do-while表示,但Java提供了另一種語句——for迴圈,使迴圈結構變的更加簡單

  • for迴圈語句是支援迭代的一種通用結構,是最有效、最靈活的迴圈結構

  • for迴圈執行的次數是在執行前就確定的。語法格式如下:

    for(初始化; 布林表示式; 更新){
    		//code
    }
    
    package whysff.com.cnblogs.struct.for_demo;
    
    /**
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 5:12
     */
    public class Demo01 {
    
        public static void main(String[] args){
            int a = 1;// 初始化條件
    
            while(a <= 100){// 條件判斷
                System.out.println(a);// 迴圈體
                a += 2;//迭代     // a = a + 2;
            }
            System.out.println("While迴圈結束!");
    
            // 初始化    條件判斷   迭代
            for(int i=1; i<=100; i++){
                System.out.println(i);
            }
            System.out.println("For迴圈結束");
    
            /*
                關於for迴圈的注意點!
    
                最先執行初始化步驟,可以宣告一種型別,但可初始化一個或多個迴圈控制變數,也可以是空語句
                然後,判斷布林表示式的值:如果為true,迴圈體被執行,如果為false,迴圈終止,開始執行迴圈體後面的語句
                執行一次迴圈後,更新迴圈控制變數(迭代)
                再次檢測布林表示式。迴圈執行上述過程
             */
            for( ; ; ){
                break;
            }
        }
    }
    
    
  • 練習1:計算0到100之間的奇數和偶數的和

    package whysff.com.cnblogs.struct.for_demo;
    
    /**
     * 練習1:計算0到100之間的奇數和偶數的和
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 5:24
     */
    public class Demo02 {
    
        public static void main(String[] args){
    
            int oddsum = 0;
            int evensum = 0;
            for(int i = 0; i <= 100 ; i++){
                if(i %2 == 0){
                    evensum += i;
                }else{
                    oddsum += i;
                }
            }
            System.out.println("奇數的和為:" + oddsum);
            System.out.println("偶數的和為:" + evensum);
        }
    }
    
    
  • 練習2:用while或for迴圈輸出1-1000之間能被5整除的數,並且每行輸出3個

    package whysff.com.cnblogs.struct.for_demo;
    
    /**
     * 練習2:用while或for迴圈輸出1-1000之間能被5整除的數,並且每行輸出3個
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 5:33
     */
    public class Demo03 {
    
        public static void main(String[] args){
            for(int i = 1; i <= 1000 ; i++){
                // 能被5整除就輸出且不換行
                if(i %5 == 0){
                    System.out.print(i + "\t");
                }
                // 一旦能被55整除就輸出換行
                if(i %(5*5) ==0){
                    System.out.println();
                }
            }
        }
    }
    
    
  • 練習3:列印九九乘法表

    package whysff.com.cnblogs.struct.for_demo;
    
    /**
     * 練習3:列印九九乘法表
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 10:41
     */
    public class Demo04 {
    
        public static void main(String[] args){
    
            /*
                先列印第一列
                再把固定的1用一個迴圈封裝起來
                去掉重複出現的項
                調整格式
             */
            for(int i = 1; i <= 9 ; i++){
                for(int j = 1; j <= i ; j++){
                    System.out.print(j + "*" + i + "=" + j*i + "\t" );
                }
                System.out.println();
            }
        }
    }
    
    

增強for迴圈

  • 這裡對這部分內容進行初步的瞭解,之後陣列重點學習

  • JDK5引入了一種主要用於陣列或集合的增強型for迴圈

  • 語法格式如下:

    for(宣告語句 : 表示式)
    {
      //code
    }
    
  • 宣告語句:宣告新的區域性變數,該變數的型別必須和陣列元素的型別匹配。其作用域限定在迴圈語句塊,其值與此時陣列元素的值相等

  • 表示式:表示式是要訪問的陣列名,或者是返回值為陣列的方法

    package whysff.com.cnblogs.struct.for_demo;
    
    /**
     * 增強for
     *
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 11:18
     */
    public class Demo05 {
    
        public static void main(String[] args){
    
            // 定義一個數組
            int[] numbers = {10,20,30,40,50};
            // 普通for遍歷陣列
            for(int i = 0; i <5 ; i++){
                System.out.println(numbers[i]);
            }
    
            System.out.println("===================");
    
            
            // 使用增強for遍歷陣列
            for(int x : numbers){
                System.out.println(x);
            }
        }
    }
    
    

5、break & continue

  • break在任何迴圈語句的主體部分,均可用break控制迴圈的流程。作用是強行退出迴圈,不執行迴圈中剩餘的語句(break也在Switch語句中使用)

    package whysff.com.cnblogs.struct.breakandcontinue;
    
    import com.sun.org.apache.bcel.internal.generic.IfInstruction;
    
    /**
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 11:36
     */
    public class BreakDemo {
    
        public static void main(String[] args){
            int i = 0;
            while(i < 100){
                i++;
                System.out.println(i);
                if(i == 30){
                    break;
                }
            }
            System.out.println("已經出來迴圈體啦");
        }
    }
    
    
  • continue語句用在迴圈體重,用於終止某次迴圈過程,作用是跳過迴圈體中剩餘語句,接著進行下一次是否執行迴圈的判斷!

    package whysff.com.cnblogs.struct.breakandcontinue;
    
    /**
     * @author xLiu
     * @version 1.0
     * @create 2020.07.24 下午 11:40
     */
    public class ContinueDemo {
    
        public static void main(String[] args){
            int i = 0;
            while(i<100){
                i++;
                if(i%10==0){
                    System.out.println();
                    continue;
                }
                System.out.print(i+"\t");
            }
            
            /*
                總結:
                break直接跳出迴圈(辭職)
                continue是僅跳過當前的單次迴圈,進入下一迴圈過程(請假)
             */
        }
    }
    
    
  • 關於goto關鍵字

    • goto關鍵字很早就在程式設計語言中出現,儘管goto仍是Java的一個保留字,但從未正式使用;Java沒有goto。然而在break和continue這兩個關鍵字的身上,我們仍能看出goto的影子——帶標籤的break和continue
    • “標籤”是指後面跟一個冒號的識別符號,例如:label:
    • 對Java來說唯一用到標籤的地方是在迴圈語句之前。理由是:我們希望在其中巢狀另一個迴圈,由於break和continue關鍵字通常只中斷當前迴圈,但若和標籤一起使用,它就會中斷到存在標籤的地方

6、練習

package whysff.com.cnblogs.struct;

/**
 * 列印三角形
 *
 * @author xLiu
 * @version 1.0
 * @create 2020.07.25 上午 12:02
 */
public class Test01 {

    public static void main(String[] args){
        // 列印三角形,10行
        for(int i = 1; i <= 10; i++){
            // 列印空格,位於三角形的左上方區域
            for(int j = 10; j >=i ; j--){
                System.out.print(" ");
            }
            // 列印三角形的左半部
            for(int j = 1; j <= i ; j++){
                System.out.print("*");
            }
            // 列印三角形的右半部
            for(int j = 1; j < i ; j++){
                System.out.print("*");
            }
            // 每列印完一行就換行
            System.out.println();
        }
    }
}