13.01.2013 Aufrufe

Kapitel 3 - Algorithmen und Methoden

Kapitel 3 - Algorithmen und Methoden

Kapitel 3 - Algorithmen und Methoden

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

3. <strong>Algorithmen</strong> <strong>und</strong> <strong>Methoden</strong><br />

� Vertiefende Diskussion über <strong>Algorithmen</strong><br />

Praktische Informatik I<br />

04.11.2003<br />

– Definition<br />

– Eigenschaften<br />

– Klassifizierung<br />

� Schrittweise Verfeinerung von <strong>Algorithmen</strong><br />

� Aufbau von <strong>Algorithmen</strong> <strong>und</strong> <strong>Methoden</strong> sowie Kontrollstrukturen in<br />

Java<br />

– Folge (Sequenz)<br />

– Selektion<br />

– Wiederholung<br />

– Prozedur / Methode<br />

– Rekursion<br />

� Zustandsbasierte <strong>Algorithmen</strong><br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

67


<strong>Methoden</strong> – Was wir schon wissen<br />

� Das Verhalten der Objekte ist durch seine <strong>Methoden</strong> bestimmt.<br />

Praktische Informatik I<br />

04.11.2003<br />

– <strong>Methoden</strong> können entweder den Objektzustand verändern (Mutatoren)<br />

• Dann wird das Schlüsselwort void vor den <strong>Methoden</strong>namen geschrieben, d. h. es wird kein<br />

Ergebnis produziert.<br />

oder ein Ergebnis liefern.<br />

• Dann muss noch der gewünschte Ergebnistyp vor den <strong>Methoden</strong>namen geschrieben<br />

werden.<br />

� <strong>Methoden</strong> können Parameter besitzen<br />

– Ein Parameter hat einen Typ (<strong>und</strong> einen Namen). Wir sprechen dann auch vom<br />

Formalparameter.<br />

� <strong>Methoden</strong> können sich direkt auf die Datenfelder des Objekts beziehen.<br />

� Eine Methode kann nur im Kontext eines Objekts aufgerufen werden.<br />

– Beispiel: Eine Methode m() eines Objekts o wird durch o.m() aufgerufen.<br />

– <strong>Methoden</strong> können Parameter besitzen<br />

• Ein Parameter hat ein Typ (<strong>und</strong> einen Namen). Wir sprechen dann auch vom<br />

Formalparameter.<br />

• Beim Aufruf der Methode werden diese Parameter mit einem Wert belegt. Wir sprechen<br />

dann vom Aktualparameter.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

68


<strong>Methoden</strong> – Was noch unklar ist<br />

� Wie können wir nun ein konkretes Problem durch eine<br />

Methode lösen?<br />

� Welche Hilfsmechanismen stehen uns zur Verfügung, um<br />

die Lösung zu formulieren?<br />

� Wie kann ich überhaupt erkennen, dass die Methode<br />

tatsächlich das Gewünschte leistet?<br />

Praktische Informatik I<br />

04.11.2003<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

69


3.1 <strong>Algorithmen</strong> <strong>und</strong> ihre Spezifikationen<br />

� <strong>Algorithmen</strong> sind allgemeine Lösungsverfahren zu Problemen<br />

� Problemspezifikation:<br />

ist eine vollständige <strong>und</strong> unzweideutige Problembeschreibung.<br />

Praktische Informatik I<br />

04.11.2003<br />

– vollständig:<br />

Angabe aller Rahmenbedingungen (Eingabe)<br />

– detailliert:<br />

Voraussetzungen über Hilfsmittel <strong>und</strong> Gr<strong>und</strong>operationen (Prozessor)<br />

– unzweideutig:<br />

klare Beschreibung, was der Algorithmus tun soll (Ausgabe).<br />

� Beschreibungsverfahren zur Problemspezifikationen<br />

– Informelle in Umgangssprache formulierte Spezifikationen genügen i.a. nicht den<br />

obigen Kriterien.<br />

– Spezifikationen können ganz formal in speziellen, auf der Logik basierenden<br />

Spezifikationssprachen ausgedrückt werden:<br />

– Beispiele für formale Spezifikationssprachen: Z, VDM<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

70


Beispiel: Suche nach einer Telefonnummer<br />

� informelle Beschreibung: Suche zu einem beliebigen Namen die<br />

zugehörige Telefonnummer.<br />

Offene Fragen:<br />

� Vollständigkeit:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Wie setzt sich ein Name zusammen?<br />

• Buchstaben des deutschen Alphabets<br />

• Sind auch Ziffern <strong>und</strong> Sonderzeichen erlaubt ? Beispiel „1&1“<br />

• Besteht ein Name aus Vor- <strong>und</strong> Nachname?<br />

� Detailliertheit:<br />

– Welche Hilfsmittel stehen zur Verfügung?<br />

• Der Adressenkalender von meinem Fre<strong>und</strong> / meiner Fre<strong>und</strong>in?<br />

• Telefonbuch<br />

• CD-ROM<br />

– Was bieten die einzelnen Hilfsmittel an Funktionalität?<br />

� Unzweideutigkeit:<br />

– Wie soll die Ausgabe meiner Suche aussehen?<br />

– Was passiert, wenn ich mehrere Telefonnummern finde<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

71


Beispiel: größter gemeinsamer Teiler<br />

� informelle Problembeschreibung: Für beliebige Zahlen M <strong>und</strong> N<br />

berechne den größten gemeinsamen Teiler<br />

Offene Fragen<br />

� Vollständigkeit:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Welche Zahlen sind zugelassen?<br />

• Ganze Zahlen, rationale Zahlen, oder sonstige?<br />

• Dürfen M <strong>und</strong> N auch 0 sein?<br />

� Detailliertheit:<br />

– Welche Operationen sind auf den ganzen Zahlen erlaubt?<br />

• +, - oder auch div (ganzzahlige Division), mod (Divisionsrest)?<br />

� Unzweideutigkeit:<br />

– Was bedeutet „ggt“ überhaupt?<br />

• Welche Zahlen sind als Ergebnis zugelassen?<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

72


Beispiel: Fahrkartenautomat<br />

� Ziel: Entwicklung eines Automaten zum Kaufen von Fahrkarten<br />

Praktische Informatik I<br />

04.11.2003<br />

– Modellbildung<br />

� Was sind die algorithmischen Problemstellungen?<br />

• Eine Methode des Automaten sollte entscheiden, ob genügend Wechselgeld im<br />

Automat ist.<br />

• Eine Methode des Automaten müsste berechnen, wie viele Münzen einer<br />

Stücklung ausgegeben werden.<br />

– Vollständigkeit:<br />

• Kann der Benutzer eine Aktion abbrechen? Soll Stromausfall als Fehlerfall<br />

mitberücksichtigt werden?<br />

• Sind verschiedene Münzen zugelassen?<br />

– Detailliertheit:<br />

• Welche Operationen werden innerhalb des Automaten unterstützt?<br />

– Unzweideutigkeit<br />

• Genaue Bedeutung von Kaufen einer Fahrkarte muss klar definiert sein.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

73


Vorbedingung - Nachbedingung<br />

� Probleme können über ein Paar {P} {Q} formal spezifiziert werden<br />

Praktische Informatik I<br />

04.11.2003<br />

– P (Vorbedingung):<br />

alle relevanten Eigenschaften, die anfangs gelten<br />

– Q (Nachbedingung):<br />

alle relevanten Eigenschaften, die am Ende gelten sollen<br />

– P <strong>und</strong> Q können als Funktionen aufgefasst werden, die nur zwei Werte<br />

(„wahr“ <strong>und</strong> „falsch“) als Resultat zulassen.<br />

Beispiel (ggt):<br />

� P: M <strong>und</strong> N sind ganze Zahlen mit M > 0 <strong>und</strong> N > 0.<br />

� Q: das Ergebnis z aus den ganzen Zahlen mit z > 0 erfüllt folgende<br />

Bedingungen:<br />

– z ist Teiler von M<br />

– z ist Teiler von N<br />

– für jede ganze Zahl y, die N <strong>und</strong> M teilt, gilt y ≤ z<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

74


Algorithmus<br />

� Definition:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Ein Algorithmus ist eine präzise, endliche Beschreibung eines allgemeinen<br />

Verfahrens zur schrittweisen Lösung eines Problems. Der Algorithmus<br />

besteht aus einzelnen Schritten <strong>und</strong> Vorschriften, welche die Ausführung<br />

dieser Schritte kontrollieren.<br />

– Jeder Schritt muss<br />

• klar <strong>und</strong> eindeutig beschrieben sein <strong>und</strong><br />

• mit endlichem Aufwand in endlicher Zeit ausführbar sein.<br />

– Ein Algorithmus wird durch einen Prozessor ausgeführt.<br />

– Ein (sequentieller) Prozess bezeichnet die sequentielle Folge von<br />

Ausführungsschritten, die durch einen Prozessor bei der Verarbeitung<br />

eines Algorithmus erzeugt wird.<br />

� Der Mensch übernimmt beim Algorithmus oft die Rolle des Prozessors<br />

– Ziel: Zu einer Spezifikation eines Problems einem anderen Menschen<br />

(„Programmierer“) mitteilen, wie etwas berechnet wird.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

75


Eigenschaften von solchen <strong>Algorithmen</strong><br />

