Java从入门到精通笔记七

目录

  • 专题课(综合案例)
  • 编程思维训练
    • 1、编程思维
    • 2、关于提升编程思维和编程能力的建议
      • 具体措施:
  • 案例一:买飞机票
    • 需求:
    • 分析:
  • 案例二:找素数
    • 需求:
    • 说明:
    • 分析:
  • 案例三:开发验证码
    • 需求:
    • 分析:
  • 案例四:数组元素的复制
    • 需求:
    • 分析:
  • 案例五:评委打分
    • 需求 :
    • 分析:
  • 案例六:数字加密
    • 需求:
    • 分析:
  • 案例七:抢红包
    • 需求:
    • 分析:
  • 案例八:模拟双色球[拓展]
    • 随机一组中奖号码的分析:
    • 用户输入一组双色球号码分析:
    • 判断中奖情况分析

专题课(综合案例)

编程思维训练

1、编程思维

使用所学的Java技术解决问题的思维方式和编写代码实现出来的能力

2、关于提升编程思维和编程能力的建议

编程思维和编程能力不是一朝一夕形成的,需要时间的沉淀和大量练习

具体措施:

勤于练习代码,勤于思考,孰能生巧
前期:先模仿,后期:再创新

不积跬步,无以至千里;不积小流,无以成江海。

案例一:买飞机票

需求:

机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱
按照如下规则计算机票价格:
旺季(5-10月)头等舱9折,经济舱8.5折
淡季(11月到来年4月)头等舱7折,经济舱6.5折

分析:

1、定义一个方法可以进行键盘录入机票原价、月份和机舱类型
2、使用if判断月份是是旺季还是淡季,使用switch分支判断是头等舱还是经济舱
3、选择对应的折扣进行计算并返回计算的结果

package com.itheima.type;

import java.util.Scanner;

public class TypeDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入机票原价:");
        double price = sc.nextDouble();
        System.out.println("请输入机票月份:");
        int month = sc.nextInt();
        System.out.println("请输入机票所属舱库:");
        String type = sc.next();
        double rs = calc(price, month, type);
        System.out.println("您当前购买机票的价格是:" + rs);
    }
    public static double calc(double price, int month, String type) {
        if(month >= 5 && month <= 10) {
            switch (type){
                case "头等舱":
                    price *= 0.9;
                    break;
                case "经济舱":
                    price *= 0.85;
                    break;
                default:
                     System.out.println("您输入的舱位不正确~~~");
                     price = -1;
            }
        }else if(month == 11 || month == 12 || month >= 1 && month <= 4){
            switch (type){
                case "头等舱":
                    price *= 0.7;
                    break;
                case "经济舱":
                    price *= 0.65;
                    break;
            }
        }else {
            System.out.println("您输入的月份有问题~~~");
            price = -1;
        }
        return price;
    }
}

案例二:找素数

需求:

Java从入门到精通笔记七_第1张图片

说明:

素数:如果除了1和它本身以外,不能被其他正整数整除,就叫素数

分析:

1、101-200之间的数据可以采用循环依次拿到
2、每拿到一个数,判断该数是否是素数
3、从2开始遍历到该数的一半的数据,看是否有数据可以整除它,有则不是素数,没有则是素数

package com.itheima.type;

import java.util.Scanner;

public class TypeDemo1 {
    public static void main(String[] args) {
        prime();
    }
    public static void prime() {
        int count = 0;
        System.out.print("101-200之间素数:");
        for (int i = 101; i <= 200; i++) {
            boolean flag = true;
            for (int j = 2; j < i / 2; j++) {
                if(i % j == 0){
                    flag = false;
                    break;
                }
            }
            if(flag){
                System.out.print(i + "\t");
                count++;
            }
        }
        System.out.println();
        System.out.println("101-200之间素数的个数为:" + count);
    }
}

案例三:开发验证码

需求:

定义方法实现随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母

分析:

1、定义一个方法,生成验证码返回:方法参数是位数、方法的返回值类型是String
2、在方法内部使用for循环生成指定位数的随机字符,并连接起来
3、把连接好的随机字符作为一组验证码进行返回

package com.itheima.type;

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

