如何解决用于学生成绩的 JAVA 数组对
如何将学生数组与成绩数组配对?当我找到最高分时,相应的学生也应该显示出来,和最低分的学生一样。我不知道如何让这个程序用两个单独的数组执行。
import java.util.Scanner;
公共类 Asm7 {
public static void main(String[] args) {
Scanner Scan = new Scanner(system.in);
System.out.println("How many students do you have?: ");
int AMOUNT = 0;
AMOUNT = Scan.nextInt();
String[] STUDENT = new String [AMOUNT];
int COUNTER = 0;
int GRADE [] = new int [AMOUNT];
if (AMOUNT <= 0) {
System.out.println("Invalid student amount");
}
else {
for(int i = 0; i < AMOUNT; i++){
System.out.println("Enter student's first name: " + (i+1));
STUDENT[i] = Scan.next();
System.out.println("Enter student's grade in order added: ");
GRADE[i] = Scan.nextInt();
}
for(int i = 0; i < AMOUNT; i++){
System.out.println(STUDENT[i] + " received the final grade of " + GRADE[i]);}
System.out.println();
int [] Results = MinMax(GRADE);
System.out.println("The highest grade in the class was " + Results[1]);
System.out.println("The lowest grade in the class was "+ Results[0]);
}}
public static int[] MinMax(int[] value) {
int[] Result = new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE};
for (int i : value) {
Result[0] = i < Result[0] ? i : Result[0];
Result[1] = i > Result[1] ? i : Result[1];
}
return Result;
}
}
解决方法
如果数据没有排序,最好在打印学生和他们的成绩后,在同一个循环中找到 min
和 max
成绩。
然后不需要循环打印min
和max
成绩:
for (int i = 0; i < amount; i++) {
System.out.println(student[i] + " received the final grade of " + grade[i]);
}
int min = grade[0];
int max = grade[0];
for (int i = 1; i < amount; i++) {
if (grade[i] < min) {
min = grade[i];
} else if (grade[i] > max) {
max = grade[i];
}
}
System.out.println("The highest grade in the class was " + max);
System.out.println("The lowest grade in the class was " + min);
如果要查找 min/max 的索引,则可以打印获得最低和最高成绩的学生的姓名。
,public static void main(String[] args) {
int[] grades = new int[]{50,51,52,50,60,22,53,70,94,56,41};
int[] result = getMinMax(grades);
System.out.println("Min: " + result[0] + ",Max: " + result[1]);
}
public static int[] getMinMax(int[] values) {
int[] result = new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE};
for (int i : values) {
result[0] = i < result[0] ? i : result[0];
result[1] = i > result[1] ? i : result[1];
}
return result;
}
您需要处理 int[] 值为 null 或为空的情况。您可以决定(抛出异常,返回空值...或其他)
,您对 学生人数 的 while
循环验证有点晚了。您希望在声明和初始化数组之前执行此操作。然而,while
循环实际上用于尝试某种形式的验证这一事实是一个非常好的迹象。这比大多数新程序员倾向于做的要多。所有输入都应经过验证,并为用户提供提供正确解决方案的机会。这只会为用户带来更流畅、无故障的应用程序和更好的体验。看看代码中的这个 while
循环:
while (amount < 0) {
System.out.println("Invalid student amount");
}
如果用户提供 -1
(这是一个有效的整数值,+1)会发生什么?没错……您的应用程序将在无限循环中结束,将 Invalid student amount
吐出到控制台窗口。您的验证方案应该包含整个提示,然后应该更合乎逻辑地定义退出它的方法。对于 while
循环,最好的退出是通过其条件语句完成,如果条件为假则退出循环,例如:
Scanner scan = new Scanner(System.in);
// Number Of Students...
String inputString = "";
while (inputString.isEmpty()) {
System.out.print("How many students do you have?: --> ");
inputString = scan.nextLine().trim();
/* Is the supplied Number Of Students valid and within
range (1 to 50 inclusive)? */
if (!inputString.matches("\\d+") || Integer.valueOf(inputString) < 1
|| Integer.valueOf(inputString) > 50) {
// No...
System.err.println("Invalid entry (" + inputString + ") for Student "
+ "amount! Try again...");
inputString = ""; // Empty inputString so we loop again.
System.out.println();
}
}
// Valid amount provided.
int amount = Integer.valueOf(inputString);
String[] student = new String[amount];
int grade[] = new int[amount];
您马上就会注意到这里有一些明显的变化。整个 How many students do you have?
提示包含在 while
循环块中。如果用户未提供有效响应,则要求该用户重试。 student
和 grade
parallel arrays 仅在针对学生人数提供有效响应后才声明和初始化。 >
您还会注意到 while
循环条件不依赖于整数值,而是依赖于实际的字符串内容(无论它是什么)。如果变量为空 (""),则再次循环。这是因为 Scanner#nextLine() 方法用于收集用户输入而不是 Scanner#nextInt() 方法。提示仍然需要提供一个整数值,只是一个整数值的字符串表示,这使用 String#matches() 方法和一个小的 Regular Expression(正则表达式)进行验证。
出于多种原因,我个人更喜欢使用 Scanner#nextLine() 方法。我个人认为它更灵活,特别是如果您想从单个提示中同时接受 Alpha 和数字输入。如果上面提示:
How many students do you have? (q to quit)
您只需要在数字验证代码上方添加另一个 if
语句即可查看是否提供了“q”或“Q”,例如:
// If either q or Q is entered then quit application.
if (amountString.matches("[qQ]")) {
System.out.println("Bye-Bye");
System.exit(0);
}
另外,一个好的表达式传递给matches()方法,没有必要为了进行验证而捕获异常,不是说这有什么问题,很多人都这样做,我特别不但是当我不需要这样做时。
旁注:我将在这里说明显而易见的事情,我相信你已经听过一百次了,你已经听腻了,但我要再说一遍:
您的类方法应该以小写字母开头(请参阅Java Naming Conventions)。 我知道你没有听到编译器抱怨,但它确实使它成为 阅读代码有点困难(有时)。每个阅读的人 您的代码会因此而感激您。
因为 student
和 grade
数组是 parallel arrays,所以您需要 minGrade() 和 maxGrade() 方法将特定数组索引值返回到最低或最高等级,以便可以对包含确定的特定等级的学生建立参考关系。所以,这会更有用:
public static int minGrade(int[] arr,int size) {
// Initialize min to have the highest possible value.
int min = Integer.MAX_VALUE;
int returnableIndex = -1;
// loop to find lowest grade in array
for (int i = 0; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
returnableIndex = i;
}
}
return returnableIndex;
}
public static int maxGrade(int[] arr,int size) {
int max = Integer.MIN_VALUE;
int returnableIndex = -1;
// loop to find highest grade in array
for (int i = 0; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
returnableIndex = i;
}
}
return returnableIndex;
}
随着所有内容的进行,您的代码可能如下所示:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// Number Of Students...
String amountString = "";
while (amountString.isEmpty()) {
System.out.print("How many students do you have?: --> ");
amountString = scan.nextLine().trim();
// Is the supplied Number Of Students valid and within
// range (1 to 50 inclusive)?
if (!amountString.matches("\\d+") || Integer.valueOf(amountString) < 1
|| Integer.valueOf(amountString) > 50) {
// No...
System.err.println("Invalid entry (" + amountString + ") for Student "
+ "amount! Try again...");
amountString = ""; // Empty inputString so we loop again.
System.out.println();
}
}
// Valid amount provided.
int amount = Integer.valueOf(amountString);
// Declare and initialize parallel arrays
String[] student = new String[amount];
int grade[] = new int[amount];
// Student Names and Grade...
for (int i = 0; i < amount; i++) {
// Student Name...
String name = "";
while (name.isEmpty()) {
System.out.print("Enter student #" + (i + 1) + " name: --> ");
name = scan.nextLine().trim();
/* Is the name valid (contains upper or lower case letters from
A-Z and a single whitespaces separating first and last name?
Whitespace and last name is optional. */
if (!name.matches("(?i)([a-z]+)(\\s{1})?([a-z]+)?")) {
// No..
System.err.println("Invalid Student #" + (i + 1) + " name ("
+ name + ")! Try Again...");
System.out.println();
name = ""; // Empty name so we loop again.
}
}
// Valid Student name provided...
student[i] = name;
// Student Grade...
String gradeString = "";
while (gradeString.isEmpty()) {
System.out.print("Enter student #" + (i + 1) + " grade: --> ");
gradeString = scan.nextLine().trim();
// Is the supplied grade valid and within range (0 to 100 inclusive)?
if (!gradeString.matches("\\d+")
|| Integer.valueOf(gradeString) < 0
|| Integer.valueOf(gradeString) > 100) {
// No...
System.err.println("Invalid entry (" + gradeString + ") for "
+ "Student #" + (i + 1) + " grade! Try again...");
gradeString = "";
System.out.println();
}
}
// Valid Student grade provided...
grade[i] = Integer.valueOf(gradeString);
}
// Display everyone's grade
System.out.println();
for (int i = 0; i < amount; i++) {
System.out.println(student[i] + " received the final grade of " + grade[i]);
}
System.out.println();
//Display who is highest and lowest...
int index = maxGrade(grade,amount);
System.out.println("The highest grade in the class was by '" + student[index]
+ "' with a grade of: " + grade[index]);
index = minGrade(grade,amount);
System.out.println("The lowest grade in the class was by '" + student[index]
+ "' with a grade of: " + grade[index]);
}
public static int minGrade(int[] arr,int size) {
int max = Integer.MIN_VALUE;
int returnableIndex = -1;
// loop to find highest grade in array
for (int i = 0; i < size; i++) {
if (arr[i] > max) {
max = arr[i];
returnableIndex = i;
}
}
return returnableIndex;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。