Bootstrap

入门到入土,java学习day5(练习巩固前面所学,二维数组)

1.开发验证码,定义方法实现随机产生一个5位验证码,长度5,前四位是大写字母或者小写字母,最后一位是数字

首先看要求,是随机生成,5位,前四位大小写字母,最后一位数字

随机生成我们只知道是一个随机的数,并不知道怎么生成字母,所以怎么用过数字得到字母,就是将数字当作索引在数组中得到字母,那数组怎么定义,这里就要用到ASCII码表来将大小写字母放进去。细节问题就是,大写字母直接从97+i开始,但是小写字母判定条件是要i>25才进入语句,所以要从65开始,就要再减去26.

其实就是数组和随机数,键盘输入的应用

package test;
import java.util.Random;

public class hws {
    public static void main(String[] args) {
       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.print(chs[i] + " ");
       }
       String str = "";
       //随机抽取4次
       Random r = new Random();
       for (int i = 0; i < 4; i++) {
          int randomIndex = r.nextInt(chs.length);
          System.out.println(chs[randomIndex]);
          str += chs[randomIndex];
       }
       int number = r.nextInt(10);
       str += number;
       System.out.println("验证码为:" + str);
    }
}

2.拷贝数组

这个就是循环遍历就行

package test;

public class test1 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int[] arr1 = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            arr1[i] = arr[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]);
        }
    }
}

3.评委打分,歌唱比赛中,有6名评委给选手打分,分数范围是[0-100]之间的整数,选手的最后得分为:去掉最高分,在最低分后的4个评委的平均分,计算得分。

首先看要求,6个打分输入,0-100范围,去掉最高和最低,求4个平均

打分输入我们就正常键盘录入就行,然后判断一下是否符合范围,然后将6个数字放到数组中。然后之前学过,遍历数组将初始最大和最小定位数组第一个数,然后遍历比较,得到两个数,这个时候也不用麻烦操作数组,直接用两个变量记录最大和最小值,然后遍历加起来减去,然后求平均就行。

package test;
import java.util.Scanner;

public class test2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[6];

        // 提示用户输入 6 个评委的打分
        System.out.println("请输入 6 个评委的打分(分数范围是 0 - 100 之间的整数):");
        for (int i = 0; i < arr.length; i++) {
            System.out.print("请输入第 " + (i + 1) + " 个评委的打分:");
            arr[i] = scanner.nextInt();
            // 检查输入的分数是否在 0 - 100 之间
            while (arr[i] < 0 || arr[i] > 100) {
                System.out.println("输入的分数不在 0 - 100 之间,请重新输入:");
                arr[i] = scanner.nextInt();
            }
        }

        int max = arr[0];
        // 替换为增强 for 循环来找出最大值
        for (int num : arr) {
            if (num > max) {
                max = num;
            }
        }

        int min = arr[0];
        // 替换为增强 for 循环来找出最小值
        for (int num : arr) {
            if (num < min) {
                min = num;
            }
        }

        int sum = 0;
        // 替换为增强 for 循环来计算总和
        for (int num : arr) {
            sum += num;
        }

        sum = sum - max - min;
        int avg = sum / (arr.length - 2);
        System.out.println("最终得分为" + avg);

        // 关闭 Scanner 对象
        scanner.close();
    }
}

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

首先看要求,键盘录入,得到每一位数,加5,10求余,反转

可以看到我注释掉了一部分代码,我将分为两个思路

(1)有的人觉得,密码可以直接写到数组里面,毕竟你是知道的,但我觉得这样功能性可能不是很强,这样的话你直接就得到每一位数,那就不用我写的循环去获取,注释掉的代码就可以用了

(2)我自己是用的键盘录入,获取密码,然后用回文数那里的思路来获取每一位数,这个是后其实就已经反转了,然后直接进行后面的操作可能更简单一些

扩展:解密

解密过程中减5,反转都是简单的,唯一的难点是对10取余

这里我用的是一些数学思想,因为你每一位数,最大就是9,大于等于5的数加5,取余才会出现小于5的数,其他都其实不变,所以我们可以用判断来看这个数取余之前是多少。

package test;
import java.util.Scanner;

public class test3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int r = scanner.nextInt();
        int []  arr = new int[4];
        for (int i = 0; r != 0; i++) {
            arr[i] = r%10;
            r = r/10;
        }
        add(arr);
        yu(arr);
        //reverse(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }

    }
    public static void add(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] += 5;
        }
    }
    public  static void yu(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] %= 10;
        }
    }
   /* public static void reverse(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;
        }
    }*/
}

