Java/Algorithmik: Unterschied zwischen den Versionen
(akt) Markierung: 2017-Quelltext-Bearbeitung |
K (Text überarbeitet) Markierung: 2017-Quelltext-Bearbeitung |
||
Zeile 1: | Zeile 1: | ||
{{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| | ||
Zeile 7: | Zeile 4: | ||
übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}} | übersicht=Einstieg in Java<br>(Übersicht)|übersichtlink=Java#Übersicht|}} | ||
== | 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. | ||
== Bedingte Anweisung == | |||
[[Datei:Einseitige Auswahl svg.svg|miniatur|250px|[[Algorithmus#Grundstrukturen|Struktogramm]] einer if-Anweisung]] | [[Datei:Einseitige Auswahl svg.svg|miniatur|250px|[[Algorithmus#Grundstrukturen|Struktogramm]] einer if-Anweisung]] | ||
Eine '''bedingte Anweisung''' ist | Eine '''bedingte Anweisung''' ist eine der wichtigsten Bestandteile der Programmierung, da durch sie ein Programm auf unterschiedliche Zustände und Eingaben reagieren kann. | ||
<source lang="java"> | <source lang="java"> | ||
if (Bedingung) { | if (Bedingung) { | ||
//Anweisungsblock | |||
… | |||
} | } | ||
else { | |||
//Anweisungsblock | |||
… | |||
} | } | ||
</source> | </source> | ||
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:<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) { | |||
System.out.println(pZahl + " ist zwei oder mehrstellig"); | |||
} | } | ||
else { | else { | ||
if ( pZahl < 0) { | |||
System.out.println(pZahl + "ist negativ."); | |||
} | |||
else { | |||
System.out.println(pZahl + " liegt zwischen 0 und 9.999..."); | |||
} | |||
} | } | ||
} | |||
</source> | |||
{{Übung| | {{Übung|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 === | |||
Ein konkretes Beispiel: Die Auszahlung erfolgt nur, wenn es der Kontostand zulässt. | Ein konkretes Beispiel: 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){ | |||
kontostand -= pBetrag; | |||
System.out.println("Auszahlung erfolgt: "+pBetrag); | |||
} | |||
else { | |||
System.out.println("Auszahlung verweigert!\nEs fehlen“+(pBetrag-kontostand)); | |||
} | |||
System.out.println("Auf Wiedersehen!"); | |||
}</source> | } | ||
</source> | |||
=== isPositiv() | === OnlineBank: Prüfmethode isPositiv() === | ||
Die folgende Methode prüft, ob der Kontostand positiv ist. Der Rückgabewert der Methode ist vom [[Java/Glossar#Datentypen|Typen]] '''boolean''', d.h. es wird entweder '''true''' oder '''false''' zurückgegeben. | |||
Der Rückgabewert wird in einer '''lokalen''' Variable <code>ergebnis</code> gespeichert, die nur innerhalb der Methode gültig ist. | |||
{{Box|Lokale Variable|Eine Variable, die innerhalb einer Methode angelegt wird, wird lokale Variable genannt. Sie wird mit verlassen der Methode wieder zerstört. Sie kann nur innerhalb der Methode abgefragt und verändert werden. Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Unterscheidung 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. | {{Box|Lokale Variable|Eine Variable, die innerhalb einer Methode angelegt wird, wird lokale Variable genannt. Sie wird mit verlassen der Methode wieder zerstört. Sie kann nur innerhalb der Methode abgefragt und verändert werden. Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Unterscheidung 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. |
Version vom 20. November 2019, 23:21 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
Eine bedingte Anweisung ist eine der wichtigsten Bestandteile der Programmierung, 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...");
}
}
}
Online Bank: Bedingte Auszahlung
Ein konkretes Beispiel: 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!");
}
OnlineBank: Prüfmethode isPositiv()
Die folgende Methode prüft, ob der Kontostand positiv ist. Der Rückgabewert der Methode ist vom Typen boolean, d.h. es wird entweder true oder false zurückgegeben.
Der Rückgabewert wird in einer lokalen Variable ergebnis
gespeichert, die nur innerhalb der Methode gültig ist.
Eine Variable, die innerhalb einer Methode angelegt wird, wird lokale Variable genannt. Sie wird mit verlassen der Methode wieder zerstört. Sie kann nur innerhalb der Methode abgefragt und verändert werden. Nennt man eine lokale Variable genauso wie eine Eigenschaft der Klasse, so muss man zur Unterscheidung das Wort this
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.
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;
}
(Zum Onlinebankprojekt)
- 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. - Durch Einzahlen eines negativen Betrages kann man den Bankautomaten austricksen. Ändern Sie diese Sicherheitslücke (umgehend ;-) ).
- Erweitern Sie das Konto um eine Eigenschaft „gesperrt“. Implementieren Sie die zugehörige Methode
isGesperrt()
, dietrue
zurückgibt, wenn das Konto gesperrt ist.
BMI-Rechner
„Der 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 Übergewicht ein weltweit zunehmendes Problem darstellt, wird die Körpermassenzahl vor allem dazu verwendet, auf eine diesbezügliche Gefährdung hinzuweisen. Der BMI gibt aber 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.
- Entwerfen Sie die Klasse Person, die das Alter, das Gewicht und die Größe einer Personerfasst. Entwickeln Sie die Methode
getBMI()
, 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 „Adipositas“, d.h. Starkes Übergewicht über BMI 30)
Lassen Sie prüfen, ob die Person ihr Idealgewicht hat. Es solltrue
zurückgegeben werden, wenn das der Fall ist.
(Hinweis: Es ist einfacher mit&&
zu arbeiten als mitif...else
. Fragen Sie Ihren Lehrer!)
- Fortgeschrittene: Realisieren Sie die gesamte Tabelle (kritisches Untergewicht und „Adipositas“, d.h. Starkes Übergewicht über BMI 30)
- Realisieren Sie eine Klasse Zahlenratespiel. Eine Zahl
zuErratendeZahl
wird als Eigenschaft vom Konstruktor gesetzt (z.B. auf 7).- Entwickeln Sie eine Methode
rateZahl(int zahl)
, diezahl
einliest und mitzuErratendeZahl
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.
- Entwickeln Sie eine Methode
Kategorie | BMI (kg/m²) |
---|---|
Starkes Untergewicht | < 17 |
Untergewicht | 17 - 20 |
Normalgewicht | 20 - 25 |
Übergewicht | 25 - 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 |
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 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...“:
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).
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)
Für zwei boolesche Werte (also bei Java Typ boolean
) a und b gilt:
- !a (bedeutet NICHT a) 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.
- 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
Vertiefung: 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.
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;
- Analysieren Sie die Methode:
kleinsteZahl(int x, int y, int z)
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.
|
|
|
Porto-Kalkulator
- Realisieren Sie einen Portokalkulator (Daten: vgl. unten). Es gibt keine weiteren Vorgaben, außer, dass das Ergebnis kundenfreundlich sein soll.
- 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
tageseinnahmen
addieren. - 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.
Schreiben Sie die Methode:druckeRechnungAus(double rechnungsbetrag)
- Eine Klasse Kühlhaus hat 4 Eigenschaften:
temperaturRaum1, temperaturRaum2, temperaturRaum3, kühlstufe
Sobald in einem Raum die Temperatur größer als -5 Grad ist, schaltetkühlstufe
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.
Formate | Preise | Maße | Gewicht |
---|---|---|---|
Standard | 0,80 € | L: 14 - 23,5 cm B: 9 - 12,5 cm H: bis 0,5 cm |
bis 20 g |
Kompakt | 0,95 € | L: 10 - 23,5 cm B: 7 - 12,5 cm H: bis 1 cm |
bis 50 g |
Groß | 1,55 € | L: 10 - 35,3 cm B: 7 - 25 cm H: bis 2 cm |
bis 500 g |
Maxi | 2,70 € | L: 10 - 35,3 cm B: 7 - 25 cm H: bis 5 cm |
bis 1.000 g |
Quelle: deutschepost.de
Weblinks
- gailer.net: Entscheidungen treffen
- uhelmich.de: Fallunterscheidungen
- wikibooks.de: Kontrollstrukturen
- Boolesche Algebra