微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于学生成绩的 JAVA 数组对

如何解决用于学生成绩的 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;

    }

}

解决方法

如果数据没有排序,最好在打印学生和他们的成绩后,在同一个循环中找到 minmax 成绩。

然后不需要循环打印minmax成绩:

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 循环块中。如果用户未提供有效响应,则要求该用户重试。 studentgrade 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)。 我知道你没有听到编译器抱怨,但它确实使它成为 阅读代码有点困难(有时)。每个阅读的人 您的代码会因此而感激您。

因为 studentgrade 数组是 parallel arrays,所以您需要 minGrade()ma​​xGrade() 方法将特定数组索引值返回到最低或最高等级,以便可以对包含确定的特定等级的学生建立参考关系。所以,这会更有用:

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 举报,一经查实,本站将立刻删除。