【黑马程序员java笔记】java基础的综合练习

卖飞机票

题目

package com.basic.comprehensive;
import java.util.Scanner;
/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo01
 * @Description:求飞机票
 * @date 2024/9/416:45
 */
public class demo01 {
    public static void main(String[] args) {
        /*输入:机票原价,月份,头等舱或经济舱;
        * 输出:机票价格*/
        //1.读入需要的数据
        Scanner sc = new Scanner(System.in);
        System.out.println("输入机票原价:");
        double oranginalPrice = sc.nextDouble();
        System.out.println("出行月份:");
        int month = sc.nextInt();
        System.out.println("是否经济舱(经济舱输入0,头等舱输入1):");
        int level = sc.nextInt();

        //分装计算机票价格的方法
        double price = getPrice(oranginalPrice,month,level);

        //3.打印机票价格
        if (price != 0){
            System.out.println("机票现价是:"+price);
        }
        sc.close();
    }
    public static double getPrice(double oranginalPrice,int month,int level){
        //2.进行判断,头等舱还是经济舱
        if (level == 0){
            //2.1.继续判断,是否旺季,同样可以封装为方法
            return tellMonth(oranginalPrice,month,0.85,0.65);
        }else if (level == 1){
            return tellMonth(oranginalPrice,month,0.9,0.7);
        }else{
            System.out.println("不存在该舱位。");
            return 0;
        }
    }
    public static double tellMonth(double oranginalPrice,int month,double v1,double v2){
        if(month>=5 && month<=10){
            return oranginalPrice*v1;
        }else if(month>12 || month<1){
            System.out.println("不存在该月份。");
            return 0;
        }else{
            return oranginalPrice*v2;
        }
    }
}

结果图:
机票价格测试
错误判断

ctrl+alt+M可以自动抽取方法

开发验证码

题目
缺点在于还未实现数字位置的随机

package com.basic.comprehensive;
import java.util.Random;
/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo02
 * @Description:开发验证码
 * @date 2024/9/418:38
 */
public class demo02 {
    public static void main(String[] args) {
        /*长度为5,前四位为大小写字母的随机,最后一位为数字的随机*/
        //1.定义大小写字母数组
        char[] chs = new char[52];
        for (int i = 0; i < chs.length; i++) {
            if (i <=25 ){
                chs[i] = (char) (i + 'A');//利用ASC码得到
            }else{
                chs[i] = (char) (i-26 + 'a');
            }
        }
        //2.随机抽取字母和数字并赋值给一个新的数组
        Random rand = new Random();
        char[] verifyCode= new char[4];
        //可以改为Sting result="";
        // 后面相对应的变为result字母数组+char[randIndex]
        //最后打印可以直接print(result+number)
        for (int i = 0; i < 4; i++) {
            int r = rand.nextInt(chs.length);
            verifyCode[i] = chs[r];
        }
        //3.打印验证码
        for (int i = 0; i < verifyCode.length; i++) {
            System.out.print(verifyCode[i]);
        }
        System.out.println(rand.nextInt(10));
    }
}

结果图:
结果

评委打分

题目
1.读取六位评委打的分数,可以用数组存储
2.剔除不合法的分数,小于0或大于100
3.得到最大值
3.1比较最大值
3.2返回最大值
4.得到最小值
4.1比较最小值
4.2返回最小值
5.计算得到剩余数组的平均值
6.打印选手得分

package com.basic.comprehensive;
import java.util.Scanner;
/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo03
 * @Description:评委打分,得到不合法数据后剔除再算平均,去掉一个最高分和一个最低分
 * @date 2024/9/419:04
 */
