Java基礎 --- 綜合練習

Y423x發表於2024-03-13

Java基礎 --- 綜合練習


案例一 賣飛機票

需求:

  • 機票價格按照淡季旺季、頭等艙和經濟艙收費、輸入機票原價、月份和頭等艙或經濟艙。

  • 按照如下規則計算機票價格:旺季(5-10月) 頭等艙9折,經濟艙8.5折,淡季(11月到來年4月)頭等艙7折,經濟艙6.5折。

import java.util.Scanner;

public class Test9 {
    public static void main(String[] args) {
        /*機票價格按照淡季旺季、頭等艙和經濟艙收費、輸入機票原價、月份和頭等艙或經濟艙。
        按照如下規則計算機票價格:旺季(5-10月) 頭等艙9折,經濟艙8.5折,淡季(11月到來年4月)頭等艙7折,經濟艙6.5折。
         */
        //1.鍵盤錄入
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入機票原價");
        double ticket = sc.nextInt();
        System.out.println("請輸入月份");
        int month = sc.nextInt();
        System.out.println("請選擇0頭等艙或1經濟艙");
        int carriage = sc.nextInt();
        //2.判斷淡旺季
        if(month >= 5 && month <= 10){//旺季
            //3.判斷頭等艙或經濟艙
            if(carriage == 0){//頭等艙
                ticket *= 0.9;
            } else if (carriage == 1) {//經濟艙
                ticket *= 0.85;
            }else {
                System.out.println("沒有這個艙位");
            }
        } else if ((month >= 1 && month <= 4)||(month >= 11 && month <= 12)) {//淡季
            if(carriage == 0){//頭等艙
                ticket *= 0.7;
            } else if (carriage == 1) {//經濟艙
                ticket *= 0.65;
            }else {
                System.out.println("沒有這個艙位");
            }
        }else {
            System.out.println("鍵盤錄入的月份屬於非法月份");
        }
        System.out.println("您的票價是" + ticket);
    }
}

最佳化版:

import java.util.Scanner;

public class Test9 {
    public static void main(String[] args) {
        /*機票價格按照淡季旺季、頭等艙和經濟艙收費、輸入機票原價、月份和頭等艙或經濟艙。
        按照如下規則計算機票價格:旺季(5-10月) 頭等艙9折,經濟艙8.5折,淡季(11月到來年4月)頭等艙7折,經濟艙6.5折。
         */
        //1.鍵盤錄入
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入機票原價");
        double ticket = sc.nextInt();
        System.out.println("請輸入月份");
        int month = sc.nextInt();
        System.out.println("請選擇0頭等艙或1經濟艙");
        int carriage = sc.nextInt();
        //2.判斷淡旺季
        if(month >= 5 && month <= 10){//旺季
            //3.判斷頭等艙或經濟艙
            ticket = getPrice(ticket,carriage,0.9,0.85);
        } else if ((month >= 1 && month <= 4)||(month >= 11 && month <= 12)) {//淡季
            ticket = getPrice(ticket,carriage,0.7,0.65);
        }else {
            System.out.println("鍵盤錄入的月份屬於非法月份");
        }
        System.out.println("您的票價是" + ticket);
    }
    public static double getPrice(double ticket,int carriage,double v0,double v1){
        if(carriage == 0){//頭等艙
            ticket *= v0;
        } else if (carriage == 1) {//經濟艙
            ticket *= v1;
        }else {
            System.out.println("沒有這個艙位");
        }
        return ticket;
    }
}

補充:Idea快捷鍵 ctrl + alt + M 自動抽取方法

選擇要抽取的程式碼-->快捷鍵-->系統提示程式碼中有其他一樣的程式碼是否要一起抽取,是-->系統提示是否用呼叫方法的形式抽取,同意


案例二 找質數

判斷 101-200之間由多少個素數,並輸出所有素數