public class TypeDemo1 {
    public static void main(String[] args) {
        String code = createCode(5);
        System.out.println("随机生成的验证码为:" + code);
    }
    public static String createCode(int n) {
        String code = "";
        Random r = new Random();
        for (int i = 0; i < n; i++) {
            int type = r.nextInt(3);
            switch (type) {
                case 0:
                    //大写字母
                    char ch1 = (char)(r.nextInt(26) + 65);
                    code += ch1;
                    break;
                case 1:
                    //大写字母
                    char ch2 = (char)(r.nextInt(26) + 97);
                    code += ch2;
                    break;
                case 2:
                    //数字
                    code += r.nextInt(10);
                    break;
            }
        }
        return code;
    }
}

案例四:数组元素的复制

需求:

把一个数组中的元素复制到另一个新数组中去

分析:

1、需要动态初始化一个数组,长度与原数组一样
2、遍历原数组的每个元素,依次赋值给新数组
3、输出两个数组的内容

package com.itheima.type;

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

public class TypeDemo1 {
   public static void main(String[] args) {
       int[] arr1 = {11, 22, 33, 44};
       int[] arr2 = new int[arr1.length];
       copy(arr1, arr2);
       printArray(arr1);
       printArray(arr2);
   }
   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.println("]");
   }
   public static void copy(int[] arr1, int[] arr2) {
       for (int i = 0; i < arr1.length; i++) {
           arr2[i] = arr1[i];
       }
   }
}

案例五:评委打分

需求 :

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

分析:

1、把6个评委的分数录入到程序中去 ----> 使用数组
2、遍历数组中每个数据,进行累加求和,并找出最高分、最低分
3、按照分数的计算规则算出平均分

package com.itheima.type;

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

public class TypeDemo1 {
    public static void main(String[] args) {
        int[] scores = new int[6];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; i++) {
            System.out.print("请输入第" + (i + 1) + "个评委的打分:");
            scores[i] = sc.nextInt();
        }
        int max = scores[0];
        int min = scores[0];
        int sum = scores[0];
        for (int i = 1; i < scores.length; i++) {
            if(min > scores[i]){
                min = scores[i];
            }
            if(max <scores[i]){
                max = scores[i];
            }
            sum += scores[i];
        }
        System.out.println("最高分是:" + max);
        System.out.println("最低分是:" + min);
        double res = (sum - max - min) * 1.0 / (scores.length - 2);
        System.out.println("选手最终平均得分是:" + res);
    }
}

案例六:数字加密

需求:

某系统的数字密码,比如1983,采用加密方式进行传输,
规则如下:先得到每位数,然后每位数都加上5 , 再对10求余,最后将所有数字反转,得到一串新数。

分析:

1、将每位数据存入到数组中去,遍历数组每位数据按照规则进行更改,把更改后的数据从新存入到数组中
2、将数组的前后元素进行交换,数组中的最终元素就是加密后的结果

package com.itheima.type;

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

public class TypeDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请您输入需要加密的数字个数:");
        int length = sc.nextInt();
        int[] arr1 = new int[length];
        for (int i = 0; i < arr1.length; i++) {
            System.out.print("请输入第" + (i + 1) + "数字密码:");
            arr1[i] = sc.nextInt();
        }
        System.out.println("加密后的密码为:" + enCode(length, arr1));
    }
    public static int enCode(int length, int[] arr1){
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = (arr1[i] + 5) % 10;
        }
        int temp;
        for (int i = 0, j = arr1.length - 1; i < j; i++, j--) {
            temp = arr1[i];
            arr1[i] = arr1[j];
            arr1[j] = temp;
        }
        int res = arr1[3] + arr1[2] * 10 + arr1[1] * 100 + arr1[0] * 1000;
        return res;
    }
}

案例七:抢红包

需求:

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

分析:

1、定义一个数组用于存储这些奖金金额
2、定义一个数组用于记录已经抽到的金额。
3、每次抽奖都随机一个索引,取出索引对应的奖金金额,判断该金额之前是否抽中过,抽中过从新抽一次

package com.itheima.type;

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

public class TypeDemo1 {
    public static void main(String[] args) {
        int[] redPacket = {2, 588, 888, 1000, 10000};
        boolean[] redPacketStatus = new boolean[redPacket.length];
        for (int i = 0; i < redPacketStatus.length; i++) {
            redPacketStatus[i] = true;
        }
        Random r = new Random();
        int i = 0;
        while (true){
            int money = r.nextInt(redPacket.length);
            if(redPacketStatus[money]){
                System.out.println(redPacket[money] + "元的奖金被抽出");
                i++;
            }
            redPacketStatus[money] = false;
            if(i == redPacket.length) break;
        }
    }
}

