Informatik II
Sommersemester 2003 Prof. Dr. Peter C. Lockemann bungsleitung
Gbor M. Surnyi Daniel Pfeifer Philipp Bender
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
Organisation
! Medien und Unterlagen:
" Web: " News: http://www.ipd.uni-karlsruhe.de/~info2/ news://news.rz.uni-karlsruhe.de/uka.info2 Mo, Mi 14:00 Uhr, Hrsaal am Forum Mi 15:45 Uhr, Hrsaal am Forum WebInScribe Mi nach der bung und im Web Mi bis zum Beginn der Vorlesung Ksten im Keller Infobau (Geb. 50.34)
! Veranstaltungen:
" Vorlesung: " bung: " Tutorien:
! bungsbltter:
" Ausgabe: " Abgabe:
! Klausur:
" Voraussichtlich 30.07.2003 " Bonus fr Bearbeitung der bungsbltter
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
Informatik II SS 2003
Innensicht
Auensicht
Programm (1)
Innensicht Imperatives Programmieren (Konstrukte aus Java)
! Praxis: Basistypen, Anweisungen, Verbunde, Felder, Schleifen, Rekursion ! Theorie: Syntaxbeschreibung, Induktion, Schleifeninvarianten ! Ausnahmebehandlung
Auensicht
Dienste
! Funktionalitt/Schnittstellen ! Qualittsparameter: Aufwand, Zuverlssigkeit, Skalierbarkeit, Persistenz ! Algorithmenwahl
Objektorientierung
! Objekte, Zustnde, Methoden ! Entwurf mittels UML ! Vererbung
Kapitel 1
Programm (2)
Innensicht Algorithmenentwurf und Algorithmen (incl. Aufwnde)
! Suche und Sortieren (Reihen, Folgen, Bume) ! Graphen ! Dyn. Programmieren ! Geometr. Algorithmen
Prozesse
! ! ! ! Prozesse Prozesskommunikation Parallelitt/Synchronisation Java: Thread-Programmierung
Autonome Dienste
! Enge/lose Kopplung ! Protokolle / Automaten ! Verteilung
Kapitel 1
Informatik II SS 2003
Programm (1)
Innensicht Imperatives Programmieren (Konstrukte aus Java)
! Praxis: Basistypen, Anweisungen, Verbunde, Felder, Schleifen, Rekursion ! Theorie: Syntaxbeschreibung, Induktion, Schleifeninvarianten ! Ausnahmebehandlung
Auensicht
Dienste
! Funktionalitt/Schnittstellen ! Qualittsparameter: Aufwand, Zuverlssigkeit, Skalierbarkeit, Persistenz ! Algorithmenwahl
Objektorientierung
! Objekte, Zustnde, Methoden ! Entwurf mittels UML ! Vererbung
Kapitel 1
Kapitel 1
Kapitel 1
10
Rechenwerk
Datensignale Steuersignale
Steuerwerk
! Programm und Daten sind in einheitlichem Speicher ! Die Befehle werden nacheinander aus den Zellen des Speichers geholt ! Ein Befehl wird dekodiert, die entsprechenden Daten werden aus dem Speicher geholt, und der Befehl wird ausgefhrt ! Das Ergebnis ist ein Wert, der als in einer Zelle abzulegender Inhalt interpretiert wird oder als Referenz auf die Zelle mit dem nchsten Befehl ! Danach wird Zelle mit dem nchsten Befehl betrachtet und der nchste Befehl abgearbeitet
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
11
Sprache? gedachter oder realer Rechner zur unmittelbaren Verarbeitung des bersetzten Programms
Unser nchstes Ziel: Wir suchen nach einer Programmiersprache (fr das bersetzte Programm), die ! einerseits sich an die operationelle Semantik realer Rechner anlehnt, ! andererseits aber dem Programmierer das Denken in dessen Problemstrukturen und -begriffen erlaubt.
Wir nennen eine derartige Programmiersprache zustandsorientierte oder imperative Programmiersprache. Zur Illustration verwenden wir als Sprache Java.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
12
bersetzung
bersetztes Programm
Ausfhrung
Ergebnis
Sprache? gedachter oder realer Rechner zur unmittelbaren Verarbeitung des bersetzten Programms
Kapitel 1
13
Ergebnis
Eine Sprache Eine Umgebung basierend auf der zur Ausfhrung operationalen des bersetzten Semantik realer Programms Rechner (Java (Java Interpreter) Bytecode)
! Bei der bersetzung (zur bersetzungszeit) eines Java-Programms wird es in gewissem Rahmen auf seine Korrektheit geprft. Beispiel: Die syntaktische Struktur der Programms ! Bei der Ausfhrung (zur Laufzeit) finden weitere Prfungen statt, die erst beim Programmlauf bekannt werden knnen. Beispiel: Division durch 0 aufgrund einer falschen Benutzereingabe ! Daher ist es wichtig, bersetzungszeit und Laufzeit zu unterscheiden.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
14
Rechenwerk
Datensignale Steuersignale
Steuerwerk
Zustandsbergang : berfhrung des Inhalts des Speichers (eine oder mehrere Speicherzellen) in einen neuen Inhalt durch Anwendung einer Operation.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
Zustand (der Ausfhrung, des (gedachten) Rechners): Momentaner Inhalt der Speicherzellen
Kapitel 1
1.2 Zustandsbeschreibung
! Eigenschaften einer Speicherzelle:
15
" Sie stellt einen Behlter dar, der ber eine Adresse angesprochen wird und einen Inhalt (Wert) aufnimmt. " Wir sagen: Die Zelle mit Adresse a hat den Wert w zum Inhalt.
! Beispiel:
Ausfhrende Operation: 1/pi Name: pi Addresse: 003 Wert: 3.141 Referenz von pi ist die Addresse 003. Der Wert der Referenz ist 3.141.
Kapitel 1
1.2 Zustandsbeschreibung
! Ablauf des Zugriffs ber Name:
" Lesend: Vorgabe des Namens Beschaffung der Referenz Zugriff auf den Behlter Lieferung des Wertes als Ergebnis " Schreibend: Vorgabe des Namens Beschaffung der Referenz Zugriff auf den Behlter Ersetzen des Wertes
16
! Variablen sind Namen, die lesenden und schreibenden Zugriff erlauben ! Konstanten erlauben nur Lesezugriffe ! Beachte: Der schreibende Zugriff hat einen sogenannten Seiteneffekt, d.i. eine Vernderung des Zustands (im Speicher) des Rechners
Kapitel 1
1.2 Zustandsbeschreibung
Typen ! Jede Variable oder Konstante besitzt einen Typ. ! Typsicherheit: Auf Variable oder Konstante knnen nur die dem Typ entsprechenden Operationen angewandt werden.
17
! Auffassung von Typen gem Abstrakten Datentypen: Eine Grundmenge von Werten und auf ihnen definierte Operationen. ! Somit lassen sich mit Typen manche Fehler ermitteln, bevor ein Schaden angerichtet wird: Verbesserte Korrektheit von Programmen (statische Typsicherheit).
Kapitel 1
1.2 Zustandsbeschreibung
18
Fehlt <Wert>: Vorbesetzung mit typspezifischem Java-Syntax fr Werte Variablen, Konstanten und Zuweisungen Wert, z.B. int-Variablen mit 0. Art unbenannte Konstante (Literal) Variablenvereinbarung lesender Zugriff schreibender Zugriff (Zuweisung) Variablenvereinbarung mit Vorbesetzung Vereinbarung einer benannten Konstanten mit Einmalzuweisung Syntaktische Form <Wert> <Typ> <Name>; <Name> <Name> = <Wert>; Beispiele
1, true, 'c' int a; a + 1 a = 1;
1.2 Zustandsbeschreibung
! Folge der Zugriffsfunktion: Es wird immer der (einzig verfgbare) aktuelle Wert gelesen.
Wert von a nach der Anweisung 1 2 3 3
19
int a = 1; a = a + 1; a++; a = a;
Kapitel 1
1.2 Zustandsbeschreibung
Primitive Typen (primitive types) und Operationen ! Einfache Datentypen in Java:
Grundoperationen (Auswahl) boolean ==, !=, !(not), &(and), |(inkl. or), ^(exkl. or), &&(and), ||(inkl. or)
byte, short, int, long ==, !=, <, >, <=, >=, +, -, ++ (unr), -- (unr), *, /, % (mod), << (left shift), >> (right shift) ==, !=, <, >, <=, >=, +, -, ++ (unr), -- (unr), *, /, % (mod)
20
Typ
Beschreibung
Werte: true, false strikte Auswertung faule Auswertung vorzeichenbehaftete Ganzzahlen von 8, 16, 32, 64 bit Lnge. Einschrnkungen beachten!
float, double
Gleitpunktzahlen von 32 bzw. 64 bit gem IEEE 754-1985. Einschrnkungen beachten! Einzelzeichen (16-bit Unicode)
Kapitel 1
char
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
1.2 Zustandsbeschreibung
Ausdrcke ! Zusammensetzung von Operanden und Operatoren. ! Sei F Ausdruck. Es gilt zulssig(F) in einem Zustand z, wenn
21
" das Ergebnis nach den Regeln des jeweiligen ADT existiert; " das Ergebnis arithmetischer Ausdrcke innerhalb der Genauigkeit der Rechnerarithmetik berechenbar ist; " alle Operanden in F im Zustand z einen Wert besitzen.
! Ausdrcke haben einen Ergebnistyp! ! Beachte: Auch Zuweisungen liefern Werte, nmlich das jeweilige Ergebnis der rechten Seite, Beispiel:
int i, j; i = j = 0; // i und j wird der // Wert 0 zugewiesen, // da j = 0 den Wert 0 liefert
Kapitel 1
1.2 Zustandbeschreibung
(Statischer) Typ eines Ausdrucks:
22
! Der Typ eines Ausdrucks kann zur bersetzungszeit bestimmt werden und leitet sich im wesentlichen aus den Typen der Teilausdrcke und des angewendeten Operators ab. ! Bei Zuweisungen mssen der Typ der Variablen und des Ausdrucks zusammenpassen. ! Analog bei anderen Operationen. ! Beispiel:
int a = 0; float b = 2; boolean c; c = a == b; // Typ des Ausdrucks a == b ist boolean, passt. c = a * b; // Typ des Ausdrucks a * b ist float, Fehler! c = c * c; // Fehler, da * nicht auf boolean anwendbar
Kapitel 1
1.2 Zustandsbeschreibung
23
Auswertungsreihenfolge fr Ausdrcke ! Gem Przedenz, innerhalb dieser: links vor rechts. ! Mit Klammern lsst sich die Przendenzregelung umgehen. ! Strikte Evaluation (Berechnung der Operanden vor Anwendung des Operators) auer fr &&, ||, ? (zu ? siehe spter). ! Beachte bei Reihenfolge die Seiteneffekte! Diese spielen eine Rolle, wenn Teilausdrcke zum Beispiel Zuweisungen enthalten.
Kapitel 1
1.2 Zustandsbeschreibung
Typumwandlung auf primitiven Typen ! Erforderlich, wenn gefordeter Typ eines Wertes nicht mit tatschlichem Typ bereinstimmt. ! Keine Freizgigkeit wegen Typsicherheit! ! Implizite Umwandlung bei Zuweisung a = b, wenn
Typ von b
byte short, char int long float
24
Typ von a
short, int, long, float, double int, long, float, double long, float, double float, double double
1.2 Zustandsbeschreibung
Typumwandlungen (Forts.) ! Implizite Umwandlung in Ausdrcken, um definierten Operator anzuwenden.
" Bei ++, -- auf byte, short, char wird Wert zu int.
25
wandelt evtl. unter Informationsverlust. " Einschrnkungen beachten, jedoch Wandlungen zwischen allen numerischen Typen erlaubt
Kapitel 1
1.2 Zustandsbeschreibung
Zusammengesetzte Typen oder nicht-primitive Typen ! Java behandelt alle zusammengesetzten Typen nach einem einheitlichen Mechanismus: Klassen. ! Wir betrachten zunchst nur drei Sonderflle, die in allen Programmiersprachen vorkommen. ! Wir gehen zunchst nur auf grundlegende Formen ihrer Zusammensetzung ein.
26
Kapitel 1
1.2 Zustandsbeschreibung
! Zeichenfolgen (Klasse String in Java)
" Folge von Unicode-Zeichen. Darstellung: leerer String hello normaler String hello + boys! konkatenierter String " Es gilt: hello + boys! == hello boys! liefert true
27
Kapitel 1
1.2 Zustandsbeschreibung
! Reihung (Array)
" Geordnete Menge typgleicher Variablen. " Vereinbarung: <Typ> [] <Name>. " Beispiele: int[] ai; " Die Gre wird bei Erzeugung des Arrays festgelegt, kann dann aber nicht mehr gendert werden. " Die Erzeugung kann bei oder nach der Variablendeklaration stattfinden. " Beispiel fr die Erzeugung eines int-Arrays der Gre 10: ai = new int[10]; // nach oder int[] ai = new int[10]; // bei
28
Kapitel 1
1.2 Zustandsbeschreibung
! Reihung (Array) (Forts.)
" Die Gre eines erzeugten Arrays kann mit <Array-Name>.length gelesen werden, Beispiel: ai.length == 10 // liefert (nach der // Erzeugung von oben) true " Durch die Erzeugung gibt es die Zugriffsfunktionen: ai[0], ai[1], ... , ai[ai.length-1] Beispiel Zugriffe: ai[1] = ai[3 + 1];
29
Kapitel 1
1.2 Zustandsbeschreibung
! Mehr ber Arrays:
30
" Der Typ eines Arrays kann beliebig sein (Klasse, primitiver Typ oder wiederum ein Array-Typ). " Daher sind mehr-dimensionale Arrays oder auch String-Arrays mglich: int[][] aai; // Array aus int-Arrays String[] aString; // Array speichert Strings " Auch im mehrdimensionalen Fall mssen die Arrays jeweils einzeln erzeugt werden: aai = new int[2][]; // Erzeuge Array zur // Speicherung von 2 int-Arrays aai[0] = new int[1]; // Erzeuge erstes int// Array der Laenge 1 aai[1] = new int[2]; // Erzeuge zweites Array // der Laenge 2
Kapitel 1
1.2 Zustandsbeschreibung
! Mehr ber Arrays:
" Bei der Erzeugung drfen die Array-Gren aus Ausdrcken berechnet werden: int a = b = 10; String[] aString = new String[a + b]; " Es sind auch direkte Array-Initialisierungen mglich: int[] quadrat = {1, 4, 9, 16, 25, 36, 49}; int[][] aai = { { 1, 2 }, { 3, 4 } }; " Bei nicht initialisierten Arrays werden die Elemente implizit auf Standardwerte gesetzt. Zum Beispiel 0 bei int, short, byte, float, double und false bei boolean.
31
Kapitel 1
1.2 Zustandsbeschreibung
! Verbunde (in Java ber class-Vereinbarung)
" Mengen von sogenannten Feldern, die durch einen Bezeichner identifiziert werden " Beispiel einer Klassen-Vereinbarung: public class Point { public static int x; // // public static float y,z; // // }
32
" Aufgrund der Vereinbarung fr Point existiert ein entsprechender Typ zur Deklaration von Variablen, Beispiel: Point p; // Variable p vom Typ Point wird // deklariert.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.2 Zustandsbeschreibung
! Verbunde (in Java ber class-Vereinbarung) (Forts.)
" Der Punkt . notiert den Feld-Zugriff. " Somit Funktionen zum Zugriff auf die Felder von Point: p.x, p.y, p.z. " Beispiel: Point p; int xvar; p.x = 1; xvar = p.x;
33
// // // // //
Deklariert Verbund p und Integer xvar Initialisiert Feld x in Point mit 1 Weist xvar den Wert 1 zu
" Klassen bieten noch viele weitere Mglichkeiten. Sie werden genauer in Kapitel 4 behandelt.
Kapitel 1
1.3 Ablaufsteuerung
Anweisungen ! Eine Anweisung ist eine Abstraktion von (ein hherwertiges quivalent zu) den Operationen des realen Rechners. ! Anweisung wird daher als eine Ausfhrungseinheit betrachtet. ! Da imperatives Programmieren Zustandsbergnge bestimmt: Das Ziel der Ablaufsteuerung ist die Steuerbarkeit von Schreib/Lese-Zugriffen von Variablen und Feldern anhand von vorausgehenden Zustnden. ! Eine Anweisung ist entweder
" eine einfache Anweisung mit Terminator ; Beispiel: int c = a*a + b*b; " oder ein Block, der eine Anweisungsfolge einschlielich Vereinbarung lokaler Variablen mit { und } klammert
34
Kapitel 1
1.3 Ablaufsteuerung
Gltigkeitsbereiche
! Ein Gltigkeitsbereich ist der Bereich, in dem ein (Variablen-)Name eine und dieselbe Referenz hat und somit einen Wert liefert.
" Der Gltigkeitsbereich einer Variablen beginnt nach ihrer Deklaration und endet mit dem Ende des Blocks, in dem sie deklariert wurde. " Bei Wiederverwendung des Namens in einem inneren Block gilt dort der innere Name. " Der Gltigkeitsbereich einer Variablen kann somit zur bersetzungszeit bestimmt werden.
35
! Die Gltigkeitsbereiche von Feldern einer Klasse unterscheiden sich wesentlich von denen von Variablen. Dazu mehr in Kapitel 4.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.3 Ablaufsteuerung
Hintereinanderausfhrung ! Reine Hintereinanderschreibung.
" Beispiel: Anweisungsfolge A1; A2; A3; ...
36
{ int h;
ij ij ijh
h = i;
ijh
i = j;
ijh
j = h; }
ijh ij
zustandsdefinierende Variablen
Kapitel 1
1.3 Ablaufsteuerung
Bedingte Anweisungen, Fallunterscheidungen ! Allgemeine Form:
if (<boolean-Ausdruck>) <Anweisung1> else <Anweisung2>
37
Beispiel: if (i > j) max = i; else max = j; ! else-Teil kann entfallen einseitige bedingte Anweisung Beispiel: if (i > j) { int h; h = i; i = j; j = h; } ! Bedingter Ausdruck mit Ergebnis:
" Mit dem ersten Beispiel gleichbedeutend ist
max = ( i > j ? i : j );
" ? heit bedingter Operator und hat im Gegensatz zu if ein Ergebnis. " hnlichkeit zu Haskell:
max i j = if i > j then i else j
mit Funktionsergebnis.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.3 Ablaufsteuerung
! Kaskaden von bedingten Anweisungen sind mglich.Beispiel:
38
// Berechne das Vorzeichen von a. (a weiter oben definiert) int signum; if (a > 0) signum = 1; else if (a < 0) signum = -1; else signum = 0;
! Beachte: eine geeignete Klammerung und Einrckung macht den Code besser lesbar und vermeidet Programmierfehler. Hier besser:
// Berechne das Vorzeichen von a. (a weiter oben definiert) int signum; if (a > 0) signum = 1; else if (a < 0) signum = -1; else signum = 0;
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.3 Ablaufsteuerung
Die spezielle Form der Kaskade (Ai Anweisungsfolge)
if (i == k1) A1; else if (i == k2) A2; else if (i == k3) A3; ... else A0;
39
1.3 Ablaufsteuerung
while-Schleifen ! Grundgedanke der Steuerung: Modifikation der Werte von Zustandsvariablen, bis eine Zielbedingung erfllt ist. ! Standardform: while (<boolean-Ausdruck>) <Anweisung>
Schleifenrumpf: muss das Ergebnis der Bedingung beeinflussen
40
Anmerkungen: ! while-Schleifen werden u.U. niemals durchlaufen (die Evaluierung der Bedingung <boolean-Ausdruck> vor Betreten des Schleifenrumpfes ist dann false!). ! Abbruch jedes Blocks und damit auch einer while-Schleife mglich mit break. ! Terminator von <Anweisung> ist zugleich Terminator der while-Anweisung.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.3 Ablaufsteuerung Beispiel fr eine while - S chleife: kgV(a, b, c) dreier ganzer Zahlen (als Block).
{ // a, b, c weiter oben definiert... int aRes = a, bRes = b, cRes = c; while (aRes != bRes || bRes != cRes) { if (aRes < bRes ) { aRes = aRes + a; } else if (bRes < cRes) { bRes = bRes + b; } else { cRes = cRes + c; } } // Hier gilt: aRes == bRes == cRes == kgV(a, b, c) }
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
41
Kapitel 1
1.3 Ablaufsteuerung
42
do-while- und for-Schleifen ! Mindestens einmaliger Durchlauf wird garantiert mit der dowhile-Schleife (Evaluierung der Bedingung zum Abschluss des Schleifenrumpfes!): do <Anweisung> while (<boolean-Ausdruck>); ! Bei Iteration ber einen Wertebereich wird anstelle der whileSchleife die bequemere Form der for-Schleife verwendet: for (<Initialausdruck>; <boolean-Ausdruck>; <Inkrementausdruck>)
<Anweisung>
Kapitel 1
1.3 Ablaufsteuerung
Beispiel Aufsummieren der Werte einer Reihung int[] a:
Initialisierungsausdruck (hier als Komma-Ausdruck)
int i, summe; for (i = 0, summe = 0; i < a.length; i++) { summe = summe + a[i]; }
43
Kapitel 1
1.3 Ablaufsteuerung
for- versus while-Schleifen ! Eine for-Schleife kann (im Wesentlichen) nach folgendem Muster auf eine semantisch quivalente while-Schleife abgebildet werden:
for (<Initialausdruck>; <boolean-Ausdruck>; <Inkrementausdruck>) <Anweisung>
44
wird zu:
<Initialausdruck>; while (<boolean-Ausdruck>) { <Anweisung>; <Inkrementausdruck>; }
1.3 Ablaufsteuerung
! Schleifen knnen geschachtelt sein ! Beispiel: Algorithmus zur Berechnung der reflexiven, transitiven Hlle einer Relation
{ boolean[][] a; // Adjazenzmatrix boolean[][] s; // Ergebnismatrix ... kopiere a nach s ... // nicht detailliert int i, j, k; // Reflexivitaet von s herstellen. for (i = 0; i < s.length; i++) { s[i][i] = true; } for (i = 0; i < s.length; i++) { for (j = 0; j < s.length; j++) { for (k = 0; k < s.length; k++) { // Transitivitaet: von Knoten i nach j ueber Knoten k s[i][j] = s[i][j] ? true : s[i][k] & s[k][j]; } } } // s ist jetzt die Adjazenzmatrix der reflexiven, // transitiven Huelle von a }
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
45
Kapitel 1
1.4 Methoden
Methodeklarationen ! Eine Methode ist ein benannter Anweisungsblock, dessen Inhalt durch eine Ein/Ausgabe-Schnittstelle gekapselt ist und dessen Funktionalitt evtl. an mehreren Stellen verwendet werden kann. Der Anweisungsblock heit auch Methodenrumpf. ! Eine Methode hat ein Ergebnis von einem festen Typ (der Ausgabe-Teil der Schnittstelle). ! Die Parameter der Methode reprsentieren die EingabeSchnittstelle. Es handelt sich dabei um eine feste Liste von n getypten Variablen. Sie gelten im Methodenrumpf als lokale Variablen.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
46
Kapitel 1
1.4 Methoden
Methodeklarationen (Forts.) ! Vereinbarung:
public static <Ergebnistyp> <Methodenname> (<Parametertyp 1> <Parametername 1>, ... , <Parametertyp n> <Parametername n>) { // Anweisungen hier. }
47
Methodenrumpf
! Methoden ohne Ergebnis sind auch mglich: Vereinbarungen wie zuvor, aber mit void als <Ergebnistyp>. ! In Java werden Methoden immer in Klassen definiert!
Kapitel 1
1.4 Methoden
Aufrufen von Methoden ! Ein Methodenaufruf hat die Form <Methodenname>(<Argument 1>, ,<Argument n>) ! Bei der Abarbeitung des Methodenaufrufs werden die Anweisungen im Methodenrumpf (der Methode mit dem angegebene Namen) ausgefhrt. ! <Argument 1> bis <Argument n> sind dabei Ausdrcke, die zuvor berechnet werden und deren Werte den Parametern 1 bis n der Methode zugewiesen werden. ! Da die Parameter typisiert sind, mssen die jeweiligen Ausdruckstypen zu den Parametertypen passen (gleicher Typ oder implizit konvertierbar). ! Im Methodenrumpf sind nur die dort deklarierten Variablen und die Parameter sichtbar. ! Da die Werte der Argumentausdrcke direkt an die Parameter zugewiesen werden, spricht man von Wertaufruf.
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
48
Kapitel 1
1.4 Methoden
Zurckgeben von Ergebnissen
49
! Bei Methoden mit echtem Ergebnistyp (ungleich void) ist der Methodenaufruf ein Ausdruck, dessen Typ identisch ist mit dem Ergebnistyp der Methode ! Der Rckgabewert der Methode wird im Methodenrumpf mit return <Wert>; zurckgegeben. Der Typ des Werts muss natrlich zum Ergebnistyp der Methode passen.
Kapitel 1
1.4 Methoden
Folge: Verdeckte Zuweisungen
public static <Ergebnistyp> <Methodenname> (<Parametertyp 1> <Parametername 1>, ... , <Parametertyp n> <Parametername n>) { Parametername 1 = Argument 1; ... Parametername n = Argument n; // Anweisungen hier. verdeckteErgebnisvariable = Wert; }
50
Kapitel 1
1.4 Methoden
! Beispiel 1: eine Methode, die ihren Parameterwert um 1 erhht
public class MethodenTest { // Methode erhoehe gibt int zurueck und // nimmt int als Argument auf public static int erhoehe(int x) { // Parameter x wird verwendet int y = x + 1; // Der berechnete Wert (x + 1) wird // zurueckgegeben return y; } // Eine argument- und parameterlose Methode... public static void andereMethode() { int z = 3; // erhoehe wird mit Argumentwert 3 aufgerufen int zPlusEins = erhoehe(z); // zPlusEins ist jetzt 4; } }
Informatik II SS 2003 - Prof. Dr. Peter Lockemann
51
Kapitel 1
1.4 Methoden
! Beispiel 2: kgV(a, b, c) als Methode in einer Klasse KgV:
public class KgV { public static int kgV(int a, int b, int c) { int aRes = a, bRes = b, cRes = c; while (aRes != bRes || bRes != cRes) { if (aRes < bRes ) { aRes = aRes + a; } else if (bRes < cRes) { bRes = bRes + b; } else { cRes = cRes + c; } } return aRes; } }
52
Kapitel 1
1.4 Methoden
public class RTHuelle { public static boolean[][] berechneRTHuelle(boolean[][] a) { // Ergebnismatrix boolean[][] s = new boolean[a.length][]; int i, j, k; // kopiere a nach s for (i = 0; i < a.length; i++) { s[i] = new boolean[a.length]; for (j = 0; j < a.length; j++) s[j][i] = a[j][i]; } // Reflexivitaet von s herstellen. for (i = 0; i < s.length; i++) { s[i][i] = true; } for (i = 0; i < s.length; i++) { for (j = 0; j < s.length; j++) { for (k = 0; k < s.length; k++) { s[i][j] = s[i][j] ? true : s[i][k] & s[k][j]; } } } return s; } } Informatik II SS 2003 - Prof. Dr. Peter Lockemann
53
! Beispiel 3: Algorithmus zur Berechnung der transitiven reflexiven, transitiven Hlle einer Relation als Methode in der Klasse RTHuelle:
Kapitel 1
1.5 Rekursion
Rekursion muss mit Hilfe von Methoden formuliert werden. ! Gegeben:
" Reihung int[] a = new int[n], aufsteigend sortiert. " Ganze Zahl x (Suchwert).
54
! Gesucht: Angabe, ob x in a vorkommt. ! Methode fr rekursive Lsung der Binrsuche: Suchwert sortierte Folge
public static boolean sucheRek (int x, int[] a, int u, int o) { int m = (u + o) / 2; zu durchsuchender Teil if (u > o) return false; von a (wg. Rekursion!) else if (x == a[m]) return true; else if (x < a[m]) return sucheRek(x, a, u, m-1); else return sucheRek(x, a, m + 1, o); }
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
1.5 Rekursion
! Aufruf von auen, zum Beispiel so:
boolean found = sucheRek(x, a, 0, a.length - 1);
55
! Es ist typisch fr die Rekursion in imperativen Sprachen, dass einige Parameter nach auen getragen werden mssen, die nur der Steuerung der Rekursion dienen.
" Dies sind hier die Parameter int u, int o.
! Beispiel:
public static boolean suche(int x, int[] a) { return sucheRek(x, a, 0, a.length - 1); }
Kapitel 1
56
! Java ist als Programmiersprache standardisiert und spezifiziert. ! Die Syntax ist ein wichtiger Teil der Sprachspezifikation, aber natrlich nicht der einzige. ! Als Programmierer ist es manchmal wichtig, die Grenzen einer (Programmier-)Sprache genau zu kennen und das erfordert das Lesen und Verstehen der Spezifikation. ! Die Java-Spezifikation ist erreichbar unter http://java.sun.com/docs/books/jls/
Kapitel 1
57
Es folgt ein Auszug aus der Syntaxbeschreibung (als kontextfreie Grammatik) fr (viele) Java-Konstrukte, die bisher behandelt wurden. ! Verwendung von ENBF mit folgenden nderungen aus Lesbarkeitsgrnden: A: B C ist gleichbedeutend mit der EBNF-Regel A ::= A | B ! [ A ] bedeutet A taucht kein- oder einmal auf ! { A } bedeutet A taucht kein-, ein- oder mehrmals auf ! (A | B) bedeutet entweder A oder B taucht auf ! Literale (Terminalsymbole) sind in Courier gesetzt
Kapitel 1
58
Kapitel 1
59
Kapitel 1
60
Kapitel 1
61
Kapitel 1
62
Kapitel 1
63
{ BlockStatements } BlockStatements: { BlockStatement } BlockStatement: LocalVariableDeclarationStatement [ Identifier :] Statement LocalVariableDeclarationStatement: [ final ] Type VariableDeclarators ; Statement: Block if ParExpression Statement [ else Statement ] for ( ForInitOpt ; [Expression] ; ForUpdateOpt ) Statement while ParExpression Statement do Statement while ParExpression ; return [ Expression ] ; ExpressionStatement Identifier : Statement
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1
64
Kapitel 1
65
Statement
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1