public class Test10 {
    public static void main(String[] args) {
        //判斷 101-200之間由多少個素數,並輸出所有素數
        int count = 0;//統計次數
        for (int i = 101; i <= 200; i++) {
            boolean flag = true;
            for(int j = 2;j < i;j++){
                if(i % j == 0){
                    flag = false;
                    break;
                }
            }
            if(flag){
                System.out.println("當前數字" + i + "是一個質數");
                count++;
            }
        }
        System.out.println("一共有" + count + "個質數");
    }
}

案例三 開發驗證碼

需求:

  • 定義方法實現隨機產生一個5位的驗證碼
  • 驗證碼格式:
    • 長度為5
    • 前四位是大寫字母或小寫字母
    • 最後一位是數字
import java.util.Random;

public class Test11 {
    public static void main(String[] args) {
        /*需求:
        定義方法實現隨機產生一個5位的驗證碼
        驗證碼格式:
        長度為5
        前四位是大寫字母或小寫字母
        最後一位是數字
         */

        char[] chs = new char[52];
        for (int i = 0; i < chs.length; i++) {
            //ASCII碼
            if(i <= 25){
                chs[i] = (char) (97 + i);//新增小寫字母
            }else {
                chs[i] = (char) (65 + i -26);//新增大寫字母
            }
        }
        String result = "";//定義字串變數,記錄最終結果
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int randomIndex = r.nextInt(chs.length);//隨機索引,獲取對應元素
            result += chs[randomIndex];
        }
        int number = r.nextInt(10);//隨機獲取一個0~9的數字
        result += number;
        System.out.println(result);
    }
}

案例四 陣列元素的複製

需求:

把一個陣列中的元素複製到另一個新陣列中去。

public class Test12 {
    public static void main(String[] args) {
        /*需求:
        把一個陣列中的元素複製到另一個新陣列中去。
         */
        int[] arr = {1,2,3,4,5};//定義一個陣列
        int[] arr1 = new int[5];//定義一個新陣列,長度和老陣列一致
        for (int i = 0; i < arr.length; i++) {
            arr1[i] = arr[i];
        }
        for (int i = 0; i < arr1.length; i++) {//遍歷新陣列
            System.out.println(arr1[i]);
        }
    }
}

案例五 評委打分

需求:

在唱歌比賽中,有6名評委給選手打分,分數範圍是[0-100]之間的整數。選手的最後得分為:去掉最高分、最低分後的4個評委的平均分,請完成上述過程並計算出選手的得分

import java.util.Scanner;

public class Test13 {
    public static void main(String[] args) {
        /*需求:
        在唱歌比賽中,有6名評委給選手打分,分數範圍是[0-100]之間的整數。
        選手的最後得分為:去掉最高分、最低分後的4個評委的平均分,請完成上述過程並計算出選手的得分
         */
        int[] scoreArr = getScores();
        int max = getMax(scoreArr);
        int min = getMin(scoreArr);
        double sum = getSum(max,min,scoreArr);
        System.out.println("選手的最終的分為" + sum);
    }
    public static double getSum(int max,int min,int[] scoreArr){//定義方法用來求選手的最終分
        double sum = 0;
        for (int i = 0; i < scoreArr.length; i++) {
            sum += scoreArr[i];
        }
        sum -= (max + min);
        sum /= (scoreArr.length - 2);
        return sum;
    }
    public static int getMin(int[] scoreArr){//定義方法用於求最小值
        int min = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if(min > scoreArr[i]){
                min = scoreArr[i];
            }
        }
        return min;
    }
    public static int getMax(int[] scoreArr){//定義方法用於求最大值
        int max = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if(max < scoreArr[i] ){
                max = scoreArr[i];
            }
        }
        return max;
    }
    public static int[] getScores(){//定義方法用於打分
        int[] scores = new int[6];//定義陣列
        Scanner sc = new Scanner(System.in);//鍵盤錄入
        for (int i = 0; i < scores.length; ) {
            System.out.println("請評委打分");
            int score = sc.nextInt();//將鍵盤錄入的值賦值給陣列
            if(score >= 0 && score <= 100){
                scores[i] = score;
                i++;
            }else {
                System.out.println("成績超出了範圍,請重新錄入");
            }
        }
        return scores;
    }
}

