Java入门基础7:Java入门案例小练习

我们对前面五章的知识通过一些案例,来达到综合运用的效果,知识点单独提出来都很简单,关键的是会用,所以大家一定要多动脑筋,自己动手敲一遍试试,即使不能敲完整,也更有助于理解答案。

接下来,给大家提供八个案例,这些案例都是我看黑马Java的时候记的笔记,分享给大家。

案例一:买飞机票

需求:用户购买机票时,机票原价会按照淡季、旺季,头等舱还是经济舱的情况进行相应的优惠,优惠方案如下:

5-10月为旺季,头等舱9折,经济舱8.5折;11月到来年4月为淡季,头等舱7折,经济舱6.5折,
请开发程序计算出用户当前机票的优惠价。

分析:
1、方法是否需要接收数据?需要接收机票原价、当前月份、舱位类型;

2、方法是否需要返回数据?需要返回计算出的机票优惠价。

3、方法内部:先使用if判断月份是旺季还是淡季,然后使用switch分支判断是头等舱还是经济舱。

参考答案:

public class Text1 {
    public static void main(String[] args) {
        //完成购买飞机票的案例
        double prise = calculate(1500,5, "头等舱");
        System.out.println("优惠价格为:" + prise);
    }
    public static double calculate(double prise, int month, String type ){
        if(month >= 5 && month <= 10){
            //旺季
            //判断仓位位置
            switch(type){
                case"头等舱":
                    prise *= 0.9;
                    break;
                case "经济舱":
                    prise *= 0.85;
                    break;
            }
        }else{
            //淡季
            //判断仓位位置
            switch(type) {
                case "头等舱":
                    prise *= 0.7;
                    break;
                case "经济舱":
                    prise *= 0.65;
                    break;
            }
        }
        return prise;
    }
}

输出结果:

案例二:开发验证码

需求:开发一个程序,可以生成指定位数的验证码,每位可以是数字、大小写字母。

分析:
1、方法是否需要接收数据?需要接收一个整数,控制生成验证码的位数。

2、方法是否需要返回数据?需要返回生成的验证码。

3、方法内部的业务:使用for循环依次生成每位随机字符,并使用一个String类的变量把每个字符连接起来,最后返回该变量即可。

参考答案:

import java.util.Random;

public class Text2 {
    public static void main(String[] args) {
        //开发验证码
        System.out.println(cratecode(5));
    }
    public static String cratecode(int n){
        //1.定义一个for循环来记住产生多少的验证码字符
        Random r =new Random();
        String code = "";
        for (int i = 1; i <= n; i++) {
            //随机一个0 1 2之间的数字出来,0代表随机数字,1代表随机大写字母,2代表随机小写字母
            int type = r.nextInt(3);//0 1 2
            switch(type){
                case 0:
                    //生成随机数字
                    code += r.nextInt(10);//1-10的随机数
                    break;
                case 1:
                    //生成随机大写字母
                    char rs1 = (char)(r.nextInt(26) + 65);
                    code += rs1;
                    break;
                case 2:
                    //生成随机小写字母
                    char rs2 =(char)(r.nextInt(26) + 97);
                    code += rs2;
                    break;
            }
        }
        return code;//返回验证码
    }
}

 输出结果(不唯一):

案例三:评委打分

需求:在唱歌比赛中,可能有多名评委要给选手打分,分数是[0-100]之间的整数。选手最后得分为:去掉最高分、最低分后剩余分数的平均分,请编写程序能够录入多名评委的分数,并算出选手的最终得分。

分析:
1、方法是否需要接收数据进行处理?需要接收评委的人数。

2、方法是否需要返回数据?需要返回计算出的选手最终得分

3、方法内部的业务:定义数组,录入评委的分数存入到数组中去,接着,我们就需要遍历数组中的分数,计算出总分,并找出最高分,最低分、最后按照这些数据算出选手最终得分并返回即可。

参考答案:

import java.util.Scanner;

