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 数据类型[][];
要注意的就是
需要把数组分组管理的时候,用二维数组
内存
并不复杂,当你定义并初始化时,会先在栈中定义,然后再堆中开辟空间,找一块地址,这个地址指的是二维数组的第一个[]也就是说有几个数组,然后再找两块地址,分别是用来存放两个数组,所以第一个地址中的数组,存的两个地址。画一下图,就明白了。