案例六 數字加密

需求:

  • 某系統的數字密碼(大於0),比如1983,採用加密方式進行傳輸。
  • 規則如下:先得到每位數,然後每位數都加上5,再對10求餘,最後將所有數字反轉,得到一串新數字。
import java.util.Scanner;

public class Test14 {
    public static void main(String[] args) {
        /*需求:
        某系統的數字密碼(大於0),比如1983,採用加密方式進行傳輸。
        規則如下:先得到每位數,然後每位數都加上5,再對10求餘,最後將所有數字反轉,得到一串新數字。
         */
        int[] arr = getArr();
        getNewArr(arr);
        int number = 0;
        for (int i = 0; i < arr.length; i++) {//將陣列中的元素連起來,組成一串新的數字
            number = number * 10 + arr[i];
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
    }
    public static int[] getNewArr(int[] arr){//定義方法,對陣列中的元素加密
        for (int i = 0; i < arr.length; i++) {
            arr[i] = ((arr[i] + 5) % 10);
        }
        return arr;
    }
    public static int[] getArr(){//定義方法,將反轉後的數字賦值給陣列
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入數字");
        int number = sc.nextInt();
        while(number == 0){
            System.out.println("請重新輸入一個大於0的數字");//判斷輸入的數字是否大於0
            number = sc.nextInt();
        }
        int num = number;
        int flag = 0;//定義一個變數用記錄所輸入數字的位數
        while (number != 0) {
            number /= 10;
            flag++;
        }
        int[] arr = new int[flag];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (num % 10);
            num /= 10;
        }
        return arr;
    }
}

案例七 數字解密

需求:將案例六加密的數字解密

import java.util.Scanner;

public class Test15 {
    public static void main(String[] args) {
        /*需求:
        將案例六加密的數字解密
         */
        int[] arr = getArr();
        getNewArr(arr);
        int number = 0;
        for (int i = 0; i < arr.length; i++) {//將陣列中的元素連起來,組成一串新的數字
            number = number * 10 + arr[i];
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
    }
    public static int[] getNewArr(int[] arr){//定義方法,對陣列中的元素解密
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] >= 5 && arr[i] <= 9){
                arr[i] -= 5;
            }else if(arr[i] >= 0 && arr[i] <= 4){
                arr[i] += 5;
            }
        }
        return arr;
    }
    public static int[] getArr(){//定義方法,將反轉後的數字賦值給陣列
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入所要解密數字的個數");
        int count = sc.nextInt();
        System.out.println("請輸入要解密的數字");
        int number = sc.nextInt();
        while(number == 5){
            System.out.println("數字錯誤,請重新輸入");//5解密是0,題目要求解密前的數大於0
            number = sc.nextInt();
        }
        int[] arr = new int[count];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (number % 10);
            number /= 10;
        }
        return arr;
    }
}

案例八 搶紅包

需求:

一個大V直播抽獎,獎品是現金紅包,分別有(66,88,666,888,1888)五個獎金。請使用程式碼模擬抽獎,

列印出每個獎項,獎項的出現順序要隨機且不重複。列印效果如下:(隨機順序)

import java.util.Random;