� Details spezieller Programmiersprachen (oder gar Maschinen) sind irrelevant.<br />

� besitzt einen der Kommunikation zwischen Menschen angemessenen<br />

Abstraktionsgrad (dieser ist i.a. nicht durch eine Programmbeschreibung zu<br />

erzielen)<br />

� der Autor eines Algorithmus macht gewisse Annahmen über die Zielgruppe.<br />

Beispiele:<br />

� Tanzen (Gr<strong>und</strong>schritt Langsamer Walzer)<br />

Vorbedingung: linker <strong>und</strong> rechter Fuß stehen nebeneinander<br />

Nachbedingung: linker <strong>und</strong> rechter Fuß stehen nebeneinander<br />

Praktische Informatik I<br />

04.11.2003<br />

1. RF vorwärts (RF = rechter Fuß)<br />

2. LF seitwärts<br />

3. RF schließt zum LF<br />

4. LF vorwärts<br />

5. RF seitwärts<br />

6. LF schließt zum RF<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

76


� Schneiden von Ziegeln (aus „Das große Handwerker Buch“)<br />

Vorbedingung: Ziegel (nach DIN);<br />

Nachbedingung: ein in zwei Teile zerlegter Ziegel<br />

Praktische Informatik I<br />

04.11.2003<br />

1. Zeichnen Sie die Schnittlinie auf jeder Seite mit Kreide ein.<br />

2. Machen Sie auf ganzem Umfang entlang der Schnittlinie eine Kerbe.<br />

3. Falls der Ziegel hart ist, wird Schritt 2 wiederholt.<br />

4. Legen Sie die Ziegelunterseite auf Gras, Sand oder eine Zeitung.<br />

5. Drücken Sie die Schneide der Kelle in die Kerbe <strong>und</strong> schlagen Sie mit dem<br />

Hammer auf den Griff.<br />

� Berechnung des ggT zweier natürlicher Zahlen a, b > 0<br />

Vor- <strong>und</strong> Nachbedingung sind bereits bekannt.<br />

while (a != b) {<br />

if (a > b)<br />

a = a – b;<br />

else<br />

b = b – a;<br />

}<br />

eine Variable<br />

Vergleich zweier Variablen<br />

Zuweisung<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

77


Gegenbeispiele: Was ist kein Algorithmus!<br />

� Beschreibung durch Analogien<br />

Das Zerteilen von Fliesen läuft im Prinzip so wie das Zerteilen eines Ziegels.<br />

� Beschreibung durch Beispiele<br />

Berechne die ersten 10 Zahlen der Folge 2, 3, 5, 7, 11, ... .<br />

Praktische Informatik I<br />

04.11.2003<br />

– Was ist die nächste Zahl der Folge?<br />

� Verwendung nicht-ausführbarer <strong>und</strong> nicht-Gr<strong>und</strong>operationen<br />

– Leg die nächsten 100 Meter in 5 Sek<strong>und</strong>en zu Fuß zurück.<br />

– Zur besseren Anbindung des Campus an die Stadt, soll die aus der SF-Literatur<br />

bekannte Beam-Technik eingesetzt werden.<br />

� Verletzung der Allgemeinheit (Problem: Addieren der Zahlen 12 <strong>und</strong> 13)<br />

– 2 <strong>und</strong> 3 ergibt zusammen 5<br />

– 10 <strong>und</strong> 10 ergibt 20<br />

� Ein Algorithmus lässt sich stets auf eine Klasse von Problemstellungen<br />

anwenden (z.B. die Addition zweier Zahlen).<br />

� Jeder Algorithmus besitzt deshalb Eingabeparameter, die beim Start eines<br />

Prozesses mit konkreten Werten zu belegen sind.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

78


Qualität von <strong>Algorithmen</strong><br />

� Zwingend notwendig ist die Korrektheit, d.h. der Algorithmus muss<br />

tatsächlich die Spezifikation erfüllen:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Für jeden möglichen Prozess eines Algorithmus muss folgender<br />

Sachverhalt gelten:<br />

• Falls beim Start des Prozesses die Funktion P wahr liefert,<br />

• muss auch am Ende des Prozesses die Funktion Q wahr liefern<br />

– Erfüllt ein Algorithmus A die Spezifikation {P}{Q}, so schreiben wir auch<br />

{P}A{Q}<br />

– Die Vorbedingung P ist i.a. bzgl. der Eingabeparameter <strong>und</strong> die<br />

Nachbedingung ist i.a. bzgl. der Ausgabeparameter definiert.<br />

� weitere (wünschenswerte) Eigenschaften:<br />

– einfach zu verstehen<br />

– einfache Umsetzung in ein Programm<br />

– Laufzeit- <strong>und</strong> Platzbedarf sollten möglichst niedrig sein<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

79


Eigenschaften von <strong>Algorithmen</strong><br />

Definition (Terminierung)<br />

� Ein Prozess terminiert, wenn er aus einer endlichen Anzahl von<br />

Ausführungsschritten besteht.<br />

� Ein Algorithmus terminiert, wenn jeder seiner möglichen Prozesse<br />

terminiert.<br />

� Bemerkungen<br />

Praktische Informatik I<br />

04.11.2003<br />

– Oft ist „Algorithmus“ in der Literatur so definiert, dass die Terminierung<br />

bereits inhärent gefordert wird (z.B. Suche nach Webseiten).<br />

– nicht-terminierende <strong>Algorithmen</strong> sind aber auch von Interesse<br />

• iterative Berechnung der Zahl e<br />

• Ampelsteuerung<br />

• Verarbeitung von Daten eines Sensors oder Tickers:<br />

kontinuierliche Berechnung des durchschnittlichen Börsenwertes einer Aktie<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

80


Determinismus <strong>und</strong> Determiniertheit<br />

� Determinismus bezieht sich auf den Prozess<br />

Praktische Informatik I<br />

04.11.2003<br />

– Ein Algorithmus ist deterministisch, wenn es zu jeder möglichen Eingabe<br />

genau einen Prozess gibt.<br />

– Kann bei nicht-deterministischen <strong>Algorithmen</strong> den zu einer Eingabe<br />

gehörenden Prozessen eine Wahrscheinlichkeit zugeordnet werden, so<br />

spricht man auch von stochastischen <strong>Algorithmen</strong>.<br />

– Beispiele für nichtdeterministische <strong>Algorithmen</strong><br />

• Spielzüge bei einem Schachspiel<br />

• Verkehrsreglung an einer Kreuzung<br />

� Determiniertheit bezieht sich auf das Ergebnis eines Algorithmus<br />

– Ein Algorithmus ist determiniert, wenn die Eingabe das Resultat des<br />

Algorithmus eindeutig bestimmt.<br />

– Beispiele für nichtdeterminierte <strong>Algorithmen</strong><br />

• Spielzüge bei Spielen mit Würfeln<br />

• approximative Suchverfahren für Probleme, zu denen es keinen schnellen<br />

Algorithmus gibt.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

81


Sequentielle <strong>und</strong> parallele <strong>Algorithmen</strong><br />

� beziehen sich auf die Prozesse<br />

Praktische Informatik I<br />

04.11.2003<br />

– Ein Prozess heißt parallel, wenn Einzelschritte gleichzeitig ausgeführt<br />

werden.<br />

– Ein Algorithmus heißt parallel, wenn er parallele Prozesse zulässt.<br />

Andernfalls heißt er sequentiell.<br />

� Beispiele:<br />

– Beim Hausbau kann eine Wand aus Ziegeln gemauert werden <strong>und</strong><br />

gleichzeitig die Ziegel zugeschnitten werden.<br />

– Beim Tanzen können mehrere Paare gleichzeitig langsamen Walzer<br />

tanzen (Kollisionen möglich, da alle auf der gleichen Tanzfläche!)<br />

– Bei der Berechnung von a² + b² kann die Quadratberechnung der Zahlen a<br />

<strong>und</strong> b parallel zueinander ablaufen.<br />

– Suchen in Telefonbüchern kann parallel erfolgen (wenn es mehrere<br />

Telefonbücher gibt, ansonsten ist Parallelität nicht sehr effektiv)<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

82


(nach U. Nikolaus: Uni Regensburg, Lehrst. für Wirtschaftsinf. III Vorlesungsunterlagen Multimedia I, 1997)<br />

3.2 Einfache Kontrollstrukturen<br />

� Kontrollstrukturen sind Bestandteile von <strong>Algorithmen</strong>, die<br />

den Ablauf der Schritte innerhalb eines Algorithmus<br />

dynamisch steuern.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Aus einer endlichen Beschreibung können unendlich lange<br />

Prozesse werden.<br />

� Dem Prozessor muss die Bedeutung der Kontrollstrukturen<br />

klar sein. Ansonsten wird zu einem Algorithmus <strong>und</strong> einer<br />

Eingabe nicht der korrekte Prozess erzeugt.<br />

� wichtige Kontrollstrukturen:<br />

– Sequenz (Blockbildung)<br />

– Selektion (bedingte Anweisung)<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

83


(nach U. Nikolaus: Uni Regensburg, Lehrst. für Wirtschaftsinf. III Vorlesungsunterlagen Multimedia I, 1997)<br />

Sequenz<br />

� = zusammenhängende Teilfolge von Schritten innerhalb eines Algorithmus.<br />