public class Text3 {
    public static void main(String[] args) {
        //评委打分案例
        System.out.println("最终得分是:" + veragescore(7));
    }
    public static double veragescore(int number){
        //1.定义一个动态初始化数组,负责后期录入评委打分
        int[] scores = new int[number];
        //2.遍历数组的每一个位置,依次录入评委的分数
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; i++) {
            System.out.println("请输入第" + (i + 1) + "个评委的分数:");
            int score = sc.nextInt();//创建键盘扫描器
            scores[i] = score;//将输入的值遍历到数组
        }
        //3.从数组中计算总分,找出最值,计算总分
        //设置变量
        int sum = 0;
        int max =scores[0];
        int min =scores[0];
        for (int i = 0; i < scores.length; i++) {
            int score = scores[i];
            //求和
            sum += score;
            //找最值
            if (score > max) {
                max = score;
            }
            if (score < min){
                min = score;
            }
        }
        //计算总分
        double average = 1.0*(sum - max -min) / (number - 2);
        return average;
    }
}

输出结果(数据不唯一):

案例四:数字加密

需求:

某系统的数字密码是一个四位数,如1983,为了安全,需要加密后再传输,加密规则是:对密码中的每位数,都加5,再对10求余,最后将所有数字顺序反转,得到一串加密后的新数,请设计出满足本需求的加密程序!

分析:

1.方法是否需要接收数据进行处理?需要接收四位数字密码,进行加密处理。

2.方法是否需要返回数据?需要返回加密后的结果。

3.方法内部的业务:将四位数字密码拆分成一个一个的数字,存入到数组中去,遍历数组中的每个数字,按照题目需求进行加密!最后,再把加密后的数字拼接起来返回即可!

参考答案:

import static java.util.Collections.reverse;

public class Text4 {
    public static void main(String[] args) {
        //完成数字加密的程序开发
        String engrypt = encrypt(1983);
        System.out.println("加密后的结果是:" + engrypt);
    }
    public static String encrypt(int number) {
        //number = 1983
        //1.把这个密码拆分成一个一个的数字,才可以对其进行加密
        int[] numbers = split(number);

        //2.遍历这个数组中的每一个数字,对其进行加密处理
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = (numbers[i] + 5) % 10;
            //3.对数组反转,把对数组进行反转的操作交给一个独立的方法来完成
        }
         reverse(numbers);
            //4.把这些加密的数字连接起来作为加密后的结果返回即可
            String data = "";
            for (int j = 0; j < numbers.length; j++) {
                data += numbers[j];
            }
            return data;
    }
        //拆分数字的方法
    private static int[] split(int number) {
        int[] numbers = new int[4];
        numbers[0] = number / 1000;
        numbers[1] = (number / 100) % 10;
        numbers[2] = (number / 10) % 10;
        numbers[3] = number % 10;
        return numbers;
    }
        //反转数字的方法
    private static void reverse(int[] numbers) {
        for (int i = 0 , j = numbers.length - 1; i < j; i++ , j--) {
            int temp = numbers[j];
            numbers[j] = numbers[i];
            numbers[i] = temp;
        }
    }
}

输出结果:

案例五:数组拷贝

需求:

请把一个整型数组,例如存了数据:11,22,33,拷贝成一个一模一样的新数组出来。

分析:

1、方法是否需要接收数据进行处理?需要接收一个整型数组(原数组)。

2、方法是否需要返回数据?需要返回一个新的、一模一样的整型数组。

3、方法内部的业务:创建一个长度一样的整型数组做为新数组,并把原数组的元素对应位置
赋值给新数组,最终返回新数组即可。

参考答案:

public class Text5 {
    public static void main(String[] args) {
    //掌握数组拷贝
        int[] arr = {11,22,33};
        int[] arr2 =copy(arr);
        printArray(arr2);
        ///注意:下面这个不是拷贝数组,只是把数组变量赋值给另一个数组变量,实际在堆内存中的地址并没有改变
//        int[] arr3 = arr;
//        arr3[1] = 666;
//        System.out.println(arr[1]);
    }
    //建议创建一个新方法打印数组
    public static void printArray(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ",");
        }
        System.out.print("]");
    }
    public static int[] copy(int[] arr){
        //1.创建一个一个长度一样的整形数组出来
        int[] arr2 = new int[arr.length];
        //2.把原数组的元素值对应位置赋值给新数值
        for (int i = 0; i < arr.length; i++) {
            arr2[i] = arr[i];
        }
        return arr2;
    }
}

