2016-11-18 96 views
1

我正在自学Java,刚刚完成了数组的基础知识学习,或者我认为。我想创建一个能够保证每个学生的成绩和平均成绩的班级成绩单。我有一个for循环,要求10名学生中的每一个都要输入4个测试成绩。一旦我拿到这四个等级,我就取平均分。然后,我将学生的成绩和平均数存入一个数组中,每个学生一个数组。我基本上用这5个元素创建了10个数组,每个学生使用for循环。我现在想从每个学生的数组中取第5个元素,即4个等级的平均值,并填充另一个称为平均值的数组,以便我可以执行其他计算。这可能与我的逻辑?我认为我可以硬编码10个阵列,每个学生1个像这样:使用数组的元素填充另一个数组 - Java

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 

回答

1

你可以使用一个for循环。但是,这将需要你有一个项目集合迭代。我认为你做这件事的最好方法是把你的学生组织到他们自己的单独班级中(把班级的所有成绩作为参数加入到班级中,并在班级中进行平均计算)。

所以,如果你打电话给你的类student那么你的构造函数可能看起来像这样student(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; 
} 

祝你好运!

+0

我与阶级结构是方式达成一致来解决这个问题。但是,因为他刚刚学过数组,所以我不确定这是否属于他所问的问题的范围。我可以这样写: – KyleKW

+0

in java 8它可以是: 'int [] averageArray = Stream.of(studentArray).map(student - > student.average).toArray();' – maxpovver

+0

我同意这可能有点复杂,但我有意识到教compsci最好的方法之一是遇到一些困难的概念,并花费大量的时间来解决它。你不好意思将自己从可能困难的事情中解脱出来!不过,我完全同意这对于某人出发可能有些复杂。 – Jay

1

数组是存储信息的非常糟糕的形式。主要是因为它们不包含使用此数组内的数据的逻辑,并且任何其他代码都可能使该数据无效,因为数组不检查您给出的值。这是什么类的用途:使数据和代码与它一起工作,并保护数据免受代码中其他地方的变化。

因此,对于你的情况数组可以为相同类型的字段(例如,学生数组是OK),但不适用于该类型的值(学生成绩数组数组不成问题)。所以,你应该在这里做的是使用一个类:

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 
} 

他们让你把里面的对象逻辑,SOU你可以使用它像这样:

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