Java/Algorithmik: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
(N - importiert)
 
KKeine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
(11 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Im vorherigen Kapitel wurde beim [[Java/Online-Bank#Das_Auto|Tank-Beispiel]] bereits bemerkt, dass man nur tanken sollte, '''WENN''' der Tank noch nicht voll ist. In diesem Kapitel werden wir bedingte Anweisungen einführen, bei denen vor der Ausführung der Anweisungen erst geprüft wird, ob eine Bedingung erfüllt ist. Es können aber auch mehrere Bedingungen mit logischen Operatoren verknüpft werden.
{{Fortsetzung|
{{Fortsetzung|
vorher=Einstieg in die OOP<br>Online-Bank|vorherlink=Java/Online-Bank|
vorher=Einstieg in die OOP<br>Online-Bank|vorherlink=Java/Online-Bank|
weiter=Funktionsplotter mit Turtle Grafik|weiterlink=Java/Turtle-Grafik|
weiter=Kontrollstrukturen<br>Schleifen|weiterlink=Java/Schleife|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}


== bedingte Anweisung ==
Im vorherigen Kapitel wurde beim [[Java/Online-Bank#Das_Auto|Tank-Beispiel]] bereits bemerkt, dass man nur tanken sollte, '''WENN''' der Tank noch nicht voll ist. In diesem Kapitel werden wir '''bedingte Anweisungen''' einführen, bei denen vor der Ausführung der Anweisungen erst geprüft wird, ob eine oder mehrere Bedingungen erfüllt sind. Mit diesen '''Kontrollstrukturen''' können dann auch komplexere [[Algorithmus|Algorithmen]] modelliert und ausgeführt werden.
[[Datei:Einseitige Auswahl svg.svg|miniatur|250px|[[Algorithmus#Grundstrukturen|Struktogramm]] einer if-Anweisung]]
 
Eine '''bedingte Anweisung''' ist in der Programmierung eine Anweisung, die nur unter einer be­stimmten Bedingung ausgeführt wird. Sie ist einer der wichtigsten Bestandteile der Program­mierung, da durch sie ein Programm auf unterschiedliche Zustände und Eingaben reagieren kann.  
== Bedingte Anweisung ==
[[Datei:Ja_nein.png|miniatur|250px|[[Algorithmus#Grundstrukturen|Struktogramm]] einer if-Anweisung]]
Eine '''bedingte Anweisung''' ist eine der wichtigsten Bestandteile der Program­mierung, da durch sie ein Programm auf unterschiedliche Zustände und Eingaben reagieren kann.  


<source lang="java">
<source lang="java">
if (Bedingung) {  
if (Bedingung) {  
  //Anweisungsblock
    //Anweisungsblock
  …  
    …  
}
}
  else {
else {
  //Anweisungsblock
    //Anweisungsblock
  …  
    …  
}
}
</source>
</source>
Dies ist folgendermaßen zu lesen: Wenn die Bedingung eintritt, dann wird der erste Anweisungsblock ausgeführt: Ansonsten wird der zweite Anweisungsblock ausgeführt.


Solch bedingte Anweisungen können auch verschachtelt werden:
Dies ist folgendermaßen zu lesen:
* '''Wenn''' die Bedingung eintritt,<br>dann wird der erste Anweisungsblock ausgeführt;
* '''Sonst''' wird der zweite Anweisungsblock ausgeführt.
 
Bedingte Anweisungen können auch '''verschachtelt''' werden:<br>
Im folgenden Beispiel ist im else-Zweig der ersten Verzweigung eine weitere Verzweigung untergebracht.


<source lang="java">
<source lang="java">
public void prüfeZahl(int pZahl){   
public void prüfeZahl(int pZahl){   
  if (pZahl >= 10) {       
    if (pZahl >= 10) {       
    System.out.println(pZahl+" ist zwei oder mehrstellig");   
        System.out.println(pZahl + " ist zwei oder mehrstellig");   
  }
  else {
    if ( pZahl < 0) {
      System.out.println(pZahl+"ist negativ.");   
     }
     }
     else {     
     else {
      System.out.println(pZahl+" liegt zwischen 0 und 9.999...");         
        if ( pZahl < 0) {
            System.out.println(pZahl + "ist negativ.");    
        }
        else {   
            System.out.println(pZahl + " liegt zwischen 0 und 9.999...");         
        }
     }
     }
  }
}
}</source>
</source>


{{Übung|# Nennen Sie 3 Zahlen, bei denen jeweils eine andere Zeile die Ausgabe des Programms übernimmt. Beschreiben Sie, wie die Klammern gesetzt sind, erläutern Sie die Einrückung.
{{Aufgabe|Schreiben Sie eine Methode, die zwei ganze Zahlen als Übergabeparameter hat.<br>Die Methode soll ausgeben, ob die erste Zahl größer, gleich oder kleiner als die zweite ist.}}
# Bei dem Beispiel handelt es sich um eine verschachtelte Verzweigung. In einem <code>if … else</code> wird ein weiteres <code>if … else</code> untergebracht.
## Legen Sie eine Klasse <code>TestKlasse</code> 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 ange­zeigt werden.}}


=== Bedingte Auszahlung - if...else bei der Online-Bank ===
=== Online Bank: Bedingte Auszahlung ===
Ein konkretes Beispiel: Die Auszahlung erfolgt nur, wenn es der Kontostand zulässt.


Die Auszahlung erfolgt nur, wenn es der Kontostand zulässt.
<source lang="java">
<source lang="java">
public void auszahlen(double pBetrag){
public void auszahlen(double pBetrag){
  if (kontostand >= pBetrag){
    if (kontostand >= pBetrag) {
    kontostand -= pBetrag;
        kontostand -= pBetrag;
    System.out.println("Auszahlung erfolgt: "+pBetrag);
        System.out.println("Auszahlung erfolgt: "+pBetrag);
  }
    }
  else {  
    else {  
    System.out.println("Auszahlung verweigert!\nEs fehlen“+(pBetrag-kontostand));
        System.out.println("Auszahlung verweigert!\nEs fehlen“+(pBetrag-kontostand));
  }
    }
  System.out.println("Auf Wiedersehen!");
    System.out.println("Auf Wiedersehen!");
}</source>
}
</source>


=== isPositiv() - Beispiel Onlinebank ===
=== Online Bank: Prüfmethode isPositiv() ===
Die folgende Methode prüft, ob der Kontostand positiv ist<ref>Eigentlich ist 0 sowohl positiv als auch negativ. Das berücksichtigt die Methode aber nicht. Ggf. müsste man die Methode <code>isGroesserNull()</code> nennen.</ref>. Typisch ist hierbei, dass Prüfmethoden wie diese mit dem Wort „is“, also dem englischen ist, anfangen. Der Rückgabewert der Methode ist vom [[Java/Glossar|Datentypen|Typen]] <code>boolean</code>, d.h. es wird entweder <code>true</code> oder <code>false</code> zurückgegeben.


Neu ist die Speicherung von Daten in einer „lokalen Variable“ <code>ergebnis</code>. Diese ist eine lokale Variable, da sie nur innerhalb der Methode <code>isPositiv()</code> gültig ist.  
Die folgende Methode prüft, ob der Kontostand positiv ist.
* Der Rückgabewert der Methode ist vom [[Java/Glossar#Datentypen|Typ]] '''boolean''',<br> d.h. es wird entweder '''true''' oder '''false''' zurückgegeben.
* Zur kurzfristigen Speicherung wird eine '''lokale''' Variable <code>ergebnis</code> verwendet.  


{{Box|Lokale Variable|Eine Variable, die innerhalb einer Methode angelegt wird, wird lokale Varia­ble genannt. Sie wird mit verlassen der Methode wieder zerstört. Sie kann nur innerhalb der Me­thode abgefragt und verändert werden. Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Un­terscheidung das Wort <code>this</code> verwenden, um die Eigenschaft zu erreichen. Bei Namensgleichheit hat das Abfragen der lokalen Variable Priorität. Lokale Variablen lassen sich gut als kurzfristigen Zwischenspeicher einsetzen.
<source lang="java">
 
public boolean isPositiv() {
Konvention: Die Deklaration der lokalen Variable sollte direkt unter dem Kopf der Methode – also direkt nach der ersten geschweiften Klammer - passieren.|Merksatz}}
    boolean ergebnis;
 
    if (kontostand > 0) {
<source lang="java"> public boolean isPositiv()
        ergebnis = true;
  {
    }
    boolean ergebnis;
    else {
    if (kontostand>0) {
        ergebnis = false;   
        ergebnis=true;
    }
    }
    return ergebnis;
    else {
}
        ergebnis=false;   
    }
    return ergebnis;
  }
</source>
</source>


Möglich wäre auch:
{{Box|Lokale Variable|*Eine Variable, die innerhalb einer Methode angelegt wird, wird '''lokale''' Varia­ble genannt.
<source lang="java">  public boolean isPositiv()
*Sie kann '''nur innerhalb''' der Me­thode abgefragt und verändert werden. Mit Verlassen der Methode wird sie gelöscht.
  {
*Lokale Variablen lassen sich gut als kurzfristigen '''Zwischenspeicher''' einsetzen.
    boolean ergebnis = kontostand>0 ? true : false;
*Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Un­terscheidung das Wort <code>this</code> verwenden, um die Eigenschaft zu erreichen. Bei Namensgleichheit hat das Abfragen der lokalen Variable Priorität.
   
*'''Konvention''': Die '''Deklaration''' der lokalen Variable sollte '''direkt unter dem Kopf der Methode''' passieren.|Merksatz}}
    return ergebnis;
  }
</source>


{{Übung|
{{Aufgabe|'''Onlinebankprojekt'''
(Zum Onlinebankprojekt)
# Fügen Sie eine '''Eigenschaft Dispo-Kredit''' mit einer get- und set-Methode ein.
# Fügen Sie eine Eigenschaft Dispo-Kredit mit einer get- und set-Methode ein. Ändern Sie anschließend die Methoden <code>abheben()</code> so, dass der Dispo-Kredit nicht überschritten werden kann.  
# Ändern Sie anschließend die Methoden <code>abheben()</code> so, dass der Dispo-Kredit nicht überschritten werden kann.  
# Durch Einzahlen eines negativen Betrages kann man den Bankautomaten austricksen. Ändern Sie diese Sicherheitslücke (umgehend ;-) ).
# Durch Einzahlen eines negativen Betrages kann man den Bankautomaten austricksen. Ändern Sie diese Sicherheitslücke!
# Erweitern Sie das Konto um eine Eigenschaft „gesperrt“. Implementieren Sie die zugehörige Methode <code>isGesperrt()</code>, die <code>true</code> zurückgibt, wenn das Konto gesperrt ist.
# Erweitern Sie das Konto um eine '''Eigenschaft gesperrt'''. Implementieren Sie die zugehörige Methode <code>isGesperrt()</code>, die <code>true</code> zurückgibt, wenn das Konto gesperrt ist.
}}
}}


=== BMI-Rechner ===
=== BMI-Rechner ===
„Der {{wpde|Body-Mass-Index}} (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen im Verhältnis zum Quadrat seiner Größe. Da Überge­wicht ein weltweit zunehmendes Problem darstellt, wird die Körpermassenzahl vor allem dazu verwendet, auf eine diesbezügliche Gefährdung hinzuweisen. Der BMI gibt lediglich einen groben Richtwert an und ist nicht unumstritten, da er die Statur eines Menschen und die individuell verschiedene Zusammensetzung des Körpergewichts aus Fett- und Muskelgewebe naturgemäß nicht berücksichtigt. Ebenso ist er für besonders große und besonders kleine Menschen nur eingeschränkt aussagefähig.
„Der {{wpde|Body-Mass-Index}} (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen im Verhältnis zum Quadrat seiner Größe. Der BMI gibt lediglich einen groben Richtwert an und ist nicht unumstritten, da er die Statur eines Menschen und die individuell verschiedene Zusammensetzung des Körpergewichts aus Fett- und Muskelgewebe naturgemäß nicht berücksichtigt. Ebenso ist er für besonders große und besonders kleine Menschen nur eingeschränkt aussagefähig.
 
{{Box|Arbeitshinweise|
# Entwerfen Sie die Klasse Person, die das Alter, das Gewicht und die Größe einer Personerfasst. Entwickeln Sie die Methode <code>getBMI()</code>, die den BMI berechnet und zurückgibt.
# Lassen Sie prüfen, ob die Person Unter-, Normal- oder Übergewicht hat. Untergewicht soll ein Wert unter 20, Übergewicht ein Wert über 25 sein.
#* Fortgeschrittene: Realisieren Sie die gesamte Tabelle (kritisches Untergewicht und „Adi­positas“, d.h. Starkes Übergewicht über BMI 30)<br>Lassen Sie prüfen, ob die Person ihr Idealgewicht hat. Es soll <code>true</code> zurückgegeben werden, wenn das der Fall ist.<br>(Hinweis: Es ist einfacher mit <code>&&</code> zu arbeiten als mit <code>if...else</code>. Fragen Sie Ihren Lehrer!)
# Realisieren Sie eine Klasse Zahlenratespiel. Eine Zahl <code>zuErratendeZahl</code> wird als Eigen­schaft vom Konstruktor gesetzt (z.B. auf 7).
#* Entwickeln Sie eine Methode <code>rateZahl(int zahl)</code>, die <code>zahl</code> einliest und mit <code>zuErratende­Zahl</code> vergleicht. Lassen Sie ausgeben „zu klein“, zu groß“ oder „Gewonnen!“.
#* Erweitern Sie die Methode um eine Abfrage: der Ratende soll nur Zahlen zwischen 1 und 10 eingeben können. |Arbeitsmethode}}


<div class="grid">
<div class="grid">
Zeile 126: Zeile 114:
| Übergewicht
| Übergewicht
| 25 - 30
| 25 - 30
|-
| Starkes Übergewicht
| > 30
|}
|}
</div>
</div>
Zeile 152: Zeile 143:
|}
|}
</div></div>
</div></div>
{{Aufgabe|
Entwerfen Sie die '''Klasse Person''', die das Alter, das Gewicht und die Größe einer Person erfasst.
# Entwickeln Sie die Methode <code>getBMI()</code>, die den BMI berechnet und zurückgibt.
# Lassen Sie prüfen, ob die Person Unter- (< 20), Normal- oder Übergewicht (> 25) hat.
# Realisieren Sie nun die gesamte Tabelle (kritisches Untergewicht und „Adi­positas“)
# Lassen Sie prüfen, ob die Person ihr '''Idealgewicht''' hat. Es soll <code>true</code> zurückgegeben werden, wenn das der Fall ist. Verwenden Sie bei der Abfrage die logische UND-Verknüpfung (siehe unten).
}}


== Operatoren ==  
== Operatoren ==  
Zeile 167: Zeile 166:


=== Logische Operatoren ===
=== Logische Operatoren ===
Wichtige logische Operatoren sind NICHT, UND und ODER. Wir verwenden sie alltäglich, wenn wir Aussagen formulieren. Allerdings sind wir im Alltag häufig unpräzise. Im Alltag verwenden wir Logische Operatioren ohne es zu bemerken häufig bei Sätzen mit „Wenn...“:
Wichtige logische Operatoren sind UND, ODER und NICHT.<br> Wir verwenden sie täglich, wenn wir Aussagen formulieren, häufig in Sätzen mit „Wenn...“:


Wenn ich eine gute Note in der Klausur habe UND ich im Unterricht mitmache, dann bekomme ich eine gute Note (d.h. nur wenn beides der Fall ist).
* '''Wenn''' ich eine gute schriftliche '''UND''' mündliche Note habe, bekomme ich eine gute Zeugnisnote (d.h. nur wenn beides der Fall ist):
 
<source lang="java">
<source lang="java">if ((klausurNote <= 2) && (soMiNote <= 2)) ...
if ((klausurNote <= 2) && (soMiNote <= 2)) ...
</source>
</source>
Wenn es regnet ODER die Sonne stark scheint, sitze ich unter einem Schirm (d.h. wenn zumindest eines erfüllt ist. Wenn es regnet und zugleich die Sonne stark scheint, sitze ich natürlich erst recht unter einem Schirm.)
* '''Wenn''' es regnet '''ODER''' die Sonne stark scheint, sitze ich unter einem Schirm (d.h. wenn zumindest eines erfüllt ist. Wenn es regnet und zugleich die Sonne stark scheint, sitze ich natürlich erst recht unter einem Schirm.)
 
<source lang="java">
<source lang="java">if ((sonneScheint == true) ||(esRegnet == true)) ...
if ((sonneScheint == true) ||(esRegnet == true)) ...
</source>
</source>
 
* '''Wenn''' es '''NICHT''' hell ist, dann geht die Straßenlaterne an.  
Wenn es NICHT hell ist, dann geht die Straßenlaterne an.  
<source lang="java">
 
if (!(helligkeitsSensor > 30)) // ... das ist das gleiche wie: if (helligkeitsSensor <= 30)  
<source lang="java">if (!(helligkeitsSensor > 30)) // ... das ist das gleiche wie: if (helligkeitsSensor <= 30)  
</source>
</source>


{{Box|Zusammenfassung|Für zwei boolesche Werte (also bei Java Typ <code>boolean</code>) a und b gilt:  
{{Box|Zusammenfassung|Für zwei boolesche Werte a und b gilt:  
* '''!a''' (bedeutet NICHT a) erzeugt das Gegenteil von a. Wenn a true ist, ist !a false und andersherum.
* '''!a''' bedeutet '''NICHT a''' und erzeugt das '''Gegenteil von a'''. Wenn a true ist, ist !a false und andersherum.
* Die Aussage '''a && b''' (bedeutet a UND b) ist true, wenn sowohl a als auch b true sind. Sonst nicht.
* '''a && b''' bedeutet '''a UND b''' und ist true, wenn '''sowohl a als auch b true''' sind. Sonst nicht.
* Die Aussage '''a || b''' (d.h. a ODER b) ist true, wenn entweder a oder b oder beide true sind. D.h. nur wenn sowohl a als auch b false sind, ist die Aussage a || b false.|Merksatz}}
* '''a &#124;&#124; b''' bedeutet '''a ODER b''' und ist true, wenn '''entweder a oder b oder beide true''' sind.<br> D.h. nur wenn sowohl a als auch b false sind, ist die Aussage a || b false.|Merksatz}}
 
Vertiefung {{wpde|Aussagenlogik}}


=== Anwendung===
==== Die kleinste aus 3 Zahlen ====
Drei Zahlen werden als Parameter übergeben, die kleinste soll zurückgegeben werden. Die folgende Methode liefert einen Lösungsansatz, der noch nicht vollkommen optimal ist.
<source lang="java">
public int kleinsteZahl(int x, int y, int z) {
  int zwischenspeicher = x;
  if ((x<y) && (x<z)) zwischenspeicher = x;
  if ((y<x) && (y<z)) zwischenspeicher = y;
  if ((z<x) && (z<y)) zwischenspeicher = z;
return zwischenspeicher; 
</source>
{{Box|Arbeitshinweise|
# Analysieren Sie die Methode: <code>kleinsteZahl(int x, int y, int z)</code> Wie könnte man a) die größte b) die mittlere herausfinden?
# Nennen Sie weitere Alltagsbeispiele für UND, ODER und NICHT. Erläutern Sie die folgende Tabelle.
|Arbeitsmethode}}
{| border="0"
{| border="0"
|
|
Zeile 254: Zeile 234:
|}
|}
|}
|}
{{wpde|Boolesche Algebra}}


==== Porto-Kalkulator ====
Vertiefung:
{{Box|Aufgabe|# Realisieren Sie einen Portokalkulator (Daten: vgl. unten). Es gibt keine weiteren Vorgaben, außer, dass das Ergebnis kundenfreundlich sein soll.
* {{wpde|Aussagenlogik}}
# Im Freibad gilt folgende Regelung: Kinder unter 3 Jahren sind kostenlos. Kinder bis 12 kosten die Hälfte des Erwachsenenpreises. Ein Erwachsenener zahlt 5 Euro, es sei denn er ist über 65, dann zahlt er nur die Hälfte. Schreiben Sie eine Klasse Freibadkasse, die eine Methode hat die nach Übergabe des Alters entsprechend den Preis nennt. Eine zweite Methode soll nach Übergabe des Alters ein Ticket drucken und den Eintrittspreis auf die Eigenschaft <code>tageseinnahmen</code> addieren.
* {{wpde|Boolesche Algebra}}
# Ein Computerhändler gibt folgende Rabatte:
#* bei Beträgen unter 500€ gibt es 5% Rabatt
#* bei Beträgen zwischen 500€ und 2000€ gibt er 10% Rabatt
#* über 2000€ gibt er sogar 15% Rabatt.<br>Schreiben Sie die Methode: <code>druckeRechnungAus(double rechnungsbetrag)</code>
# Eine Klasse Kühlhaus hat 4 Eigenschaften:<code>temperaturRaum1, temperaturRaum2, temperaturRaum3, kühlstufe</code> Sobald in einem Raum die Temperatur größer als -5 Grad ist, schaltet <code>kühlstufe</code> auf Stufe1. Liegt in mindestens 2 Räumen die Temperatur über -5 Grad, so wird Stufe 2 eingestellt. Realisieren Sie eine entsprechende Klasse mit den zugehörigen Methoden.|Arbeitsmethode}}


{| class="wikitable"
== Weitere Beispiele ==
|-
 
! Formate !! Preise !! Maße !!Gewicht
=== Zahlenratespiel ===
|-
{{Aufgabe|
| Standard  || 0,80 €  ||L: 14 - 23,5 cm<br>B: 9 - 12,5 cm<br>H: bis 0,5 cm || bis 20 g
# Eine Zahl <code>zuErratendeZahl</code> wird als Eigen­schaft vom Konstruktor gesetzt (z.B. auf 7).
|-
# Entwickeln Sie eine Methode <code>rateZahl(int zahl)</code>, die <code>zahl</code> einliest und mit <code>zuErratende­Zahl</code> vergleicht. Lassen Sie ausgeben „zu klein“, zu groß“ oder „Gewonnen!“.
| Kompakt  || 0,95 €  || L: 10 - 23,5 cm<br/>B: 7 - 12,5 cm<br>H: bis 1 cm  || bis 50 g
# Erweitern Sie die Methode um eine Abfrage: der Ratende soll nur Zahlen zwischen 1 und 10 eingeben können.}}
|-
 
| Groß      || 1,55 €  || L: 10 - 35,3 cm<br>B: 7 - 25 cm<br>H: bis 2 cm || bis 500 g
=== Die kleinste aus 3 Zahlen ===
|-
{{Aufgabe|
| Maxi      || 2,70 €  || L: 10 - 35,3 cm<br>B: 7 - 25 cm<br>H: bis 5 cm || bis 1.000 g
Drei Zahlen werden als Parameter übergeben, die kleinste soll zurückgegeben werden.<br> Die folgende Methode liefert einen Lösungsansatz, der noch nicht optimal ist.
|}  
<source lang="java">
public int kleinsteZahl(int x, int y, int z) {
    int zwischenspeicher = x;
    if ((x<y) && (x<z)) zwischenspeicher = x;
    if ((y<x) && (y<z)) zwischenspeicher = y;
    if ((z<x) && (z<y)) zwischenspeicher = z;
    return zwischenspeicher; 
}
</source>
# Analysieren Sie die Methode: <code>kleinsteZahl(int x, int y, int z)</code>
# Wie könnte man a) die größte b) die mittlere herausfinden?
# Schreiben Sie die Methode mit verschachtelten Verzeigungen}}
 
=== Portorechner ===
{{Aufgabe|
Realisieren Sie einen '''Portorechner'''. Verwenden Sie folgende Angaben: [https://www.deutschepost.de/de/b/brief_postkarte.html deutschepost.de].
}}
=== Freibadkasse ===
{{Aufgabe|
Schreiben Sie eine Klasse '''Freibadkasse''', die eine Methode hat die nach Übergabe des Alters entsprechend den Preis nennt.
# Kinder unter 3 Jahren sind kostenlos.
# Kinder bis 12 kosten die Hälfte des Erwachsenenpreises.
# Ein Erwachsener zahlt 5 Euro, es sei denn er ist über 65, dann zahlt er nur die Hälfte.
# Eine zweite Methode soll nach Übergabe des Alters ein Ticket drucken und den Eintrittspreis auf die Eigenschaft <code>tageseinnahmen</code> addieren.
}}
=== Rabatt ===
{{Aufgabe|
Ein Computerhändler gibt folgende '''Rabatte''':
# bei Beträgen unter 500€ gibt es 5% Rabatt
# bei Beträgen zwischen 500€ und 2000€ gibt er 10% Rabatt
# über 2000€ gibt er sogar 15% Rabatt.<br>Schreiben Sie die Methode: <code>druckeRechnungAus(double rechnungsbetrag)</code>
}}
=== Kühlhaus ===
{{Aufgabe|
Eine '''Klasse Kühlhaus''' hat 4 Eigenschaften:<code>temperaturRaum1, temperaturRaum2, temperaturRaum3, kühlstufe</code>
# Sobald in einem Raum die Temperatur größer als -5 Grad ist, schaltet <code>kühlstufe</code> auf Stufe1.
# Liegt in mindestens 2 Räumen die Temperatur über -5 Grad, so wird Stufe 2 eingestellt.
# Realisieren Sie eine entsprechende Klasse mit den zugehörigen Methoden.
}}


Quelle: [https://www.deutschepost.de/de/b/brief_postkarte.html deutschepost.de]


{{Fortsetzung|
{{Fortsetzung|
vorher=Einstieg in die OOP<br>Online-Bank|vorherlink=Java/Online-Bank|
vorher=Einstieg in die OOP<br>Online-Bank|vorherlink=Java/Online-Bank|
weiter=Funktionsplotter mit Turtle Grafik|weiterlink=Java/Turtle-Grafik|
weiter=Kontrollstrukturen:<br>Schleifen|weiterlink=Java/Schleife|
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}}


Zeile 290: Zeile 301:
* wikibooks.de: [https://de.wikibooks.org/wiki/Kurzeinstieg_Java:_Kontrollstrukturen Kontrollstrukturen]
* wikibooks.de: [https://de.wikibooks.org/wiki/Kurzeinstieg_Java:_Kontrollstrukturen Kontrollstrukturen]
* {{wpde|Boolesche Algebra|Boolesche Algebra}}
* {{wpde|Boolesche Algebra|Boolesche Algebra}}


[[Kategorie:Java]]
[[Kategorie:Java]]

Aktuelle Version vom 8. Januar 2020, 16:14 Uhr

Im vorherigen Kapitel wurde beim Tank-Beispiel bereits bemerkt, dass man nur tanken sollte, WENN der Tank noch nicht voll ist. In diesem Kapitel werden wir bedingte Anweisungen einführen, bei denen vor der Ausführung der Anweisungen erst geprüft wird, ob eine oder mehrere Bedingungen erfüllt sind. Mit diesen Kontrollstrukturen können dann auch komplexere Algorithmen modelliert und ausgeführt werden.

Bedingte Anweisung

Struktogramm einer if-Anweisung

Eine bedingte Anweisung ist eine der wichtigsten Bestandteile der Program­mierung, da durch sie ein Programm auf unterschiedliche Zustände und Eingaben reagieren kann.

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

Dies ist folgendermaßen zu lesen:

  • Wenn die Bedingung eintritt,
    dann wird der erste Anweisungsblock ausgeführt;
  • Sonst wird der zweite Anweisungsblock ausgeführt.

Bedingte Anweisungen können auch verschachtelt werden:
Im folgenden Beispiel ist im else-Zweig der ersten Verzweigung eine weitere Verzweigung untergebracht.

public void prüfeZahl(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...");        
        }
    }
}

Aufgabe
Schreiben Sie eine Methode, die zwei ganze Zahlen als Übergabeparameter hat.
Die Methode soll ausgeben, ob die erste Zahl größer, gleich oder kleiner als die zweite ist.

Online Bank: Bedingte Auszahlung

Die Auszahlung erfolgt nur, wenn es der Kontostand zulässt.

public void auszahlen(double pBetrag){
    if (kontostand >= pBetrag) {
        kontostand -= pBetrag;
        System.out.println("Auszahlung erfolgt: "+pBetrag);
    }
    else { 
        System.out.println("Auszahlung verweigert!\nEs fehlen“+(pBetrag-kontostand));
    }
    System.out.println("Auf Wiedersehen!");
}

Online Bank: Prüfmethode isPositiv()

Die folgende Methode prüft, ob der Kontostand positiv ist.

  • Der Rückgabewert der Methode ist vom Typ boolean,
    d.h. es wird entweder true oder false zurückgegeben.
  • Zur kurzfristigen Speicherung wird eine lokale Variable ergebnis verwendet.
public boolean isPositiv() {
    boolean ergebnis;
    if (kontostand > 0) {
        ergebnis = true;
    }
    else {
        ergebnis = false;   
    }
    return ergebnis;
}

Lokale Variable
  • Eine Variable, die innerhalb einer Methode angelegt wird, wird lokale Varia­ble genannt.
  • Sie kann nur innerhalb der Me­thode abgefragt und verändert werden. Mit Verlassen der Methode wird sie gelöscht.
  • Lokale Variablen lassen sich gut als kurzfristigen Zwischenspeicher einsetzen.
  • Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Un­terscheidung das Wort this verwenden, um die Eigenschaft zu erreichen. Bei Namensgleichheit hat das Abfragen der lokalen Variable Priorität.
  • Konvention: Die Deklaration der lokalen Variable sollte direkt unter dem Kopf der Methode passieren.

Aufgabe

Onlinebankprojekt

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

BMI-Rechner

„Der Body-Mass-IndexWikipedia-logo.png (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen im Verhältnis zum Quadrat seiner Größe. Der BMI gibt lediglich einen groben Richtwert an und ist nicht unumstritten, da er die Statur eines Menschen und die individuell verschiedene Zusammensetzung des Körpergewichts aus Fett- und Muskelgewebe naturgemäß nicht berücksichtigt. Ebenso ist er für besonders große und besonders kleine Menschen nur eingeschränkt aussagefähig.

Kategorie BMI (kg/m²)
Starkes Untergewicht < 17
Untergewicht 17 - 20
Normalgewicht 20 - 25
Übergewicht 25 - 30
Starkes Übergewicht > 30
Alter (Jahre) BMI-Idealwert (kg/m²)
19 - 24 19 - 24
25 - 34 20 - 25
35 - 44 21 - 26
45 - 54 22 - 27
55 - 64 23 - 28
> 64 24 - 29

Aufgabe

Entwerfen Sie die Klasse Person, die das Alter, das Gewicht und die Größe einer Person erfasst.

  1. Entwickeln Sie die Methode getBMI(), die den BMI berechnet und zurückgibt.
  2. Lassen Sie prüfen, ob die Person Unter- (< 20), Normal- oder Übergewicht (> 25) hat.
  3. Realisieren Sie nun die gesamte Tabelle (kritisches Untergewicht und „Adi­positas“)
  4. Lassen Sie prüfen, ob die Person ihr Idealgewicht hat. Es soll true zurückgegeben werden, wenn das der Fall ist. Verwenden Sie bei der Abfrage die logische UND-Verknüpfung (siehe unten).

Operatoren

Vergleichsoperatoren

Um solche Bedingungen zu formulieren, brauchen Sie Vergleichsoperatoren

      < (kleiner)
      > (größer)
      <= (kleiner gleich)
      >= (größer gleich)
      == (gleich mit zwei == Zeichen)
      != (ungleich)

Logische Operatoren

Wichtige logische Operatoren sind UND, ODER und NICHT.
Wir verwenden sie täglich, wenn wir Aussagen formulieren, häufig in Sätzen mit „Wenn...“:

  • Wenn ich eine gute schriftliche UND mündliche Note habe, bekomme ich eine gute Zeugnisnote (d.h. nur wenn beides der Fall ist):
if ((klausurNote <= 2) && (soMiNote <= 2)) ...
  • Wenn es regnet ODER die Sonne stark scheint, sitze ich unter einem Schirm (d.h. wenn zumindest eines erfüllt ist. Wenn es regnet und zugleich die Sonne stark scheint, sitze ich natürlich erst recht unter einem Schirm.)
if ((sonneScheint == true) ||(esRegnet == true)) ...
  • Wenn es NICHT hell ist, dann geht die Straßenlaterne an.
if (!(helligkeitsSensor > 30)) // ... das ist das gleiche wie: if (helligkeitsSensor <= 30)

Zusammenfassung

Für zwei boolesche Werte a und b gilt:

  • !a bedeutet NICHT a und erzeugt das Gegenteil von a. Wenn a true ist, ist !a false und andersherum.
  • a && b bedeutet a UND b und ist true, wenn sowohl a als auch b true sind. Sonst nicht.
  • a || b bedeutet a ODER b und ist true, wenn entweder a oder b oder beide true sind.
    D.h. nur wenn sowohl a als auch b false sind, ist die Aussage a
Konjunktion
0 1
0 0 0
1 0 1
 
Disjunktion
0 1
0 0 1
1 1 1
 
Negation
 
0 1
1 0

Vertiefung:

Weitere Beispiele

Zahlenratespiel

Aufgabe
  1. Eine Zahl zuErratendeZahl wird als Eigen­schaft vom Konstruktor gesetzt (z.B. auf 7).
  2. Entwickeln Sie eine Methode rateZahl(int zahl), die zahl einliest und mit zuErratende­Zahl vergleicht. Lassen Sie ausgeben „zu klein“, zu groß“ oder „Gewonnen!“.
  3. Erweitern Sie die Methode um eine Abfrage: der Ratende soll nur Zahlen zwischen 1 und 10 eingeben können.

Die kleinste aus 3 Zahlen

Aufgabe

Drei Zahlen werden als Parameter übergeben, die kleinste soll zurückgegeben werden.
Die folgende Methode liefert einen Lösungsansatz, der noch nicht optimal ist.

public int kleinsteZahl(int x, int y, int z) {
    int zwischenspeicher = x;
    if ((x<y) && (x<z)) zwischenspeicher = x;
    if ((y<x) && (y<z)) zwischenspeicher = y;
    if ((z<x) && (z<y)) zwischenspeicher = z;
    return zwischenspeicher;  
}
  1. Analysieren Sie die Methode: kleinsteZahl(int x, int y, int z)
  2. Wie könnte man a) die größte b) die mittlere herausfinden?
  3. Schreiben Sie die Methode mit verschachtelten Verzeigungen

Portorechner

Aufgabe

Realisieren Sie einen Portorechner. Verwenden Sie folgende Angaben: deutschepost.de.

Freibadkasse

Aufgabe

Schreiben Sie eine Klasse Freibadkasse, die eine Methode hat die nach Übergabe des Alters entsprechend den Preis nennt.

  1. Kinder unter 3 Jahren sind kostenlos.
  2. Kinder bis 12 kosten die Hälfte des Erwachsenenpreises.
  3. Ein Erwachsener zahlt 5 Euro, es sei denn er ist über 65, dann zahlt er nur die Hälfte.
  4. Eine zweite Methode soll nach Übergabe des Alters ein Ticket drucken und den Eintrittspreis auf die Eigenschaft tageseinnahmen addieren.

Rabatt

Aufgabe

Ein Computerhändler gibt folgende Rabatte:

  1. bei Beträgen unter 500€ gibt es 5% Rabatt
  2. bei Beträgen zwischen 500€ und 2000€ gibt er 10% Rabatt
  3. über 2000€ gibt er sogar 15% Rabatt.
    Schreiben Sie die Methode: druckeRechnungAus(double rechnungsbetrag)

Kühlhaus

Aufgabe

Eine Klasse Kühlhaus hat 4 Eigenschaften:temperaturRaum1, temperaturRaum2, temperaturRaum3, kühlstufe

  1. Sobald in einem Raum die Temperatur größer als -5 Grad ist, schaltet kühlstufe auf Stufe1.
  2. Liegt in mindestens 2 Räumen die Temperatur über -5 Grad, so wird Stufe 2 eingestellt.
  3. Realisieren Sie eine entsprechende Klasse mit den zugehörigen Methoden.


Weblinks