Alle Prozesse führen eine Sequenz nach folgenden Regeln aus:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Bearbeitung der Sequenz beginnt mit dem ersten Schritt der Sequenz<br />

– zu einem Zeitpunkt wird dann nur ein Schritt ausgeführt<br />

– jeder Schritt wird genau einmal ausgeführt: keine Wiederholung, kein Auslassen<br />

– Reihenfolge der Bearbeitung der Schritte ist identisch mit der des Algorithmus<br />

– Bearbeitung der Sequenz endet mit dem letzten Schritt<br />

Bemerkungen<br />

oder auch komplexere Strukturen<br />

• Eine Sequenz kann logisch wieder als ein einziger Schritt aufgefasst werden!<br />

• Dies wird in Java durch eine spezielle Notation gekennzeichnet: “{ “ <strong>und</strong> “}”.<br />

Schritte, die nicht weiter strukturiert sind, werden auch als atomare Schritte<br />

bezeichnet.<br />

• Ein Algorithmus besitzt mindestens eine Sequenz<br />

• <strong>Algorithmen</strong>, die aus nur einer Sequenz bestehen, sind sehr unflexibel<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

84


Beispiel<br />

� Wir haben bereits im letzten <strong>Kapitel</strong> folgende Methode<br />

kennen gelernt:<br />

Praktische Informatik I<br />

04.11.2003<br />

void maleHaus( ) {<br />

}<br />

sonne.makeVisible();<br />

sonne.changeColor(“yellow“);<br />

sonne.moveHorizontal(100);<br />

dach.changeSize(100,150);<br />

dach.makeVisible();<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

85


(nach Ralf Steinmetz: Multimedia-Technologie, 2. Auflage, Springer, 1999)<br />

Selektion<br />

� <strong>Algorithmen</strong> erzeugen in Abhängigkeit von den Eingabeparametern<br />

verschiedene Prozesse.<br />

� Bei <strong>Algorithmen</strong> benötigt man eine von einer Bedingung abhängige<br />

Selektionsmöglichkeit, mit welchen Schritten fortgefahren wird.<br />

Praktische Informatik I<br />

04.11.2003<br />

if (Bedingung)<br />

Schritt<br />

� Bedingung liefert entweder wahr oder falsch.<br />

– Zunächst wird die Bedingung ausgewertet.<br />

– Bei wahr wird die Sequenz ausgeführt <strong>und</strong> bei falsch übersprungen.<br />

� Beispiel:<br />

Algorithmus Maximum<br />

eine atomare Anweisung oder eine in<br />

„{“ <strong>und</strong> „} “ eingeschlossene Sequenz<br />

// Gegeben ganze Zahlen x <strong>und</strong> y. Resultat ist die größte der beiden Zahlen.<br />

if (x > y)<br />

Resultat ist x<br />

Resultat ist y<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

86


(nach Ralf Steinmetz: Multimedia-Technologie, 2. Auflage, Springer, 1999)<br />

Ein Algorithmus in Java<br />

� Ein Algorithmus wird in Java als eigenständige Methode implementiert.<br />

Praktische Informatik I<br />

04.11.2003<br />

int max2(int x, int y) {<br />

if (x > y) {<br />

return x;<br />

}<br />

return y;<br />

}<br />

Bemerkungen<br />

Einrückungen dienen nur der<br />

Lesbarkeit durch den Menschen!<br />

Java interpretiert (im Gegensatz z.B.<br />

zu Python) die Einrückungen nicht!<br />

� Jeder Schritt eines Algorithmus wird mit einem Semikolon abgeschlossen.<br />

� Das berechnete Ergebnis wird nach dem Schlüsselwort return angegeben.<br />

� Durch das Schlüsselwort int wird klargestellt, dass der berechnete Wert <strong>und</strong><br />

die Eingabeparameter des Algorithmus ganze Zahlen sind.<br />

� Mit dem Schlüsselwort if kennzeichnet man eine bedingte Anweisung.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

87


Verallgemeinerung der Selektion<br />

� Abarbeitung:<br />

Praktische Informatik I<br />

04.11.2003<br />

if (Bedingung)<br />

Schritt1<br />

else Schritt2<br />

– Wiederum wird zunächst die Bedingung ausgewertet.<br />

– Falls die Bedingung wahr ist, wird mit Schritt1 fortgefahren.<br />

– Andernfalls (Bedingung ist falsch) wird mit Schritt2 fortgefahren.<br />

– Nach vollständiger Abarbeitung von Schritt1 bzw. Schritt2 wird mit dem<br />

nachfolgenden Schritt fortgefahren.<br />

� Beispiel:<br />

/** Es wird das Maximum von drei ganzen Zahlen berechnet */<br />

int max3(int x, int y, int z) {<br />

if (x > y)<br />

return max2 (x, z); // Was passiert hier ?<br />

else<br />

return max2 (y, z);<br />

}<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

88


Anwendungsbeispiel<br />

� Wir wollen die bisherigen Kontrollstrukturen an Hand eines Beispiels<br />

illustrieren.<br />

� Aufgabe:<br />

Implementieren Sie einen Fahrkartenautomaten, der nach Einwurf von<br />

Münzen die gewünschte Fahrkarte ausgibt.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Der Automat hat einen Geldvorrat, der beliebig verwendet werden kann.<br />

• Es gibt keine Stückelung.<br />

– Der Automat soll die Eingabe auf Korrektheit überprüfen.<br />

• Es soll geprüft werden, ob genügend viel Geld in den Automaten eingeworfen<br />

wurde.<br />

– Der Automat soll die Fahrkarte <strong>und</strong> das genaue Wechselgeld ausgeben.<br />

– Der Automat soll eine Fahrkarte drucken.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

89


Erste Lösung: Teil 1<br />

