0

新手 java 程序员,数组新手,正在处理以下提示的分配:

编写一个程序来绘制考试分数的等级分布。一次输入一个分数,当输入 0(零)分数时循环将中断。输出将为字母等级中的每个分数打印一个 *,并将字母等级放在图表下方的水平轴上。

我的主要问题是创建一个数组,使我能够对每个等级(A、B、C...)的分数求和。我被禁止在此转换中使用 if 或 switch 语句。我想知道从哪里开始创建这个数组。谢谢!

4

2 回答 2

1

Does it have to be an array? If not, a Map is a good choice for this type of scenario. The keys of the map are the various grades (A, B, C, etc) and the value of each key is an integer (or long) to hold the number of grades for that key. So, the basic logic is to get the counter from the map for the grade (i.e. key), increment it and put it back into the map.

If you don't mind using external libraries, then Guava's Multiset is an even better fit.

EDIT: OK so you need to use an array, but one challenge (if I read your post correctly) is that you can't use if or switch statements (presumably to access the array). One possible way around this is to assign 'A' to index 0, 'B' to index 1, etc. Then you can use the following notation for array indexing:

char gradeAsChar = ...;  //I'll leave this to you to get the grade as an (uppercase) char
gradesArray[gradeAsChar - 'A'] = gradesArray[gradeAsChar - 'A'] + 1;

'A' - 'A' is 0, 'B' - 'A' is 1, etc. The above, of course, is ripe for index out of bounds issues if the character is unexpected so you'll need some error handling there.

于 2013-03-10T00:00:57.477 回答
1

当然,如果你不关心内存效率(在编码时你总是应该这样做!),你可以像这样创建一个新数组:

int[] grades = new int[101];

然后,每当用户输入输入时,您可以执行以下操作:

int grade = input.nextInt();
grades[grade] = grades[grade] + 1;

您可以通过运行以下命令来计算等于 A 的等级数:

int A = 0;
for (int i = 91; i < 101; i++){
  A += grades[i];
}

当您说不允许使用 if 或 switch 语句时,我就是这么想的。让我知道它是否有帮助。同样,效率非常低,但至少您可以跟踪您拥有的所有分数。这是一个优点。

这应该是 O(n) 的粗略运行时间,但我认为可能会更好。

祝你好运!

编辑:您可以通过使用整数除法的概念来执行上述方法的更有效版本。你可能会问什么是整数除法,当你将两个整数相除时,比如 10/3,答案可能是 3.333,但是 java 会丢弃小数部分,所以答案是 3。因此,如果你除以 10,你可以使用结果得到哪些分数是A等等。例如:92/10 = 9、97/10 = 9、83/10 = 8 等。需要注意的是,A 的分数是 91-100,所以在应用这个概念之前你必须减去 1。

这应该将数组从 101 个元素减少到 10 个,因为您只跟踪十位数中的数字,无论如何这更重要。你也许可以进一步优化它,但同样,这不是我的功课,所以我不想花太多时间在上面。我醒来时想到了这个:)。

希望这能给你一些思考!

于 2013-03-10T08:59:05.820 回答