Bedingte Ausführung

aus ZUM-Wiki, dem Wiki für Lehr- und Lerninhalte auf ZUM.de
< Java
Version vom 15. April 2018, 21:55 Uhr von Karl Kirst (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

if-Abfrage

Eine bedingte Anweisung ist in der Programmierung eine Anweisung, die nur unter einer bestimmten Bedingung ausgeführt wird. Sie ist einer der wichtigsten Bestandteile der Programmierung, da durch sie ein Programm auf unterschiedliche Zustände und Eingaben reagieren kann.

wenn (Bedingung) dann Anweisung(en)

Dies ist folgendermaßen zu lesen: wenn Bedingung eintritt, dann wird zu Anweisung(en) nur verzweigt.


W-Logo.gif Verzweigung (Programmierung), Wikipedia – Die freie Enzyklopädie, (leicht verändert) 06.12.2006 - Der Text ist unter der Lizenz „Creative Commons Attribution/Share Alike“ verfügbar; zusätzliche Bedingungen können anwendbar sein. Siehe die Nutzungsbedingungen für Einzelheiten. In der Wikipedia ist eine Liste der Autoren verfügbar.

In Java

if (Bedingung) {
   // Anweisungsblock 
   ...
}


Beispiel
public void pruefeZahl(int pZahl)
{
   if (pZahl>0) {
      System.out.println(pZahl+" ist positiv.");
   } 
}

Als Arithmetische Notation

Eine if Notation ohne else ist nicht möglich, die Syntax bietet dies nicht. Dennoch gibt es die Möglichkeit if ohne else in Arithmetische Notation abzubilden. Sie Siehe Arithmetische Notation if ohne else .

if-else-Abfrage

if (Bedingung) {
   // Anweisungsblock 
   ...
}
else {
   // Anweisungsblock
   ...
}
Beispiel
public void pruefeZahl(int pZahl)
{
   if (pZahl>0) {
      System.out.println(pZahl+" ist positiv.");
   }
   else {
      System.out.println(pZahl+" ist negativ oder 0.");
   }
}

Arithmetische Notation if / else

Schema:
Bedingung ? Zutreffend : nicht Zutreffend;
 
Syntax mit Zuweisung:
ergebissEmpfänger = Bedingung ? Zutreffend : nicht Zutreffend;
Erleuterung: 

'ergebissEmpfänger' bekommt die Auswertung der Bedingung durch das = zugewiesen. 

Nach dem ? wird der Wert Notiert, für den Fall, das die Auswertung der Bedingung 'true' zurück gibt.
Nach dem : wird der Wert des 'false' Fall notiert.

Wert kann Anweisung/Ausdruck sein, die Rückgabe muss dem Daten Type des ergebissEmpfänger entsprechen.
Bedingung kann eine Anweisung/Ausdruck sein, sie muss den Daten Type boolean|Boolean zurückgeben.

Praxistip: 
Da die Syntax eine if Anweisung ohne else nicht zu lässt, es aber in manchen Fällen eine Arithmetische Notation
zwingend ist, kann das Hinderniss durch Notation des ergebissEmpfänger hinter dem ? und dem : umgangen werden.
Die if/else Verzweigung verhält sich dann so, wie ein if ohne else. 

Beispiel Arithmetische Notation if/else
public void pruefeZahl(int pZahl)
{
    System.out.println( pZahl > 0 ? pZahl+" ist positiv." : pZahl+" ist negativ oder 0." );
}
Beispiel Arithmetische Notation if 'ohne' else

Um die Arithmetische Notation zu Komplettieren und zu zeigen wie es gemacht werden kann. Hier noch ein Beispiel.

public void pruefeZahlArithmetisch( int pZahl )
{
 
   // Ziel ist eine Ausgabe pZahl+2 wenn pZahl grösser 5 ist, ansonsten soll pZahl unverändert beleiben. 
   // Es ist handelt sich immer noch eine if/else, da aber pZahl pZahl zugwiesen wird ist 
   // das Verhalten wie in einer if Bedingung ohne else.
   // im Fall das pZahl grösser 5 kommt es zur addition  
   // pZahl = pZahl + 2. 
   // Im anderen Fall
   // ist und bleibt der Wert von pZahl gleich.
 
   pZahl = pZahl > 5 ? pZahl + 2 : pZahl;
 
   System.out.println( "Wert von pZahl:" + pZahl );
 
}
 
 
//Zur gegenüberstellung
public void pruefeZahlMitIfElse( int pZahl )
{
    if(pZahl > 5)
    {
       pZahl = pZahl + 2;
    }else{
       pZahl = pZahl;
    }
 
     System.out.println( "Wert von pZahl:" + pZahl );
}

Anwendung if/else und Arithmetische Notation

Die if/else Notation empfiehlt sich wenn der Anweisungsblock komplexer ist, da bei Verschachtelungen in Arithmetische Notation schnell unübersichtlichen Kode entsteht.
Anmerkung: Soll in Java Server Faces eine if/else Bedingung abgebildet werden ist man zur Arithmetische Notation gezwungen, if/else ist im View nicht zugelassen.

Verschachtelte if-Abfrage

Bei dem Beispiel handelt es sich um eine verschachtelte Verzweigung. In einem if...else wird ein weiteres if...else untergebracht.

if (Bedingung) {
   // Anweisungsblock 
   ...
}
else {
  if (Bedingung) {
   // Anweisungsblock 
  }
  else {
  // Anweisungsblock
   ...
  }
}
Beispiel
public void pruefeZahl(int pZahl)
{
   if (pZahl>=10) {
      System.out.println(pZahl+" ist zwei oder mehrstellig");
   }
   else {
        if (pZahl<0) {
            System.out.println(pZahl+"ist negativ.");   
        }
        else {
            System.out.println(pZahl+" liegt zwischen 0 und 9.999...");
        }
   }
}

Verschachtelte if-Abfrag in Arithmetische Notation

Beispiel
public void pruefeZahl(int pZahl)
{   
   System.out.println( pZahl>=10 ? pZahl+" ist zwei oder mehrstellig" : pZahl<0 ? pZahl+"ist negativ." : pZahl+" liegt zwischen 0 und 9.999..." );
}
Der Ablauf in Worten:
Übergeben ist pZahl mit dem Wert 5:
Java wertet von Links nach Rechts aus, dabei werden Klammern beachtet.



System.out.println( )
Der Inhalt der Klammer muss ausgewertet werden. 

Als erstes stossen wir auf die Frage.
pZahl>=10? 
Ist pZahl grösser gleich zehn?

Die Antwort ist: Nein.

Ergo muss alles nach dem ersten Fragezeichen bis 
zum nächsten Doppelpunkt überspungen werden.

Wenn die Antwort Ja wäre müsste der Zutreffend Block 
nach dem ersten Fragezeichen ausgewertet werden, 
pZahl+" ist zwei oder mehrstellig" und mit 
System.out.println( ) ausgegeben werden - fertig.

Aber die Auswertung hat Nein ergeben also
'Nicht zutreffend' muss ausgewertet werden.
Nicht zutreffend beginnt nach dem ersten Doppelpunkt.

Hier stossen wir auf die Frage pZahl<0?
Ist pZahl kleiner als Null?
Die Antwort lautet Nein, pZahl ist nicht kleiner als 0.
Ergo wird der zweite Zutreffend Block pZahl+"ist negativ." 
nach dem zweiten Fragezeichen übersprungen und die Auswertung startet 
nach dem zweiten Doppelpunkt.
 
Hier stossen wir auf:
pZahl+" liegt zwischen 0 und 9.999..."
Das wird auf Grund des Plus Zeichens 
zu einer Zeichenkette zusammengefasst.
Damit ist die Klammer ausgewertet.
Das Program  macht via System.out.println() 
die Ausgabe "5 liegt zwischen 0 und 9.999..."
- fertig.

Übliche Operatoren für die Bedingung

Numerische Werte als Bedingung

Bei numerischen Werten verwendet man folgende Operatoren.

      < (kleiner)
      > (größer)
      <= (kleiner gleich)
      >= (größer gleich)
      == (gleich mit zwei == Zeichen)
      != (ungleich)
Wahrheitswerte (boolean)
  • Variablen vom Typ boolean können mit if abgefragt werden. Dabei kann z.B. ein !, also ein logisches NICHT verwendet werden. Das folgende Beispiel verdeutlicht die Abfrage eines Wahrheitswertes.
    public void testeBoolean(boolean wahrheitswert)
    {
        if (!wahrheitswert) {
            System.out.println("Der Wahrheitswert hatte den Wert false");
        }
        else {
            System.out.println("Der Wahrheitswert hatte den Wert true");   
        }   
    }

Die Alternative wäre:

    public void testeBoolean(boolean wahrheitswert)
    {
       	 System.out.println( ! wahrheitswert ? "Der Wahrheitswert hatte den Wert false" : "Der Wahrheitswert hatte den Wert true" );
 
    }

Hinweis

  • Jede Bedingung ist letztlich ein boolscher-Wert, d.h. sie muss eindeutig mit true oder false beantwortet werden können.
  • der else-Teil kann auch weggelassen werden, bei Arithmetische Notation nicht.
  • die if-Anweisung ist keine Schleife (was Anfänger immer wieder falsch sagen!) sondern eine Verzweigung


Hand.gif   Übung
  1. Nennen Sie 3 Zahlen, bei denen jeweils eine andere Zeile die Ausgabe des Programms übernimmt.
  2. Beschreiben Sie, wie die Klammern gesetzt sind, erläutern Sie die Einrückung.
  3. Legen Sie eine Klasse TestKlasse an. Sie soll keine Eigenschaften haben.
    Schreiben Sie eine Methode, die zwei ganze Zahlen als Parameter hat. Die Methode soll die größere auf dem Bildschirm ausgeben. Falls sie gleich groß sind, soll das auch angezeigt werden.

isPositiv() - Beispiel Onlinebank

Die folgende Methode prüft, ob der Kontostand positiv ist1. Typisch ist hierbei, dass Prüfmethoden wie diese mit dem Wort „is“, also dem englischen ist, anfangen. Der Rückgabewert der Methode ist vom Typen boolean, d.h. er wird entweder true oder false zurückgegeben. Neu ist die Speicherungen von Daten in einer „lokalen Variable“ ergebnis. Diese ist eine lokale Variable, da sie nur innerhalb der Methode isPositiv() gültig ist.

  public boolean isPositiv()
  {
     boolean ergebnis;
     if (kontostand>0) {
         ergebnis=true;
     }
     else {
         ergebnis=false;   
     }
     return ergebnis;
  }

Möglich wäre auch:

  public boolean isPositiv()
  {
     boolean ergebnis = kontostand>0 ? true : false;
 
     return ergebnis;
  }
Hand.gif   Übung

(Zum Onlinebankprojekt)

  1. Fügen Sie eine Eigenschaft Dispo-Kredit mit einer get- und set-Methode ein. Ändern Sie anschließend die Methoden abheben() so, dass der Dispo-Kredit nicht überschritten werden kann.
  2. Durch Einzahlen eines negativen Betrages kann man den Bankautomaten austricksen. Ändern Sie diese Sicherheitslücke (umgehend ;-) ).
  3. Erweitern Sie das Konto um eine Eigenschaft „gesperrt“. Implementieren Sie die zugehörige Methode isGesperrt(), die true zurückgibt, wenn das Konto gesperrt ist.

Anwendungsbeispiele

Siehe auch

Weitere externe Links