Variabel mit mehrere Zahlen speichern

moali007

Mitglied
Hallo, meine Aufgabe war es entsprechend des Alters Autohalters eine Altersklasse zu erstellen wie man erkennen kann, jedoch wenn der Kunde 17 jahre ist. Ferner, tritt die Kind, Jugendliche, fehlermeldung auf. Jedoch, als ich die if zu else if ersetzt habe, ist die Lösung richtig, jedoch warum? was der unterschied zu einem if und else if. Wenn ein if true ist, muss er doch die restlichen if`s überspringen oder nicht?


static int berechneBaujahr(int aktuell, int baujahr)
{
int x = aktuell - baujahr;
if(x >= 0 && x <= 12)
{
System.out.println("Auto ist Kind");
}
if( x >= 12 && x <= 18)
{
System.out.println("Auto jugendlich");
}

if(x >= 18 && x <= 70)
{
System.out.println("Auto Erwachsen");
}
if(x >= 70)
{
System.out.println("Auto Senior");
}
else {
System.out.print("Fehrler Alter");
}

return x;
 

Robert Zenz

Top Contributor
Na schau, du musst das einfach nur mal ganz einfach lesen:

Java:
if(x >= 0 && x <= 12) {
    System.out.println("Auto ist Kind");
}

if( x >= 12 && x <= 18) {
    System.out.println("Auto jugendlich");
}     

if(x >= 18 && x <= 70) {
    System.out.println("Auto Erwachsen");
}

if(x >= 70) {
    System.out.println("Auto Senior");
} else {
    System.out.print("Fehler Alter");
}

Code:
wenn x groeszer 0 und kleiner gleich 12 dann
    zeige "Auto ist Kind"

wenn x groeszer 12 und kleiner gleich 18 dann
    zeige "Auto jugendlich"

wenn x groeszer 18 und kleiner gleich 70 dann
    zeige "Auto Erwachsen"

wenn x groeszer 70 dann
    zeige "Auto Senior"
ansonsten
    zeige "Fehler Alter"

So, und wenn du das jetzt mit else if machst:

Java:
if(x >= 0 && x <= 12) {
    System.out.println("Auto ist Kind");
} else if( x >= 12 && x <= 18) {
    System.out.println("Auto jugendlich");
} else if(x >= 18 && x <= 70) {
    System.out.println("Auto Erwachsen");
} else if(x >= 70) {
    System.out.println("Auto Senior");
} else {
    System.out.print("Fehler Alter");
}

Code:
wenn x groeszer 0 und kleiner gleich 12 dann
    zeige "Auto ist Kind"
ansonsten wenn x groeszer 12 und kleiner gleich 18 dann
    zeige "Auto jugendlich"
ansonsten wenn x groeszer 18 und kleiner gleich 70 dann
    zeige "Auto Erwachsen"
ansonsten wenn x groeszer 70 dann
    zeige "Auto Senior"
ansonsten
    zeige "Fehler Alter"

Jetzt etwas klarer?
 

Blender3D

Top Contributor
Wenn ein if true ist, muss er doch die restlichen if`s überspringen oder nicht?
Nein er sieht lediglich nach ob die Bedingung erfüllt ist.
Bei einem Alter von 18 treffen folgende Bedingungen deines Codes zu.
Java:
if( x >= 12 && x <= 18) {
    System.out.println("Auto jugendlich");
}    
if(x >= 18 && x <= 70) {
    System.out.println("Auto Erwachsen");
}
Jedoch, als ich die if zu else if ersetzt habe, ist die Lösung richtig, jedoch warum?
Bei der Variante else if wird die 2te Bedingung aber nicht mehr erreicht weil sie nur überprüft wird wenn die vorige Bedingung nicht erfüllt war.

Würdest Du das Ganze in 2 Funktionen aufspalten und für die Variablen besser Namen wählst kannst Du Deinen Code übersichtlicher machen.
Java:
public class StartAutoAlter {
    public static void main(String[] args) {
        int[] baujahr = { 2005, 1910, 1988, 2015 };
        for (Integer bj : baujahr) {
            int alter = berechneAlter(2022, bj);
            System.out.println(bj + " -> " + alterZuName(alter));
        }
    }

    public static String alterZuName(int alter) {
        if (alter < 0)
            return "Fehler Alter";
        if (alter < 13) // 0 - 12
            return "Auto ist Kind";
        if (alter < 19) // 13 - 18
            return "Auto jugendlich";
        if (alter < 71) // 19 - 70
            return "Auto Erwachsen";
        return "Auto Senior"; // > 70
    }