public class demo03 {
    public static void main(String[] args) {
        //1.读取六位评委打的分数,可以用数组存储
        int[] score=getValue();

        //2.剔除不合法的分数,小于0或大于100,替换为零同时打印反馈
        int[] reScore = deleteIllegality(score);

        //3.找到最大值
        int max = getMax(reScore);

        //4.替换最小值为零
        int min = getMin(reScore);

        //5.计算得到剩余数组的平均值
        double scoreMean = getMean(reScore,max,min);
        //6.打印选手得分
        System.out.println("The score is " + scoreMean);
    }
    //1.
    public static int[] getValue(){
        int[] score=new int[6];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 6; i++) {
            System.out.println("Enter score:");
            score[i] = sc.nextInt();
        }
        sc.close();
        return score;
    }
    //2.
    public static int[] deleteIllegality(int[] arr){
        int count=0;
        boolean flag=false;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]<0||arr[i]>100){
                System.out.println("存在非法分数:"+arr[i]);
                arr[i]=-1;//只要是原始数组中不可能存在的数就行,便于后续剔除
                count++;
                flag=true;
            }
        }
        if(flag){
            int[] res=new int[arr.length - count];
            int flag_index=0;
            int i = 0;
            for (int j = flag_index; j < arr.length; j++) {
                flag_index++;
                if(arr[j]==-1){
                    continue;
                }else{
                    res[i]=arr[j];
                    i++;
                }
            }
            //用了两个循环来得到剔除不合法数据的数组,是否可以改进?
            return res;
        }
        return arr;
    }
    //3.
    public static int getMax(int[] arr){
        //	3.1比较最大值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i]>max){
                max = arr[i];
            }
        }
        //	3.2返回最大值
        return max;
    }
    //4.
    public static int getMin(int[] arr){
        //	4.1比较最小值
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i]<min){
                min = arr[i];
            }
        }
        //	4.2返回最小值
        return min;
    }
    //5.
    public static double getMean(int[] arr, int max, int min){
        double mean = 0;
        //求和
        for (int i = 0; i < arr.length; i++) {
            mean += arr[i];
        }
        //求减去的平均
        mean = (mean -max -min )/ (arr.length - 2);
        return mean;
    }
}

结果图:
得分结果图
非法测试:
非法测试

数字加密

题目
1.用数组读入数据
2.每一位都是相同的操作,利用循环加五以及对十取余
3.反转得到新的数组
4.打印得到的数组

package com.basic.comprehensive;
import java.util.Scanner;
/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo04
 * @Description:数字加密
 * @date 2024/9/420:14
 */
public class demo04 {
    public static void main(String[] args) {
        //1.用数组读入数据
        Scanner sc = new Scanner(System.in);
        System.out.println("输入密码: ");
        //1.1将密码看为一个整数读入
        int passTemp = sc.nextInt();
        int passNum = passTemp;
        //1.2根据密码长度确认数组长度
        int n = 0;
        while (passNum != 0) {
            passNum = passNum / 10;
            n++;
        }
        //1.3 将密码存储于数组中,注意密码中数字的顺序
        int[] password=new int[n];
        for (int i = 0; i < n; i++) {
            int ge = passTemp % 10;
            passTemp /=  10;
            password[n-1-i] = ge;
        }
        //2.每一位都是相同的操作,利用循环加五以及对十取余
        for (int i = 0; i < n; i++) {
            password[i] = (password[i]+5) % 10;
        }
        //3.反转得到新的数组
        for (int i = 0,j= password.length-1; i < j; i++,j--) {
            int temp=password[i];
            password[i]=password[j];
            password[j]=temp;
        }
        //4.打印得到的数组,可以不打印空格直接打印,也可以乘以10还原整数
        int number = 0;
        for (int i = 0; i < n; i++) {
            number = number*10+password[i];
        }
        System.out.println(number);
        sc.close();
    }
}

结果图:
结果
问题:是否可以使输入的密码不显示?

数字解密

题目
数字加密的逆操作,对10取余的逆操作是?
根据第一步加五确定范围,范围为5~14;故对10取余的逆操作时,如果是0到4之间,则需要加上10;如果是5到9之间,则是本身。

  1. 利用数组读入加密的数字(同数字加密)
  2. 将数字反转
  3. 判断范围
    3.1. 0到4之间,加上10
    3.2 5到9之间,本身不变
  4. 加上5
  5. 打印结果
    为了方便解密,将上述加密代码封装了函数更改为:
package com.basic.comprehensive;
import java.util.Scanner;
/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo04
 * @Description:数字加密
 * @date 2024/9/420:14
 */
