第七课 Java基础篇——阶段性综合练习

案例一、卖飞机票

需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。

按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季〔11月到来年4月)头等舱7折,经济舱6.5折。

//快捷键Ctrl+Alt+M 自动抽取方法

package cn.nwafu;

import java.util.Scanner;

public class test01 {
    public static void main(String[] args) {
        //卖飞机票
        //需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
        //按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折
        // 淡季〔11月到来年4月)头等舱7折,经济舱6.5折。

        //分析:
        //键盘录入机票的原价,月份,舱型
        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语句
        if (month >= 5 && month <= 10) {//旺季
//            if(seat == 0){//判断舱型
//                //头等舱
//                ticket = (int)(ticket*0.9);
//            }else if(seat == 1){
//                //经济舱
//                ticket = (int)(ticket*0.85);
//            }else{//没有这个舱型
//                System.out.println("没有这个舱位");
//            }以上注释正常初学者写法,下面用方法改进代码
            ticket = getPrice(ticket, seat, 0.9, 0.85);
        } else if ((month >= 1 && month <= 4) || (month >= 11 && month <= 12)) {//淡季
//            if(seat == 0){//判断舱型
//                //头等舱
//                ticket = (int)(ticket*0.7);
//            }else if(seat == 1){
//                //经济舱
//                ticket = (int)(ticket*0.65);
//            }else{//没有这个舱型
//                System.out.println("没有这个舱位");
//            }
            ticket = getPrice(ticket, seat, 0.7, 0.65);
        } else {//月份不合法
            System.out.println("键盘录入的月份不合法");
        }
        System.out.println(ticket);//打印机票
    }
        //1.我要干嘛?根据舱位和折扣来计算最终的票价
        //2.我干这件事,需要什么才能完成?原价 舱位 头等舱的折扣 经济舱的折扣
        // 3.方法的调用处是否需要继续使用这个结果 需要
        public static int getPrice(int ticket,int seat,double v0,double v1){
            if(seat == 0){//判断舱型
                //头等舱
                ticket = (int)(ticket*v0);
            }else if(seat == 1){
                //经济舱
                ticket = (int)(ticket*v1);
            }else{//没有这个舱型
                System.out.println("没有这个舱位");
            }
            return ticket;
        }
}

案例二、找质数

需求:判断101-200之间有多少个素数,并输出所有素数。

package cn.nwafu;