案例八:模拟双色球[拓展]

随机一组中奖号码的分析:

1、中奖号码由6个红球和1个篮球组成(注意:6个红球要求不能重复)
2、可以定义方法用于返回一组中奖号码(7个数据),返回的形式是一个整型数组

用户输入一组双色球号码分析:

1、定义一个方法,该方法可以录入用户输入的6个红球和1个篮球号码
2、该方法最终需要返回一个数组,数组中就是用户录入的号码(7位)

判断中奖情况分析

1、定义一个方法,可以接收中奖号码的数组,用户选号的数组
2、根据命中红球数和篮球数判断最终的中奖情况并输出详情和中奖金额

package com.itheima.type;

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

public class TypeDemo1 {
    public static void main(String[] args) {
        int[] luckNumbers = createLuckNumbers();
        
        int[] userNumbers = userInputNumbers();

        judge(luckNumbers, userNumbers);
    }
    //打印数组
    public static void printArry(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + "\t");
        }
        System.out.println("]");
    }
    //随机生成中奖号码
    public static int[] createLuckNumbers(){
        int[] numbers = new int[7];
        boolean[] numbersStatus1 = new boolean[33];
        for (int i = 0; i < numbersStatus1.length; i++) {
            numbersStatus1[i] = true;
        }
        Random r = new Random();
        int i = 0;
        while(true){
            int num1 = r.nextInt(33) + 1;
            if(numbersStatus1[num1 - 1]){
                numbers[i] = num1;
                numbersStatus1[num1 - 1] = false;
                i++;
            }
            if(i == numbers.length - 1) break;
        }
        numbers[numbers.length - 1] = r.nextInt(16) + 1;
        return numbers;
    }
    //录入用户号码
    public static int[] userInputNumbers(){
        int[] numbers = new int[7];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < numbers.length - 1; i++) {
            System.out.print("请您输入第" + (i + 1) + "个号码(在1-33之间且号码不能重复):");
            numbers[i] = sc.nextInt();
        }
        System.out.print("请您输入第7个号码(在1-16之间):");
        numbers[6] = sc.nextInt();
        return  numbers;
    }
    //判断用户是否中奖
    public static void judge(int[] luckNumbers, int [] userNumbers){
        int redHitNumbers = 0;
        for (int i1 = 0; i1 < userNumbers.length - 1; i1++) {
            for (int i = 0; i < luckNumbers.length - 1; i++) {
                if(luckNumbers[i] == userNumbers[i1]){
                    redHitNumbers++;
                    break;
                }
            }
        }
        int blueHitNumbers = userNumbers[6] == luckNumbers[6] ? 1 : 0;

        System.out.println("中奖号码是:");
        printArry(luckNumbers);
        System.out.println("您投注的号码是:");
        printArry(userNumbers);
        System.out.println("您命中了" + redHitNumbers + "个红球");
        System.out.println("您命中了" + blueHitNumbers + "个蓝球");

        if(blueHitNumbers == 1 && redHitNumbers < 3)
            System.out.println("恭喜您,中了5元小奖!");
        else if(blueHitNumbers == 1 && redHitNumbers == 3
        || blueHitNumbers ==0 && redHitNumbers == 4)
            System.out.println("恭喜您,中了10元小奖!");
        else if(blueHitNumbers == 1 && redHitNumbers == 4
                || blueHitNumbers ==0 && redHitNumbers == 5)
            System.out.println("恭喜您,中了200元!");
        else if(blueHitNumbers == 1 && redHitNumbers == 5)
            System.out.println("恭喜您,中了3000元大奖!");
        else if(blueHitNumbers == 0 && redHitNumbers == 6)
            System.out.println("恭喜您,中了500万超级大奖!");
        else if(blueHitNumbers == 1 && redHitNumbers == 6)
            System.out.println("恭喜您,中了1000万巨奖!可以开始享受人生,诗和远方!!");
        else System.out.println("感谢您为福利事业做出的突出贡献!!");

    };
}

你可能感兴趣的:(黑马java入门笔记,java,开发语言,后端)