public class demo04 {
    public static void main(String[] args) {
        //1.用数组读入数据
        Result result = getResult();
        //2.每一位都是相同的操作,利用循环加五以及对十取余
        for (int i = 0; i < result.n(); i++) {
            result.password()[i] = (result.password()[i]+5) % 10;
        }
        //3.反转得到新的数组,数组改变的是地址,不用再次返回
        extracted(result);
        //4.打印得到的数组,可以不打印空格直接打印,也可以乘以10还原整数
        int number = getNumber(result);
        System.out.println(number);
    }

    public static int getNumber(Result result) {
        int number = 0;
        for (int i = 0; i < result.n(); i++) {
            number = number*10+ result.password()[i];
        }
        return number;
    }

    //原先抽取的函数是private,改为public的话数字解密继续用
    public static void extracted(Result result) {
        for (int i = 0, j = result.password().length-1; i < j; i++,j--) {
            int temp= result.password()[i];
            result.password()[i]= result.password()[j];
            result.password()[j]=temp;
        }
    }

    public static Result getResult() {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入密码: ");
        //1.1将密码看为一个整数读入
        int passTemp = sc.nextInt();
        int passNum = passTemp;
        //1.2根据密码长度确认数组长度
        int n = 0;
        while (passNum != 0) {
            passNum = passNum / 10;
            n++;
        }
        //1.3 将密码存储于数组中,注意密码中数字的顺序
        int[] password=new int[n];
        for (int i = 0; i < n; i++) {
            int ge = passTemp % 10;
            passTemp /=  10;
            password[n-1-i] = ge;
        }
        Result result = new Result(sc, n, password);
        sc.close();
        return result;
    }

    public record Result(Scanner sc, int n, int[] password) {
    }
    //自动抽取获得的方法,暂时还不知道record是个什么东西

}

更改后的代码:

package com.basic.comprehensive;
import java.util.Scanner;

/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo05
 * @Description:数字解密
 * @date 2024/9/420:50
 */
public class demo05 {
    public static void main(String[] args) {
        //1.利用数组读入加密的数字(同数字加密)
        demo04.Result result = demo04.getResult();

        //2.将数字反转
        demo04.extracted(result);
        //3.判断范围
        for (int i = 0;i < result.n();i++){
            //3.1 0到4之间,加上10
            //3.2 5到9之间,本身不变
            if(result.password()[i]>=0 && result.password()[i]<=4){
                result.password()[i]+=10;
            }
        }
        //4.减去5
        for (int i = 0;i < result.n();i++){
            result.password()[i]-=5;
        }
        //5.打印结果
        int Number = demo04.getNumber(result);
        System.out.println(Number);
    }
}

结果图:
结果

双色球系统

题目

  1. 随机生成中奖号码
    1.1 定义一个数组用于存储红球中奖号码,定义一个数字用于存储篮球中奖号码。
    1.2 随机生成红球号码,要求1-33之间生成六个数字且不重复。
    1.2.1 生成随机数字
    1.2.2 判断是否重复
    1.3 随机生成篮球号码,1-16之间
  2. 读入用户输入的号码,用数组存储
    2.1 定义一个数组用于存储中奖号码。
    2.2 判断输入的数字是否重复,重复则要求重新输入
    2.3 将输入的数字存储于数组中
  3. 比较两个数组的号码判断获奖情况;红球数字不需要位置相同
    3.1 判断红球的号码是否在中奖号码中,同时计数
    3.2 根据上述计数判断获奖情况
    3.2.1 当红球中奖个数小于4个时,判断篮球号码是否相同,不同则直接打印“未能中奖”;相同则继续根据红球个数判断中奖情况
    3.2.2 当红球中奖而概述大于等于4个时,根据篮球和红球个数一起判断中奖情况
package com.basic.comprehensive;
import java.util.Scanner;
import java.util.Random;

/**
 * @author soso
 * @PackageName:com.basic.comprehensive
 * @ClassName:demo06
 * @Description:双色球中奖条件和奖金表
 * @date 2024/9/510:21
 */
