Sind meine If-Statements richtig angesetzt ?

Diskutiere Sind meine If-Statements richtig angesetzt ? im Java Basics - Anfänger-Themen Bereich.
B

Basics_Java

Java:
import java.util.Scanner;

public class SportRatgeber {
    String s1 = new String ("ja");
    String s2 = new String ("nein");

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Wie heisst du?");
        String name = scanner.nextLine();
        System.out.println("Mein Name ist: " + name);
        System.out.println("Hallo, " +name+"!");
        System.out.println("Wie alt bist du, "+name);
        int alter = scanner.nextInt();
        System.out.println(alter);
        
        if(alter<=15){
            
            System.out.println("Frage mal die Eltern");
        
        }
        if(alter<=16 && alter<=25){
            System.out.println("Liebst du Aufregung?");
            }else if(scanner.next().equals("ja")) {
            }else if((scanner.next().equals("ja"))) {
                System.out.println("In einer Gruppe?");
            }else if((scanner.next().equals("ja"))) {
                System.out.println("Handball");
            }
        if(alter<=16 && alter<=25) {
            }else if((scanner.next().equals("nein"))){
                System.out.println("Viel Zeit haben?");
            }else if((scanner.next().equals("ja"))){
                System.out.println("Golf");
            }else if((scanner.next().equals("ja"))){
                System.out.println("Golf");
            }else if((scanner.next().equals("nein"))){
                System.out.println("Joggen");   
            }
        if(alter<=26 && alter <=40) {
                System.out.println("Die Natur lieben?");
            }else if((scanner.next().equals("ja"))){
                System.out.println("Wandern");
            }else if((scanner.next().equals("nein"))){
                System.out.println("Yoga");
            }
        if(alter>=41) {
            System.out.println("Frage mal den Arzt");
        }
        }
        
    }
Das Problem ist, dass es nicht richtig funktioniert, wenn ich das Alter 26 oder älter eingebe funktioniert das Programm nicht, auch das Alter 16 bis 25 mit der Antwort nein funktioniert nicht.
 
J

JustNobody

Nein, das macht so keinen Sinn:
if(alter<=16 && alter<=25)

Wenn alter kleiner gleich 16 ist, dann ist es auch <= 25. Aber Du meinst vermutlich:
if(alter>=16 && alter<=25)
Also Alter zwischen 16 und 25.

Dann noch eine Sache:
Wenn die diversen if Bedinungen sich gegenseitig ausschließen, dann macht die Verwendung von else Sinn:
Code:
if (...) {
  ...
} else if (...) {
  ...
} else if (...) {
  ...
}
Dadurch muss der Compiler nicht alles Prüfen. Wenn das Alter <= 15 ist, dann macht er das erste if und muss nicht mehr alle anderen Bedingungen prüfen.
 
MoxxiManagarm

MoxxiManagarm

