2016-11-18 2 views
1

Ich lerne Java selbst und habe gerade die Grundlagen von Arrays gelernt, denke ich. Ich möchte ein Notenblatt erstellen, das die Noten und den Durchschnittswert jedes Schülers enthält. Ich habe eine For-Schleife, die jeden der 10 Schüler auffordert, ihre 4 Prüfungsnoten einzugeben. Sobald ich diese 4 Noten bekomme, nehme ich den Durchschnitt. Ich speichere dann die Noten und den Durchschnitt des Schülers in ein Array, ein Array pro Schüler. Ich erstelle im Grunde 10 Arrays mit diesen 5 Elementen für jeden Schüler, der die for-Schleife benutzt. Ich möchte nun das fünfte Element, den Durchschnitt der vier Grade, aus dem Array jedes Schülers nehmen und ein weiteres Array namens Durchschnitt füllen, damit ich andere Berechnungen durchführen kann. Ist das mit meiner Logik möglich? Ich glaube, ich könnte hart Code 10-Arrays, 1 für jeden Schüler in etwa so:Verwenden eines Array-Elements zum Auffüllen eines anderen Arrays - Java

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

Ist das nicht eine schlechte Art und Weise über diese allerdings zu gehen? Jede konstruktive Hilfe oder Anleitung wäre willkommen. Bitte schreiben Sie keinen Code, der die Antwort preisgibt, da ich davon nicht lernen werde. Ich möchte nur einen Hinweis in die richtige Richtung. :)

Hier ist mein Code bis zum Punkt der Verwirrung:

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} ??? 
     } 
    } 
} 

OUTPUT Ab sofort:

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 

Antwort

1

Sie könnten eine for-Schleife verwenden. Dies erfordert jedoch eine Sammlung von Elementen, die durchlaufen werden müssen. Ich denke, der beste Weg für Sie, dies zu tun, ist, Ihre Schüler in ihre eigene separate Klasse zu organisieren (geben Sie dieser Klasse alle Noten als Parameter in ihrem Konstruktor und lassen sie die Berechnungen für den Durchschnitt innerhalb dieser Klasse durchführen).

Wenn Sie also Ihre Klasse student aufrufen, könnte Ihr Konstruktor so aussehen student(int grade1, int grade2, int grade3, int grade4). Verwenden Sie diese Parameter, um den Durchschnitt für jedes Schülerobjekt zu berechnen.

Dann in Ihrer ClassAverage Klasse nur neue student Objekte instanziiert, wie Sie sie von student Objekte zu einem Array wollen und hinzufügen und dann seine so einfach, wie durch die Anordnung von student Iterieren, Extrahieren des average Feld, das Sie für jeden Schüler Objekt erstellt (extrahieren Sie dies einfach durch Angabe von studentName.average, vorausgesetzt, Sie haben Ihr average Feld average in der Schülerklasse genannt).

Also am Ende sollten Sie etwas haben, das so aussieht. Nehmen wir an, dass die Anordnung von Studenten Objekte studentArray

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

Viel Glück genannt wird!

+0

Ich stimme mit Klassenstruktur ist die Art und Weise sich diesem zu nähern. Da er aber gerade Arrays gelernt hat, bin ich mir nicht sicher, ob das in der Fragestellung liegen würde, die er stellt. – KyleKW

+0

in Java 8 kann es sein: 'int [] AverageArray = Stream.of (StudentArray) .Map (Student -> Student.Average) .toArray();' – maxpovver

+0

Ich stimme zu, dass dies ein bisschen komplex sein könnte, aber ich habe erkannte, dass einer der besten Wege, um Compcsi zu unterrichten, einige schwierige Konzepte zu begegnen und viel Zeit damit verbringen, es herauszufinden. Es tut dir nicht gut, dich vor etwas zu schützen, das schwierig sein könnte! Ich stimme jedoch völlig zu, dass dies für jemanden, der anfängt, etwas zu komplex sein könnte. – Jay

1

Arrays sind eine sehr schlechte Form der Informationsspeicherung. Hauptsächlich, weil sie keine Logik enthalten, die Daten innerhalb dieser Arrays verwendet, und jeder andere Code kann diese Daten ungültig machen, weil das Array nicht prüft, welche Werte Sie ihm geben. Dies ist, wofür Klassen sind: um Daten und Code, der damit arbeitet, an einem Ort zu haben, und um Daten vor Änderungen von anderen Stellen im Code zu schützen.

Also für Ihren Fall Arrays sind OK für Felder des gleichen Typs (zum Beispiel, Array von Studenten ist OK), aber nicht für Werte dieser Art (Array von Arrays von Schüler Noten ist nicht OK).Also, was sollte man hier tun ist, um eine Klasse zu verwenden:

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 
} 

Sie ermöglichen es, Logik innerhalb Objekt zu nehmen, sou Sie es wie folgt verwenden können:

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