    public static int berechneAlter(int aktuell, int baujahr) {
        return aktuell - baujahr;
    }
}
 

AndyZ59

Mitglied
Hi,
viele Wege führen nach Rom :)
Ziel ist es, den Code richtig, aber auch lesbar zu schreiben, denn wenn Du das nach 6 Monaten wieder lesen willst, oder eine Änderung vornehmen musst, dann erkennst Du den Vorteil von lesbarem Code, also:

bei der if Entscheidung wird der folgende Block ausgeführt, wenn die if-Berechnung WAHR ist, also ein true rauskam.
wenn Du die Altersabfragen nur mit if-Abfragen abklapperst verbrauchst Du unnötig Rechenzeit, denn Dein Alter kann ja nur in einem Block TRUE sein, alle anderen liefern FALSE (sofern Du die Logik richtig aufgebaut hast). Das wäre bei heutigen Rechnern zwar kein Problem, wird jedoch beim Debuggen lästig.

Besser ist der Stil mit if mit else if, denn nur wenn das erste if FALSE ist, kommt die nächste Abfrage dran. So wird Dein ganzer Abfragebaum immer gleich lang und es wird nicht erfolglos in Zweigen gesucht, die sowieso FALSE ergeben.

Achtung bei den Abfragen:
Du darfst nicht in beiden logischen Entscheidungen ein "=" haben, sonst hast Du ein Auto, das gleichzeitig KIND und JUGEND meldet,
also
1) >=,
2) <


zum besseren Verständnis kannst Du den Code oben

Java:
[CODE]if(x >= 0 && x <= 12) {
    System.out.println("Auto ist Kind");
} else if( x >= 12 && x <= 18) {
    System.out.println("Auto jugendlich");
} else if(x >= 18 && x <= 70) {
    System.out.println("Auto Erwachsen");
} else if(x >= 70) {
    System.out.println("Auto Senior");
} else {
    System.out.print("Fehler Alter");
}
[/CODE]

auch wie folgt umbauen, dann wird die Ablaufstruktur sichtbar:

Java:
if(x >= 0 && x <= 12) {
    System.out.println("Auto ist Kind");
    }
    else if( x >= 12 && x <= 18) {
        System.out.println("Auto jugendlich");
        }
        else if(x >= 18 && x <= 70) {
            System.out.println("Auto Erwachsen");
            }
            else if(x >= 70) {
                System.out.println("Auto Senior");
                }
                else {
                    System.out.print("Fehler Alter");
                }

Vermutlich ist die SWITCH - CASE Struktur hier eleganter, ich kenne den Syntax aber noch nicht, selber googeln :)
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Eine mögliche Alternative um diese riesige Kontrollstruktur zu vermeiden wäre die Nutzung eine NavigableMap:
Java:
    public void demonstrateNavigableMap() {
        NavigableMap<Integer, String> ageDescriptions = new TreeMap<>();
        ageDescriptions.put(Integer.MIN_VALUE, "Fehler Alter");
        ageDescriptions.put(0, "Auto ist Kind");
        ageDescriptions.put(12, "Auto ist jugendlich");
        ageDescriptions.put(18, "Auto Erwachsen");
        ageDescriptions.put(70, "Auto Senior");

        System.out.println(ageDescriptions.floorEntry(-1)); // -2147483648=Fehler Alter
        System.out.println(ageDescriptions.floorEntry(0)); // 0=Auto ist Kind
        System.out.println(ageDescriptions.floorEntry(11)); // 0=Auto ist Kind
        System.out.println(ageDescriptions.floorEntry(12)); // 12=Auto ist jugendlich
        System.out.println(ageDescriptions.floorEntry(17)); // 12=Auto ist jugendlich
        System.out.println(ageDescriptions.floorEntry(18)); // 18=Auto Erwachsen
        System.out.println(ageDescriptions.floorEntry(69)); // 18=Auto Erwachsen
        System.out.println(ageDescriptions.floorEntry(70)); // 70=Auto Senior
    }

floorEntry liefert eine Map.Entry, wodurch man halt ein key / value Paar bekommt und man kann dann die Ausgabe auch schön zuordnen:
Code:
-2147483648=Fehler Alter
0=Auto ist Kind
0=Auto ist Kind
12=Auto ist jugendlich
12=Auto ist jugendlich
18=Auto Erwachsen
18=Auto Erwachsen
70=Auto Senior

Wenn man nur den Wert selbst haben will, dann ergänzt man einfach ein .getValue() und schon hat man nur den gesuchten Wert.

==> Einmalig die Map füllen
==> map.floorEntry(age).getValue() aufrufen
 

Neue Themen


Oben