Denk mal über diese if's nach:
if(alter<=16 && alter<=25) {

Wenn jünger als 16 und wenn jünger als 25. Du muss den linken Vergleich shcon umdrehen


Davon mal abgesehen werden die inneren Bedingungen nicht funktionieren, bei jedem next() Aufrufst nimmst du einen neuen Wert.
 
B

Basics_Java

Nein, das macht so keinen Sinn:
if(alter<=16 && alter<=25)

Wenn alter kleiner gleich 16 ist, dann ist es auch <= 25. Aber Du meinst vermutlich:
if(alter>=16 && alter<=25)
Also Alter zwischen 16 und 25.

Dann noch eine Sache:
Wenn die diversen if Bedinungen sich gegenseitig ausschließen, dann macht die Verwendung von else Sinn:
Code:
if (...) {
  ...
} else if (...) {
  ...
} else if (...) {
  ...
}
Dadurch muss der Compiler nicht alles Prüfen. Wenn das Alter <= 15 ist, dann macht er das erste if und muss nicht mehr alle anderen Bedingungen prüfen.
Wie kriege ich die Wendung, wenn Alter 16 ist aber die Antwort nicht ja sondern nein lauten soll, das klappt nicht in der Konsole.
 
MoxxiManagarm

MoxxiManagarm

Du solltest dir den Entscheidungsbaum unbedingt mal aufmalen. Dann kannst du ihn auch abbilden. Für mich macht der Entscheidungsbaum aktuell null Sinn. Alleine die Frage nach Aufregung, für mich sind 0 aufregende Aktivitäten dabei.
 
J

JustNobody

Betrachte das als eigenständige Blöcke. Also Du hast zum einen:
Code:
if(alter<=15) {
    // Do something ..
} else if(alter<=25) {
    // Do something else ...
} else if(alter<=25) {
(Ich habe da jetzt auch die untere Grenze weglassen können. Denn wir wissen ja schon, dass Alter nicht <= 15 ist, sonst wären wir ja nicht beim else Zweig.

Das was da dann in den Blöcken gemacht wird, ist eigenständig. Also ohne else und so:
Code:
System.out.println("Liebst du Aufregung?");
if(scanner.next().equals("ja")) {
    // Do something
}
Und so ist jede Abfrage aufgebaut. Also erst die Frage und dann die Auswertung der Antwort.
 
B

Basics_Java

Java:
import java.util.Scanner;

public class SportRatgeber {
    String s1 = new String ("ja");
    String s2 = new String ("nein");

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Wie heisst du?");
        String name = scanner.nextLine();
        System.out.println("Mein Name ist: " + name);
        System.out.println("Hallo, " +name+"!");
        System.out.println("Wie alt bist du, "+name);
        int alter = scanner.nextInt();
        System.out.println(alter);
        
        if(alter<=15){
            System.out.println("Frage mal die Eltern");
        }else if(alter>=16 && alter<=25){
            System.out.println("Liebst du Aufregung?");
            if(scanner.next().equals("ja")) {
                System.out.println("In einer Gruppe?");
            }if((scanner.next().equals("ja"))) {
                System.out.println("Handball");
            }if((scanner.next().equals("nein"))) {
                System.out.println("Viel Zeit haben?");
            }if((scanner.next().equals("ja"))) {
                System.out.println("Golf");
            }if((scanner.next().equals("nein"))){
                System.out.println("Joggen");
            }
        }else if(alter>=26 && alter <=40) {
            System.out.println("Die Natur lieben?");
            if((scanner.next().equals("ja"))){
                System.out.println("Wandern");
            }if((scanner.next().equals("nein"))){
                System.out.println("Yoga");
            }
        
        }else if(alter>=41) {
            System.out.println("Frage mal den Arzt");
        }
    }
        
}
Alle Ausführungen mit "ja" funktionieren, doch alle nein funktionieren nicht :/
 
MoxxiManagarm

MoxxiManagarm

Weil du in jeder Bedingung scanner.next() aufruft. Mit jedem Aufruf erwartet der Scanner eine neue Eingabe! Speicher die die Antwort. Und nochmal, mal mal den Entscheidungsbaum.
 
J

JustNobody

Du hast die Blöcke auch nicht richtig. Wenn Du Teile hast in der Art von:
Code:
System.out.println("Liebst du Aufregung?");
if(scanner.next().equals("ja")) {
    // Do something
}
Dann muss die folgende Frage komplett rein, also bei zwei Fragen so:
Code:
System.out.println("Frage1");
if(scanner.next().equals("ja")) {
    System.out.println("Frage2");
    if(scanner.next().equals("ja")) {
        // Do something
    }
}
 
J

JustNobody

Und natürlich wie Moxxi richtig schreibt: Die ja/nein Prüfung erfolgt entweder mit dem speichern des Wertes oder alles andere als ja wäre ein nein, dann ginge ein else Zweig.
 
MoxxiManagarm

MoxxiManagarm

Ein Entscheidungsbaum, wie er etwa für mich sinnig wäre ("Aufregend" ist hier nicht enthalten):

Code:
alter<=15
|_ja: Eltern fragen
|_nein: alter <= 25
  |_ja: Gruppenfrage
    |_ja: Handbal
    |_nein: Zeitfrage
      |_ja: Golf
      |_nein: Joggen
  |_nein: alter <= 40
    |_ja: Naturfrage
      |_ja: Wandern
      |_nein: Yoga
    |_nein: Arzt fragen


(soll nicht heißen, dass der Baum richtig ist, du musst ihn korrigieren und erweitern)
 
Zuletzt bearbeitet:
T

temi

BTW, das hier solltest du nicht machen:
Java:
String s1 = new String ("ja");
String s2 = new String ("nein");
Schreib stattdessen einfach:
Java:
String s1 = "ja";
String s2 = "nein";
Der Java-Compiler behandelt ein von Anführungszeichen eingeschlossenes Literal bereits als String. Praktisch erzeugst du mit deiner Version also vier String-Objekte: Je einmal als Parameter für den Konstruktor und die beiden Variablen s1 und s2.

In deinem Fall sind die beiden Strings vermutlich als Konstanten gedacht. Per Konvention solltest du sie also folgendermaßen deklarieren:
Java:
private static final String JA = "ja";
private static final String NEIN = "nein";
Und dann natürlich im weiteren Code auch verwenden!
Java:
System.out.println("Liebst du Aufregung?");
if(scanner.next().equals(JA)) {
    // do something
}
 
Zuletzt bearbeitet:
MoxxiManagarm

MoxxiManagarm

Aha! Fallschirmspringen war bisher gar nicht drin bei dir im Code. Aber jetzt siehst du schön deine Zweige. Alle unteren Entscheidungen sind in einer höheren Entscheidung geschachtelt.
 
Zuletzt bearbeitet:
MoxxiManagarm

MoxxiManagarm

Alternativ könntest du auch einen Entscheidungsbaum als (Binär-)Baum erstellen und ihn dann ablaufen, aber das ist vermutlich noch nicht euer Lernziel.
 
T

temi

Habt ihr schon Methoden kennengelernt?

Falls ja, dann würde ich die Unterzweige in Methoden auslagern:
Java:
System.out.println("Liebst du Aufregung?");
if(scanner.next().equals(JA)) {
    frageNachGruppe();
}
 
B

Basics_Java

Java:
import java.util.Scanner;

public class SportRatgeber {
    String s1 = "ja";
    String s2 = "nein";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Wie heisst du?");
        String name = scanner.nextLine();
        System.out.println("Mein Name ist: " + name);
        System.out.println("Hallo, " +name+"!");
        System.out.println("Wie alt bist du, "+name);
        int alter = scanner.nextInt();
        System.out.println(alter);
        
        if(alter<=15){
            System.out.println("Frage mal die Eltern");
            
        }else if(alter<=25){
            System.out.println("Liebst du Aufregung?");
            
            if(scanner.next().equals("ja")) {
                System.out.println("In einer Gruppe?");
                }if((scanner.next().equals("ja"))) {
                    System.out.println("Handball");
                }if((scanner.next().equals("nein"))) {
                    System.out.println("Fallschirmspringen");
            
            }if((scanner.next().equals("nein"))) {
                System.out.println("Viel Zeit haben?");
                }if((scanner.next().equals("ja"))) {
                    System.out.println("Golf");
                }if((scanner.next().equals("nein"))){
                        System.out.println("Joggen");
                }
        
        }else if(alter <=40) {
            System.out.println("Die Natur lieben?");
            if((scanner.next().equals("ja"))){
                System.out.println("Wandern");
            }if((scanner.next().equals("nein"))){
                System.out.println("Yoga");
            }
        
        }else if(alter>=41) {
            System.out.println("Frage mal den Arzt");
        }
    }
        
}
Jetzt habe ich theoretisch alles verschachtelt, doch die Neins klappen dennoch nicht..
 
J

JustNobody

Also das Problem hat @MoxxiManagarm in #8 schon erläutert.
scanner.next() ruft jedes Mal eine neue Eingabe ab. Das willst Du aber nicht. Daher gibt es zwei Möglichkeiten:

a) Die Antwort einmal speichern:

Code:
String antwort = scanner.next();
if((antwort.equals("ja"))) {
    System.out.println("Handball");
}
if((antwort.equals("nein"))) {
    System.out.println("Fallschirmspringen");
}
b) if / else nutzen - alles was kein "ja" ist, wird dann als "nein" gewertet:

Code:
if((scanner.next().equals("ja"))) {
    System.out.println("Handball");
} else {
    System.out.println("Fallschirmspringen");
}
 
Thema: 

Sind meine If-Statements richtig angesetzt ?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben