Methode erklären


#1
Ich weiß, dass es eine Anfängerfrage ist und jeder hier es weiß, aber
wir sollen folgende Methode analysieren (erklären)
Code:
public void ankuppeln(Waggon einWaggon) {
if(anzahl < MaxZahl) {
for (int i = Anzahl; i > 0; i--)
Waggons[i] = Waggons[i-1];
Waggons[0] = ein Waggon;
Anzahl++;
      }
}
Die if-Anweisung verstehe ich gut, bei der for-Schleife hapert es aber.
Kann mir jemand hier die for-Schleife verständlich erklären?
Grüße.
 

HonniCilest

Erfahrenes Mitglied
#2
Du hast ein Waggon Array
[waggon@0, waggon@1, waggon@2, waggon@3 .. waggon@n-1]

Dein Array ist nicht an jeder Stelle mit einem Waggon belegt, sondern hat null Einträge
[waggon@0, waggon@1, null, null, .. null]

Dabei ist anzahl bei dir die Anzahl (in meinem Beispiel = 2) der tatsächlichen Waggons, MaxZahl die Größe des Arrays n. Wenn wir nun den Klammerfehler*) "übersehen" dann verschiebt die Schleife alle belegten Elements um eins nach hinten. Also nach Schleifendurchlauf:
[null, waggon@0, waggon@1, null, .. null]

Anlschließend wird der Parameter Waggon an die Stelle 0 gesetzt, du fügst also den Waggon am Anfang des Arrays ein.
[waggon@param, waggon@0, waggon@1, null, .. null]
Nach dem Einfügen ist die Anzahl der gespeicherten Waggons erhöht (anzahl++)


*) Nun zu dem Klammerfehler. Ich behaupte der Code sieht eigentlich so aus:
Java:
public void ankuppeln(Waggon einWaggon) {
    if(anzahl < MaxZahl) {
        for (int i = anzahl; i > 0; i--) {
            Waggons[i] = Waggons[i-1];
        }
        Waggons[0] = ein Waggon;
        Anzahl++;
    }
}
 
Zuletzt bearbeitet:

Technipion

Erfahrenes Mitglied
#3
HonniCilest hat ja das wichtigste dazu schon erklärt LegendaryBeazt. Allerdings hat er sich glaube ich etwas bei dem Klammerfehler vertan. Der Code müsste imho so aussehen:
Java:
public void ankuppeln(Waggon einWaggon) {
    
    if(anzahl < MaxZahl) {
        
        for (int i = anzahl; i > 0; i--) // durchlaufe alle Wagons
            Waggons[i] = Waggons[i-1];   // verschiebe aktuellen Wagon um eine Stelle
        
        Waggons[0] = einWaggon; // setze übergebenen Wagon an erster Stelle ein
        anzahl++; // und erhöhe Länge des Zuges um 1
    }
    // ein else hier wäre noch schön
    // damit man eine Rückmeldung erhält, weil der Zug schon voll ist
}
Bitte achte darauf die Variablennamen richtig zu schreiben LegendaryBeazt. Groß- und Kleinschreibung spielt eine Rolle, und Leerzeichen auch.
Ahja und mit den Einrückungen solltest du dir auch etwas Mühe geben. Dem Compiler ist es zwar egal, aber dir als Programmierer hilft es enorm weiter bezüglich Lesbarkeit und Verständnis (uns übrigens auch).

Gruß Technipion
 
#4
Danke für eure Hilfe.
Ich hätte da noch eine Frage.
Wieso wird hier bei MaxZiel der Wert auf -1 gesetzt?
Code:
public int sucheMaxZiel() {
int MaxZiel = -1;
for(int i = 0; i < getAnzahl(); i++)
if (MaxZiel < Waggons[i].getZiel())
      MaxZiel = Waggons[i].getZiel();
return MaxZiel;
}
Die Methode sucheMaxZiel() bestimmt die größte Zielbahnhofsnummer der Waggons eines Zuges
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#5
Hi,

die Methode liefert die grösste Ziel-Bahnhofs-Nummer aller Waggons oder -1, falls keine Waggons vorhanden.

Ist mehr oder minder Standard, wenn nichts gefunden wird -1 zurückzugeben, da dies normalerweise offensichtlich ein ungültiger Wert ist.

Grüsse,
BK
 

HonniCilest

Erfahrenes Mitglied
#7
Ja ihr habt Recht, ist nicht wirklich ein Klammerfehler, da bei einem einzeiligen Body diese auch weggelassen werden kann. Da wurde ich selbst durch die Einrückung irritiert. Sorry! In diesem Sinne appelliere auch ich nochmal an die Formatierung des Codes.