问题描述
- 随机生成n名学生m科成绩,
- 计算n名学生m科的总成绩,其中挂科的总分记为0,
- 找出总分最高和最低对应的同学。
提示:
随机生成数——用到包import java.util.Random;引用数据类型Random,
生成一个矩阵——用到for循环,
找挂科的把总分记为0,找最值——用到for循环和if判断
代码运行情况
某次运行的结果:
Tips:
- nextInt 是 java.util.Random 的一种函数(功能、方法),它用于产生下一个随机整数。——如果你要下一个随机实数,就应该写 nextDouble()。
- Random tempRandom = new Random(); 此处Random是引用数据类型。注意:它的首字母大写)
- 数据类型是定义的类,后面变量名就是对象
代码思路旁白
程序层次:
- 包(basic)
- 类(Task1)——底层方法是单元测试task1
- 单元测试(task1)
- 步骤1:生成一个随机矩阵——设定分数在50~65之间,用于找bug ;
- 步骤2:计算每个学生的总分,构成一维数组——上述矩阵的每一行;
- 步骤3:找出最好和最差学生——按照一维数组的元素位置,逐个筛查;
- 步骤4:输出最高&最低分以及相应学生——对结果的预见性,分类输出。
程序细节:
对于步骤1,如何根据区间生成随机数:
Random tempRandom = new Random();
int[][] data = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
data[i][j] = lowerBound + tempRandom.nextInt(upperBound - lowerBound);//用下届固定位置,随机加上一个介于0和最大差之间的数,前闭后开(就是说如果upperBound不+1的话,构造的随机数都小于100)
}// Of for j
}// Of for i
对于步骤3,如何做到逐个筛查:
for (int i =0; i < n; i++) {
// Do not consider failed students.
if (totalScores[i] == 0){
continue;//依旧i循环,即考虑下一个i++
}// Of if
if (tempBestScore < totalScores[i]) {
tempBestScore = totalScores[i];
tempBestIndex = i;
}// Of if
// Attention:This if statement cannot be combined with the last one using "else if", because a student can be both the best and the worst. I found this bug while setting upperBound = 65.
if (tempWorstScore > totalScores[i]) {
tempWorstScore = totalScores[i];
tempWorstIndex = i;
}// Of if
}// Of for i
一个人要判断3次:先判断总分是不是0,再和最好/最差的分数比较(遇见更高/更低的就更新,那当然是设置成最低/最高方便更新了)。
回答找出程序中的bug:
当上界降低时,一个学生的成绩里很容易出现不及格情况,也就是说总分为0的极多。如果只有1人能参与评比,那么他既是最好的也是最差的学生。
(调试:这种情况显然与现实意愿违背,应该是在尽可能多能参评的人中比较,即totalScores>0的个数>=2。这样就不会出现无一人参评的情况,也不会出现最差和最优都是同一个人的现象。)
遇到的问题
- 为什么最高/最低的下标初始化是-1(答:下标对应学生,即矩阵中元素的位置,无效)
int tempBestIndex = -1;
int tempWorstIndex = -1;
- 为什么最高分的初始化是0,最低分的初始化是总分最高+1(答:都是不太可能的,这样方便更新。至于+1,是因为万一所有人都是100,100,100呢)
int tempBestScore = 0;
int tempWorstScore = m * upperBound + 1;
小结
第一个10天的学习总体而言还是比较顺利的,除了软件环境遇到无法解决的问题,其它遇到的小问题都可以自行百度解决。现在和第一天相比,对Java语言和敲代码感觉熟悉了好多,比如能分清楚段落了,不用再苦苦寻找终止的地方,也能大概猜到每段是在干什么事了。还挺有趣的,因为能写好代码说明思路很清晰,任务拆解之后显然难度也降低了。进阶Fighting