public class test02 {
    public static void main(String[] args) {
        //找质数
        //需求:判断101-200之间有多少个素数,并输出所有素数。

        //变量统计个数
        int count = 0;

        for (int i = 101; i <= 200; i++) {//范围101~200
            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

前四位是大写字母或者小写字母

最后一位是数字

package cn.nwafu;

import java.util.Random;

public class test03 {
    public static void main(String[] args) {
        //开发验证码
//    需求:定义方法实现随机产生一个5位的验证码
//    验证码格式: 长度为5
//              前四位是大写字母或者小写字母
//              最后一位是数字

        //分析
        //大写字母与小写字母放在一个数组中
        char[] chs = new char[52];
        for (int i = 0; i < chs.length; i++) {
            if(i <=25){
                chs[i] =(char)(97+i);
            }else{
                chs[i] =(char)(65+i-26);
            }
        }
//        for (int i = 0; i < chs.length; i++) {
//            System.out.println(chs[i]);
//        }
        //随机抽取四次
        String result = "";//拼接
        Random r =new Random();
        for (int i = 0; i < 4; i++) {
            int randomIndex = r.nextInt(chs.length);
            //System.out.println(chs[randomIndex]);
            result = result + chs[randomIndex];
        }
       // System.out.println(result);

        //随机抽取一个数字0~9
        int number = r.nextInt(10);
        result += number;
        //打印结果
        System.out.println(result);
    }
}

案例四、数组元素的复制

需求:把一个数组中的元素复制到另一个新数组中去。

package cn.nwafu;

public class test04 {
    public static void main(String[] args) {
        //数组复制

        int[] arr ={1,2,3,4,5};
        int[] newarr =new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newarr[i] = arr[i];
        }
        for (int i = 0; i < newarr.length; i++) {
            System.out.println(newarr[i]);
        }
    }
}

案例五、评委打分

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

package cn.nwafu;

import java.util.Scanner;

public class test05 {
    public static void main(String[] args) {
        //评委打分
        //需求:在唱歌比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数。
        // 选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。

        //建立数组
        int[] scoreArr = getScores();
//        for (int i = 0; i < scoreArr.length; i++) {
//            System.out.println(scoreArr[i]);
//        }
        //求最大值
        int max = getMax(scoreArr);
        //求最小值
        int min = getMin(scoreArr);
        //求总和
        int sum = getSum(scoreArr);
        //求(总和-最大值-最小值)/4
        //int result = (sum-max-min) / 4 ;
        int result = (sum -max -min) / (scoreArr.length-2);//这样写代码更灵活
        //打印结果
        System.out.println("选手最终的得分是:"+ result);
    }
    //新建一个方法 将老师打的分数键盘录入,并且存入数组中,返回数组以便后续操作
    public static int[] getScores(){
        int[] scores = new int [6];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; ) {//没有i++,在下面
            System.out.println("请输入评委的打分");
            int score = sc.nextInt();

            if(score>=0&&score<=100) {
                scores[i] = score;
                i++;//成绩有效i才加1,否则不加1,注意i++位置
            }else{
                System.out.println("成绩超出了范围,继续录入,当前的i为:" + i);
            }
        }
        return scores;
    }
    //求最大值
    public static int getMax( int[] scoreArr){
        int max = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if (scoreArr[i]>max){
                max = scoreArr[i];
            }
        }
        return max;
    }
    //求最小值
    public static int getMin( int[] scoreArr){
        int min = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if (scoreArr[i]<min){
                min = scoreArr[i];
            }
        }
        return min;
    }
    //求总和
    public static int getSum(int[] scoreArr){
        int sum = 0;
        for (int i = 0; i < scoreArr.length; i++) {
            sum += scoreArr[i];
        }
        return sum;
    }

}

案例六:数字加密

需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。

规则如下:

先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数。

package cn.nwafu;

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

        //分析
        //1.把整数里面的数字放入数组中

        //没有思路时:
        //方法:反向推导
        //计算数组的长度
        int inputNumber = 123456;
        //定义一个变量临时记录inputNumber的值,为了第三步能够再次使用
        int temp0 = inputNumber;
        int count = 0;
        while(inputNumber != 0){
            inputNumber = inputNumber /10;
            count ++;
        }
        //System.out.println(count);
        //需要一个数组容器,动态数组需要长度值
        int[] arr = new int[count];
        //把数字依次放入数组中,需要拆分数字
        int index = arr.length-1;
        while(temp0 != 0){
            int ge = temp0 % 10;
            arr[index] = ge;
            temp0 = temp0 / 10;
            index --;
        }
        //for (int i = 0; i < arr.length; i++) {
        //    System.out.print(arr[i]+" ");
        //}
       // int[] arr ={1,9,8,3};
        //2.加密
        //每位数加5
        for (int i = 0; i < arr.length; i++) {
            arr[i] += 5;
        }
        //对10取余
        for (int i = 0; i < arr.length; i++) {
            arr[i] %= 10;
        }
        //反转
        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++) {
//            System.out.print(arr[i]+" ");
//        }

        //3.拼接
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number *10 + arr[i];
        }
        System.out.println(number);
    }
}

练习 、数字解密

将加密后的数据解密出来

package cn.nwafu;

public class test07 {
    public static void main(String[] args) {
        //数字解密

        //1.定义一个数组记录解密之后的结果
        int arr[] = {8, 3, 4, 6};
        //2.反转
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

        //3.由于加密是通过对10取余的方式获取的
        //所以在解密的时候需要判断:0~4之间+10,5~9数字不变
        //与最大值最小值有关
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= 0 && arr[i] <= 4) {
                arr[i] += 10;
            }
        }
        //4.减5
        for (int i = 0; i < arr.length; i++) {
            arr[i] -= 5;
        }
        //5.拼接
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number * 10 + arr[i];
        }
        System.out.println(number);
//        for (int i = 0; i < arr.length; i++) {
//            System.out.print(arr[i] + " ");
//        }
    }
}

案例七、抢红包

需求:

