【问题标题】:Using an Array's Element to Populate Another Array - Java使用数组的元素填充另一个数组 - Java
【发布时间】:2016-11-18 17:58:45
【问题描述】:

我正在自学 Java,并且刚刚学习完数组的基础知识,至少我是这么认为的。我想创建一个班级成绩表,以记录每个学生的成绩和平均成绩。我有一个 for 循环,要求 10 个学生中的每一个输入他们的 4 个测试成绩。一旦我得到这4个成绩,我就取平均值。然后我将学生的成绩和平均值存储到一个数组中,每个学生一个数组。我基本上使用 for 循环为每个学生创建了包含这 5 个元素的 10 个数组。我现在想从每个学生的数组中取出第 5 个元素,即 4 个成绩的平均值,并填充另一个称为平均值的数组,以便我可以执行其他计算。这可能与我的逻辑吗?我想我可以硬编码 10 个数组,每个学生 1 个这样:

double averages[] = {student1[4], student2[4], ..., student10[4]};

这不是一个糟糕的方法吗?任何建设性的帮助或指导将不胜感激。请不要发布给出答案的代码,因为我不会从中学习。我只是想要一个正确方向的提示。 :)

这是我的代码,直到混淆点:

import java.util.Scanner;

public class ClassAverages {

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);

        double grade1 = 0.0, grade2 = 0.0, grade3 = 0.0, grade4 = 0.0, average = 0.0;

        // get grades from each of the 10 students
        for (int student = 1; student <= 3; student++) {
            System.out.println("Student " + student);
            System.out.println("---------\n");
            System.out.print("Enter the first grade: ");
            grade1 = keyboard.nextDouble();
            while (grade1 < 0) { // input validation for grade 1
                System.out.print("You entered a negative value for grade. Please re-enter a positive grade: ");
                grade1 = keyboard.nextDouble();
            }
            System.out.print("Enter the second grade: ");
            grade2 = keyboard.nextDouble();
            while (grade2 < 0) { // input validation for grade 2
                System.out.print("You entered a negative value for grade. Please re-enter a positive grade: ");
                grade2 = keyboard.nextDouble();
            }
            System.out.print("Enter the third grade: ");
            grade3 = keyboard.nextDouble();
            while (grade3 < 0) { // input validation for grade 3
                System.out.print("You entered a negative value for grade. Please re-enter a positive grade: ");
                grade3 = keyboard.nextDouble();
            }
            System.out.print("Enter the fourth grade: ");
            grade4 = keyboard.nextDouble();
            System.out.println();
            while (grade4 < 0) { // input validation for grade 4
                System.out.print("You entered a negative value for grade. Please re-enter a positive grade: ");
                grade4 = keyboard.nextDouble();
                System.out.println();
            }

            // calculate the current student's average
            average = (grade1 + grade2 + grade3 + grade4) / 4;

            // for each student, 1 to 10, create an array with their 4 grades and average
            double studentX[] = { grade1, grade2, grade3, grade4, average };
            System.out.println("SCORE 1\t\tSCORE 2\t\tSCORE 3\t\tSCORE 4\t\tAVERAGE");
            System.out.print(studentX[0] + "\t\t");
            System.out.print(studentX[1] + "\t\t");
            System.out.print(studentX[2] + "\t\t");
            System.out.print(studentX[3] + "\t\t");
            System.out.print(studentX[4] + "\n");
            System.out.println();

            // I want to use each student's average for each corresponding element in the averages array 
            // create an array of all student's averages
            // double averages[] = {student1average, student2average,...student10average} ???
        }
    }
}

目前的输出:

Student 1
---------

Enter the first grade: 100
Enter the second grade: 100
Enter the third grade: 100
Enter the fourth grade: 100

SCORE 1     SCORE 2     SCORE 3     SCORE 4     AVERAGE
100.0       100.0       100.0       100.0       100.0

Student 2
---------

Enter the first grade: 90
Enter the second grade: 90
Enter the third grade: 90
Enter the fourth grade: 80

SCORE 1     SCORE 2     SCORE 3     SCORE 4     AVERAGE
90.0        90.0        90.0        80.0        87.5

Student 3
---------

Enter the first grade: 100
Enter the second grade: 100
Enter the third grade: 90
Enter the fourth grade: 80

SCORE 1     SCORE 2     SCORE 3     SCORE 4     AVERAGE
100.0       100.0       90.0        80.0        92.5

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    您可以使用 for 循环。但是,这将要求您有一组要迭代的项目。我认为你这样做的最好方法是将你的学生组织到他们自己的单独班级中(在其构造函数中为该班级提供所有成绩作为参数,并让它在该班级内进行平均计算)。

    因此,如果您调用您的类student,那么您的构造函数可能看起来像thisstudent(int grade1, int grade2, int grade3, int grade4)。使用这些参数计算每个学生对象的平均值。

    然后在您的 ClassAverage 类中,只需根据需要实例化新的 student 对象并将它们添加到 student 对象数组中,然后就像遍历 student 数组一样简单,提取 average 字段您为每个学生对象创建的对象(只需声明studentName.average,假设您在学生类中将average 字段命名为average)。

    所以到最后你应该有一些看起来像这样的东西。假设学生对象的数组名为studentArray

    int[] averageArray = new int[studentArray.length];
    for (int i = 0; i < studentArray.length; i++){
    averageArray[i] = studentArray[i].average;
    }
    

    祝你好运!

    【讨论】:

    • 我同意类结构是解决这个问题的方法。但是,由于他刚刚学习了数组,我不确定这是否属于他提出的问题的范围。
    • 在 java 8 中可以是:int[] averageArray = Stream.of(studentArray).map(student -&gt; student.average).toArray();
    • 我同意这可能有点复杂,但我意识到教授 compsci 的最佳方法之一是遇到一些困难的概念并花费大量时间试图弄清楚。躲避一些可能很困难的事情对你没有好处!但是我完全同意这对于刚开始的人来说可能有点太复杂了。
    【解决方案2】:

    数组是一种非常糟糕的信息存储形式。主要是因为它们不包含使用此数组中的数据的逻辑,并且任何其他代码都可以使该数据无效,因为数组不会检查您给它的值。这就是类的用途:将数据和代码放在一个地方,并保护数据免受代码中其他地方的更改。

    因此,对于您的案例,对于相同类型的字段,数组是可以的(例如,学生数组是可以的),但对于该类型的值则不行(学生成绩数组数组是不可以的)。所以你在这里应该做的是使用一个类:

    class Student
    {
         int grades[] = new int[4];
         public Student(int grade1, grade2, int grade3, int grade4)
         {
              grades[0] = grade1; 
              grades[1]=grade2; 
              grades[2]=grade3; 
              grades[3]=grade4;
         }
         public double average()
         {
             double result = 0;
             for(int i =0; i<grades.count; i++)
               result += grades;
             return result / grades / count;
          }
      // and so on
    }
    

    它们允许您在对象内部获取逻辑,所以您可以像这样使用它:

    Student albert = new Student(5, 4, 2, 1);
    System.out.println(albert.avarage()); // prints 3
    

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      相关资源
      最近更新 更多