public class Test16 {
    public static void main(String[] args) {
        /*需求:
        一個大V直播抽獎,獎品是現金紅包,分別有(66,88,666,888,1888)五個獎金。請使用程式碼模擬抽獎,
        列印出每個獎項,獎項的出現順序要隨機且不重複。列印效果如下:(隨機順序)
         */
        int[] arr = {66, 88, 666, 888, 1888};//定義一個陣列,存有(66,88,666,888,1888)
        int[] newArr = new int[arr.length];
        Random r = new Random();
        for (int i = 0; i < arr.length; ) {
            int randomIndex = r.nextInt(arr.length);//抽取隨機數
            int prize = arr[randomIndex];
            if(!contains(newArr,prize)){//如果抽取結果有效
                newArr[i] = prize;
                i++;
            }
        }
        for (int i = 0; i < newArr.length; i++) {//列印抽取結果
            System.out.println(newArr[i]);
        }

    }
    public static boolean contains(int[] arr, int prize){//定義方法,判斷是否重複抽取,抽取結果無效
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == prize){
                return true;//若重複抽取,返回true
            }
        }
        return false;//若沒有,則返回false,抽取結果有效
    }
}

最佳化演算法

import java.util.Random;

public class Test17 {
    public static void main(String[] args) {
        /*需求:
        一個大V直播抽獎,獎品是現金紅包,分別有(66,88,666,888,1888)五個獎金。請使用程式碼模擬抽獎,
        列印出每個獎項,獎項的出現順序要隨機且不重複。列印效果如下:(隨機順序)
         */
        //把獎池裡面的所有獎項打亂順序
        int[] arr = {66, 88, 666, 888, 1888};
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //獲取隨機索引
            int randomIndex = r.nextInt(arr.length);
            //拿著i跟隨機索引randomIndex上的值進行交換
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
        //遍歷獎池
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

案例九 雙色球系統

投注號碼由6個紅色球號碼和1個藍色球號碼組成。紅色球號碼從1-33中選擇;藍色球號碼從1-16中選擇。

一等獎 6紅+1藍 最高1000萬
二等獎 6紅+0藍 最高500萬
三等獎 5紅+1藍 3000元
四等獎 5紅+0藍 200元
四等獎 4紅+1藍 200元
五等獎 4紅+0藍 10元
五等獎 3紅+1藍 10元
五等獎 2紅+1藍 10元
六等獎 1紅+1藍 5元
六等獎 0紅+1藍 5元
import java.util.Random;
import java.util.Scanner;

public class Test18 {
    public static void main(String[] args) {
        int[] arr = createNumber();
        int[] userInputArr = userInputNumber();
        int redCount = 0;//定義變數,用於統計紅球中獎個數
        int blueCount = 0;//定義變數,用於統計藍球中獎個數
        for (int i = 0; i < userInputArr.length - 1; i++) {//判斷紅球中獎個數
            int redNumber = userInputArr[i];
            for (int j = 0; j < arr.length - 1; j++) {
                if(redNumber == arr[i]){
                    redCount++;
                    break;
                }
            }
        }
        int blueNumber = userInputArr[userInputArr.length - 1];
        if(blueNumber == arr[arr.length - 1]){
            blueCount++;
        }
        if(redCount == 6 && blueCount == 1){
            System.out.println("恭喜你!抽中一等獎:1000萬¥");
        } else if(redCount == 6 && blueCount == 0){
            System.out.println("恭喜你!抽中二等獎:500萬¥");
        } else if (redCount == 5 && blueCount == 1) {
            System.out.println("恭喜你!抽中三等獎:3000¥");
        } else if ((redCount == 5 && blueCount == 0) || (redCount == 4 && blueCount == 1)) {
            System.out.println("恭喜你!抽中四等獎:200¥");
        } else if ((redCount == 4 && blueCount == 0) || (redCount == 3 && blueCount == 1) || (redCount == 2 && blueCount == 1)) {
            System.out.println("恭喜你!抽中五等獎:10¥");
        } else if ((redCount == 1 && blueCount == 1) || (redCount == 0 && blueCount == 1)) {
            System.out.println("恭喜你!抽中六等獎:5¥");
        } else {
            System.out.println("謝謝惠顧!");
        }
    }
    public static int[] userInputNumber(){//定義方法,用於使用者輸入號碼
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[7];
        for (int i = 0; i < arr.length - 1; ) {//紅球號碼
            System.out.println("請輸入第" + (i + 1) + "個紅球的號碼");
            int redNumber = sc.nextInt();
            if(redNumber >= 1 && redNumber <= 33){
                if(!contains(arr,redNumber)){
                    arr[i] = redNumber;
                    i++;
                }else{
                    System.out.println("號碼重複,請重新輸入");
                }
            }else {
                System.out.println("號碼不在可輸入範圍內,請重新輸入");
            }
        }
        for (int i = 0;i < 1 ; ) {//藍球號碼
            System.out.println("請輸入藍球的號碼");
            int blueNumber = sc.nextInt();
            if(blueNumber >= 1 && blueNumber <= 16){
                arr[arr.length - 1] = blueNumber;
                i++;
            }
            else {
                System.out.println("號碼不在可輸入範圍內,請重新輸入");
            }
        }
        return arr;
    }
    public static int[] createNumber(){//定義方法,用於生成紅球和藍球號碼
        int[] arr = new int[7];
        Random r = new Random();
        for (int i = 0; i < arr.length - 1; ) {//紅球號碼
            int redNumber = r.nextInt(1,34);
            if(!contains(arr,redNumber)){
                arr[i] = redNumber;
                i++;
            }
        }
        int blueNumber = r.nextInt(1,17);//藍球號碼
        arr[arr.length - 1] = blueNumber;
        return arr;
    }
    public static boolean contains(int[] arr,int number){//定義方法,用於判斷號碼是否重複
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == number){
                return true;//重複抽取
            }
        }
        return false;//抽取結果有效
    }
}