public class demo06 {
    public static void main(String[] args) {
        //1. 随机生成中奖号码
        //	1.1 定义一个数组用于存储中奖号码
        int[] prizeNumber = new int[7];
        //	1.2 随机生成红球号码,要求1-33之间生成六个数字且不重复。
        getPrizeNumber(prizeNumber);

        //2. 读入用户输入的号码,用数组存储
        //	2.1 定义一个数组用于存储用户号码。
        int[] userNumber = new int[prizeNumber.length];
        getUserRedNumber(userNumber);

        //3. 比较两个数组的号码判断获奖情况;红球数字不需要位置相同
        printPrize(userNumber, prizeNumber);
    }
    //1.2
    private static void getPrizeNumber(int[] arr) {
        //  1.2
        //		1.2.1 生成随机数字
        Random rand = new Random();
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; ) {
            int r = rand.nextInt(33)+1;
            //		1.2.2 判断是否重复
            flag = isPrize(r,arr);
            if (!flag) {
                arr[i] = r;
                i++;
            }
        }
        //	1.3 随机生成篮球号码,1-16之间
        arr[arr.length - 1] = rand.nextInt(16)+1;
    }
    //1.2.2
    private static boolean isPrize(int number,int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (number == arr[i]) {
                return true;
            }
        }
        return false;
    }
    //2.
    private static void getUserRedNumber(int[] arr) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < arr.length - 1; ) {
            //  2.2 读入用户数字
            System.out.print("请输入第"+(i+1)+ "个红球号码:");
            int number = sc.nextInt();
            //	2.3 判断输入的数字是否重复,重复则要求重新输入
            if (number <=33 && number >=1) {
                if (!isPrize(number, arr)) {
                    arr[i] = number;
                    i++;
                }else{
                    System.out.println("输入号码重复,请重新输入。");
                }
            }else{
                System.out.println("输入号码无效,请输入1-33之间的数字。");
            }
        }
        //2.4 输入篮球数字
        System.out.print("请输入篮球号码:");
        for ( ; ; ) {
            int blueNumber = sc.nextInt();
            if (blueNumber <=16 && blueNumber >=1) {
                arr[arr.length - 1] = blueNumber;
                break;
            }else{
                System.out.println("输入号码无效,请输入1-16之间的号码。");
            }
        }
        sc.close();
    }
    //3.
    private static void printPrize(int[] userNumber,int[] prizeNumber) {
        //	3.1 判断红球的号码是否在中奖号码中,同时计数
        int count=0;
        for (int i = 0; i < userNumber.length - 1; i++) {
            if (isPrize(userNumber[i],prizeNumber)) {
                count++;
            }
        }
        //	3.2 根据上述计数判断获奖情况
        //		3.2.1 当红球中奖个数小于4个时,判断篮球号码是否相同,不同则直接打印“未能中奖”;相同则继续根据红球个数判断中奖情况
        if (count < 4){
            if (userNumber[userNumber.length-1] == prizeNumber[prizeNumber.length-1]) {
                if (count <=2){
                    System.out.println("恭喜您中奖5元!");
                }else{
                    System.out.println("恭喜您中奖10元!");
                }
            }else{
                System.out.println("很遗憾您未能中奖。");
            }
        }else{
            //		3.2.2 当红球中奖而概述大于等于4个时,根据篮球和红球个数一起判断中奖情况
            if (userNumber[userNumber.length-1] == prizeNumber[prizeNumber.length-1]) {
                if (count ==4){
                    System.out.println("恭喜您中奖200元!");
                }else if (count ==5){
                    System.out.println("恭喜您中奖3000元!");
                }else if (count ==6){
                    System.out.println("恭喜您中奖最高一千万!");
                }
            }else{
                if (count ==4){
                    System.out.println("恭喜您中奖10元!");
                }else if (count ==5){
                    System.out.println("恭喜您中奖200元!");
                }else if (count ==6){
                    System.out.println("恭喜您中奖最高500万!");
                }
            }
        }
    }
}

结果图:
号码数
缺点:判断中奖的循环存在问题,可以直接用中奖金额来分情况判断。

二维数组

内存图:
内存图
特殊情况:
一维数组的内存空间可以先不给出,即定义二维数组时可定义:int[][] arr=new int[2][];
或者定义了之后也可以赋值维度不同的一维数组,因为二维数组存储的是一维数组的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值