II. 3. 1. Erste Schritte mit einer Programmierumgebung Vorlesung Informatikfür 02(ET+MB+WET) www.imn.htwk-leipzig.de/˜uwe/Teaching/OOP II. Algorithmieren und Programmieren II. 3. Daten- und Kontrollstrukturen, einfache Programme II. 3. 4 Beschreibung des Programmverhaltens mittels Zusicherungen Prof. Dr. Uwe Petermann Dept. of Computer Science University of Applied Sciences Leipzig P.O.B. 300066 D-04251 Leipzig (Germany) [email protected] • Eine Programmieraufgabe wird als ein Projekt organisiert. • Zugehörige Dateien werden in einem Verzeichnis angeordnet, welches dem Projekt zugeordnet wurde. • Annahme für weitere Erläuterungen: alle Projekte befinden sich in einem Verzeichnis “APPLICATIONS”. • Projekt anlegen und bearbeiten: Emacs (oder XEmacs) aufrufen (1) in das Verzeichnis “APPLICATIONS” wechseln (2) Projektverzeichnis anlegen, z.B. “HelloWorld” (3) in das Projektverzeichnis wechseln (4) Bearbeiten der Programmdatei(en) im Zyklus Editieren — Übersetzen — falls syntaktisch korrekt: Testen March 24, 2004 U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 1 OO Programmierung, 02(ET+MB+WET) II. 3. Daten- und Kontrollstrukturen, einfache Programme U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 3 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 1. Erste Schritte . . . (1) Erste Schritte mit einer Programmierumgebung • Neues Verzeichnis anlegen (z.B. für ein neues Projekt ) (2) einfache Datentypen (1) XEmacs: Menues auswählen: File — Open File im folgenden Menue: Name angeben (ohne “/” am Ende!). Verzeichnis wird angelegt, falls es nicht schon existiert. (3) Kontrollstrukturen (4) Einfache Programme (2) Emacs: Menues auswählen: File — Open Directory im folgenden Menue: Name angeben (ohne “/” am Ende!). Verzeichnis wird angelegt, falls es nicht schon existiert. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 2 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 4 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 1. Erste Schritte . . . • Anlegen neuer Dateien in einem Projekt (in der Regel jede Klasse in eigener Datei) (1) XEmacs und Emacs: Menues auswählen: File — Open File (2) im folgenden Menue: Name angeben. Datei wird erzeugt, falls sie nicht schon existiert. (3) Wichtig: beide Editoren erkennen an der Datei-Endung den Typ und passen ihr Verhalten an. Deshalb vor dem Schreiben die Datei anlegen. Bei .java-Dateien kann der “Speedbar” benutzt werden. Browser, welcher Quelldateien und deren Bestandteile (Klassen, Methoden, Variablen ... anzeigt und die Navigation im Quelltext unterstützt. noch zu II. 3. 1. • Ein (selbständig ausführbares) Java-Programm hat zumindest eine Klasse. Diese enthält eine Methode public static void main(String[]); • Klassen bilden relativ unabhängige und idealerweise wiederverwendbare Programmeinheiten, die Teilaufgaben lösen. • Klassen können auch separat in den von einer virtuellen Maschine für Java ausführbaren Byte–Code übersetzt werden. • Mehrere Klassen können zu einem Paket zusammengefaßt werden. • Häufig benutzt man Pakete der Java-Bibliothek. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 5 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 1. 7 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 1. • Einfachstes Beispiel: “Hello World” /** Hauptklasse des "Hello-World-Beispiels" */ public class HelloWorld { /** Constructor. Wird hier nicht gebraucht. */ public HelloWorld () { } /** Hauptmethode der Klasse. Eine Klassenmethode. * Argument beim Aufruf zu uebergeben (hier unnoetig). */ public static void main(String[] args) { System.out.print("Hello World"); } } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 6 OO Programmierung, 02(ET+MB+WET) • Eine Klasse ist bestimmt durch – ihren Namen – Datenfelder (auch lokale Variablen genannt) und – Methoden. • Während der Programmausführung werden Objekte (Inkarnationen) von Klassen erzeugt. Dazu werden besondere Methoden, die KonstruktorMethoden benutzt. Beispiel: Integer x = new Integer("1024"); Integer(String) ist ein Konstruktor der Klasse Integer U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 8 OO Programmierung, 02(ET+MB+WET) • Datenfelder und Methoden können – ausschließlich klassenabhängig und damit objektunabhängig oder – objektabhängig sein. Erstere sind am Schlüsselwort static erkennbar. Beispiele: – Variable static int MAX_VALUE und Methode static int parseInt(String) aus Klasse Integer des Pakets java.lang sowie – Methode int intValue() aus Klasse Integer des Pakets java.lang U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 9 OO Programmierung, 02(ET+MB+WET) II. 3. 2. Einfache Datentypen DarstellungsDatentyp größe n = 2k byte 8-bit short 16-bit int 32-bit long 64-bit float 32-bit double 64-bit char boolean 16-bit true, false Wertebereich k Beschreibung 3 4 5 6 Zweierkomplement Zweierkomplement Zweierkomplement Zweierkomplement IEEE754 Gleitkommazahl einfache Genauigkeit IEEE754 Gleitkommazahl doppelte Genauigkeit Unicode-Zeichen Wahrheitswert U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 11 −27 bis 27 − 1 −215 bis 215 − 1 −231 bis 231 − 1 −263 bis 263 − 1 −3.4 ∗ 1038 bis 3.4 ∗ 1038 −1.7 ∗ 10308 bis 1.7 ∗ 10308 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen Datentyp beschreibt einen Wertebereich für Variablen mit den zugehörigen Operationen, Konstanten und Relationen vordefinierte Datentypen: z.B. int, boolean, float, char, String und deren abgeleitete Feldtypen (z.B. int[]) Endlichkeit des Speichers bewirkt, daß in der Mathematik betrachtete algebraische Struktur, z.B. Zahlbereich der ganzen Zahlen, sich von endlicher Modellierung in Datentyp int unterscheidet. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. noch zu II. 3. 2. Einfache Datentypen 10 OO Programmierung, 02(ET+MB+WET) Darstellung ganzer Zahlen im Rechner: im Positionssystem zur Basis b nach folgender Formel: z = zn−2bn−2 + . . . + z1b1 + z0b0 (1) Dabei gilt 0 ≤ zi < b für alle i mit 0 ≤ i ≤ n. Übliche Werte : b = 2, n = 2k mit k = 3, 4, 5, 6. Bei Darstellung negativer ganzer Zahlen wird dem Zweierkomplement 2n−1 − z eine 1 vorangestellt. Bei Darstellung nichtnegativer ganzer Zahlen wird der Binärdarstellung eine 0 vorangestellt. Vorteil: für Addition und Subtraktion kann der gleiche Algorithmus verwendet werden. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 12 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen noch zu II. 3. 2. Einfache Datentypen Darstellung ganzer Zahlen im Rechner: Eigenschaften: Für x, y ∈ Z mit minint ≤ x, y ≤ maxint gilt: x ⊕ y ≡ x + y (mod 2n) x ⊙ y ≡ x · y (mod 2n) x ⊖ y ≡ x − y (mod 2n) (2) (3) (4) Also gilt zum Beispiel: maxint ⊕ 1 = minint, minint ⊖ 1 = maxint für minint = −2n−1 und maxint = 2n−1 − 1. (IZ, ⊕, ⊙, ⊖, 0, 1) ist ein kommutativer Ring. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 13 OO Programmierung, 02(ET+MB+WET) Darstellung von Gleitkommazahlen im Rechner: Wert = (−1)v ∗ (1 + m) ∗ 2e−k wobei gilt: für float: k = 127 Bit 31 Bits 30 - 23 Bits 22 - 0 Vorzeichen Exponent Mantisse v e m 0 oder 1 0 bis 254 0 bis 1 − 2−23 für double: k = 1023 Bit 63 Bits 62 - 52 Bits 51 - 0 Vorzeichen Exponent Mantisse v e m U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 15 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen noch zu II. 3. 2. Einfache Datentypen noch: Darstellung ganzer Zahlen im Rechner: Eigenschaften Gleitkommaoperationen im Rechner: 1 0 7 1 ∗ −2 0 ∗ 26 Wert = -89 1 0 7 1 ∗ −2 0 ∗ 26 Wert = -128 0 1 7 0 ∗ −2 1 ∗ 26 Wert = 127 1 0 0 1 1 1 5 4 3 2 1 1 ∗ 2 0 ∗ 2 0 ∗ 2 1 ∗ 2 1 ∗ 2 1 ∗ 20 0 0 0 0 0 0 5 4 3 2 1 0 ∗ 2 0 ∗ 2 0 ∗ 2 0 ∗ 2 0 ∗ 2 0 ∗ 20 1 1 1 1 1 1 5 4 3 2 1 1 ∗ 2 1 ∗ 2 1 ∗ 2 1 ∗ 2 1 ∗ 2 1 ∗ 20 • Kommutativität der Addition und Multiplikation: ∀x, y ∈ Real : x ⊕ y = y ⊕ x ∀x, y ∈ Real : x ⊗ y = y ⊗ x • Symmetrie der Operationen bezüglich der 0: ∀x, y ∈ Real : x ⊖ y = x ⊕ (−y) = −(y ⊖ x) ∀x, y ∈ Real : (−x) ⊗ y = x ⊗ (−y) = −(x ⊗ y) ∀x, y ∈ Real : (−x) ⊘ y = x ⊘ (−y) = −(x ⊘ y) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 14 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 16 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen zu Eigenschaften Gleitkommaoperationen im Rechner: • Monotonie ∀x, y, a, b ∈ Real : 0 ≤ x ≤ y∧0 ≤ a ≤ b ⇒ x⊕a ≤ y⊕b ∀x, y, a, b ∈ Real : 0 ≤ x ≤ y∧0 ≤ a ≤ b ⇒ x⊗a ≤ y⊗b ∀x, y, a, b ∈ Real : 0 ≤ x ≤ y∧0 ≤ a ≤ b ⇒ x⊖b ≤ y⊖a ∀x, y, a, b ∈ Real : 0 ≤ x ≤ y∧0 < a ≤ b ⇒ x⊘b ≤ y⊘a U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 17 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen zu Eigenschaften Gleitkommaoperationen im Rechner: • Rechnen mit Gleitkommazahlen — Spezialgebiet Numerik • Probleme durch Endlichkeit der Darstellung: z.B. bei Zusammentreffen großer und kleiner Summanden kann zum “Verschwinden” der kleinen Summanden führen U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 18 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen Java / C++ Pascal unäre Operationen: -, ! unäre Operationen: -, not Multiplikationsoperationen: Multiplikationsoperationen: *, /, mod, div, and *, /, %, /, && Additionsoperationen: Additionsoperationen: +, -, or +, -, || Vergleichsprädikate: <, <=, >, >=, ==, != U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. Vergleichsprädikate: <, <=, >, >=, =, <> 19 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen Feldtypen beschreiben eine Folge von Daten gleichen Typs Beispiele für Feldtypen: z.B. int[], float[], String[] Vereinbarung und Initialisierung: durch explizite Aufzählung der Feldelemente: int[] x = {1,3,4}; durch Angabe der Feldlänge: int[] x = new int[laenge]; U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 20 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 2. Einfache Datentypen Zugriff auf einzelne Feldelemente: Der in Klammern angegebene Wert muß eine nichtnegative ganze Zahl sein. lesend: int y = x[1]; schreibend: x[1] = 23; mehrdimensionale Felder: float[][] matrix = new float[2][3]; matrix[1][2] = 3; matrix[2][1] = 4; U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 21 OO Programmierung, 02(ET+MB+WET) II. 3. 3. Einfache Programmstrukturen noch zu II. 3. 3. Einfache Programmstrukturen • Variablenvereinbarungen – Variablen müssen vor ihrer Benutzung nach einem der folgenden Muster vereinbart werden: TypBezeichner VariablenName(n); TypBezeichner VariablenName(n) = InitialWert; – Beispiele: int i; Integer iobj = new Integer("1023"); float x = 1.209; U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 23 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 3. Einfache Programmstrukturen • Wertzuweisungen, Einfache Programmstrukturen sind • Variablenvereinbarungen und • einfache Anweisungen: – Wertzuweisungen, – Ein-/Ausgabeanweisungen, – Bedingte und Verzweigungsanweisungen, – Wertzuweisungen haben die folgende Form: Variable = Ausdruck; – Beispiele: iobj = new Integer("1023"); x = 1.209 / 2.4; x = (1.209 / 2.4); – Die Form der linken Seite kann auch komplexer sein. Dazu später. – Schleifenanweisungen U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 22 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 24 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 3. Einfache Programmstrukturen • Eingabeanweisungen (Eingabe von der Tastatur) Gepuffertes Leses einer Zeichenkette über Methode readLine() eines Objekts d der Klasse BufferedReader unter Benutzung eines Eingabestromlesers (InputStreamReader) mittels Standardeingabe (Variable in der Klasse System) noch zu II. 3. 3. Einfache Programmstrukturen • Eingabeanweisungen (Eingabe von der Tastatur) Gepuffertes Leses einer ganzen Zahl über Methode readLine() eines Objekts d der Klasse BufferedReader wie im vorhergehenden Beispiel. Wert der eingelesenen Zahl wird aus der Zeichenkette mittels Methode intValue der Klasse Integer erzeugt. import java.io.*; ... throws IOException{ ... BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); ... String s1 = d.readLine(); } } import java.io.*; ... throws IOException{ ... BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); ... int s1 = (new Integer(d.readLine())).intValue(); } } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 25 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen • Programmbeispiel zu Variablenvereinbarungen, Wertzuweisungen, Ein-/Ausgabe von Zeichenketten: “ReadString” import java.io.*; public class ReadString { /** Hauptmethode der Klasse. Eine Klassenmethode. */ public static void main(String args[]) throws IOException{ BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); System.out.print("\nDas erste Wort bitte!\n"); String s1 = d.readLine(); System.out.print("\nDas zweite Wort bitte!\n"); String s2 = d.readLine(); System.out.print("\nSie sagten: " + s1 + " " + s2 + "\n"); } } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 26 OO Programmierung, 02(ET+MB+WET) 27 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen import java.io.*; /** Hauptklasse des "ReadData-Beispiels" */ public class ReadData { * Argument beim Aufruf zu uebergeben (hier unnoetig). */ public static void main(String args[]) throws IOException{ BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); System.out.print("\nDie erste Zahl bitte!\n"); int s1 = (new Integer(d.readLine())).intValue(); System.out.print("\nDie zweite Zahl bitte!\n"); int s2 = (new Integer(d.readLine())).intValue(); int s = s1 + s2; System.out.print("\nIhre Summe ist: " + s + "\n"); } } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 28 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen Verzweigung : if (Bedingung) // der WENN-Zweig Anweisung else // der SONST-Zweig Anweisung + ? ? H HH H BedingungH H HH HH Anweisung1 noch zu II. 3. 3. Einfache Programmstrukturen • anfangsgeprüfte Schleifenanweisung: ? HH HH H HHBedingung HH H − ? Anweisung2 ? while (Bedingung) // Koerper // der Schleifen// anweisung Anweisung − + ? Anweisung ? bedingte Anweisung : if (Bedingung) // der WENN-Zweig Anweisung + ? ? H HH H BedingungH H HH HH − Anweisung ? • endgeprüfte Schleifenanweisung: do ? // Koerper // der Schleifen// anweisung Anweisung while (Bedingung); Anweisungsfolge + ? H HH H H H HBedingung H HH − ? U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 29 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen Beispiel: Verzweigung und bedingte Anweisung if (r != 0) { // der WENN-Zweig System.out.print(\"Ergebnis=" + m/r + "\n"); } else{ // der SONST-Zweig System.out.print ("Division durch 0 nicht definiert!!!\n"); } if (r != 0) { // der WENN-Zweig System.out.print(\"Ergebnis=" + m/r + "\n"); } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 30 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 31 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen Schleifenanweisung Beispiel: Berechnung des größten gemeinsamen Teilers (GGT) der positiven ganzen Zahlen x und y Der Algorithmus: // Vor: x>0, y>0, x und y ganze Zahlen n = x; m = y; r = n % m; while (r != 0) { // Inv: ggT(x,y)=ggT(n,m)=ggT(r,m), r>=0 n=m; m=r; r= n % m; } // Nach: ggT(x,y)=m U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 32 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen Hintergrund zum GGT positiver ganzer Zahlen x und y zu II. 3. 3. Einfache Programmstrukturen Algorithmus 2: GGT positiver ganzer Zahlen x und y (1) Der größte gemeinsame Teiler (GGT) der positiven ganzen Zahlen x und y ist die größte Zahl z, die sowohl x als auch y teilt, d.h. für die es Zahlen n und m gibt mit x = n ∗ z und y = m ∗ z (2) Zunächst gilt: ggT (x, x) = x (3) Wenn 0 < y < x, dann gilt: ggT (x, y) = ggT (y, x − y) und x + y > y + (x − y) (4) Wenn 0 < y < x und außerdem r der Rest der Division von x durch y ist, so gilt auch: ggT (x, y) = ggT (y, r) und x + y > y + r (5) Die Fakten 3 und 4 ergeben mit 2 die Grundlage für 2 Verfahren zur Berechnung des GGT. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 33 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen Algorithmus 1: GGT positiver ganzer Zahlen x und y (1) Wenn x = y, dann ist x der GGT von x und y. (2) Andernfalls: Wenn 0 < y < x, dann überschreibe x mit x − y und setze mit (2) fort. Wenn 0 < x < y, dann überschreibe y mit y − x und setze mit (2) fort. (1) Belege die Variablen n, m und r mit den Werten x, y und x%y (2) Wenn r = 0, dann ist m der GGT von x und y. (3) Andernfalls: überschreibe n mit m, überschreibe m mit r , überschreibe r mit n%m und setze mit 2 fort. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 35 OO Programmierung, 02(ET+MB+WET) import java.io.*; // bildet in m den GGT der positiven ganzen Zahlen x und y class GGTmod { public static void main(String[] args) throws java.io.IOException { int r, n, m, x, y; BufferedReader d = new BufferedReader(new InputStreamReader(System.in)); System.out.print("GGT mittels ganzahliger Division\n x="); x = (new Integer(d.readLine())).intValue(); System.out.print(" y="); y = (new Integer(d.readLine())).intValue(); // Vor: x>=0, y>=0 .... Algorithmus .... // Nach: ggT(x,y)=m System.out.print("ggT(x,y)=" + m + "\n"); } } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 34 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 36 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen • Verkettung von Anweisungen Man kann eine Folge von Anweisungen Anweisung1 Anweisung2 ... Anweisung mittels Klammerung zu einer Anweisung zusammenfassen: { Anweisung1 Anweisung2 ... Anweisung } noch zu II. 3. 3. Einfache Programmstrukturen • Mehrfachverzweigungen (else-if-Anweisungen) if ( Bedingung ) Anweisung else if ( Bedingung ) Anweisung ..... Beispiele: if (x<0) { u = -x; v = -y; } else { u = x; v = y; } do { z = z + y; u = u - 1; } while (u != 0); U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 37 OO Programmierung, 02(ET+MB+WET) zu II. 3. 3. Einfache Programmstrukturen • Verschachtelte if-Anweisungen Wie ist die folgende Anweisung zu verstehen: if (true) if (false) System.out.print("x"); else System.out.print("y"); Varianten 1 if (true) if (false) System.out.print("x"); else System.out.print("y"); Variante 2 if (true) if (false) System.out.print("x"); else System.out.print("y"); Antwort: Der Compiler interpretiert gemäß Variante 1. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 38 OO Programmierung, 02(ET+MB+WET) else if ( Bedingung ) Anweisung else Anweisung U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 39 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 3. Einfache Programmstrukturen • Beispiel zu Mehrfachverzweigungen (else-if-Anweisungen) if (command.equals("Cut")) { // perform cut operation cut(); } else if (command.equals("Copy")) { // perform copy operation copy(); } else if (command.equals("Paste")) { // perform paste operation paste(); } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 40 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 3. Einfache Programmstrukturen • Mehrfachverzweigungen (switch-Anweisungen) switch ( Ausdruck ) { case konstanter_Ausdruck : Anweisungsfolge II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen (1) Vor- und Nachbedingungen (2) Zusammentreffen von Nach- und Vorbedingung bei Anweisungsfolgen (3) Wertzuweisung ..... (4) Verzweigung und bedingte Anweisung case konstanter_Ausdruck : Anweisungsfolge default : Anweisungsfolge } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 41 OO Programmierung, 02(ET+MB+WET) noch zu II. 3. 3. Einfache Programmstrukturen • Beispiel zu Mehrfachverzweigungen (switch-Anweisungen) switch (a[i]) { case ’y’ : ys = ys+1; break; case ’x’ : xs = xs+1; break; default : sonst = sonst+1; } U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 42 OO Programmierung, 02(ET+MB+WET) (5) Nachweis der Termination (6) anfangs- und endgeprüfte Schleife U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 43 OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu (1) Vor- und Nachbedingungen Das Verhalten eines Programms P kann durch Vor- und Nachbedingungen V or und N ach beschrieben werden. Definition: Beispiel: P ist korrekt bezüglich Vorbedingung V or und Nachbedingung N ach gdw. Für alle Eingaben für P , die V or erfüllen, gilt: P terminiert und das Ergebnis erfüllt N ach. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 44 // Vor: 0<=x z = 0; u = x; do { z = z + y; u = u - 1; } while (u != 0); // Nach: z=x*y OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen – Beispiel 1 zur Wertzuweisung: vorher: zu (2) Anweisungsfolgen P Q (erst P ausführen, dann Q) Bedingungen Beispielbelegung Beispiel: Wenn P korrekt bezüglich V orP und N achP und Q korrekt bezüglich V orQ und N achQ und (N achP ) → (V orQ) gilt dann ist die Verkettung P Q korrekt bezüglich V orP und N achQ U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 45 /* z+(u-1)*y=x*y 0 <= u-1 */ u = u - 1; /* z+u*y=x*y 0 <= u */ OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu (3) Wertzuweisung z+u∗y =x∗y /* z+u*y=x*y, 0 < u */ z = z + y; /* z+(u-1)*y=x*y, 0 < u */ z + y + (u − 1) ∗ y = x ∗ y Wertzuweisung: z = z+y nachher: Bedingungen Beispielbelegung Variable x y z u Wert 5 4 12 3 z + (u − 1) ∗ y = x ∗ y U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 47 OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen – Beispiel 2 zur Wertzuweisung: vorher: z = w Beispiele: Wenn die Bedingung V or aus der Bedingung N ach entsteht, indem alle Vorkommen von z in N ach durch w ersetzt werden, dann ist die Wertzuweisung z = w korrekt bezüglich Vorbedingung V or und Nachbedingung N ach U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. Variable x y z u Wert 5 4 8 3 ist äquivalent zu 46 /* Beispiel 1: z+u*y=x*y */ z = z + y; /* z+(u-1)*y=x*y */ Bedingungen Beispielbelegung z +( u−1 )∗y =x∗y Variable x y z u Wert 5 4 12 3 Wertzuweisung: u = u−1 nachher: /* Beispiel 2: 0 <= u-1 */ u = u - 1; /* 0 <= u */ OO Programmierung, 02(ET+MB+WET) Bedingungen z + u ∗y =x∗y U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 48 Beispielbelegung Variable x y z u Wert 5 4 12 2 OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu (4) Regel für die Verzweigung : zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu 5: Nachweis der Termination Wenn Anweisung1 korrekt bzgl. (V or) ∧ (Bedingung) und N ach Problem bei allen Konstrukten, die Wiederholungen (Iterationen) von Anweisungen beschreiben: Beispiel: // Vor: x<0 or x>0 if (x<0) { u = -x; v = -y; } else { u = x; v = y; } // Nach: u*v=x*y und Anweisung2 korrekt bzgl. (V or) ∧ ¬(Bedingung) und N ach dann ist die Anweisung if (Bedingung) Anweisung1 else Anweisung2 Wird irgendwann die Abbruchbedingung erfüllt? Idee: Man definiere ein Maß für die Größe der verbleibenden Aufgabe. Dies kann z.B. eine natürliche Zahl sein. Nachzuweisen ist dann: (a) Bei jeder Iteration verringert sich diese Größe. (b) Die Größe kann sich nicht unendlich oft verringern. korrekt bzgl. V or und N ach. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 49 OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen Regel für die bedingte Anweisung : U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 51 zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen zu (6) anfangsgeprüfte Schleife Wenn (V or)→(Inv) gilt und Wenn Anweisung korrekt bzgl. (V or) ∧ (Bedingung) und N ach Beispiel: und es gilt ((V or) ∧ ¬(Bedingung))→(N ach) dann ist die Anweisung if (Bedingung) Anweisung // Vor: u=x and v=y if (x<0) { u = -x; v = -y; } // Nach: 0<=u // and u*v=x*y OO Programmierung, 02(ET+MB+WET) Beispiel: Anweisung korrekt bzgl. (Inv) ∧ (Bedingung) und Inv ist // Vor: z=0, u=x, 0<=u while (u != 0) // Inv: z+u*y=x*y, 0<=u // GM: u { z = z + y; u = u - 1; } // Nach: z=x*y sowie ((Inv) ∧ ¬(Bedingung))→(N ach) gilt und GM geeignetes Größenmaß ist, dann ist while (Bedingung) Anweisung korrekt bzgl. V or und N ach. korrekt bzgl. V or und N ach. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 50 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 52 OO Programmierung, 02(ET+MB+WET) zu II. 3. 4. Beschreibung des Programmverhaltens mittels Zusicherungen endgeprüfte Schleife Wenn Anweisung korrekt bzgl. V or und Inv ist und Anweisung korrekt bzgl. (Inv) ∧ (Bedingung) und Inv ist Beispiel: // Vor: z=0, u=x, 0<u do { z = z + y; u = u - 1; } // Inv: z+u*y=x*y, 0<=u // GM: u while (u != 0) // Nach: z=x*y sowie ((Inv) ∧ ¬(Bedingung))→(N ach) gilt und GM geeignetes Größenmaß ist, dann ist do Anweisung while (Bedingung) References [1] J. Goll, C. Weiß, and P. Rothländer. Java als erste Programmiersprache. B. G. Teubner, Stuttgart, Leipzig, 2000. [2] C. Horn and I. O. Kerner, editors. Lehr- und Übungsbuch Informatik, volume 1. Grundlagen und Überblick. Fachbuchverlag Leipzig, 1995. [3] M. Kofler. Linux: Installation, Konfiguration, Anwendung. Addison-Wesley (Deutschland), 2 edition, 1996. [4] S. Middendorf, R. Singer, and S. Strobel. Java, Programmierhandbuch und Referenz. dpunkt, 2 edition, 1999. [5] Nusser. Sicherheit im Internet. xyz, 1998. [6] U. Petermann. Vorlesungsskript Informatik. Technical report, HTWK Leipzig, 2000. korrekt bzgl. V or und N ach. U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 53 OO Programmierung, 02(ET+MB+WET) Zum Nachlesen • Einführung in die Programmierung: [4] umfassendes Buch für objektorientierte Porgrammierung in Java mit vielen instruktiven Beispielen. [1] Informatikeinführung mit Java als erster Programmiersprache. • Einstieg zum Betriebssystem Linux (sehr hilfreich, übertragbar auf andere UNIX-Versionen und in den umfangreichen Ausführungen zu freier Software auch auf weitere Betriebssysteme): [3] u.a. Kapitel 3 und 11 • Grundlagen zum Betriebssystem: [2] Kapitel 3 • außerdem: [6] Kapitel 1 www.imn.htwk-leipzig.de/˜uwe/Teaching/OOP U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 54 OO Programmierung, 02(ET+MB+WET) U. Petermann, Leipzig University of Applied Sciences, C.S. Dept. 55 OO Programmierung, 02(ET+MB+WET)