输出结果:

案例六:抢红包

需求:

一个大V直播时发起了抢红包活动,分别有:9、666、188、520、99999五个红包。请模拟粉丝来抽奖,按照先来先得,随机抽取,抽完即止,注意:一个红包只能被抽一次,先抽或后抽哪一个红包是随机的,示例如下(不一定是下面的顺序):

分析:
1、方法是否需要接收数据进行处理?需要接收一个数组,里面是5个金额,表示5个红包。

2、方法是否需要返回数据?不需要。

3、方法内部完成本需求的第1种方案:写个for循环控制抽奖5次,每次抽奖,都从数组中随机找出
一个金额,如果该金额不是0,则代表抽中,接着用0替换该位置处的金额,然后继续下一个粉丝的抽奖;如果抽中的金额发现是0,代表该位置处的红包之前被别人抽走了,则从新从数组中随机找出一个金额,继续判断!直至抽中的金额不是0!

参考答案:

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

public class Text6 {
    public static void main(String[] args) {
        //抢红包案例
        int[] arr = {9,66,188,9999,8888};
        start(arr);
    }
    public static void start(int[] moneys){
        Scanner sc = new Scanner(System.in);
        Random r = new Random();
        //1.定义一个for循环,控制抽奖5次
        for (int i = 1; i <= 5 ; i++) {
            //2.提示抽奖
            System.out.println("请输入任意内容进行抽奖:");
            sc.next();//等待用户输入内容,按了回车才能进行往下走

            //3.为当前对象找一个随机红包出来

            while (true) {
                int index =r.nextInt(moneys.length);

                int money = moneys[index];

                //4.判断这个红包是否为0
                if(money != 0){
                    System.out.println("恭喜您,抽中了红包:" + money);
                    moneys[index] = 0;
                    break;
                }
            }
        }
    }
}

案例七:找素数

需求:

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

说明:除了1和它本身以外,不能被其他正整数整除,就叫素数。
比如:3、7就是素数,而9、21等等不是素数。

分析:

1.方法是否需要接收数据进行处理?需要接收101以及200,以便找该区间中的素数。

2.方法是否需要返回数据?需要返回找到的素数个数。

3.方法内部的实现逻辑:使用f0循环来产生如101到200之间的每个数;每拿到一个数,判断该数是否是素数;判断规则是:从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数;根据判定的结果来决定是否输出这个数据(是素数则输出);最后还需要统计素数的个数并返回。

参考答案:

public class Test7 {
    public static void main(String[] args) {
        //找素数
        System.out.println("当前的素数个数是:" + search(2, 200));
    }
    public static int search(int start,int end){
        //要求找一个区间的素数比如[101,200]
        //1.定义一个for循环找到101到200之间的每个数据
        int count = 0;//用来返回素数个数
        for (int i = start; i <= end; i++) {
            //信号位思想
            boolean flag = true;//假设的意思:默认认为当前i记住的数据是素数
            //2.判断i当前记住的这个数据是否为素数
            for (int j = 2; j <= i / 2 ; j++) {
                if (i % j ==0){
                    //i当前记住的这个数据不是素数了
                    flag = false;
                    break;
                }
            }
            //3.根据判定的结果决定是否输出i当前记住的数据,是素数才输出展示
            if(flag){
                System.out.println(i);
                count++;
            }
        }
        return count;
    }
}

上面这个例子我们还可以为外部循环指定标签,这样就不需要判断假设了,代码会更加简洁:

public static int search(int start,int end){
        //要求找一个区间的素数比如[101,200]
        //1.定义一个for循环找到101到200之间的每个数据
        int count = 0;//用来返回素数个数
        OUT://为外部循环制定标签
        for (int i = start; i <= end; i++) {
            //2.拦截判断该数是否为素数
            for (int j = 2; j <= i / 2 ; j++) {
                if (i % j ==0){
                    //i当前记住的这个数据不是素数了
                    continue OUT;
                }
            }
            count++;
            System.out.println(i);
        }
        return count;
    }

输出结果:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 当前的素数个数是:46

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值