案例十 二維陣列

  • 二維陣列:陣列中存陣列
  • 應用場景:當我們需要把資料分組管理的時候,就需要用到二維陣列

二維陣列的初始化


靜態初始化

  • 格式:

    資料型別[][] 陣列名 = new 資料型別[][]{{元素1,元素2},{元素1,元素2}};
    
  • 範例:

    int[][] arr = new int[][]{{11,22},{33,44}};
    
  • 簡化格式:

    資料型別[][] 陣列名 = {{元素1,元素2},{元素1,元素2}};
    
  • 範例:

    int[][] arr = {{11,22},{33,44}};
    
  • 範例:(不常用)

    int arr[][] = {{11,22},{33,44}};
    

動態初始化

  • 格式:

    資料型別[][] 陣列名 = new 資料型別[m][n];
    //m表示這個二維陣列,可以存放多少個一維陣列
    //n表示每一個一維陣列,可以存放多少個元素
    
  • 範例:

    int[][] arr = new int[2][3];
    //該陣列可以存放2個一維陣列,每個一維陣列中可以存放3個int型別元素
    

總結

  1. 當我們需要把資料分組管理的時候,就需要用到二維陣列
  2. 掌握二維陣列的靜態初始化、動態初始化
  3. 如何給二維陣列中的元素賦值
  4. 如何遍歷二維陣列

二維陣列練習

某商城每個季度的營業額如下:單位(萬元)

第一季度:22,66,44

第二季度:77,33,88

第三季度:25,45,65

第四季度:11,66,99

要求計算出每個季度的總營業額和全年的總營業額

public class Test19 {
    public static void main(String[] args) {
        /*某商城每個季度的營業額如下:單位(萬元)
        第一季度:22,66,44
        第二季度:77,33,88
        第三季度:25,45,65
        第四季度:11,66,99
        要求計算出每個季度的總營業額和全年的總營業額
         */
        int[][] yearArrArr ={
                {22,66,44},
                {77,33,88},
                {25,45,65},
                {11,66,99}
        };
        int yearSum = 0;
        for (int i = 0; i < yearArrArr.length; i++) {
            int[] quartArr = yearArrArr[i];
            int sum = getSum(quartArr);
            yearSum += sum;
            System.out.println("第一個季度的總營業額為:" + sum);
        }
        System.out.println("全年的總營業額為:" + yearSum);
    }
    public static int getSum (int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];

        }
        return sum;
    }
}

相關文章