我正在研究一个基本程序(控制台)。
程序应允许用户输入各种标记,直到输入的标记超过100.此时程序应显示直方图。每颗星代表一名学生在所示范围内获得模块标记。
这是输出的一个例子。
0 - 29 xxx
30 - 39 xxxxx
40 - 69 xxxxxxx
70 - 100 xxxx
总共20名学生。
当用户输入每个标记时,应该有一个值增加的计数器并打印输入的标记总数。
我想确保程序尽可能高效但也可以理解
代码
在collabedit上与@Dici合作我对我的问题有一个惊人的答案:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] ranges = { 0,29,39,69,100 };
int[] inRange = new int[ranges.length - 1];
int mark;
do {
System.out.println("Enter Mark:");
mark = sc.nextInt();
for (int j=1 ; j<ranges.length ; j++)
if (ranges[j-1] <= mark && mark <= ranges[j]) {
inRange[j-1]++;
break;
}
} while (mark <= 100);
System.out.println(Arrays.toString(inRange));
String s = "The number of students that have scored between %d and %d is: ";
int k = 0;
for (int i=0 ; i<ranges.length - 1 ; i++) {
System.out.print(String.format(s,ranges[i] + k,ranges[i + 1]));
for (int r = 0; r<inRange[i] ; r++)
System.out.print("*");
System.out.println();
k = 1;
}
sc.close();
再次感谢您的出色帮助!
答案 0 :(得分:1)
正如我们在Collabedit上一起做的那样,这是您的问题的工作代码:
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] ranges = { 0,29,39,69,100 };
int[] inRange = new int[ranges.length - 1];
int mark;
do {
System.out.println("Enter Mark:");
mark = sc.nextInt();
for (int j=1 ; j<ranges.length ; j++)
if (ranges[j-1] <= mark && mark <= ranges[j]) {
inRange[j-1]++;
break;
}
} while (mark <= 100);
System.out.println(Arrays.toString(inRange));
String s = "The number of students that have scored between %d and %d is : ";
int k = 0;
for (int i=0 ; i<ranges.length - 1 ; i++) {
System.out.print(String.format(s,ranges[i] + k,ranges[i + 1]));
for (int r = 0; r<inRange[i] ; r++)
System.out.print("*");
System.out.println();
k = 1;
}
sc.close();
}
}
答案 1 :(得分:0)
快速建议:如果这是你的循环索引,请不要在循环内改变marksInsp
。
Paulinho提出了使用modulo operator的绝佳建议。我将这里扩展到一个地图,因为你没有指定上限标记:
public static void main(String[] args) {
int currentMark, currentBucket;
final int BUCKET_WIDTH = 30;
Map<Integer, Integer> markRanges = new HashMap<Integer, Integer>();
for(int i = 0; i < 101; i++) {
Scanner input = new Scanner(System.in);
System.out.print("Enter Marks: ");
currentMark = input.nextInt();
currentBucket = currentMark % BUCKET_WIDTH;
if(markRanges.containsKey(currentBucket)) {
// There's already an entry for this bucket
markRanges.put(currentBucket, markRanges.get(currentBucket) + 1);
} else {
// If there isn't, make a new entry
markRanges.put(currentBucket, 1);
}
// Print out grade buckets
for(Integer j : markRanges.keySet) {
System.out.println(String.format("There are %d students with scores between %d and %d", markRanges.get(j), j, j.intValue() + BUCKET_WIDTH - 1));
}
}
}
答案 2 :(得分:0)
好。现在这是有道理的。如果你有一个号码
int mark = 3;
您可以使用if语句
if(mark <= 10){
//do this
}else if(mark <= 20){
//do this
}
您也可以使用switch语句,但是个人偏好使我几乎总是使用if语句。
如果你想要&#34;水桶&#34;你可以用
ArrayList<String> marksForStudent = new ArrayList<>();
此处的文档就在这里。
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
或者,也许你想要的是一个hashmap。将学生的姓名或其他唯一标识符作为密钥,然后使用集合来包含其标记。
HashMap<String, ArrayList<String>> gradesForStudents = new HashMap<>();
gradesForStudents.put("Marc",Arrays.asList("99","98","100"));
这样的事情。