Java 学习笔记(基础篇4)
1. 综合练习
① 开发验证码
编写一个 Java 程序,实现如下功能:
- 程序需要首先准备一个包含 26 个小写字母(
a-z
)和 26 个大写字母(A-Z
)的字符数组,共 52 个字符。 - 从上述字符数组中随机选取 4 个字符,拼接成字符串。
- 生成一个 0-9 之间的随机数字,拼接到上述字符串的末尾。
- 最终将拼接后的完整字符串输出到控制台(注意:初始字符串以一个空格开头)。
public class test1 {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);}}String result = " ";Random r = new Random();for (int i = 0; i < 4; i++) {int randomIndex = r.nextInt(chs.length);result += chs[randomIndex];}int number = r.nextInt(10);result = result + number;System.out.println(result);}
}
关键逻辑:准备字符数组:存储所有大小写字母:
小写字母填充(i 从 0 到 25):
通过(char)(97 + i)
计算字符。
原理:在 ASCII 编码中,'a'
对应数字 97,'b'
对应 98…… 因此97 + i
当 i=0 时为 97(即'a'
),i=1 时为 98(即'b'
),直到 i=25 时为 122(即'z'
)。大写字母填充(i 从 26 到 51):
通过(char)(65 + i - 26)
计算字符。
原理:ASCII 中'A'
对应 65,i-26
让索引从 26 开始重新转为 0-25(例如 i=26 时,i-26=0
,对应 65+0=65 即'A'
;i=27 时对应'B'
,直到 i=51 时为 65+25=90 即'Z'
)。
最终数组内容:['a','b',...,'z','A','B',...,'Z']
。
② 评委打分
某比赛需要实现一个评委打分系统,规则如下:
- 共有 6 位评委对选手进行打分,打分范围为 0-100 分(包含 0 和 100),超出范围的分数为无效分数,需重新输入;
- 系统需接收并存储 6 位评委的有效打分;
- 最终得分计算规则为:去掉一个最高分和一个最低分后,计算剩余分数的平均值(结果取整数);
- 输出所有评委的打分以及选手的最终得分。
要求:
需使用方法封装不同的功能,至少包含以下方法:
getScores()
:负责接收用户输入的 6 个有效分数,返回存储分数的数组;getMax(int[] scoreArr)
:接收分数数组,返回数组中的最高分;getMin(int[] scoreArr)
:接收分数数组,返回数组中的最低分;getSum(int[] scoreArr)
:接收分数数组,返回数组中所有分数的总和;
public class test1 {public static void main(String[] args) {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);int avg = (sum - max -min) / (scoreArr.length -2);System.out.println("选手的最终得分为" + avg);}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 = sum + scoreArr[i];}return sum;}public static int[] getScores(){int[] scores = new int[6];Scanner sc = new Scanner(System.in);for (int i = 0; i < 6; ){System.out.println("请输入评委的打分");int score = sc.nextInt();if (score >= 0 && score <= 100){scores[i] = score;i++;} else{System.out.println("成绩超出范围,继续录入,当前的i为" + i);}}return scores;}
}
main 方法:
(1) int[] scoreArr = getScores();
- 这行代码中,
getScores()
方法返回的是数组的引用(可以理解为数组在内存中的地址),而不是数组本身的数据。 - 方法执行结束时,
return scores;
返回的是这个数组的引用(地址)。
(2) int max = getMax(scoreArr);
- 作用:调用
getMax
方法,传入scoreArr
数组,获取数组中的 “最高分”,并把这个值存到变量max
中。 - 例子:如果
scoreArr
是[80, 90, 85, 95, 75, 88]
,那么max
会被赋值为 95。
getScores() 方法:
(1) 分支 1(有效分数):
scores[i] = score;
:把当前有效分数存到数组scores
的第 i 个位置(比如 i=0 时存第一个分数,i=1 时存第二个,以此类推)。i++;
:只有分数有效时,i
才 + 1,确保下一次循环录入下一个位置的分数(直到 i=6 时循环结束)。
(2) 注意方法的返回值类型是 Int[ ]
getMax() 方法:
核心原则:参数的类型(这里的int[]
)不能错,因为它决定了方法能接收什么样的数据;而参数的名称只是一个标识符,只要方便理解和使用即可(通常会取有意义的名字,比如scores
比a
更易读)。