日撸Java三百行(Day 10)

问题描述

  1. 随机生成n名学生m科成绩,
  2. 计算n名学生m科的总成绩,其中挂科的总分记为0,
  3. 找出总分最高和最低对应的同学。

提示:
随机生成数——用到包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. 为什么最高/最低的下标初始化是-1(答:下标对应学生,即矩阵中元素的位置,无效)
int tempBestIndex = -1;
int tempWorstIndex = -1;
  1. 为什么最高分的初始化是0,最低分的初始化是总分最高+1(答:都是不太可能的,这样方便更新。至于+1,是因为万一所有人都是100,100,100呢)
int tempBestScore = 0;
int tempWorstScore = m * upperBound + 1;

小结

  第一个10天的学习总体而言还是比较顺利的,除了软件环境遇到无法解决的问题,其它遇到的小问题都可以自行百度解决。现在和第一天相比,对Java语言和敲代码感觉熟悉了好多,比如能分清楚段落了,不用再苦苦寻找终止的地方,也能大概猜到每段是在干什么事了。还挺有趣的,因为能写好代码说明思路很清晰,任务拆解之后显然难度也降低了。进阶Fighting

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值