Java综合练习

一、涉及到的知识点

  • 变量、数组
  • 运算符
  • 程序流程控制
  • 跳转关键字
  • 方法
  • 键盘录入、随机数

二、卖飞机票

  • 需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
  • 按照如下规则计算机票价格:旺季(5-10月)头等舱九折,经济舱八五折;淡季(11月-来年4月)头等舱七折,经济舱六五折。
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入机票的原价:");
        int ticket = sc.nextInt();
        System.out.println("请输入当前的月份:");
        int month = sc.nextInt();
        System.out.println("请输入当前购买的舱位 0 头等舱 1 经济舱:");
        int seat = sc.nextInt();

        if (month >= 5 && month <= 10) {
            ticket = getTicket(seat, ticket, 0.9, 0.85);
        } else if ((month >= 1 && month <= 4) || (month >= 11 && month <= 12)) {
            ticket = getTicket(seat, ticket, 0.7, 0.65);
        }else {
            System.out.println("键盘录入的月份不合法");
        }
        System.out.println(ticket);
    }

    public static int getTicket(int seat, int ticket, double x, double x1) {
        if (seat == 0) {
            ticket = (int) (ticket * x);
        } else if (seat == 1) {
            ticket = (int) (ticket * x1);
        }else{
            System.out.println("没有这个舱位");
        }
        return ticket;
    }
}

三、找质数

  • 需求:判断101~200之间有多少个质数,并输出所有质数。
public class Main {
    public static void main(String[] args) {
        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 Main {
    public static void main(String[] args) {
        String code = getCode();
        System.out.println("验证码是 " + code);
    }

    public static String getCode() {
        String result = "";
        char[] chs = new char[52];
        for (int i = 0; i < chs.length; i++) {
            if (i < 26) {
                chs[i] = (char) (97 + i);
            } else {
                chs[i] = (char) (65 + i - 26);
            }
        }
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int randomIndex = random.nextInt(chs.length);
            result += chs[randomIndex];
        }
        int number = random.nextInt(10);
        result += number;
        return result;
    }
}

五、数组元素的复制

  • 需求:把一个数组中的元素复制到另一个新数组中去。
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] oldArr = {1, 2, 3, 4, 5};
        int[] newArr = copyArr(oldArr);
        System.out.println(Arrays.toString(newArr));
    }

    public static int[] copyArr(int[] arr) {
        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }
}

六、评委打分

  • 需求:在唱歌比赛中,有6名评委给选手打分,分数范围是[0~100]之间的整数。
  • 选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int[] scores = getScores();

        int max = getMax(scores);
        int min = getMin(scores);
        int sum = getSum(scores);
        
        int avg = (sum - max - min) / (scores.length - 2);
        System.out.println("选手的最终得分为:" + avg);
    }

    public static int[] getScores() {
        int[] scores = new int[6];
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < scores.length;) {
            System.out.println("请输入第" + (i + 1) + "个评委的打分:");
            int score = scanner.nextInt();
            if (score >= 0 && score <= 100) {
                scores[i] = score;
                i++;
            } else {
                System.out.println("成绩超出范围,继续录入,当前是" + (i + 1) + "第个评委");
            }
        }
        return scores;
    }

    public static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }

    public static int getMin(int[] arr) {
        int min = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    public static int getSum(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
}

七、数字加密

  • 需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
  • 规则:先得到每位数,然后每位数都加上5,在对10求余,最后将所有数字反转,得到一串新数。
public class Main {
    public static void main(String[] args) {
        // 定义一个数
        int number = 1983;

        // 计算数字有多少位
        int count = getNumberCount(number);

        // 定义一个数组,元素个数为数字位数
        int[] arr = getArr(number, count);

        // 加密
        int[] encryptArr = encrypt(arr);

        // 拼接
        int result = getResult(encryptArr);

        System.out.println(result);  // 8346
    }

    private static int getResult(int[] encryptArr) {
        int result = 0;
        for (int i = 0; i < encryptArr.length; i++) {
            result = result * 10 + encryptArr[i];
        }
        return result;
    }

    private static int[] encrypt(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] + 5;
        }
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] % 10;
        }
        for (int i = 0, j = arr.length-1; i < j; i++,j--) {
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
        return arr;
    }

    private static int[] getArr(int temp, int count) {
        int[] arr = new int[count];
        // 把数字一个一个塞进数组
        int index = arr.length - 1;
        while (temp != 0) {
            int everyNumber = temp % 10;
            temp = temp / 10;
            arr[index] = everyNumber;
            index--;
        }
        return arr;
    }

    private static int getNumberCount(int number) {
        int count = 0;
        while (number != 0) {
            number = number / 10;
            count++;
        }
        return count;
    }
}

