Verzweigungen (2)

Mehrere Möglichkeiten

Häufig kommt man auf mehreren Wegen zum Ziel. Bei der Einreise nach Island kann man sich durch Vorlage eines Personalausweises oder alternativ auch eines Reisepasses ausweisen. Hier der Dialog mit dem Grenzbeamten. Bitte ausprobieren:


import java.util.*;
class Grenze1 {
  public static void main(String[] args) {
    boolean pass, ausweis;
    Scanner Eingabe = new Scanner(System.in);
    System.out.println("Passkontolle (1)\n");
    System.out.print("Haben Sie einen Pass dabei j/n ? ");
    String antwort = Eingabe.next();
    if (antwort.equals("j")) {pass = true;} else {pass = false;}
    System.out.print("Haben Sie einen Ausweis dabei j/n ? ");
    antwort = Eingabe.next();
    if (antwort.equals("j")) {ausweis = true;} else {ausweis = false;}
    if (pass==true || ausweis==true) {
      System.out.println("\nSie dürfen passieren");
    } else {
      System.out.println("\nSie müssen leider umkehren!\n");
    }
 
}
}


Gleich zu Beginn des Programms lernen Sie den neuen Variablentyp boolean kennen. In einer solchen Variable kann sich das Programm merken, ob eine Bedingung erfüllt war oder nicht. Eine boolean-Variable kann den Wert true oder  false annehmen.

In der letzten If-Abfrage sehen Sie, wie die beiden Bedingungen miteinander verknüpft werden. Der Code || (auf der Tastatur AltGr <) steht für "oder". Die zusammengesetzte Bedingung ist erfüllt, wenn mindestens eine der beiden Einzelbedingungen wahr ist.

In unserem Falle geht es sogar noch einfacher:
Die Variablen pass und ausweis sind an sich schon true oder false, wir müssen sie also nicht noch zusätzlich mit true vergleichen.
Statt  if (pass==true || ausweis==true) { können Sie einfach schreiben: if (pass || ausweis) {

Analog lässt sich die Wertzuweisung an booleschee Variablen vereinfachen.
Statt if (antwort.equals("j")) {pass = true;} else {pass = false;} schreiben Sie pass = antwort.equals("j")

Negativ ist manchmal positiv

Manche Grenzer fragen auch nach ansteckenden Krankheiten. Und sie lassen einen natürlich dann passieren, wenn man nicht krank ist. In Java lässt sich der Wahrheitswert jeder Bedingung umkehren, indem man ein ! davor setzt. Entsprechendes gilt für boolesche Variablen. Wenn die Abfrage der Variablen krank true liefert, dann liefert die Abfrage !krank false.


import java.util.*;

class Grenze2 {
  public static void main(String[] args) {
    Scanner Eingabe = new Scanner(System.in);
    System.out.println("Passkontolle (3)\n");
    System.out.print("Haben Sie eine ansteckende Krankheit j/n ? ");
    if (!Eingabe.next().equals("j")) {
      System.out.println("\nSie dürfen passieren");
    } else {
      System.out.println("\nSie müssen leider umkehren!\n");
    }
  }
}


Viele Bedingungen

An manchen Grenzen reicht der Personalausweis nicht aus. Um zu passieren, braucht man nicht nur einen Pass, sondern auch noch ein Visum. Im folgenden Beispiel werden die Bedingungen Pass und Visum (bzw. der Wert der entsprechenden Variablen) mit && verknüpft. Das liest man als "und". Die zusammengesetzte Bedingung ist nur dann erfüllt, wenn beide Einzelbedingungen erfüllt sind, sonst nicht. Probieren Sie es aus.


import java.util.*;

class Grenze3 {
  public static void main(String[] args) {
    boolean pass, visum;
    Scanner Eingabe = new Scanner(System.in);
    System.out.println("Passkontolle (2)\n");
    System.out.print("Haben Sie den Pass dabei j/n ? ");
    pass = Eingabe.next().equals("j");
    System.out.print("Haben Sie auch ein Visum j/n ? ");
    visum = Eingabe.next().equals("j");
    if (pass && visum) {
      System.out.println("\nSie dürfen passieren");
    } else {
      System.out.println("\nSie müssen leider umkehren!\n");
    }
  }
}


Folgerungen

In der Praxis würde die zweite Frage nicht mehr gestellt, wenn die erste verneint wurde. Auch das lässt sich programmieren:

import java.util.*;

class Grenze4 {
  public static void main(String[] args) {
    Scanner Eingabe = new Scanner(System.in);
    System.out.println("Passkontolle (3)\n");
    System.out.print("Haben Sie den Pass dabei j/n ? ");
    if (Eingabe.next().equals("j")) {
      System.out.print("Haben Sie auch ein Visum j/n ? ");
      if (Eingabe.next().equals("j")) {
        System.out.println("\nSie dürfen passieren");
      } else {                                                    // else zum zweiten if
        System.out.println("\nOhne Visum geht hier nichts!\n");
      }
    } else {                                                      // else zum ersten if
      System.out.println("\nSie müssen leider umkehren!\n");
   
}
  }
}


Spätestens jetzt sehen Sie hoffentlich ein, wie nützlich es ist, jeden weiteren Anweisungsblock um zwei Stellen mehr einzurücken.

Aufgaben:

  1. Laden Sie erneut Grenze1. Ändern Sie die Klasse so ab, dass die zweite Frage nicht mehr gestellt wird, wenn die erste mit ja beantwortet wurde.
  2. Laden Sie erneut Grenze1. Verknüpfen Sie die beiden Bedingungen mit && statt ||. Am Ergebnis der Prüfung (durchgelassen wird nur, wer entweder Ausweis oder Pass vorzeigt) soll sich natürlich nichts ändern. Welche weiteren Änderungen müssen Sie deshalb vornehmen?
  3. Schreiben Sie ein Programm, das den Benutzer zur Eingabe von zwei Zahlen auffordert. Das Programm soll ausgeben "Beide Zahlen sind gleich" oder "Die erste Zahl ist größer" oder "Die zweite Zahl ist größer".
  4. Schreiben Sie ein Programm, das drei ganze Zahlen abfragt und dann den Medianwert (die mittlere der drei Zahlen) ausgibt.
  5. Fragen Sie den Benutzer nach Gewicht und Größe. Wenn der Body mass index (Gewicht in kg geteilt durch das Quadrat der Größe in Meter), zwischen 20 und 25 liegt, antworten Sie mit "Alles klar". Wenn er unter 20 liegt, so antworten Sie mit "Geh öfter mal gut essen", wenn er über 25 liegt, dann antworten Sie: "Futttere nicht so viel!".
  6. Jahreszahlen von Schaltjahren sind durch 4 teilbar, aber Jahreszahlen, die durch 100 teilbar sind, sind nur dann Schaltjahre, wenn sie auch durch 400 teilbar sind. Konkret: 2009 ist kein Schaltjahr, 2012 ist eins, 2000 war eins, 1900 war keins. Fassen Sie das in ein Prüfprogramm.