2016-11-18 9 views
1

Я изучаю Java самостоятельно и только что закончил изучать основы массивов, или так я думаю. Я хочу создать класс класса, который хранит оценки каждого ученика и средний. У меня есть цикл for, который просит каждого из 10 учеников ввести 4 теста. Как только я получаю эти 4 класса, я беру среднее. Затем я храню оценки и среднее количество учащихся в массиве, по одному массиву на одного учащегося. Я по существу создаю 10 массивов с этими 5 элементами, для каждого ученика, использующего цикл 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

Вы можете использовать цикл. Однако это потребует от вас набора элементов для итерации. Я думаю, что лучший способ сделать это - организовать своих учеников в свой отдельный класс (дать этому классу все оценки в качестве параметров в его конструкторе и провести вычисления для среднего в этом классе).

Так что, если вы вызываете свой класс student, тогда ваш конструктор может выглядеть так: student(int grade1, int grade2, int grade3, int grade4). Используйте эти параметры для вычисления среднего значения для каждого объекта-ученика.

Тогда в вашем классе ClassAverage только экземпляры новых student объектов, как вы хотите, и добавить их в массив student объектов, а затем его так просто, как перебор массива student, извлекая поле average, созданное для каждого объекта студента (извлеките это просто, указав studentName.average, предположив, что вы назвали поле averageaverage в классе ученика).

Итак, к концу вы должны иметь что-то похожее на это. Давайте предположим, что массив студенческих объектов называется studentArray

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

Успехов!

+0

Я согласен с классовой структурой является способом подойти к этому. Однако, поскольку он только что научился массивам, я не уверен, будет ли это в вопросе, который он задает. – KyleKW

+0

в java 8 это может быть: 'int [] averageArray = Stream.of (studentArray) .map (student -> student.average) .toArray();' – maxpovver

+0

Я согласен, что это может быть немного сложным, но у меня есть понял, что один из лучших способов научить compsci - столкнуться с некоторыми сложными концепциями и потратить много времени, пытаясь понять это. Вам нехорошо защищать себя от чего-то, что может быть трудно! Однако я полностью согласен с тем, что это может быть слишком сложно для кого-то начинающего. – Jay

1

Массивы - очень плохая форма хранения информации. В основном потому, что они не содержат логику, которая использует данные внутри этих массивов, и любой другой код может сделать эти данные недействительными, потому что массив не проверяет, какие значения вы им даете. Это то, что классы предназначены для: наличия данных и кода, которые работают с ним в одном месте, и для защиты данных от изменений из других мест в коде.

Итак, для ваших массивов case подходит для полей того же типа (например, массив учеников в порядке), но не для значений этих типов (массив массивов классов студентов НЕ ОК).Так что вы должны сделать здесь, чтобы использовать класс:

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 
Смежные вопросы