八、数字解密

  • 需求:把上面加密的数据解密。
public class Main {
    public static void main(String[] args) {
        // 定义需要解密的数字
        int number = 8346;
        // 获取位数
        int count = getNUmberCount(number);
        // 把数字塞进数组
        int[] arr = getArr(number, count);
        // 解密
        int result = decode(arr);
        System.out.println(result);  // 1983
    }

    private static int decode(int[] arr) {
        // 反转
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= 0 && arr[i] <= 4) {
                arr[i] = arr[i] + 10;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] - 5;
        }

        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            result = result * 10 + arr[i];
        }
        return result;
    }

    private static int[] getArr(int number, int count) {
        int[] arr = new int[count];
        for (int i = 0; i < count; i++) {
            int everyNumber = number % 10;
            number = number / 10;
            arr[count - i - 1] = everyNumber;
        }
        return arr;
    }

    private static int getNUmberCount(int number) {
        int count = 0;
        while (number != 0) {
            number = number / 10;
            count++;
        }
        return count;
    }
}

九、抢红包

  • 需求:一个大V直播抽奖,奖品是现金红包,分别有{2, 588, 888, 1000, 10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
  • 打印效果如下:
    在这里插入图片描述

方法一:判断是否被抽取

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int[] arr = {2, 588, 888, 1000, 10000};
        int[] newArr = new int[arr.length];

        Random random = new Random();
        for (int i = 0; i < 5; ) {
            int randomIndex = random.nextInt(arr.length);
            int prize = arr[randomIndex];
            boolean flag = contains(newArr, prize);
            // 如果没有被抽
            if (!flag) {
                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;  // 已被抽取
            }
        }
        return false;  // 未被抽取
    }
}

方法二:打乱数组

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int[] arr = {2, 588, 888, 1000, 10000};
        Random random = new Random();
        for (int i = 0; i < arr.length; i++) {
            int randomIndex = random.nextInt(arr.length);

            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

十、模拟双色球

在这里插入图片描述

import java.util.Random;
import java.util.Scanner;

public class Main {
    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[j]) {
                    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) {
            System.out.println("恭喜你,中奖500万");
        } else if (redCount == 5 && blueCount == 1) {
            System.out.println("恭喜你,中奖3000");
        } else if (redCount == 5 || redCount == 4 && blueCount == 1) {
            System.out.println("恭喜你,中奖200");
        } else if (redCount == 4 || redCount == 3 && blueCount == 1) {
            System.out.println("恭喜你,中奖10");
        } else if ((redCount == 2 && blueCount == 1) || (redCount == 1 && blueCount == 1) || (redCount == 0 && blueCount == 1)) {
            System.out.println("恭喜你,中奖5");
        }else {
            System.out.println("谢谢参与");
        }
    }

    public static int[] userInputNumber() {
        int[] arr = new int[7];
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 6; ) {
            System.out.println("请输入第" + (i + 1) + "个红球号码:");
            int redNumber = scanner.nextInt();
            if (redNumber >= 1 && redNumber <= 33) {
                boolean flag = contains(arr, redNumber);
                if (!flag) {
                    arr[i] = redNumber;
                    i++;
                } else {
                    System.out.println("当前红球号码已经存在,请重新输入");
                }
            } else {
                System.out.println("当前红球号码超出范围");
            }
        }
        System.out.println("请输入蓝球号码:");
        while (true) {
            int blueNumber = scanner.nextInt();
            if (blueNumber >= 1 && blueNumber <= 16) {
                arr[arr.length - 1] = blueNumber;
                break;
            } else {
                System.out.println("当前蓝球号码超出范围");
            }
        }
        return arr;
    }

    public static int[] createNumber() {
        int[] arr = new int[7];

        // 生成红球号码
        Random random = new Random();
        for (int i = 0; i < 6; ) {
            int redNumber = random.nextInt(33) + 1;
            boolean flag = contains(arr, redNumber);
            if (!flag) {
                arr[i] = redNumber;
                i++;
            }
        }

        int blueNumber = random.nextInt(16) + 1;
        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;
    }
}

土、二维数组

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        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[] quarterArr = yearArrArr[i];
            int sum = getSum(quarterArr);
            System.out.println("第" + i + "个季度的总营业额为:" + sum);
            yearSum += 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iFulling

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值