Wieso werden in der Ausgabe der Klasse andere Werte angezeigt als berechnet?

 - (Programmieren, Informatik)

3 Antworten

Hallo ,

ein Bild ist womöglich die schlechteste Methode um Code zu transportieren. Selbst hier kann man Code einfügen (einfach das Quelltext tag benutzen).

Ansonsten gibt es noch https://pastebin.com/ um dort Code zu posten und dann hier zu verlinken.

Ich behaupte mal die wenigsten Entwickler sehen sich gern Bilder von Quellcode an.

Gruß

public class Student {
    
    int[][] studi = new int[10][2];
    int summe = 0;
    int summe1 = 0;
    
    int durschnittslänge(int[][]array){
        summe = 0;
        for(int zeile = 0; zeile<studi.length;zeile++){
            summe = summe + array[zeile][0];
            summe = summe/array.length;
        }
        return summe;
    }   
 
    int durchschittsgewicht(int[][]array){
        summe1 = 0;
        for(int zeile = 0; zeile<studi.length;zeile++){
            summe1 = summe1 + array[zeile][1];
            summe1 = summe1/array.length;
        }
        return summe1;
    }
    
    int maxiBe(int[][]array){
        int maxi = array[0][0];
        for(int zeile = 0; zeile<studi.length;zeile++){
            maxi = Math.max(array[zeile][0], maxi);
        }
        return maxi;  
    }
    public void anzeigen(Graphics g){
        for(int zeile = 0; zeile<studi.length;zeile++){
            for(int spalte = 0; spalte<studi[zeile].length; spalte++){
                studi[zeile][0] = (int) (Math.random()*20+160);
                studi[zeile][1] = (int) (Math.random()*10+50);
                
                g.drawString(""+studi[zeile][spalte], spalte*40+40, zeile*40+40);
            }
        }
        g.drawString("durchschnittslänge"+durchschittsgewicht(studi),100,100);
        g.drawString("durchschnittgewicht"+durschnittslänge(studi),100,120);
       g.drawString("größter studi"+maxiBe(studi),100,140);  
    }
}
0

@AldoradoXYZ hier .. ich bin immernoch auf keine Lösung gekommen -.-

0

für die Durchschnittslänge und Gewicht habe ich die Lösung, die Berechnung muss außerhalb der Klammer geschehen.

Aber das mit maxi versteh ich nicht? -.-

0
@Belus911

Oh man, hab deine Bugs. Etwas trickreich.

Hab deinen Code für Konsole umgeschrieben:

1) public void print(){
2)    System.out.printf("%8s%8s\n", "Größe", "Gewicht");
3)    for(int zeile = 0; zeile<studi.length;zeile++){
4)        for(int spalte = 0; spalte<studi[zeile].length; spalte++){
5)            studi[zeile][0] = (int) (Math.random()*20+160);
6)            studi[zeile][1] = (int) (Math.random()*10+50);
7)            System.out.printf("%8d",studi[zeile][spalte]);
        }
        System.out.println();
    }
    System.out.println();
    System.out.println("Durchschnittsgröße: "+durchschittsgewicht(studi));
    System.out.println("Durchschnittgewicht: "+durschnittslänge(studi));
    System.out.println("größter Student: "+maxiBe(studi));
}

Du schreibst in Zeile 5 und 6 die Größe und das Gewicht. Der Code wird zwei mal durchlaufen durch die Schleife in Zeile 4 (für jede Spalte ein Durchlauf).

Das heißt Du:

1) schreibst die Größe und das Gewicht ins Array.

2) Gibst die Größe in Zeile 7 aus

3) schreibst wieder Größe und Gewicht

4) Gibst die Größe in Zeile 7 aus

5)...danach gehst Du zur nächsten Zeile

Letztendlich gibst Du auf dem Bildschirm Werte für die Größe aus uns überschreibst sie im Array wieder.

Das Problem kannst Du so beheben:

public void print(){
    System.out.printf("%8s%8s\n", "Größe", "Gewicht");
    for(int zeile = 0; zeile<studi.length;zeile++){
        studi[zeile][0] = (int) (Math.random()*20+160);
        studi[zeile][1] = (int) (Math.random()*10+50);
        for(int spalte = 0; spalte<studi[zeile].length; spalte++){
            System.out.printf("%8d",studi[zeile][spalte]);
        }
        System.out.println();
    }
    System.out.println();
    System.out.println("Durchschnittsgröße: "+durchschittsgewicht(studi));
    System.out.println("Durchschnittgewicht: "+durschnittslänge(studi));
    System.out.println("größter Student: "+maxiBe(studi));
}

Dann zu deiner Durchschnittsberechnung. Du addierst die Werte und dividierst nach jeder Addition. Den Durchschnitt berechnet man aber so:

1) Summiere alle Größen

2) Dividiere die Summe aller Größen anschließend durch die Anzahl der Elemente

int durschnittslänge(int[][]array){
    summe = 0;
    for(int zeile = 0; zeile<array.length;zeile++){
        summe = summe + array[zeile][0];
    }
    summe = summe/array.length;
    return summe;
}