6.抢红包,一个大V直播抽奖,奖品是现金红包,分别由{2,588,888,1000,10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。

首先看要求,明确的数组,拿出不放回,随机,打印

总体的思路,就是随机下标,拿出来,然后再进行这个过程,只是要判断一下是否重复,这里如果只是在原数组里面操作,可能就没有思路。其实只要新建一个数组用来接收抽过的,然后在这个新数组里面判断就行。

细节问题可能就是,循环时控制语句需要成功是才运行,所以要放到里面。因为如果在上面,就是错误的逻辑,会少数字,因为重复时没有记录但是缺增加了控制,少一次。

package test;

import java.util.Random;

public class test4 {
    public static void main(String[] args) {
        int[] arr = {2, 588, 888, 1000, 10000};
        int[] arr1 = new int[arr.length];
        Random random = new Random();
        for (int i = 0; i < arr.length; ) {
            int randomIndex = random.nextInt(arr.length);
            int prize = arr[randomIndex];
            boolean flag = contain(arr1, prize);
            if (!flag) {
                arr1[i] = prize;
                i++;
            }
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }

    public static boolean contain(int[] arr1, int prize) {
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] == prize) {
                return true;
            }
        }
        return false;
    }
}

7.模拟双色球,投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择

这个代码就复杂一些,如果成功写出,说明前面的学习没有问题了。

要求不多,6红1-33随机不重复,1蓝1-16,然后判断,复杂的点可能就是系统生成一个用户输入一个

就是两个个长度位7的数组,一个是随机生成不重复需要判断,控制条件放到里面,一个时键盘录入也要判断,最后一位直接赋值很方便。然后就是比较两个数组,因为不在意顺序,可以用两个循环来实现,外循环控制比较那个数,内循环遍历比较看是否存在,注意索引范围,然后用一个变量来记录数量。蓝色的更简单,直接,比较最后一位。得到匹配数字,根据条件,写if判断语句打印输出就好。

package test;

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

public class test7 {
    public static void main(String[] args) {
            int[] arr = create();
            int[] userArr = userInput();
            int redCount = 0;
            int blueCount = 0;
            for(int i = 0; i < userArr.length - 1; i++) {
                int num = userArr[i];
                for(int j = 0; j < arr.length - 1; j++) {
                    if(num == arr[j]) {
                        redCount++;
                        break;
                    }
                }
            }
            int bnum = userArr[6];
            if(bnum == arr[6]) {
                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("恭喜您,中了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[] userInput () {
        int[] arr = new int[7];
        Scanner sc = new Scanner(System.in);
        for(int i = 0; i < 6; ) {
            System.out.println("请输入第" + (i + 1) + "个红球号码");
            int num = sc.nextInt();
            if(num >=1 && num <= 33) {
                boolean flag = contains(arr, num);
                if(!flag) {
                    arr[i] = num;
                    i++;
                }else {
                    System.out.println("您输入的号码重复,请重新输入");
                }
            }else {
                System.out.println("您输入的号码超出范围,请重新输入");
            }
        }
        System.out.println("请输入第7个蓝球号码");
        int bnum = sc.nextInt();
        if(bnum >= 1 && bnum <= 16) {
            arr[6] = bnum;
        }else {
            System.out.println("您输入的号码超出范围,请重新输入");
            arr[6] = userInput()[6];
        }
        return arr;
    }
    public static int[] create () {
        int[] arr = new int[7];
        Random r = new Random();
        for (int i = 0; i < 6; ) {
            int num = r.nextInt(33) + 1;
            boolean flag = contains(arr, num);
            if (!flag) {
                arr[i] = num;
                i++;
            }
        }
        int bnum = r.nextInt(16) + 1;
        arr[6] = bnum;
        return arr;
    }
    public static boolean contains(int[] arr, int num) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                return true;
            }
        }
        return false;
    }
}

二维数组

二维数组,在数组中存数组

静态初始化

格式:

1.数据类型[][] = new 数据类型[][]{{元素1,元素2},{元素1,元素2}};

2.数据类型[][] = {{元素1,元素2},{元素1,元素2}};

动态初始化

格式:

数据类型[][] 数组名 = new 数据类型[][];

要注意的就是

需要把数组分组管理的时候,用二维数组

内存

并不复杂,当你定义并初始化时,会先在栈中定义,然后再堆中开辟空间,找一块地址,这个地址指的是二维数组的第一个[]也就是说有几个数组,然后再找两块地址,分别是用来存放两个数组,所以第一个地址中的数组,存的两个地址。画一下图,就明白了。

;