Sie sind auf Seite 1von 65

Informatik II Sommersemester 2003

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

bersicht Informatik II: Systemverstndnis

Innensicht

Auensicht

Institut fr Programmstrukturen und Datenorganisation (IPD)

Prof. Dr. Peter Lockemann

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

Objektorientiertes Programmieren (Java)


! ! ! ! OO-Klassen Objekt und Zustnde Methoden und Vererbung in Java Java: Einfhrung aller restlicher OO-Sprachkonstrukte
Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Auensicht Skalierbarkeit und Persistenz


! Mengenorientierung ! Assoziativer Zugriff, Schlsselbegriff ! Aufwnde ! Polymorphie ! Schema ! Deskr. Sprachen (SQL)

Prozesse
! ! ! ! Prozesse Prozesskommunikation Parallelitt/Synchronisation Java: Thread-Programmierung

Autonome Dienste
! Enge/lose Kopplung ! Protokolle / Automaten ! Verteilung

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

Informatik II SS 2003

Kapitel 1 Imperatives Programmieren


1.1 Funktionales und imperatives Programmieren 1.2 Zustandsbeschreibung 1.3 Ablaufsteuerung 1.4 Methoden 1.5 Rekursion 1.6 Die Java-Spezifikation

Institut fr Programmstrukturen und Datenorganisation (IPD)

Prof. Dr. Peter Lockemann

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

Objektorientiertes Programmieren (Java)


! ! ! ! OO-Klassen Objekt und Zustnde Methoden und Vererbung in Java Java: Einfhrung aller restlicher OO-Sprachkonstrukte
Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Objektorientierung
! Objekte, Zustnde, Methoden ! Entwurf mittels UML ! Vererbung

Kapitel 1

1.1 Funktionales und imperatives Programmieren


Ein Rckblick auf das funktionale Programmieren ! Operationale Semantik einer funktionalen Sprache
Programm Funktionale Sprache Ausfhrung gedachter (virtueller) Rechner zur unmittelbaren Verarbeitung des Programms Ergebnis

! Verarbeitungsprinzip: Substitution ! Zustzliche Verarbeitungsregeln in Haskell:


" Vorrangregelung fr Operatoren " Faule Auswertung " Erste anwendbare Funktionsdefinition

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.1 Funktionales und imperatives Programmieren


Haskell-Beispiel
f :: Float -> Float f x = klammer * log(klammer) where klammer = (2.0 * x + 1.0)

Ausfhrung durch schrittweise Substitution:


f 4.5 = klammer * log(klammer) where klammer = (2.0 * x + 1.0) [4.5/x] = klammer * log(klammer) where klammer = (2.0 * 4.5 + 1.0) = klammer * log(klammer) [10.0/klammer] = 10.0 * 1.0 = 10.0

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.1 Funktionales und imperatives Programmieren


Operationelle Semantik realer Rechner
Eingabewerk Speicher Ausgabewerk

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

1.1 Funktionales und imperatives Programmieren


Verarbeitung einer funktionalen Sprache auf einer realen Maschine
Programm Funktionale Sprache bersetzung bersetztes Programm Ausfhrung Ergebnis

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

1.1 Funktionales und imperatives Programmieren


Verarbeitung einer imperativen Hochsprache auf einer realen Maschine
Programm Funktionale Sprache bersetzung bersetztes Programm Hochsprache Ausfhrung Ergebnis

12

gedachter Rechner zur Verarbeitung des bersetzten Programms

Programm Imperative Hochsprache

bersetzung

bersetztes Programm

Ausfhrung

Ergebnis

Sprache? gedachter oder realer Rechner zur unmittelbaren Verarbeitung des bersetzten Programms
Kapitel 1

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

1.1 Funktionales und imperatives Programmieren


bersetzung von Java-Programmen
Java Programm Imperative Sprache (Java) Java bersetzer bersetztes Programm Ausfhrung

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

1.1 Funktionales und imperatives Programmieren


Abstraktion vom konkreten Rechnermodell
Eingabewerk Speicher Ausgabewerk

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.

! Abstraktion fr den Programmierer: Die Adresse interessiert nicht.


" Verwendung einer die Zelle identifizierenden Zugriffsfunktion: Name. " Ergebnis der Berechnung der Adresse ber die Zugriffsfunktion: Referenz.

! 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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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).

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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;

<Typ> <Name> = <Wert>; int a = 1; final <Typ> <Name> = <Wert>;


final float pi = 3.14159;

<Wert> kann ein zu berechnender Ausdruck sein


Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 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;

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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.

! Achte auf Unterschied zwischen fauler und strikter Auswertung:


" zulssig ((x != 0) && (1-x)/x > 1)), " aber: nicht zulssig ((x != 0) & (1-x)/x > 1)) fr x==0