int durchschittsgewicht(int[][]array){
    summe1 = 0;
    for(int zeile = 0; zeile<array.length;zeile++){
        summe1 = summe1 + array[zeile][1];
    }
    summe1 = summe1/array.length;

    return summe1;
}

Ich hab einfach nur das Dividieren aus den Schleifen herausgezogen.

Zu deinem restlichen Code schreibe ich dir etwas in einem extra Kommentar.

Gruß

0
@AldoradoXYZ

Du hast ja schon einen Klasse Student. Die Klasse ist berechtigterweise Singular. Warum dann aber alle Studenten (Größe, Gewicht) in der Klasse halten?

Wie wäre es ein Array von Studenten zu machen. Und jeder Student bekommt genau eine Größe und ein Gewicht. Wie im "echten" Leben.

Es gibt keinen Grund warum Du dich mit 2D Arrays quälen musst, außer Du willst das üben.

Student[] studenten = new Student[10];

Fertig.

Wenn Du dann wissen willst was die Maximalgröße ist, dann ja, kannst Du nicht einen einzelnen Studenten fragen. Dafür benötigst Du dann etwas "außerhalb" was alle Studenten kennt und über diese iterieren ("laufen") kann.

In der Art etwa so:

int maxGroesse = studenten[0].getGroesse();
for (Student student : studenten){
    maxGroesse = Math.max(maxGroesse, student.getGroesse());
}
return maxGroesse;

Ok, das erste Element (Index 0) brauchst Du noch immer. Dafür bist Du aber alle sonstigen Indexoperationen los, eine häufige Fehlerquelle.

Wenn Du mit Java etwas weiter bist schreibst Du dann sowas:

List<Student> studenten = new LinkedList<>();
//... add some students
int maxGroesse = studenten.stream().mapToInt(Student::getGroesse).max(); //*

*) Und packst das wahrscheinlich in eine Methode

Aber für den Anfang sind Arrays wunderbar. Schadet nicht, wenn man sich damit auskennt.

Gruß und viel Spaß

Gruß

0

Du machst ein paar Sachen, die ich vorerst etwas unnötig finde bzw. anders machen würde.

1) Du hast 2 Attribute angelegt, doch wozu brauchst du sie? Die Methoden haben doch eh Rückgabetypen definiert, da reicht es doch, die beiden Variablen nur lokal in der Methode anzulegen.

int durschnittslänge(int[][] array) {
  int summe = 0;
  // ...
}    

2) Vermeide Umlaute im Quellcode und vermeide mehr Leerzeichen, um den Code lesbarer zu gestalten. Vergib des Weiteren passendere Namen. Wenn in einer Schleife, in der über die Anzahl an Studenten iteriert wird, etwas von einer Zeile steht, ist dies eher irritierend (im Folgenden verwende ich der Kürze halber den Namen i, er wird oft als Bezeichner für Schleifenzähler verwendet). Das in einem Array studi dann auch noch Längen/Körpergrößen gespeichert sind, und keine Studenten (wie es der Name andeutet), ist so ein weiteres Beispiel.

3) Bei der Berechnung eines Maximalwerts kannst du den ersten Durchlauf überspringen, denn der aktuelle Wert ist ja der erste in der Liste. Mit sich selbst muss er sich also nicht vergleichen.

int maxHeight = array[0][0];

for (int i = 1; i < students.length; ++i) {
  maxHeight = Math.max(array[i][0], maxHeight);
}

4) Mit der doppelten Schleife definierst du die Werte für jeden Student mehrmals. Belasse es doch bei einer Schleife.

for (int i = 0; i < students.length; ++i) {
  students[i][0] = (int) (Math.random() * 20 + 160);
  students[i][1] = (int) (Math.random() * 10 + 50);

  // ...

Nur die Ausgabe müsste wenn in einer inneren Schleife erfolgen, doch auch das würde ich mir in diesem konkreten Fall ersparen, denn es sind ja nur zwei Werte.

5) Beim größten Student bekomme ich das richtige Ergebnis. Die Berechnung des Durchschnitts hingegen ist falsch. Führe die Division erst nach Ablauf der Schleife durch.

erstmal Vielen Dank!

das mit den durchschnitten habe ich bereits gelöst! Aber was muss ich konkret an der Methode für den maxiwert ändern?

0
@Belus911

Achja, wieso arbeitest du in maxiBe da mit 2 unterschiedlichen Arrays? Auch das Attribut studi kann weg, du übergibst es ja eh stets als Argument an die jeweiligen Methoden.

0
@regex9

ah! ja, dass war ein Leichtsinnfehler! Danke!

Aber ist die max methode ansonsten richtig gewesen, oder wie erklärt sich der Fehler bei der Ausgabe?

0
@Belus911

Die ist ansonsten so richtig gewesen. Einfach nachzuprüfen: https://ideone.com/4PQwDf

Wie du auf die Ausgabe gekommen bist, kann ich dir nicht sagen. Womöglich doch noch mit anderem Code.

0

für die Durchschnittslänge und Gewicht habe ich die Lösung, die Berechnung muss außerhalb der Klammer geschehen.

Aber das mit maxi versteh ich nicht? -.-

Was möchtest Du wissen?