public class FahrkartenAutomat {<br />

// Der Preis einer Fahrkarte = 100 Cent<br />

private int preis = 100;<br />

// Der bisher eingezahlte Betrag<br />

private int bisherGezahlt = 0;<br />

// Der Geldvorrat im Automat<br />

private int geldVorrat = 0;<br />

/**<br />

* getPreis liefert den Preis einer Fahrkarte.<br />

*/<br />

public int getPreis() {<br />

return preis;<br />

}<br />

/**<br />

* getBisherGezahltenBetrag liefert die Höhe des bisher eingeworfenen Betrags<br />

*/<br />

public int getBisherGezahltenBetrag() {<br />

return bisherGezahlt;<br />

}<br />

/**<br />

* geldEinwerfen erhöht den bisher gezahlten Betrag um betrag.<br />

*/<br />

public void geldEinwerfen(int betrag) {<br />

bisherGezahlt += betrag;<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

Dies sind Kommentarzeilen<br />

Hier beginnt ein Kommentar<br />

<strong>und</strong> dort endet der Kommentar<br />

Hier wird das Ergebnis zum Aufrufer der<br />

Methode zurückgegeben. Danach ist die<br />

Methode beendet.<br />

Der Wert von bisherGezahlt wird<br />

um den Wert von betrag erhöht<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

90


}<br />

Erste Lösung: Teil 2<br />

/**<br />

* ticketDrucken druckt ein Fahrschein,<br />

* aktualisiert den Geldvorrat <strong>und</strong><br />

* setzt den bisher gezahlten Betrag auf 0.<br />

*/<br />

public void fahrscheinDrucken() {<br />

System.out.println("##########################");<br />

System.out.println("# Lummerland Verkehrsverb<strong>und</strong>");<br />

System.out.println("# Fahrschein");<br />

System.out.print("# ");<br />

System.out.print(preis);<br />

System.out.println(" Cent.");<br />

System.out.println("###########################");<br />

System.out.println();<br />

/* Jetzt wird Folgendes noch erledigt:<br />

geldVorrat erhöht <strong>und</strong> bisherGezahl initialisiert. */<br />

geldVorrat += bisherGezahlt;<br />

bisherGezahlt = 0;<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

Textuelle Ausgabe des<br />

Aktualparameters<br />

Aber was passiert<br />

an dieser Stelle?<br />

Dies sind 2 Kommentarzeilen.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

91


Kommentare im Quellprogramm<br />

� wichtige Zusatzinformationen zur Klasse<br />

Praktische Informatik I<br />

04.11.2003<br />

– Autor der Klasse, Erstellungsdatum<br />

– Erläuterungen zur Klasse <strong>und</strong> insbesondere zu den <strong>Methoden</strong>, um die<br />

Verständlichkeit des Quellprogramms zu verbessern.<br />

• Bedeutung jedes Datenfeldes<br />

• Vor- <strong>und</strong> Nachbedingungen für <strong>Methoden</strong><br />

� Syntax für Kommentare<br />

– // Der Rest der Zeile ist Kommentar.<br />

Hierfür benötigen wir also keine weitere Kennung für das Ende des<br />

Kommentars.<br />

– /** Beginn des Kommentars<br />

*/ <strong>und</strong> Ende des Kommentars<br />

– /* Beginn des Kommentars<br />

*/ <strong>und</strong> Ende des Kommentars<br />

Gibt es ein<br />

Unterschied?<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

92


Elementare Befehle<br />

� int preis = 100;<br />

– Dies ist eine Initialisierung eines Datenfelds. Der Wert auf der rechten Seite wird dem Datenfeld<br />

preis zugewiesen.<br />

– = wird auch als Zuweisungsoperator bezeichnet.<br />

� private<br />

– Dies ist ein sogenannter Modifikator, der das Datenfeld (bzw. <strong>Methoden</strong>) vor unberechtigten<br />

Zugriff von aussen schützt.<br />

� public<br />

– Ein Modifikator, der den Zugriff auf <strong>Methoden</strong> (bzw. Datenfelder) von aussen erlaubt.<br />

� return preis;<br />

– Das Schlüsselwort return stoppt die Verarbeitung der Methode. Falls die Methode ein Ergebnis<br />

liefern soll, muss hinter return ein Ausdruck stehen, dessen Wert nach aussen gegeben wird.<br />

� System.out.print("Hier wird ein Text ausgegeben.");<br />

– Hier erfolgt eine textuelle Ausgabe des Aktualparameters.<br />

– Falls der Parameter eine Zahl ist, wird die Zahl in textueller Form ausgegeben.<br />

� System.out.println("Hier wird ein Text ausgegeben <strong>und</strong> die Zeile abgeschlossen.");<br />

Praktische Informatik I<br />

04.11.2003<br />

– Zusätzlich zu System.out.print() wird noch die Ausgabenzeile abgeschlossen.<br />

– Die nächste Ausgabe erfolgt am Anfang der nächsten Zeile.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

93


Formatierung des Quellprogramms<br />

� Zeilenumbrüche <strong>und</strong> Leerzeichen haben nur eine Bedeutung zwischen<br />

Schlüsselwörtern <strong>und</strong> Namen von Datenfeldern, <strong>Methoden</strong> sowie<br />

Klassen.<br />

� Äquivalentes Programm:<br />

class FahrkartenAutomat{private int preis = 100;private int bisherGezahlt=0; private int geldVorrat=0; public int getPreis() {return preis;}public<br />

int getBisherGezahltenBetrag(){return bisherGezahlt;}public void<br />

geldEinwerfen(int betrag){bisherGezahlt += betrag;}public void fahrscheinDrucken(){System.out.println("##########################");<br />

System.out.println("# Lummerland Verkehrsverb<strong>und</strong>");System.out.println("# Fahrschein");System.out.print(<br />

"# ");System.out.print(preis);System.out.println("Cent.");System.out.println("###########################");<br />

System.out.println();geldVorrat += bisherGezahlt;bisherGezahlt = 0;}}<br />

� Die Formatierung hat keinen Einfluß auf die synaktische Korrektheit<br />

eines Programms, sondern dient „nur“, die Lesbarkeit zu verbessern.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Abgabe von Programmen mit schlechter Formatierung führt zu<br />

Punktabzug. Im schwerwiegenden Fällen: 0 Punkte!<br />

– Formatierungskonventionen sollen beachtet werden.<br />

• Diese können auch in unseren Programmierrichtlinien nachgelesen werden.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

94


Verbesserung der Lösung<br />

� Defizite der bisherigen Lösung<br />

– Negative Einzahlung ist möglich.<br />

– Wird zu viel gezahlt, wird das Wechselgeld nicht zurückgegeben.<br />

– Beim Drucken des Fahrscheins wird nicht überprüft, ob der Betrag auch tatsächlich<br />

eingezahlt wurde.<br />

� Teil der Lösung<br />

public void fahrscheinDrucken() {<br />

if (bisherGezahlt >= preis) {<br />

drucken(); // Hier wird das Ticket gedruckt.<br />

geldVorrat += preis;<br />

wechselGeld = bisherGezahlt – preis;<br />

bisherGezahlt = 0;<br />

}<br />

else<br />

System.out.println("Sie müssen noch mehr Geld einwerfen.");<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

95


3.3 Schrittweise Verfeinerung von <strong>Algorithmen</strong><br />

� Entwurf der <strong>Algorithmen</strong> ist relativ einfach solange die<br />

Problemstellungen einfach sind.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Leider sind nahezu alle interessanten Problemstellungen sehr komplex!<br />

Schrittweise Verfeinerung (Top-Down Ansatz)<br />

� Idee<br />

1. Zerlege das Problem geeignet in mehrere Einzelprobleme<br />

2. Verfahre mit jedem in Schritt 1 erzeugten Teilproblem folgendermaßen:<br />

• Falls das Teilproblem genügend einfach ist: Entwerfe Algorithmus für das<br />

Problem<br />

• ansonsten: Wende das Verfahren der schrittweisen Verfeinerung auf dieses<br />

Problem an.<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

96


Beispiel<br />

Algorithmus für meinen Hausroboter zum Kochen einer Tasse Tee<br />

� erster Entwurf:<br />

Praktische Informatik I<br />

04.11.2003<br />

1. Koche Wasser;<br />

2. Gib Tee in die Tasse;<br />

3. Fülle Wasser in die Tasse.<br />

Problem:<br />

– Schritte sind noch nicht detailliert genug, d.h. der Roboter kann diese noch nicht<br />

interpretieren <strong>und</strong> deshalb auch nicht ausführen.<br />

� Verfeinerung des ersten Schritts „Koche Wasser“<br />

1.1 Fülle Kessel mit Wasser;<br />

1.2 Schalte Herdplatte an;<br />

1.3 Setze Kessel auf diese Herdplatte;<br />

1.4. Warte bis das Wasser kocht;<br />

1.5 Schalte Herdplatte aus;<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

97


� Verfeinerung des zweiten Schrittes („Gib Tee in die Tasse“)<br />

Praktische Informatik I<br />

04.11.2003<br />

2.1 Nimm einen Teefilter;<br />

2.2 Setze den Teefilter auf die Tasse;<br />

2.3 Öffne die Teedose;<br />

2.3 Nimm einen Löffel Tee;<br />

2.4 Kippe den Löffelinhalt in den Filter;<br />

2.5 Schließe den Teebehälter<br />

� Verfeinerung des dritten Schrittes („Gieße Wasser in die Tasse“)<br />

3.1 Gieße Wasser aus dem Kessel in die Tasse, bis die Tasse voll ist.<br />

Bemerkung:<br />

– Verfeinerung des Schritts 3 erhöht nicht die Anzahl der einzelnen Schritte,<br />

sondern beschreibt lediglich einen einzelnen Schritt detaillierter als zuvor.<br />

– einige Schritte können bereits vom Roboter direkt interpretiert werden (z.B.<br />

„schalte Herdplatte an“), andere benötigen wiederum eine Verfeinerung<br />

(z.B. „fülle Kessel mit Wasser“).<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

98


...<br />

Ursprünglicher Algorithmuse<br />

Koche Wasser<br />

Gib Tee in die Tasse<br />

Praktische Informatik I<br />

04.11.2003<br />

Nimm einen Löffel Tee<br />

...<br />

Erste Verfeinerung<br />

Fülle Kessel mit Wasser<br />

Schalte Herdplatte ein<br />

Setze Kessel auf die Herdplatte<br />

Warte bis das Wasser kocht<br />

Schalte Herdplatte aus<br />

Nimm einen Teefilter<br />

Setze den Teefilter auf die Tasse<br />

Öffne die Teedose<br />

Stelle Kessel unter Wasserhahn<br />

Drehe Wasserhahn auf<br />

Warte bis der Kessel voll ist<br />

Drehe Wasserhahn zu<br />

Nimm den Filterrahmen<br />

Nimm passenden Papierfilter<br />

Setze Papierfilter auf den<br />

Filterrahmen<br />

Nimm Teedose aus dem Fach<br />

Entferne den Deckel<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

...<br />

Zweite Verfeinerung<br />

99


Aspekte bei der schrittweisen Verfeinerung<br />

� Kenntnisse über die Fähigkeiten des Prozessors sind von zentraler<br />

Bedeutung bei der schrittweisen Verfeinerung<br />

Praktische Informatik I<br />

04.11.2003<br />

– wenn ein Schritt noch nicht vom Prozessor ausgeführt werden kann, muss<br />

noch eine Verfeinerung vorgenommen werden.<br />

– wünschenswert ist auch eine Verfeinerung von Schritten, deren<br />

Ausführung noch verbessert werden kann, z.B.<br />

„Warte bis der Kessel voll ist“ (wie voll?)<br />

– die Fähigkeiten des Prozessors legen die Richtung der Verfeinerung fest<br />

� Basisschritte der schrittweisen Verfeinerung können teilweise wieder<br />

beim Entwurf anderer <strong>Algorithmen</strong> genutzt werden, z.B. „Kochen einer<br />

Tasse Kaffee“<br />

– erster Schritt „Koche Wasser“ ist in beiden <strong>Algorithmen</strong> identisch<br />

– Roboter erweckt dadurch den Anschein, komplexere Operationen direkt<br />

interpretieren zu können.<br />

100<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Prozeduren / <strong>Methoden</strong><br />

� schrittweise Verfeinerung<br />

Praktische Informatik I<br />

04.11.2003<br />

– ein Schritt eines Algorithmus wird unterteilt in viele Teilschritte<br />

– Teilschritte sind oft unabhängig von den anderen Schritten des Algorithmus<br />

� Beispiel (Schritt „Wasser kochen“ bei der Teebereitung)<br />

• Fülle 200 ml Wasser in den Kessel<br />

• Schalte Herdplatte an<br />

• Setze Kessel auf diese Herdplatte<br />

• Warte bis das Wasser kocht<br />

• Schalte Herdplatte aus<br />

– für die anderen Schritte des Algorithmus ist nur relevant, was dieser Teil bewirkt,<br />

aber nicht wie dies technisch realisiert wird.<br />

– Sequenz könnte wieder als eigenständiger Algorithmus aufgefasst werden<br />

Algorithmus kocheWasser200<br />

Eingabe: 200 ml Wasser<br />

Ausgabe: 200 ml kochendes Wasser<br />

– entsprechend <strong>Algorithmen</strong> KocheWasser300, KocheWasser400, …<br />

101<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Beobachtung<br />

� verschiedene <strong>Algorithmen</strong> zum Wasser kochen sind sehr ähnlich:<br />

Idee<br />

Praktische Informatik I<br />

04.11.2003<br />

– Unterschied liegt nur in der Wassermenge<br />

� vereinige diese <strong>Algorithmen</strong> in einen gemeinsamen Algorithmus, wobei die<br />

Wassermenge als Parameter an den Algorithmus übergeben wird.<br />

– Aufruf des Algorithmus: kocheWasser(200)<br />

– Formulierung des Algorithmus als Prozedur (Methode):<br />

/** Kocht xMilliLiter Wasser */<br />

void kocheWasser(int xMilliLiter) {<br />

if (xMilliLiter > Kapazität des Kessels)<br />

Melde “Wassermenge zu groß”<br />

else {fuelleKessel(xMilliLiter); // noch ein <strong>Methoden</strong>aufruf<br />

Schalte die Herdplatte an;<br />

…<br />

}<br />

� weitere mögliche Parameter im Algorithmus<br />

– Kessel<br />

– Herd<br />

102<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


allgemeine Form:<br />

� Methode besteht aus einem <strong>Methoden</strong>kopf <strong>und</strong> einem Rumpf.<br />

Wünschenswert wäre auch Spezifikation (in Java aber nicht verlangt)<br />

Praktische Informatik I<br />

04.11.2003<br />

• <strong>Methoden</strong>kopf<br />

void <strong>Methoden</strong>name(Liste von Formalparametern)<br />

- Schlüsselwort void signalisiert, dass die Methode keinen Ausgabewert<br />

berechnet.<br />

- Jede Methode besitzt einen Namen (Annahme: der Name sei eindeutig).<br />

- An den Klammern wird erkannt, dass dies eine <strong>Methoden</strong>deklaration ist.<br />

- Zwischen den Klammern steht eine Liste von Parametern.<br />

• <strong>Methoden</strong>rumpf<br />

- Algorithmus als Java-Programm.<br />

� Aufruf einer Methode: <strong>Methoden</strong>name(Liste von Aktualparametern);<br />

– Prozessor bearbeitet diese Anweisung wie folgt:<br />

• Berechnung der Werte der Aktualparameter<br />

• Anlegen von Speicher für die Formalparameter<br />

• Formalparameter bekommen die berechneten Werte zugewiesen.<br />

• Danach werden die Schritte des <strong>Methoden</strong>rumpfs ausgeführt.<br />

– Liste der Aktual- <strong>und</strong> der Formalparameter müssen kompatibel sein.<br />

103<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Funktionsmethoden<br />

� = spezielle <strong>Methoden</strong>, die<br />

Praktische Informatik I<br />

04.11.2003<br />

– zusätzlich einen Wert berechnen <strong>und</strong><br />

– diesen an den aufrufenden Algorithmus zurückgeben.<br />

� Beispiele:<br />

int max2(int x, int y) {<br />

if (x > y)<br />

return x;<br />

return y;<br />

}<br />

/** es wird das Maximum für vier ganze Zahlen berechnet */<br />

int max4(int w, int x, int y, int z) {<br />

return max2(max2(w,x), max2(y,z)); // Was passiert hier?<br />

}<br />

104<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


<strong>Methoden</strong>aufruf <strong>und</strong> Speicher<br />

Aufruf von max4(2,3,5,4)<br />

Bezeichner<br />

max4<br />

Bezeichner<br />

max4<br />

max2<br />

Praktische Informatik I<br />

04.11.2003<br />

Adresse<br />

Aufruftabelle<br />

Aufruf von max2(max2(2,3), max2(5,4))<br />

Adresse<br />

Aufruftabelle<br />

Bezeichner<br />

105<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

w<br />

x<br />

y<br />

z<br />

Bezeichner<br />

w<br />

x<br />

y<br />

z<br />

Bezeichner<br />

x<br />

y<br />

Wert<br />

2<br />

3<br />

5<br />

4<br />

Wert<br />

2<br />

3<br />

5<br />

4<br />

Wert<br />

2<br />

3


<strong>Methoden</strong>aufruf <strong>und</strong> Speicher<br />

Aufruf von max2(3, max2(5,4))<br />

Praktische Informatik I<br />

04.11.2003<br />

max4<br />

max2<br />

Bezeichner<br />

Bezeichner Adresse<br />

z<br />

4<br />

106<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

w<br />

x<br />

y<br />

Bezeichner<br />

WICHTIG<br />

Jeder Aufruf einer Methode bekommt ihren eigenen Speicherbereich,<br />

in dem z. B. die Werte der Formalparameter hinterlegt werden. Nach<br />

dem Beenden der Methode wird der Speicher zurückgegeben.<br />

x<br />

y<br />

Wert<br />

2<br />

3<br />

5<br />

Wert<br />

5<br />

4


Vorteile von <strong>Methoden</strong><br />

� Methode ist eine in sich abgeschlossene Komponente einer aufrufenden<br />

Methode<br />

Praktische Informatik I<br />

04.11.2003<br />

– Entwurf des aufrufenden Algorithmus ist getrennt vom Entwurf der Methode<br />

� Beim Benutzen einer Methode ist nur erforderlich, was die Methode leistet,<br />

aber nicht, wie die Methode dies leistet (prozedurale Abstraktion).<br />

– Änderungen einer Methode haben keinen Einfluss auf das aufrufende Programm,<br />

solange die Spezifikation gleich bleibt.<br />

– Korrektheit eines großen Programms kann einfacher überprüft werden, wenn es<br />

<strong>Methoden</strong> verwendet.<br />

– <strong>Methoden</strong> führen zu einer erheblich kompakteren Beschreibung eines Algorithmus<br />

� fertige <strong>Methoden</strong> können beim Entwurf von anderen <strong>Algorithmen</strong> immer wieder<br />

im Programm <strong>und</strong> in anderen Programmen benutzt werden (Bibliotheken)<br />

107<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


3.4 Rekursion<br />

� Wird ein Problem einer Problemklasse gelöst, indem wir es auf ein<br />

einfacheres Problem dieser Klasse zurückführen, nennen wir dies eine<br />

rekursive Lösung.<br />

� Beispiel (Matrioschka-Puppen):<br />

/** Öffnet rekursiv die Puppen, entfernt die massive Puppe <strong>und</strong> schließt die Puppen. */<br />

void nimmMassivePuppe(Puppe M) {<br />

if (M ist massiv)<br />

nimm M;<br />

else {<br />

öffne M;<br />

nimmMassivePuppe(Inhalt von M);<br />

schließe M;<br />

}<br />

}<br />

– Zweiter Schritt im else-Zweig bewirkt, dass die gleiche Methode wieder<br />

aufgerufen wird, jetzt aber mit der nächst kleineren Puppe.<br />

– Algorithmus arbeitet in 2 Phasen<br />

Praktische Informatik I<br />

04.11.2003<br />

1. Phase: Öffnen aller Puppen<br />

2. Phase: Schließen aller Puppen<br />

108<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Wichtige Anforderung an rekursive <strong>Methoden</strong>:<br />

� Folge von rekursiven <strong>Methoden</strong>aufrufen muss endlich sein<br />

Praktische Informatik I<br />

04.11.2003<br />

– Eingabe vom nächsten rekursiven Aufruf muss „einfacher“ werden<br />

– Eine Selektionsanweisung (bzw. eine entsprechende Kontrollstruktur)<br />

muss den Fall behandeln, an dem die Rekursion nicht fortgesetzt wird.<br />

Berechnung der Fakultät<br />

fak(<br />

n)<br />

n ⎧ 1 falls n = 0<br />

= ∏ i = ⎨<br />

i=<br />

1 ⎩n<br />

⋅ fak(<br />

n −1)<br />

sonst<br />

/** Berechnet Fakultät von n für alle ganzen Zahlen n mit n > 0 */<br />

int fact(n) {<br />

if (n == 0)<br />

Test auf Gleichheit<br />

return 1;<br />

else<br />

return n * fact(n-1);<br />

}<br />

109<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Veranschaulichung des Prozesses für fact(4)<br />

Praktische Informatik I<br />

04.11.2003<br />

110<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Türme von Hanoi<br />

Problem<br />

� gegeben 3 Plätze <strong>und</strong> ein Stapel von Scheiben, die auf einem der Plätze ihrer Größe<br />

nach aufeinander liegen<br />

� Ziel ist es den Stapel unter Beachtung folgender Regeln auf einen anderen Platz zu<br />

legen<br />

Praktische Informatik I<br />

04.11.2003<br />

– pro Zug wird immer nur eine Scheibe bewegt<br />

– es darf nie eine größere auf einer kleineren Scheibe liegen<br />

� Algorithmus für 4 Scheiben von Platz 1 auf Platz 2 (3 dient als Zwischenlager)<br />

1. Übertrage die oberen 3 Scheiben von Platz 1 nach Platz 3 (Rekursion!)<br />

2. Bewege die untere Scheibe von Platz 1 nach Platz 2<br />

3. Übertrage die 3 Scheiben von Platz 3 nach Platz 2 (wieder Rekursion!)<br />

111<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


1. Schritt<br />

2. Schritt<br />

3. Schritt<br />

Praktische Informatik I<br />

04.11.2003<br />

112<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Algorithmus<br />

/** Überträgt einen Stapel von n Scheiben von Platz „von“ auf Platz „nach“ <strong>und</strong> benutzt<br />

* dabei den Platz „über“.<br />

*/<br />

void bewegeStapel (int n, int von, int nach, int über) {<br />

if (n == 1)<br />

bewegeScheibe(von, nach);<br />

else {<br />

bewegeStapel(n - 1, von, über, nach);<br />

bewegeScheibe(von, nach);<br />

bewegeStapel(n - 1, über, nach, von);<br />

}<br />

}<br />

Bemerkungen<br />

� Wie oft wird bewegeStapel bei einem Problem der Größe n ausgeführt?<br />

Praktische Informatik I<br />

04.11.2003<br />

– Aufrufe beim Problem der Größe n = 2 * (Aufrufe des Problems der Größe n-1)<br />

= 4 * (Aufrufe des Problems der Größe n-2)<br />

= …<br />

= 2n * (Aufrufe des Problems der Größe 1)<br />

113<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


PlayHanoi: ein Spielautomat<br />

� Ziel ist die Entwicklung eines Automaten für das Spiel<br />

„Türme von Hanoi“.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Voraussetzungen<br />

– Ziel<br />

• Anfangs ist der komplette Stapel auf einem Platz.<br />

• Benutzer können mittels des Automaten den kompletten Stapel auf<br />

eine andere Position setzen.<br />

• Visualisierung der Züge durch den Automaten.<br />

114<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Die Klasse PlayHanoi (Teil 1)<br />

public class PlayHanoi{<br />

private int anzahlScheiben; // Anzahl der Scheiben<br />

private int startPosition = 1; // Position des Stapels<br />

/**<br />

* Konstruktor für Objekte der Klasse PlayHanoi<br />

*/<br />

public PlayHanoi(int scheiben){<br />

anzahlScheiben = scheiben;<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

/** Überträgt einen Stapel von n Scheiben von Platz von auf Platz nach.<br />

* Alle Bewegungen von Scheiben werden ausgegeben.<br />

* Diese Methode ist nur für die interne Nutzung gedacht.<br />

*/<br />

private void bewegeStapelIntern (int n, int von, int nach, int ueber) {<br />

if (n == 1) bewegeScheibe(von, nach);<br />

}<br />

else{<br />

}<br />

bewegeStapelIntern(n - 1, von, ueber, nach);<br />

bewegeScheibe(von, nach);<br />

bewegeStapelIntern(n - 1, ueber, nach, von);<br />

Test auf Gleichheit<br />

115<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Die Klasse PlayHanoi (Teil 2)<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

/** Ausgabe der Bewegung einer Scheibe:<br />

* von ist die Startposition, nach ist die Zielposition.<br />

*/<br />

private void bewegeScheibe(int von, int nach) {<br />

System.out.print("Bewege Scheibe: ");<br />

System.out.print(von);<br />

System.out.print(" --> ");<br />

System.out.println(nach);<br />

}<br />

/**<br />

* bewegeStapel bewegt den gesamten Stapel von startPosition auf zielPosition.<br />

*/<br />

public void bewegeStapel(int zielPosition){<br />

if ((zielPosition > 0) && (zielPosition < 4)){<br />

if (zielPosition != startPosition) {<br />

bewegeStapelIntern(anzahlScheiben, startPosition,<br />

zielPosition, 3 - (startPosition+zielPosition)%3);<br />

startPosition = zielPosition;<br />

}<br />

}<br />

else<br />

System.out.println("Falsche Stapelnummer");<br />

}<br />

Eingabe überprüfen<br />

Klammern, warum?<br />

Was ist denn das?<br />

116<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


3.5 Zustandsbasierte <strong>Algorithmen</strong><br />

Definition:<br />

� Ein Prozess eines imperativen Algorithmus kann Zwischenergebnisse<br />

erzeugen, auf die der Algorithmus sich wieder explizit beziehen kann.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Als Prozesszustand wird die Menge der zu den Zwischenergebnissen<br />

gehörenden Werte bezeichnet, die nach einer partiellen Ausführung<br />

existieren.<br />

– Der Zustandsraum eines Algorithmus bezeichnet die Menge aller erlaubten<br />

Prozesszustände.<br />

� Bemerkung:<br />

Frage hier: Was charakterisiert zustandsbasierte <strong>Algorithmen</strong>?<br />

– Zwischenergebnisse muss man sich merken, d.h. wir benötigen bei der<br />

Abarbeitung eines Algorithmus ein Blatt Papier (falls Prozessor = Mensch)<br />

oder einen Teil des Hauptspeichers (falls Prozessor = Rechner).<br />

• Objekte sind in diesem Sinne eine spezielle Art eines Speichers.<br />

– Wünschenswert wäre, dass ein Algorithmus möglichst wenig Speicher<br />

benötigt � Speicherplatzeffizienz<br />

117<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


3.5.1 Variablen<br />

� Da ein zustandsbasierter Algorithmus mehrere Zwischenergebnisse benötigt, wird ein<br />

Mechanismus für den selektiven Zugriff auf einzelne Ergebnisse benötigt.<br />

� Unter einer Variablen, genauer gesagt Zustandsvariablen, verstehen wir einen<br />

Speicherbereich <strong>und</strong> einen Typ.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Auf den Inhalt des Speicherbereichs kann über eine eindeutige Referenz (z.B. eine Nummer)<br />

zugegriffen werden.<br />

– Der Inhalt wird entsprechend des Typs der Variablen interpretiert.<br />

Bemerkungen:<br />

� Die Referenz <strong>und</strong> der Typ einer Variablen ändern sich während der Laufzeit nicht!<br />

– Mittels der Referenz lässt sich die Adresse berechnen, an welcher die Variable im Speicher liegt.<br />

Bei vielen Programmiersprachen (z.B. C) ist die Referenz identisch zur Speicheradresse.<br />

� Der Wert einer Variablen kann sich ändern<br />

– Schreibe den Wert 2750 in die Variable mit Referenz 1 �<br />

1<br />

2<br />

Referenz<br />

Referenz<br />

1<br />

2<br />

Wert<br />

2500<br />

3000<br />

Wert<br />

2750<br />

3000<br />

Typ<br />

118<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

int<br />

int<br />

Typ<br />

int<br />

int


Variablenbezeichner<br />

� Für die Lesbarkeit von <strong>Algorithmen</strong>:<br />

– Variablen werden nicht über ihre Referenz sondern über einen aussagekräftigen Namen angesprochen.<br />

– Im Programm muss explizit der Bezug zwischen den Namen <strong>und</strong> den Variablen hergestellt werden<br />

Variablendeklaration<br />

� In den meisten Programmiersprachen (z.B. Java) muss die Variablendeklaration vor dem ersten Zugriff auf die<br />

Variable erfolgen.<br />

� Nicht alle Namen sind erlaubt.<br />

– Verboten ist die Verwendung von Schlüsselwörtern. Zudem darf das erste Symbol keine Ziffer sein.<br />

– Als Zeichen sind Buchstaben, Ziffern <strong>und</strong> ein paar wenige Sonderzeichen erlaubt.<br />

� Darüber hinaus gibt es noch Konventionen<br />

– Variablennamen sollen mit Kleinbuchstaben beginnen, z. B. pos, suchGehalt<br />

– Bei zusammengesetzten Namen sollen alle angesetzten Teile mit einem Großbuchstaben beginnen, z. B.<br />

suchGehalt.<br />

� Beispiel (Java): int x<br />

– x ist der Bezeichner der Variablen<br />

– int bezeichnet den Datentyp.<br />

Praktische Informatik I<br />

04.11.2003<br />

Bezeichner<br />

suchGehalt<br />

gehalt<br />

1<br />

2<br />

Variable<br />

� Zu einer Variablen gibt es höchstens einen Variablenbezeichner.<br />

– Umgekehrt gilt dies nicht!<br />

1<br />

2<br />

Referenz<br />

Wert<br />

2750<br />

3000<br />

Typ<br />

119<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

Int<br />

int


Klassifizierung von Variablen<br />

� Instanzvariablen<br />

Praktische Informatik I<br />

04.11.2003<br />

– Dies ist nur eine andere Bezeichnung von den Datenfeldern.<br />

– Instanzvariablen sind in der ganzen Klasse gültig, d. h. man kann den<br />

Namen in allen <strong>Methoden</strong> verwenden (Ausnahmen später).<br />

– Bei Erzeugung eines Objekts werden die zugehörigen Instanzvariablen<br />

erzeugt <strong>und</strong> beim Löschen des Objekts auch entsprechend die<br />

Instanzvariablen zerstört.<br />

� Lokale Variablen<br />

– Lokale Variablen werden innerhalb von <strong>Methoden</strong> deklariert.<br />

– Ihr Name ist höchstens nur in der zugehörigen Methode gültig (später<br />

werden wir noch genauer darauf eingehen).<br />

– Die Instanzvariable wird erzeugt, wenn die Deklarationsanweisung<br />

ausgeführt wird <strong>und</strong> spätestens beim Beenden wird die Variable zerstört<br />

(später genauer).<br />

120<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Wertzuweisung<br />

� Durch einen speziellen Operator kann einer Variable ein Wert zugewiesen werden.<br />

� in Java: Variablenbezeichner = Ausdruck<br />

Praktische Informatik I<br />

04.11.2003<br />

– Wert des Ausdrucks wird zunächst berechnet (später genauer) <strong>und</strong> dann in den Speicherplatz<br />

der Variablen geschrieben, d.h. der alte Wert ist damit nicht mehr verfügbar.<br />

– Zusätzlich muss auch der Typ des Ausdrucks mit dem der Variable kompatibel sein.<br />

� Beispiele:<br />

– x = 2*y + 5;<br />

– x = x + 1;<br />

– z = x*y + z;<br />

� Bemerkung<br />

– Bei der Auswertung eines Ausdrucks werden zunächst die Werte der im Ausdruck<br />

vorkommenden Variablen gelesen <strong>und</strong> dann in den Ausdruck eingesetzt.<br />

– Ein Problem in Java (<strong>und</strong> anderen Sprachen wie C <strong>und</strong> C++) ist die Verwendung des Symbols<br />

“=” für den Zuweisungsoperator. Es besteht stets die Gefahr einer Verwechslung mit dem<br />

Vergleichsoperator “==”.<br />

121<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Mathematische Sichtweise<br />

� Ein Zustand entspricht einer Funktion v, die jedem Variablennamen<br />

einen Wert zuweist.<br />

� Ein Schritt eines Algorithmus erzeugt aus dem alten Zustand einen<br />

neuen Zustand, d.h. die Bedeutung eines Algorithmus lässt sich als<br />

eine Funktion T auffassen mit<br />

Praktische Informatik I<br />

04.11.2003<br />

T: Algorithmus × Zustand → Zustand<br />

wobei, wenn der Anfangszustand die Vorbedingung erfüllt, der<br />

Endzustand auch die Nachbedingung erfüllt.<br />

In einem späteren <strong>Kapitel</strong> werden wir genauer auf die Korrektheit von<br />

<strong>Algorithmen</strong> <strong>und</strong> Programmen eingehen.<br />

122<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


3.5.2 Variablen: Namensraum,<br />

Gültigkeitsbereich <strong>und</strong> Lebensdauer<br />

� Programme werden von einem Team entwickelt. Es ist deshalb sinnvoll, ein<br />

Quellprogramm in Bereiche zu unterteilen (Namensräume), wo die Bezeichner<br />

unabhängig voneinander gewählt werden können.<br />

Praktische Informatik I<br />

04.11.2003<br />

– jede Klasse besitzt einen eigenen Namensraum<br />

– jede Methode besitzt einen eigenen Namensraum<br />

� Namensraum einer Methode<br />

bezeichnet den Teil des Quellprogramms, der zwischen dem Bezeichner der<br />

Methode <strong>und</strong> dem Ende der Methode liegt.<br />

– Im Namensraum einer Methode können nur durch eine Variablendeklaration neue<br />

Bezeichner eingeführt werden.<br />

int test (int a, …, boolean z) {<br />

int aa;<br />

…<br />

}<br />

123<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


� Namensraum einer Klasse<br />

Praktische Informatik I<br />

04.11.2003<br />

bezeichnet den Teil des Quellprogramms, der zwischen dem Klassennamen<br />

<strong>und</strong> dem Ende der Klasse liegt. Die Namensräume der <strong>Methoden</strong> gehören<br />

zum Namensraum der Klasse.<br />

class xxx {<br />

private int x;<br />

public int test (int a, …, float z) {<br />

int aa;<br />

…<br />

}<br />

…<br />

}<br />

� Regel für Namensräume einer Klasse<br />

klassenbezogener Bezeichner<br />

methodenbezogener<br />

(lokaler) Bezeichner<br />

Zwei im gleichen Namensraum definierte Bezeichner müssen verschieden<br />

sein. Es gelten folgende Ausnahmen:<br />

– Der gleiche Bezeichner kann für eine Methode <strong>und</strong> eine Variable verwendet werden.<br />

– <strong>Methoden</strong> müssen sich in ihrer Signatur, aber nicht im Bezeichner unterscheiden.<br />

124<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Gültigkeitsbereich eines Bezeichners<br />

Gültigkeitsbereich lokaler Bezeichner<br />

� Bezeichner für Variablen, die innerhalb einer Methode deklariert wurden,<br />

heißen lokal.<br />

� Zu jedem lokalen Bezeichner gibt es einen eindeutigen Block, in dem der<br />

Bezeichner deklariert wurde. Die erste {, die vor der Deklaration liegt, definiert<br />

den Anfang des Blocks.<br />

� Der Gültigkeitsbereich eines lokalen Bezeichners ist der statische Teil des<br />

Programms, der bei der Deklaration des Bezeichners beginnt <strong>und</strong> bei der } des<br />

dazugehörigen Blocks endet.<br />

Gültigkeitsbereich von klassenbezogenen Bezeichnern<br />

� Der Gültigkeitsbereich eines Bezeichners, der im Namensraum der Klasse<br />

liegt, erstreckt sich über die gesamte Klasse (also auch über die <strong>Methoden</strong>).<br />

Regel für Gültigkeitsbereiche<br />

� Ein Bezeichner darf nur innerhalb seines Gültigkeitsbereichs benutzt werden.<br />

Praktische Informatik I<br />

04.11.2003<br />

125<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Beispiel<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

class Beispiel {<br />

private int x;<br />

public int test1() {<br />

}<br />

}<br />

int y;<br />

y = 2;<br />

int z;<br />

…<br />

public int test2() {<br />

int b;<br />

…<br />

{<br />

}<br />

int c;<br />

…<br />

Gültigkeitsbereich von x <strong>und</strong> den Bezeichnern<br />

test1 <strong>und</strong> test2.<br />

Gültigkeitsbereich von y<br />

Gültigkeitsbereich von z<br />

Gültigkeitsbereich von a <strong>und</strong> b<br />

Gültigkeitsbereich von c<br />

126<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Lebensdauer<br />

Aus einem (statischen) Quellprogramm wird dynamisch ein Prozess erzeugt.<br />

Zusätzlich erzeugt ein Quellprogramm dynamisch Variablen.<br />

class Beispiel {<br />

private int x = 100, y = 10;<br />

private int m1(int x) {<br />

boolean z;<br />

…<br />

}<br />

private int m2() {<br />

int b;<br />

…<br />

}<br />

public void run(int input) {<br />

int x;<br />

if (input > 0)<br />

x = m1(input*2);<br />

else<br />

x = m2();<br />

System.out.print(“x = “);<br />

System.out.println(x);<br />

}<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

� Offensichtlich erzeugt dieses<br />

Programm in Abhängigkeit von der<br />

Eingabe verschiedene Prozesse.<br />

� Wenn in run die <strong>Methoden</strong> m1 oder<br />

m2 aufgerufen werden, müssen<br />

dynamisch Variablen erzeugt<br />

werden.<br />

� Die dynamische Erzeugung neuer<br />

Variablen muss auch bei Objekten<br />

vorgenommen werden.<br />

127<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Erzeugung von Objekten<br />

� Wird ein Objekt einer Klasse erzeugt, so werden alle<br />

Datenfelder neu angelegt.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Der Variablenname wird in die Bezeichnertabelle aufgenommen.<br />

– Dieser Name verweist auf eine Variable, die als Wert wiederum<br />

eine Bezeichnertabelle besitzt, in der die Bezeichner der<br />

Instanzvariablen liegen.<br />

Bezeichner<br />

beispielObj<br />

• Wir sprechen dann auch von einer Referenzvariablen.<br />

Variable<br />

1<br />

Bezeichnertabelle<br />

Referenz<br />

1<br />

2<br />

3<br />

10<br />

Wert<br />

100<br />

?<br />

Int<br />

int<br />

Typ<br />

Bezeichner<br />

128<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

x<br />

y<br />

Variable<br />

2<br />

3


Erzeugung lokaler Variablen (<strong>Methoden</strong>aufruf)<br />

� Wird eine Methode aufgerufen, so werden alle lokalen Variablen (inkl.<br />

Parameter) neu angelegt. Zusätzlich wird der Name der Methode in<br />

einer Tabelle eingetragen <strong>und</strong> der Kontext der Methode gesetzt.<br />

Bezeichner<br />

beispielObj<br />

Praktische Informatik I<br />

04.11.2003<br />

Variable<br />

Bezeichnertabelle<br />

Bezeichner<br />

run<br />

1<br />

Variable<br />

4<br />

Aufruftabelle<br />

Referenz<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

10<br />

0<br />

Wert<br />

100<br />

200<br />

Typ<br />

?<br />

int<br />

int<br />

?<br />

int<br />

int<br />

Kontext des <strong>Methoden</strong>aufrufs<br />

Bezeichner<br />

Bezeichner<br />

input<br />

129<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

x<br />

y<br />

x<br />

Variable<br />

2<br />

3<br />

5<br />

6<br />

Variable


Kontext<br />

� Eine Methode darf über Bezeichner auf ihre lokalen Variablen <strong>und</strong> auf die<br />

Instanzvariablen des Objekts direkt zugreifen.<br />

Diese Abbildung zwischen den Bezeichnern <strong>und</strong> den Variablen bezeichnen wir<br />

auch als der Kontext des <strong>Methoden</strong>aufrufs.<br />

Praktische Informatik I<br />

04.11.2003<br />

– Stimmen die Bezeichner einer Instanzvariablen <strong>und</strong> einer lokalen Variablen überein,<br />

so muss beim Zugriff auf die Instanzvariable zusätzlich das Schlüsselwort this mit<br />

dem Punkt-Operator als Präfix mitangegeben werden:<br />

this.x ist also die Instanzvariable x <strong>und</strong> nicht die lokale Variable x.<br />

– allgemein gilt: „innere“ Teile des Kontexts verdecken „äußere“<br />

– nach einem Bezeichner wird immer zuerst im innersten Teil des Kontextes gesucht<br />

� Der <strong>Methoden</strong>kontext eines <strong>Methoden</strong>aufrufs ist die Einschränkung des<br />

Kontexts auf den Namensraum seiner Methode. Der Objektkontext ist der<br />

Kontext eingeschränkt auf das Objekt der Klasse.<br />

Bemerkungen<br />

� Der Objektkontext einer Methode unterscheidet sich i. A. für jedes Objekt.<br />

130<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Bemerkungen<br />

� Pro <strong>Methoden</strong>aufruf werden lokale Variablen angelegt.<br />

– Wird eine Methode mehrfach aufgerufen (Rekursion), so gibt es zu einer Methode<br />

verschiedene Kontexte (pro Aufruf ein Kontext).<br />

� Beim <strong>Methoden</strong>aufruf bekommen die Variablen der Formalparameter die<br />

Werte der Aktualparameter zugewiesen.<br />

� Ist die Methode vollständig abgearbeitet, so werden die zu dem Aufruf der<br />

Methode erzeugten Variablen gelöscht.<br />

– Die Verarbeitung des Programms wird bei der aufrufenden Methode fortgesetzt<br />

(Kontextwechsel).<br />

– Es wird also insbesondere der Wert des Formalparameters nicht an den<br />

Aktualparameter gegeben.<br />

� Man beachte, dass der Kontext einer Methode (in Java) zur Laufzeit<br />

dynamisch entsteht, aber über den statischen Aufbau der Klasse definiert ist.<br />

Lebensdauer lokaler Variablen<br />

Praktische Informatik I<br />

04.11.2003<br />

ich sehe also nicht den Kontext<br />

meiner Aufruf- sondern meiner<br />

Definitionsumgebung!<br />

� Ist der Zeitraum vom Aufruf der Methode bis zum Verarbeitungsende der<br />

Methode.<br />

131<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


3.5.3 Schleifen<br />

� Gegeben eine Gehaltsliste <strong>und</strong> ein Gehalt. Schreiben Sie einen Algorithmus,<br />

der zu einem gegebenen Gehalt den zugehörigen Angestellten findet.<br />

Lies den ersten Eintrag aus der Gehaltsliste<br />

if (das Gehalt des Eintrags ist das gesuchte)<br />

notiere den Angestellten<br />

else {<br />

lies den nächsten Eintrag<br />

if (das Gehalt des Eintrags ist das gesuchte)<br />

notiere den Angestellten<br />

else {<br />

lies den nächsten Eintrag<br />

…<br />

}<br />

}<br />

Praktische Informatik I<br />

04.11.2003<br />

Probleme<br />

� Beschreibung des<br />

Algorithmus ist zu<br />

aufwendig.<br />

� Algorithmus hängt direkt<br />

von der Dateneingabe ab:<br />

neue Liste ⇒ neuer<br />

Algorithmus<br />

Laut unserer Definition<br />

wäre dies kein<br />

Algorithmus!!<br />

132<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Ein Prozess sollte eine Sequenz beliebig oft durchlaufen dürfen<br />

while (Bedingung)<br />

Schritt1<br />

Schritt2<br />

� Bedeutung:<br />

Praktische Informatik I<br />

04.11.2003<br />

– Die Bedingung der Schleife wird zuerst ausgewertet (Resultat: wahr oder falsch).<br />

– Falls das Resultat wahr ist, wird Schritt1 ausgeführt <strong>und</strong> danach wieder die<br />

Bedingung ausgewertet.<br />

– Dies wird solange wiederholt bis die Auswertung der Bedingung falsch ergibt.<br />

– Danach wird mit Schritt2 fortgefahren.<br />

� Begriffe<br />

– Bedingung wird auch als Abbruchbedingung bezeichnet.<br />

– Schritt1 wird auch als Schleifenrumpf bezeichnet.<br />

• Jeder Schritt darf wiederum ein komplexer Schritt z.B. eine Sequenz sein.<br />

Voraussetzung bei Schleifen<br />

� Der Wert der Bedingung sollte sich bei der Ausführung verändern.<br />

Hierzu hängt dieser Wert normalerweise von einer Variablen ab.<br />

133<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


modifizierter Algorithmus:<br />

1. erzeuge zwei Variablen mit Bezeichnern suchGehalt <strong>und</strong> gehalt;<br />

2. suchGehalt = gesuchtes Gehalt;<br />

3. gehalt = Gehalt des ersten Angestellten aus der Liste;<br />

4. while (suchGehalt != gehalt <strong>und</strong><br />

es gibt noch einen verbleibenden Eintrag in der Liste)<br />

4.1. gehalt = Gehalt des nächsten Angestellten aus der Liste;<br />

5. if (der Wert von suchGehalt ist gleich dem Wert von gehalt)<br />

5.1. notiere den Angestellten;<br />

� Der Operator „!=“ vergleicht die Werte der entsprechenden Variablen<br />

auf Ungleichheit. Falls dies der Fall ist, ist die Bedingung wahr<br />

Ansonsten falsch.<br />

� Entwicklung des Prozesszustandes bei der Suche<br />

Praktische Informatik I<br />

04.11.2003<br />

Bezeichner<br />

suchGehalt<br />

gehalt<br />

Schritt 1<br />

Schritt 2<br />

2750<br />

Schritt 3<br />

2750<br />

1000<br />

Schritt 4<br />

2750<br />

1000<br />

Schritt 4.1<br />

2750<br />

1300<br />

134<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg<br />

...<br />

...<br />

...


<strong>Algorithmen</strong> als Flussdiagramme<br />

� <strong>Algorithmen</strong> können an Hand folgender elementarer Bestandteile<br />

angegeben werden:<br />

Praktische Informatik I<br />

04.11.2003<br />

1. In ein Rechteck wird genau eine auszuführende Elementaroperation<br />

geschrieben.<br />

2. Pfeile führen zu der als nächstes auszuführenden Aktion.<br />

3. In einer Raute steht eine Bedingung. Ist diese erfüllt, folgt man dem Pfeil<br />

mit der Marke T (für true).<br />

T F<br />

4. An diesem Kreis wird der Algorithmus begonnen.<br />

5. An diesem gefüllten Kreis wird der Algorithmus beendet.<br />

135<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Beispiel:<br />

Gehaltsliste<br />

Praktische Informatik I<br />

04.11.2003<br />

4.1 gehalt =<br />

nächstes Gehalt<br />

aus der Liste<br />

1. erzeuge die<br />

Variablen<br />

suchGehalt <strong>und</strong><br />

gehalt<br />

2. suchGehalt =<br />

gesuchtes Gehalt<br />

3. gehalt =<br />

erstes Gehalt aus<br />

der Liste<br />

T 4. suchGehalt<br />

!= gehalt<br />

F<br />

T 5. suchGehalt<br />

== gehalt<br />

F<br />

5.1 notiere den<br />

Angestellten<br />

136<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg


Zusammenfassung<br />

� Problemspezifikation, Algorithmus, Prozess <strong>und</strong> Prozessor<br />

� Konzepte beim Entwurf von <strong>Algorithmen</strong><br />

Praktische Informatik I<br />

04.11.2003<br />

– schrittweise Verfeinerung (Methode)<br />

– Kontrollstrukturen (Sequenz, Selektion, Schleifen)<br />

Problem bei der bisherigen Darstellung von <strong>Algorithmen</strong><br />

� <strong>Algorithmen</strong> wurden unter dem Blickwinkel betrachtet, anderen<br />

Menschen Lösungswege zu Problemen mitzuteilen.<br />

– relativ informelle <strong>und</strong> abstrakte Beschreibung der Lösungswege<br />

– Studierende der Vorlesung bringen genügend an Vorwissen mit, um diese<br />

Beschreibung zu verstehen <strong>und</strong> in einen Prozess umzusetzen.<br />

� Werden <strong>Algorithmen</strong> einem Rechner mitgeteilt, wird hierfür eine<br />

Programmiersprache benutzt.<br />

– In Java erfolgt die Umsetzung eines Algorithmus in eine Methode<br />

137<br />

© Prof. Dr. Andreas Henrich, Universität Bayreuth <strong>und</strong> Prof. Dr. Bernhard Seeger, Universität Marburg

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!