! 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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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.

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Genauigkeitsverluste mglich! Genauigkeitsverluste mglich!

Also: Zulssig, wenn Wertebereich nicht verkleinert wird (Widening)


Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1

1.2 Zustandsbeschreibung
Typumwandlungen (Forts.) ! Implizite Umwandlung in Ausdrcken, um definierten Operator anzuwenden.
" Bei ++, -- auf byte, short, char wird Wert zu int.

25

! Explizite Umwandlung (Casting).


" Voranstellen des Zieltyps, z.B.
long a = 35; int b = (int) a;

wandelt evtl. unter Informationsverlust. " Einschrnkungen beachten, jedoch Wandlungen zwischen allen numerischen Typen erlaubt

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

// Schreibt Array-Element 1 // und liest Array Element 4

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Feld x wird deklariert. Felder y und z werden deklariert.

" 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.

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

! Beispiel fr geschachtelte Blcke mit Gltigkeitsbereichen:


{ int a = int b = { int c } c++; // } 2 * 2; 3 * 3; = a + b; Fehler c gltig hier b gltig hier a gltig hier

! 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

! Anweisungsfolgen fhren einen Anfangszustand z0 in einen Endzustand ze ber.


" Beispiel: Vertauschungsblock

{ int h;
ij ij ijh

h = i;
ijh

i = j;
ijh

j = h; }
ijh ij

zustandsdefinierende Variablen

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

kann bersichtlicher als switch-Anweisung geschrieben werden


// i muss vom Typ byte, short, int oder char sein switch (i) { case k1: A1; break; // ki muessen Literale case k2: A2; break; // vom Typ byte, short, int, char sein, case k3: A3; break; // und i muss vom entsprechenden Typ sein. ... default: A0; }
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1

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>

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Fortschaltung Schleifenrumpf Bedingung fr Betreten und Wiederholen des Rumpfes

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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>; }

! hnliches gilt fr do-while-Schleifen


Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1

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

Signatur oder Methodenkopf

Methodenrumpf

! Methoden ohne Ergebnis sind auch mglich: Vereinbarungen wie zuvor, aber mit void als <Ergebnistyp>. ! In Java werden Methoden immer in Klassen definiert!

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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.

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

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.

! Daher bliche Lsung:


" Die rekursive Prozedur wird versteckt. " Fr die Sicht von auen wird die Prozedur vereinfacht.

! Beispiel:
public static boolean suche(int x, int[] a) { return sucheRek(x, a, 0, a.length - 1); }

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation

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/

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation

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

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation


Literal: IntegerLiteral FloatingPointLiteral CharacterLiteral StringLiteral BooleanLiteral NullLiteral Expression: Expression1 [AssignmentOperator Expression1] AssignmentOperator: = += -= *= /= &= |= ^= %=
Informatik II SS 2003 - Prof. Dr. Peter Lockemann

58

Kapitel 1

1.6 Die Java - S pezifikation


Type: Identifier { .Identifier } BracketsOpt BasicType StatementExpression: Expression ConstantExpression: Expression Expression1: Expression2 [ Expression1Rest ] Expression1Rest: [ ? Expression : Expression1 ] Expression2: Expression3 [ Expression2Rest ] Expression2Rest: { Infixop Expression3 }

59

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation


Infixop: || && | ^ & == != < > <= >= + * / %

60

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation


Expression3: PrefixOp Expression3 ( Expr | Type ) Expression3 Primary { Selector } { PostfixOp } Primary: ( Expression ) Literal PrefixOp: ++ -! ~ + PostfixOp: ++ -Informatik II SS 2003 - Prof. Dr. Peter Lockemann

61

Kapitel 1

1.6 Die Java - S pezifikation


BasicType: byte short char int long float double boolean

62

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation


Block:

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

1.6 Die Java - S pezifikation


VariableDeclarators: VariableDeclarator { , VariableDeclarator } ConstantDeclaratorsRest: ConstantDeclaratorRest { , ConstantDeclarator } VariableDeclarator: Identifier VariableDeclaratorRest ConstantDeclarator: Identifier ConstantDeclaratorRest VariableDeclaratorRest: BracketsOpt [ = VariableInitializer ] ConstantDeclaratorRest: BracketsOpt = VariableInitializer BracketsOpt: { [] }

64

Informatik II SS 2003 - Prof. Dr. Peter Lockemann

Kapitel 1

1.6 Die Java - S pezifikation


Syntaxgraphen sind anschaulicher als Syntaxdiagramme, z.B. if ParExpression Statement [ else Statement]
ifStatement if ( else Expression Statement ) Statement

65

for ( ForInitOpt ; [Expression] ; ForUpdateOpt ) Statement


forStatement for ( init ; Expression ; Update )

Statement
Informatik II SS 2003 - Prof. Dr. Peter Lockemann Kapitel 1