一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下︰(随机顺序,不一定是下面的顺序)

package cn.nwafu;

import java.util.Random;

public class test08 {
    public static void main(String[] args) {
        //抢红包
        //需求:一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。
        //请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。

        //定义一个数组作为奖池
        int[] arr = {2, 588, 888, 1000, 10000};
        //定义一个数组存放抽奖结果
        int[] newArr = new int[arr.length];
        //抽奖
        Random r = new Random();
        //因为有5个奖项,所以循环5次
        for (int i = 0; i < 5; ) {
            //获取随机索引
            int randomIndex = r.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]+"的奖金被抽出");
        }
    }
        //判断奖项是否存在
        //存在:true
        //不存在:false
        public static boolean contains(int[] newArr,int prize){
            for (int i = 0; i < newArr.length; i++) {
                if (prize == newArr[i]){
                    return true;
                }
            }
            return false;
        }
}

上面的代码有点复杂,效率较低,下面进行了一次优化,思想是奖金池打乱顺序再遍历即可。

package cn.nwafu;

import java.util.Random;

public class testOptimize08 {
    public static void main(String[] args) {
        //抢红包
        //需求:一个大V直播抽奖,奖品是现金红包,分别有{2,588 ,888,1000,10000}五个奖金。
        //请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。

        //定义一个数组作为奖池
        int[] arr = {2, 588, 888, 1000, 10000};
        //打乱顺序,避免重复问题且效率更高
        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]+"的奖金被抽出");
        }
    }
}

案例八、模拟双色球

package cn.nwafu;

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

public class test09 {
    public static void main(String[] args) {
        //双色球系统
        //红1~33 蓝1~16
        //投注号码 6红1蓝 中将条件和奖金表略,可以上网查

        //随机生成中奖号码
        int[] arr = creatNumber();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println("");
        //用户输入购买号码
        int[] userInputArr = userInputNumber();
//        for (int i = 0; i < userInputArr.length; i++) {
//            System.out.print(userInputArr[i] + " ");
//        }
        //判断中奖情况
        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++;
        }
        //System.out.println("");
        //System.out.println(redCount);
        //System.out.println(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)){
            System.out.println("恭喜你中五等奖,100元!");
        }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[] creatNumber(){
        //定义一个数组存储投注号码
        int[] arr = new int[7];

        //生成六个红球和1个蓝球
        //红球不能重复,需要判断
        //蓝球可以与红球重复
        Random r = new Random();
        for (int i = 0; i < 6; ) {
            //获取红球号码
            int redNumber = r.nextInt(33)+1;
            boolean flag = contain(arr,redNumber);
            if(!flag){
                arr[i] = redNumber;
                i++;
            }

        }
        //获取蓝球号码
        int blueNumber = r.nextInt(16)+1;
        arr[arr.length-1] = blueNumber;

        return arr;
    }
    //判断红球号码是否重复
    public static boolean contain(int[] arr,int redNumber){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == redNumber){
                return true;
            }
        }
        return false;
    }
    //用户输入购买的彩票号码
    public static int[] userInputNumber(){
        int[] arr = new int[7];
        Scanner sc = new Scanner(System.in);
        //输入红球号码
        for (int i = 0; i < 6; ) {
            System.out.println("请输入第"+(i+1)+"个红球号码");
            int redNumber = sc.nextInt();
            if(redNumber >= 1 && redNumber <= 33){//判断红球是否唯一
                boolean flag = contain(arr,redNumber);//判断红球是否在范围中
                if (!flag){
                    arr[i] = redNumber;
                    i++;
                }else{
                    System.out.println("当前红球号码已存在,请重新输入");
                }
            }else{
                System.out.println("当前红球号码超出范围");
            }
        }
        //输入蓝球号码
        System.out.println("请输入蓝球号码");
        while (true) {//快捷键ctrl+alt+t
            int blueNumber = sc.nextInt();
            if(blueNumber >= 1 && blueNumber <=16){
                arr[arr.length-1] = blueNumber;
                break;
            }else{
                System.out.println("当前蓝球超出范围");
            }
        }
        return arr;
    }
}

最后一个案例比较综合,对初学者不太友好,有兴趣的可以试一试,贴合生活实际!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值