Vom Algorithmus zum Programm

Ähnliche Dokumente
4 Vom Algorithmus zum Programm

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Modellierung und Programmierung 1

Entwurf von Algorithmen - Kontrollstrukturen

1. Einführung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Einführung in die Programmierung WS 2014/ Algorithmus, Berechenbarkeit und Programmiersprachen 2-1

VBA-Programmierung: Zusammenfassung

Softwaretechnik. Wesentliche Inhalte der Vorlesung

1 Vom Problem zum Programm

Kapitel 3. Mein erstes C-Programm

Entwicklung eines korrekten Übersetzers

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Softwareentwicklung Allgemeines und prozedurale Konstrukte

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Programmieren Formulierung eines Algorithmus in einer Programmiersprache

Programmierkurs Python I

Übungen zu C++ Kapitel 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 1. Einführung und Grundbegriffe

2 Grundlagen der Programmierung

Kapitel 5: Applikative Programmierung

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Programmieren in Haskell Einführung

Grundlagen Programmierung

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

Erste Schritte in Java

SOI Die Schweizer Informatikolympiade

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grammatiken. Einführung

Mathematik-Dossier. Die lineare Funktion

Diskrete Strukturen und Logik WiSe 2007/08 in Trier. Henning Fernau Universität Trier

Ausarbeitung des Interpreter Referats

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Programmiertechnik II

Theoretische Informatik

Minimalismen in der. Informatik

Programmiersprachen im. Informatikunterricht

Semantik von Programmiersprachen

I. Aussagenlogik. Aussagenlogik untersucht Verknüpfungen wie "und", "oder", "nicht", "wenn... dann" zwischen atomaren und komplexen Sätzen.

Programmiersprachen und Programmierkonzepte

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Grundlagen der Programmiersprache C++

Kontrollstrukturen - Universität Köln

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Schritt 1. Schritt 1. Schritt 3. - Analysieren des Problems und Spezifizierung einer Lösung.

Objektorientierte Programmierung

Spezifikation der zulässigen Parameter. Bemerkungen: Bemerkungen: (2) Design by Contract:

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

Coma I. Einleitung. Computer und Algorithmen. Programmiersprachen. Algorithmen versus Programmiersprachen. Literaturhinweise

EINI WiMa/LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Einleitung und Begriffliches. Einleitung. Programmiersprachen. Software-Komplexität ist inhärent und hat vor allem folgende Ursachen

Objektorientiertes Programmieren für Ingenieure

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

Teil 2 - Softwaretechnik. Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 2. Übersicht. Softwaretechnik

Excel Funktionen durch eigene Funktionen erweitern.

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Einführung in die Informatik I

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen Definition, Eigenschaften, Entwurf Darstellung von Algorithmen Beispiele.

Funktionale Programmierung (in Clojure)

Erwin Grüner

SWP Prüfungsvorbereitung

Motivation. Inhalt. URI-Schemata (1) URI-Schemata (2)

Kap. 4.2: Binäre Suchbäume

1 Vom Problem zum Programm

Grundlagen der Programmierung - Algorithmen

Funktionen in PHP 1/7

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

Zum Einsatz von Operatoren im Informatikunterricht

Microsoft Excel 2007 Basis

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Sortierverfahren für Felder (Listen)

Kapitel 11: Wiederholung und Zusammenfassung

Formale Methoden: Ein Überblick

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Vererbung & Schnittstellen in C#

Programmieren ++ Begleitende Übungen zu Veranstaltungen + Umsetzen des Algorithmus in ein lauffähiges Programm

Kapitel 3 Das Projekt Bankkonto Seite 1

1. Entwicklung der Datenverarbeitung

Klassendefinitionen verstehen

Einführung in die Informatik Grammars & Parsers

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

1. Grundlegende Konzepte der Informatik

4. Übungsblatt zu Mathematik für Informatiker I, WS 2003/04

Wie entsteht ein Computerprogramm?

Programmieren für Fortgeschrittene

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Sin-Funktion vgl. Cos-Funktion

Einstieg in die Informatik mit Java

Vorübung 1 Beschriften Sie die Tabelle wie in der Abbildung dargestellt.

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

Vgl. Oestereich Kap 2.7 Seiten

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Einführung in PROLOG. Christian Stocker

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Transkript:

Vom Algorithmus zum Programm Menschen und Maschinen Spezifikation Maschinenorientierte Präzisierung Präzisierung von Daten- und Anweisungskonstruktoren Programm und Programmiersprache Syntax und Semantik

Menschen und Maschinen Ziel: Einsatz einer Maschine statt eines Menschen für den Verteilungsalgorithmus Unterschiede Mensch - (ideale) Maschine sehr schnell und vor allem unermüdlich absolut zuverlässig. Handlung beim millionsten Male genauso exakt wie beim ersten Male. unbedingt gehorsam; tun genau das, was man ihnen befiehlt; tun nichts, was man ihnen nicht befiehlt; führen jede Handlung ohne Verständnis aus

Menschen und Maschinen Ziel: Einsatz einer Maschine statt eines Menschen für den Verteilungsalgorithmus Unterschiede Mensch - (ideale) Maschine jedes Detail sehr schnell und vor allem unermüdlich vollständig und ganz exakt beschreiben; absolut zuverlässig. Handlung beim jede millionsten Situation Male genauso exakt wie beim ersten berücksichtigen Male. unbedingt gehorsam; tun genau das, was man ihnen befiehlt; tun nichts, was man ihnen nicht befiehlt; führen jede Handlung ohne Verständnis aus

Defizite des Verteilungsalgorithmus Exaktheit unseres Verteilungsalgorithmus: Was ist in Anweisung 1. und 2. eine "gut sichtbare Stelle"? Was bedeutet Anweisung 3.1 "Leere den Briefkasten", wenn keine Zettel abgegeben wurden, Briefkasten also schon leer ist? Was bedeutet Anweisung 3.2 "Schreibe auf jeden Zettel eine Zahl...", wenn der Briefkasten leer war, und daher in 3.2 gar keine Zettel da sind, auf die man etwas schreiben kann? viele weitere Defizite

technische Probleme Eine Maschine wird nicht... Briefkasten aufhängen Eintrittskarten verkaufen

technische Probleme Eine Maschine wird nicht... Briefkasten aufhängen Eintrittskarten verkaufen Menschen gelingt es kraft Vernunft, fehlende Information zu ergänzen und problematische Situationen und Anweisungen vernünftig zu bewältigen Maschinen derzeit nicht

Folgerungen Maschine wird nicht alle Tätigkeiten beim Verteilungsverfahren übernehmen, die vorher der Mensch erledigt hat Automatisierungsversuch scheitert auf jeden Fall an der unpräzisen Darstellung unseres Verteilungsalgorithmus

Spezifikation des Problems Spezifikation = exakte Definition, was der Computer leisten soll Formalisierung später hier nur umgangssprachlich

Spezifikation des Problems Kleincomputer C mit Tastatur und Bildschirm nach jeder Briefkastenleerung drückt M Taste "E" (Eingabe) und tippt die auf den Zetteln eingetragenen/angekreuzten Daten getrennt durch Druck auf Eingabetaste und Leertaste ein C codiert Eingaben und bildet Codenummer (Anw. 3.2.1-3.2.3) alle Zettel einer Leerung eingetippt? M drückt Taste "F" (fertig) C sortiert die Zahlen und mischt sie mit früher eingegebenen Werten zusammen letzte Leerung und alle Zettel eingetippt? M drückt fortlaufend Taste "A" (Abrufen); C zeigt jedes Mal eine Zahl in der vorgeschriebenen Reihenfolge auf dem Bildschirm; M ruft die letzten drei Ziffern dieser Zahl, also die Ordnungsnummer, aus.

Spezifikation des Problems Kleincomputer C mit Tastatur und Bildschirm nach jeder Briefkastenleerung drückt M Taste "E" (Eingabe) und tippt die auf den Zetteln eingetragenen/angekreuzten Daten getrennt durch Aufgabe: Druck auf Transformiere Eingabetaste und Leertaste ein C codiert Eingaben diese Aufgaben und bildet Codenummer nun in eine(anw. 3.2.1-3.2.3) Darstellung, die C auch alle Zettel einer Leerung eingetippt? M drückt Taste "F" (fertig) versteht C sortiert die Zahlen und mischt sie mit früher eingegebenen Werten zusammen letzte Leerung und alle Zettel eingetippt? M drückt fortlaufend Taste "A" (Abrufen); C zeigt jedes Mal eine Zahl in der vorgeschriebenen Reihenfolge auf dem Bildschirm; M ruft die letzten drei Ziffern dieser Zahl, also die Ordnungsnummer, aus.

Präzisierung der Objekte Zu präzisieren: Zahlen, Zettelstapel, Texte Zahlen sind schon präzise z.b.: 771036, 971007, 920126 Zettelstapel als Zahlenfolgen z.b.: [771036, 971007, 920126]

Präzisierung der Objekte Zu präzisieren: Zahlen, Zettelstapel, Texte Zahlen sind schon präzise z.b.: 771036, 971007, 920126 oberster Zettel Zettelstapel als Zahlenfolgen z.b.: [771036, 971007, 920126]

Präzisierung der Objekte Zu präzisieren: Zahlen, Zettelstapel, Texte Zahlen sind schon präzise z.b.: 771036, 971007, 920126 unterster Zettel Zettelstapel als Zahlenfolgen z.b.: [771036, 971007, 920126]

Präzisierung der Objekte Zu präzisieren: Zahlen, Zettelstapel, Texte Zahlen sind schon präzise kein Zettelstapel =leere Zahlenfolge z.b.: 771036, 971007, 920126 [ ] Zettelstapel als Zahlenfolgen z.b.: [771036, 971007, 920126]

Präzisierung der Objekte Zu präzisieren: Zahlen, Zettelstapel, Texte Zahlen sind schon präzise Texte in... : z.b.: 771036, 971007, 920126 Zettelstapel als Zahlenfolgen z.b.: [771036, 971007, 920126] z.b.: "Kommen Sie von auswärts?"

Präzisierung der Elementaranweisungen Zu präzisieren: Daten merken, identifizieren, nachschauen identifizieren eindeutige Namen (Bezeichner) vergeben merken Zuweisung: z.b.: fertig [771036, 971007, 920126] frage "Kommen Sie von auswärts?". z 1 leerung [ ]

Präzisierung der Elementaranweisungen Zu präzisieren: Daten einlesen von Tastatur, anzeigen auf Bildschirm einlesen (Eingabe) lies(...) z.b.: lies(leerung) anzeigen (Ausgabe) zeige(...) z.b.: zeige(fertig)

Präzisierung der Elementaranweisungen Zu präzisieren: bei Zahlen Daten und einlesen Texten von schließt Tastatur, anzeigen auf Bildschirm die Eingabe ab einlesen (Eingabe) lies(...) z.b.: lies(leerung) anzeigen (Ausgabe) zeige(...) z.b.: zeige(fertig)

Präzisierung der Elementaranweisungen Zu präzisieren: Daten Bei einlesen Eingabe von einer Tastatur, anzeigen auf Bildschirm Zahlenfolge ein weiteres Mal am Schluß der Eingabe einlesen (Eingabe) lies(...) z.b.: lies(leerung) anzeigen (Ausgabe) zeige(...) z.b.: zeige(fertig)

Präzisierung der Elementaranweisungen Zu präzisieren: 2Daten 7 einlesen 3 von 4 Tastatur, 6 1 anzeigen auf Bildschirm einlesen (Eingabe) lies(...) z.b.: lies(leerung) anzeigen (Ausgabe) zeige(...) z.b.: zeige(fertig) [27,3,461]

Präzisierung der Objektbeschreibung Motivation Identifizierung von Namen Bezeichnet leerung eine Zahlenfolge, eine einzelne Zahl oder einen Text? Davon hängt Ausführung der Anweisung lies(...) ab => Drücken der -Taste beendet Eingabe insgesamt oder nur die Eingabe einer Zahl einer Zahlenfolge

Typen und Deklarationen 1 Lösung: Ergänze Typen "Zahl" "Zahlenfolge" "Text" Ergänze Vereinbarungen/Deklarationen: def fertig, leerung: Zahlenfolge def z: Zahl def frage: Text

Typen und Deklarationen 1 Lösung: Ergänze Typen "Zahl" "Zahlenfolge" "Text" fertig und leerung in Zukunft nur Zahlenfolgen; z nur eine Zahl; frage nur ein Text Ergänze Vereinbarungen/Deklarationen: def fertig, leerung: Zahlenfolge def z: Zahl def frage: Text

Typen und Deklarationen - Definitionen Definition Ein Bezeichner ist eine Zeichenfolge, die zur eindeutigen Identifizierung eines Objekts dient. Definition Die Zuweisung ist eine Anweisung, durch die ein Bezeichner einen (neuen) Wert erhält. Definition Eine Deklaration/Vereinbarung ist die Festlegung, welche Bedeutung ein Bezeichner im Algorithmus besitzen soll, d.h., welche Typen von Objekten mit dem Bezeichner benannt werden dürfen.

Präzisierung von Operationen auf Objekten wir können noch nicht auf Objekten operieren daher: bei Zahlen: +, -, *, / bei Zahlenfolgen: sort(f), misch(f,g)

Operationen - Beispiele Addition zweier Zahlen a und b: def a,b,c: Zahl; a 3; b 6; c a + b; zeige(c). 3.3 Sortiere die Zettel aufsteigend nach diesen Zahlen zu einem Stapel, die kleinste Zahl nach oben: leerung sort(leerung) 3.4 Mische diesen Stapel und den Stapel, der aus den Zetteln besteht, die du bei früheren Briefkastenleerungen geholt hast, zusammen: fertig misch(fertig,leerung)

weitere Operationen auf Folgen erstes(f): erste Zahl der Folge f Beispiel: erstes([771036, 971007, 920126]) liefert 771036. rest(f): Folge f ohne das erste Folgenelement Beispiel: rest([771036, 971007, 920126]) ist [971007, 920126]. Speziell: rest([771036]) ist die leere Folge [ ]. Anwendung: 5.1 Rufe die Ordnungsnummer des obersten Zettels aus; 5.2 Lege den Zettel beiseite wird zu zeige(erstes(fertig)); fertig rest(fertig)

Konkatenation von Folgen Konkatenation von Folgen = Verbinden zweier Zettelstapel: Beispiele: [3, 27, 5] [8, 1] = [3, 27, 5, 8, 1]. f [ ] = [ ] f = f

Bedingungen Bedingungsoperatoren: =, (bei allen Typen), <, >,, (bei Zahlen) z.b.: a=1, 3=4, [1,2] [2,3], f=[ ], "ja" antwort, erstes(f) 3 Verknüpfung von Bedingungen B und B': und: B und B' dann und nur dann wahr, wenn sowohl B als auch B' wahr ist oder: B oder B' dann und nur dann wahr, wenn entweder B oder B' oder beide wahr sind nicht: nicht B dann und nur dann wahr, wenn B nicht wahr sind

Bedingungen - Beispiele a=1 und erstes(f) 3. wahr, wenn sowohl Bezeichner a für Zahl 1 als auch erstes Folgenelement von f kleiner oder gleich 3 [1,2] f oder "ja" antwort. erfüllt, wenn entweder die Folge f verschieden von Folge [1,2] oder antwort nicht für den Text "ja" steht oder beides

Bedingungen - Beispiele (a=2 und b=3) oder f=[1,2]. erfüllt, wenn sowohl a für 1 als auch b für 3 steht, oder wenn f gleich [1,2], falls eine der ersten beiden Bedingungen nicht zutrifft aus einfachen Bedingungen mittels und und oder und Klammerbildung beliebig komplizierte Bedingungen formulieren. Prioritätenregelung: Klammern vor nicht vor und vor oder

Konstruktoren Konkatenation: wie bisher ; Alternative "Wenn... dann... sonst...": wenn Bedingung dann... sonst... ende. Iteration: Solange... tue folgendes...": solange Bedingung tue... ende Schlüsselwörter wenn, tue, ende,... unterstreichen

Konstruktoren - Beispiele Summe 1+2+3+...+10: def i,s: Zahl; i 1; s 0; solange i 10 tue s s + i; i i + 1 ende; zeige(s).

Konstruktoren - Beispiele Im Verteilungsalgorithmus: 5. Solange noch Eintrittskarten vorhanden sind, tue folgendes: 5.1 Rufe die Ordnungsnummer des obersten Zettels aus; 5.2 Lege den Zettel beiseite; 5.3 Verkaufe an die Gruppe mit dieser Ordnungsnummer die gewünschte Zahl an Eintrittskarten wird jetzt: solange taste = "A" und fertig [ ] tue zeige(erstes(fertig)); fertig rest(fertig); lies(taste) ende. Hierbei: def taste: Text.

Konstruktoren - Beispiele Im Verteilungsalgorithmus: 3.2.2 Wenn auf die Frage "Kommen Sie von auswärts?" "ja" angekreuzt ist, dann ist die nächste Ziffer eine Null, sonst ist die nächste Ziffer eine Eins wird jetzt: wenn antwort = "ja" dann ziffer 0 sonst ziffer 1 ende

Vollständiger Verteilungsalgorithmus def ziffer, z, kinderzahl, ordnungsnr: Zahl; def fertig, leerung: Zahlenfolge; def antwort, taste: Text; fertig [ ]; lies(taste); solange taste = "E" tue leerung [ ]; solange taste "F" tue lies(kinderzahl); lies(antwort); wenn antwort = "ja" dann ziffer 0 sonst ziffer 1 ende; lies(ordnungsnr); z (100 - kinderzahl) * 10000 + ziffer * 1000 + ordnungsnr; leerung leerung [ z ]; lies(taste) ende; leerung sort(leerung); fertig misch(fertig,leerung); lies(taste) ende; solange taste ="A" und fertig [ ] tue zeige(erstes(fertig)); fertig rest(fertig); lies(taste) ende.

Schachtelung von Schleifen solange taste = "E" tue leerung [ ]; solange taste "F" tue lies(kinderzahl); lies(antwort); wenn antwort = "ja" dann ziffer 0 sonst ziffer 1 ende; lies(ordnungsnr); z (100 - kinderzahl) * 10000 + ziffer * 1000 + ordnungsnr; leerung leerung [ z ]; lies(taste) ende; leerung sort(leerung); fertig misch(fertig,leerung); lies(taste) ende; innere Schleife äußere Schleife

Schachtelungsdiagramm (mengenorientiert)

Schachtelungsdiagramm (mengenorientiert)

Präzisierung der Abstraktion Definition Die Zusammenfassung von Deklarationen und Anweisungen zu einer Einheit bezeichnet man als Prozedur. Liefert eine Prozedur einen Wert, so nennt man sie Funktion oder Funktionsprozedur. Jede beliebige Prozedur oder Funktion kann als elementare Anweisung oder elementarer Ausdruck (durch Aufruf) in jedem anderen Algorithmus verwendet werden.

Umsetzung beim Verteilungsalgorithmus Zwei Zettelstapel S1 und S2 mischst du... zu S3...: def s1,s2,s3: Zahlenfolge M1. Solange auf beiden Stapeln S1 und S2 noch Zettel liegen, tue folgendes:... : solange s1 [ ] und s2 [ ] tue... ende. M1.1 Nimm von den beiden obersten Zetteln von S1 und S2 den mit der kleineren Codenummer weg: wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende

Umsetzung beim Verteilungsalgorithmus M2. Wenn einer der Stapel S1 oder S2 leer ist, dann hänge den anderen komplett hinten an den Stapel S3 an: s3 s3 s1 s2

Umsetzung beim Verteilungsalgorithmus M2. Wenn einer der Stapel S1 oder S2 leer ist, dann hänge den anderen komplett hinten an den Stapel S3 an: s3 s3 s1 s2 Prüfen Sie zur Übung nach, daß diese Zuweisung M2 korrekt beschreibt

Umsetzung beim Verteilungsalgorithmus M2. Wenn einer der Stapel S1 oder S2 leer ist, dann hänge den anderen komplett hinten an den Stapel S3 an: s3 s3 s1 s2 Mischen insgesamt: def s1, s2 s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2

Umsetzung beim Verteilungsalgorithmus Mangel 1 def s1, s2 s3: Zahlenfolge; Bezug zwischen solange s1 [ ] und s2 [ ] tueaufruf von Mischen und wenn erstes(s1) < erstes(s2) dann dieser Beschreibung s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2

Umsetzung beim Verteilungsalgorithmus funktion misch; def s1, s2 s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

Umsetzung beim Verteilungsalgorithmus funktion misch; def s1, s2 s3: Zahlenfolge; Mangel 2 solange s1 [ ] und s2 [ ] tuebezug der Zahlenfolgen wenn erstes(s1) < erstes(s2) dann fertig und leerung zu s3 s3 [ erstes(s1) ]; s1 und s2 s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

Umsetzung beim Verteilungsalgorithmus funktion misch (s1,s2: Zahlenfolge); def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

Umsetzung beim Verteilungsalgorithmus s1, s2 sind formale Parameter funktion misch (s1,s2: Zahlenfolge); def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

Umsetzung beim Verteilungsalgorithmus s1, s2 sind formale Parameter funktion misch (s1,s2: Zahlenfolge); def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue fertig und leerung im wenn erstes(s1) < erstes(s2) dann Aufruf misch(fertig,leerung) s3 s3 [ erstes(s1) ]; sind aktuelle Parameter s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

formale und aktuelle Parameter Definition: Als Parameter bezeichnet man variable oder austauschbare Objekte in einer Prozedur oder Funktion. Die in einer Prozedur oder Funktion benutzten und im Kopf der Prozedur anzugebenden Parameter heißen formale Parameter; sie sind Platzhalter für später einzusetzende Objekte. Die im Aufruf einer Prozedur oder Funktion stehenden Argumente nennt man aktuelle Parameter.

Umsetzung beim Verteilungsalgorithmus funktion misch (s1,s2: Zahlenfolge); def s3: Zahlenfolge; Mangel 3 solange s1 [ ] und s2 [ ] tue Bezug zwischen Ergebnis wenn erstes(s1) < erstes(s2) dann des Mischens s3 s3 s3 [ erstes(s1) ]; und Aufruf s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2 funkende

Umsetzung beim Verteilungsalgorithmus funktion misch (s1,s2: Zahlenfolge); def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2; ergebnis s3 funkende s3 ist das Ergebnis und tritt an die Stelle des Aufrufs misch(fertig,leerung)

der Typ des Ergebnisses von misch, also Zahlenfolge, wird hier festgehalten Umsetzung beim Verteilungsalgorithmus funktion misch (s1,s2: Zahlenfolge) Zahlenfolge; def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2; ergebnis s3 funkende s3 ist das Ergebnis und tritt an die Stelle des Aufrufs misch(fertig,leerung)

Umsetzung beim Verteilungsalgorithmus funktion misch (s1,s2: Zahlenfolge) Zahlenfolge; def s3: Zahlenfolge; solange s1 [ ] und s2 [ ] tue wenn erstes(s1) < erstes(s2) dann s3 s3 [ erstes(s1) ]; s1 rest(s1) sonst s3 s3 [ erstes(s2) ]; s2 rest(s2) ende ende; s3 s3 s1 s2; ergebnis s3 funkende

Prozesse beim Aufruf

Prozesse beim Aufruf fertig misch(fertig,leerung)

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms.

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung.

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung. 3. Parameter passend (Typ, Anzahl)?

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung. 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung. 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung. 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis

Prozesse beim Aufruf fertig misch(fertig,leerung) 1. unterbreche Ausführung des Programms. 2. wo ist misch? Suche Beschreibung. 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus fertig misch(fertig,leerung) 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung Suche Beschreibung des Programms. besser: aufsuchen 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. (fertig,leerung) 2. wo ist misch? zahlenfolge zahlenfolge (s1,s2) 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? s1 fertig 3. Parameter passend (Typ, Anzahl)? s2 leerung 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus fertig s3 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozesse beim Aufruf 1. unterbreche Ausführung des Programms. 2. wo ist misch? 3. Parameter passend (Typ, Anzahl)? 4. identifiziere aktuelle und formale Parameter 5. führe Anweisungen der Funktion aus 6. zum Schluß ersetze Aufruf durch den Wert hinter ergebnis 7. setze Programm an der unterbrochenen Stelle fort

Prozedurkonzept jede als Algorithmus formulierte Vorschrift kann zu Elementaranweisung in anderem Algorithmus werden Zerlegung und Strukturierung umfangreicher Algorithmen: Zerlegung des Problems in bis zu 10 Teilschritte je Teilschritt eine Prozedur/Funktion ggf. weitere Zerlegung schrittweise Verfeinerung bis kleine überschaubare Einheiten vorliegen

Prozedurschachtelung Definition: Eine Prozedur ist in einer anderen geschachtelt, wenn sie in ihr deklariert oder aufgerufen wird. Im ersten Fall spricht man von statischer, im zweiten Fall von dynamischer Schachtelung bzw. Abstützen einer Prozedur auf eine andere.

prozedur p1(...)... funktion p11(...)... prozedur p111(...)...... prozende; funktion p112(...)...... funkende;... funkende; prozedur p12(...)... funktion p121(...)...... funkende; prozedur p122(...)...... prozende;... prozende prozende; prozedur p2(...)... prozedur p21(...)... prozedur p211(...)...... prozende; prozedur p212(...)...... prozende;... prozende prozedur p22(...)... funktion p221(...)...... funkende; funktion p222(...)...... funkende;... prozende prozende...

prozedur p1(...)... funktion p11(...)... prozedur p111(...)...... prozende; funktion p112(...)...... funkende;... funkende; prozedur p12(...)... funktion p121(...)...... funkende; prozedur p122(...)...... prozende;... prozende prozende; prozedur p2(...)... prozedur p21(...)... prozedur p211(...)...... prozende; prozedur p212(...)...... prozende;... prozende prozedur p22(...)... funktion p221(...)...... funkende; funktion p222(...)...... funkende;... prozende prozende... Schachtelungsbaum

prozedur p1(...)... funktion p11(...)... prozedur p111(...)...... prozende; funktion p112(...)...... funkende;... funkende; prozedur p12(...)... funktion p121(...)...... funkende; prozedur p122(...)...... prozende;... prozende prozende; prozedur p2(...)... prozedur p21(...)... prozedur p211(...)...... prozende; prozedur p212(...)...... prozende;... prozende prozedur p22(...)... funktion p221(...)...... funkende; funktion p222(...)...... funkende;... prozende prozende... Schachtelungsbaum hierarchische Modularisierung

Programm und Programmiersprache Verteilungsproblem nun vollständig gelöst automatisierbare Elemente bestimmt dargestellt in einer Form, daß C sie ausführen kann solche Darstellungen heißen Programm Sprachen mit geeigneten Darstellungselementen und erforderlicher Präzision: Programmiersprachen die hier erfundene Sprache heißt PRO

Programm und Programmiersprache Definition: Eine Sprache zur Formulierung von Algorithmen, die von einem Computer ausgeführt werden können, bezeichnet man als Programmiersprache. Die Formulierung eines Algorithmus in einer Programmiersprache nennt man Programm.

Algorithmus und Programm Algorithmus relativ allgemein beschrieben an keine besonderen formellen Vorschriften gebunden Programm im exakt definierten Formalismus einer Programmiersprache verfaßt ein Algorithmus ist eine Abstraktion aller Programme, die ihn formal beschreiben

Welt der Programmiersprachen

Welt der Programmiersprachen

Welt der Programmiersprachen deklarativ: Problem beschreiben prozedural: Lösungsweg zum Problem beschreiben

Welt der Programmiersprachen deklarativ: Problem beschreiben funktional: Problem durch funktionale Zusammenhänge beschreiben prädikativ: Problem durch Fakten und logische Beziehungen beschreiben prozedural: Lösungsweg zum Problem beschreiben

Welt der Programmiersprachen deklarativ: Problem beschreiben funktional: Problem durch funktionale Zusammenhänge beschreiben prädikativ: Problem durch Fakten und logische Beziehungen beschreiben prozedural: Lösungsweg zum Problem beschreiben imperativ: Lösungsweg durch Anweisungen beschreiben

Welt der Programmiersprachen deklarativ: Problem beschreiben ML, MIRANDA, Gofer, Haskell funktional: Problem durch funktionale Zusammenhänge beschreiben prädikativ: Problem durch Fakten und logische Beziehungen beschreiben prozedural: Lösungsweg zum Problem beschreiben imperativ: Lösungsweg durch Anweisungen beschreiben

Welt der Programmiersprachen deklarativ: Problem beschreiben ML, MIRANDA, Gofer, Haskell funktional: Problem durch funktionale Zusammenhänge beschreiben prädikativ: Problem durch Prolog, Gödel, Fakten CLP und logische Beziehungen beschreiben prozedural: Lösungsweg zum Problem beschreiben imperativ: Lösungsweg durch Anweisungen beschreiben

Welt der Programmiersprachen deklarativ: Problem beschreiben funktional: Problem durch funktionale Zusammenhänge beschreiben prädikativ: Problem durch Prolog, Gödel, Fakten CLP und logische Beziehungen beschreiben prozedural: Lösungsweg zum Problem beschreiben ML, MIRANDA, Gofer, Haskell PRO, ADA, ALGOL, BASIC, C, EIFFEL, FORTRAN, MODULA, OBERON, PASCAL imperativ: Lösungsweg durch Anweisungen beschreiben

Syntax und Semantik

Syntax und Semantik Programmiersprachen immer präzise und eindeutige Syntax und Semantik

Syntax und Semantik Programmiersprachen immer präzise und eindeutige Syntax und Semantik Syntax: sprachliche Notierung von Programmen

Syntax und Semantik Programmiersprachen immer präzise und eindeutige Syntax und Semantik Syntax: sprachliche Notierung von Programmen Semantik: Bedeutung syntaktisch korrekter Programme

Syntax und Semantik welche Zeichenreihen sind syntaktisch korrekte eindeutige Syntax und Semantik Programme? Syntax: sprachliche Notierung von Programmen Programmiersprachen immer präzise und Semantik: Bedeutung syntaktisch korrekter Programme

Syntax und Semantik welche Zeichenreihen sind syntaktisch korrekte eindeutige Syntax und Semantik Programme? Syntax: sprachliche Notierung von Programmen welche Wirkung Semantik: Bedeutung hat syntaktisch ein syntaktisch korrekter Programme korrektes Programm auf dem Rechner? Programmiersprachen immer präzise und

Semantikansätze Semantik operationale Semantik: Art und Weise, wie ein Rechner es ausführt axiomatische Semantik: Eigenschaften, die die (Ein-/Ausgabe-)Variablen vorher und nachher erfüllen denotationale Semantik: Funktion, die das Programm berechnet

Syntax und Semantik Beispiel 1

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s).

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s). syntaktisch korrekt

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s). syntaktisch korrekt Semantik (ugs.): : "Lies eine beliebige Zahl ein und gib die Zahl 0 aus".

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s). syntaktisch korrekt Semantik (ugs.): : "Lies eine beliebige Zahl ein und gib die Zahl 0 aus". Semantik denotational: fp: Z Z mit fp(s)=0 für alle s Z.

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s). syntaktisch korrekt Semantik (ugs.): : "Lies eine beliebige Zahl ein und gib die Zahl 0 aus". Semantik denotational: fp: Z Z mit fp(s)=0 für alle s Z. Programm mit gleicher Semantik: zeige(0)

Syntax und Semantik Beispiel 1 Programm P def s: Zahl; lies(s); s 0; zeige(s). syntaktisch korrekt Semantik (ugs.): : "Lies eine beliebige Zahl ein und gib die Zahl 0 aus". Semantik denotational: fp: Z Z mit fp(s)=0 für alle s Z. Programm mit gleicher Semantik: zeige(0) Programme können semantisch äquivalent sein.

Syntax und Semantik Beispiel 2

Syntax und Semantik Beispiel 2 Programm P' def i,s: Zahl; lies(n); i 1; s 0; solange i n tue s s + i; i i + 1 zeige(s)

Syntax und Semantik Beispiel 2 Programm P' n nicht def i,s: Zahl; deklariert lies(n); i 1; s 0; solange i n tue s s + i; i i + 1 zeige(s)

Syntax und Semantik Beispiel 2 Programm P' n nicht def i,s: Zahl; deklariert lies(n); i 1; s 0; solange i n tue s s ende + i; fehlt i i + 1 zeige(s)

Syntax und Semantik Beispiel 2 Programm P' n nicht def i,s: Zahl; deklariert lies(n); i 1; s 0; solange i n tue s s ende + i; fehlt i i + 1 zeige(s) syntaktisch nicht korrekt

Syntax und Semantik Beispiel 2 Programm P def i,n,s: Zahl; lies(n); i 1; s 0; solange i n tue s s + i; i i + 1 ende; zeige(s)

Syntax und Semantik Beispiel 2 Programm P def i,n,s: Zahl; lies(n); i 1; s 0; solange i n tue s s + i; i i + 1 ende; zeige(s) Semantik ugs: "Falls der eingegebene Wert n kleiner oder gleich 0 ist, so gib die Zahl 0 aus. Falls n größer als 0 ist, so gib die Summe der ersten n Zahlen 1+2+3+...+n aus".

Syntax und Semantik Beispiel 2 Programm P def i,n,s: Zahl; lies(n); i 1; s 0; solange i n tue s s + i; i i + 1 ende; zeige(s) Semantik ugs: "Falls der eingegebene Wert n kleiner oder gleich 0 ist, so gib die Zahl 0 aus. Falls n größer als 0 ist, so gib die Summe der ersten n Zahlen 1+2+3+...+n aus". Semantik denotational: fp": Z Z mit n { Σ i, falls n 1, fp"(n)= i=1 0, sonst.

Korrektheit und Komplexität Korrektheit: exakt beweisen, daß das Programm die Spezifikation erfüllt, also stets und in jeder Hinsicht das Gewünschte leistet,... Komplexität:... und die Zeitvorgaben einhält in der Regel: sehr hoher Aufwand bei Korrektheit ( nicht berechenbar) mittelgroßer Aufwand bei Komplexität Beispiel: Mischen

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* n Werte Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* aufsteigend Funktionaler Zusammenhang: sortiert Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: m Werte Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: aufsteigend Für s1=[x1,...,xn] mit x1 x2... xn sortiert und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2. n+m Werte

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] aufsteigend mit x1 x2... xn und s2= [y1,...,ym] mit sortiert y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn es sind und die gleichen s2= [y1,...,ym] mit y1 y2... ym Werte ist s3=[z1,...,zn+m] wie in s1 und mit s2 z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Spezifikation Spezifikation: präzise Beschreibung der Anforderung an das Programm (funktionale) Spezifikation Mischen (halbformal): Eingabe: s1,s2 IN0* Ausgabe: s3 IN0* Funktionaler Zusammenhang: Für s1=[x1,...,xn] mit x1 x2... xn und s2= [y1,...,ym] mit y1 y2... ym ist s3=[z1,...,zn+m] mit z1 z2... zn+m und s3 ist eine Permutation von s1 s2.

Mischen - Beweis Korrektheit Behauptung: misch terminiert nach höchstens n+m Schleifendurchläufen und erfüllt die Spezifikation. Beweis: (vollständige Induktion über n+m) Induktionsanfang: Zeige, daß Behauptung für n+m=0 gilt. Beweis des Induktionsanfangs: Bei Eingabe von s1=[ ] und s2=[ ] werden im Programm durchlaufen: s3 [ ]; s3 s3 s1 s2; ergebnis s3 Zum Schluß wie gewünscht: s3=[ ]. Folglich ist der Induktionsanfang bewiesen.

Mischen - Beweis Korrektheit Induktionsvoraussetzung: Sei Behauptung wahr bis zur Zahl n+m. Induktionsbehauptung: Behauptung gilt dann auch für n+m+1. Beweis der Induktionsbehauptung: Ist s1=[ ] oder s2= [ ], so folgt Behauptung durch Nachvollziehen des Programms: s3 [ ]; s3 s3 s1 s2; ergebnis s3.

Mischen - Beweis Korrektheit Sei also s1 [ ] s2. O.B.d.A. erstes(s1)<erstes(s2). Dann ist erstes(s1)=min{x1,...,xn,y1,...,ym} und in der Schleife wird s3 s3 [erstes(s1)]; s1 rest(s1) ausgeführt. Zu Beginn des zweiten Schleifendurchlaufs gilt also s3=[erstes(s1)] und s1=[x2,...,xn].

Mischen - Beweis Korrektheit Sei also s1 [ ] s2. O.B.d.A. erstes(s1)<erstes(s2). Dann ist erstes(s1)=min{x1,...,xn,y1,...,ym} und in der Schleife wird s3 s3 [erstes(s1)]; s1 rest(s1) ausgeführt. Zu Beginn des zweiten Schleifendurchlaufs gilt also s3=[erstes(s1)] und s1=[x2,...,xn]. ohne Beschränkung der Allgemeinheit

Mischen - Beweis Korrektheit Sei also s1 [ ] s2. O.B.d.A. erstes(s1)<erstes(s2). Dann ist erstes(s1)=min{x1,...,xn,y1,...,ym} und in der Schleife wird s3 s3 [erstes(s1)]; s1 rest(s1) s1 und s2 sind jeweils ausgeführt. Zu Beginn des n-1 zweiten und m, zusammen Schleifendurchlaufs gilt also n+m-1 groß s3=[erstes(s1)] und s1=[x2,...,xn]. ohne Beschränkung der Allgemeinheit

Mischen - Beweis Korrektheit Ergebnis: zwei Folgen mit zusammen nur noch n+m Elementen zu mischen. Induktionsvoraussetzung beide Folgen werden durch Programm in der behaupteten Weise mit höchstens n+m Schleifendurchläufen gemischt. Da jede Operation nur Elemente hinten an s3 anfügt, bleibt das erste Element das Minimum aller Folgenelemente. Dann werden also die beiden ursprünglichen Folgen in korrekter Weise mit höchstens n+m+1 Schleifendurchläufen gemischt.

Mischen - Beweis Korrektheit Ergebnis: zwei Folgen mit zusammen nur noch n+m Elementen zu mischen. Induktionsvoraussetzung beide Folgen werden durch Programm in der behaupteten Weise mit höchstens n+m Schleifendurchläufen gemischt. Da jede Operation nur Elemente hinten an s3 anfügt, bleibt das erste Element Ergebnis: das Programm Minimum aller ist bezgl. Folgenelemente. Spezifikation korrekt. Dann werden also die beiden ursprünglichen Folgen in korrekter Weise mit höchstens n+m+1 Schleifendurchläufen gemischt.

Mischen - Komplexität Wie effizient ist Mischen realisiert? allgemeines Vorgehen: jede Operation kostet Zeit zähle, wieviele Elementaroperationen bei Eingabe zweier Folgen ausgeführt werden. Da diese Zahl von den Elementen der Folge abhängt, gehe vom schlimmsten Fall (worst-case) aus.

Mischen - Beweis Komplexität Behauptung: Zum Mischen zweier Folgen mit n+m Elementen benötigt Funktion misch höchstens 11(n+m)+4 elementare Operationen. Beweis: Seien s1=[x1,...,xn] mit x1... xn und s2=[y1,...,ym] mit y1... ym die zu mischenden Folgen. Korrektheitsbeweis höchstens n+m Schleifendurchläufe erforderlich. Je Durchlauf 11 Elementaroperationen (selbst nachzählen). Außerhalb der Schleife noch einmal 4 Operationen. Insgesamt also höchstens 11(n+m)+4 Operationen.

Mischen - Beweis Komplexität Behauptung: Zum Mischen zweier Folgen mit n+m Elementen benötigt Funktion misch höchstens 11(n+m)+4 elementare Operationen. Beweis: Seien s1=[x1,...,xn] mit x1... xn und s2=[y1,...,ym] mit y1... ym die zu mischenden Folgen. Korrektheitsbeweis höchstens n+m Schleifendurchläufe erforderlich. linearer zusätzlicher Aufwand Je Durchlauf 11 Elementaroperationen (selbst nachzählen). Außerhalb der Schleife noch einmal 4 Operationen. Insgesamt also höchstens 11(n+m)+4 Operationen.

Mischen - Beweis Komplexität Behauptung: Zum Mischen zweier Folgen mit n+m Elementen benötigt Funktion misch höchstens 11(n+m)+4 elementare Operationen. Beweis: Seien s1=[x1,...,xn] mit x1... xn und s2=[y1,...,ym] mit y1... ym die zu mischenden Folgen. Korrektheitsbeweis höchstens n+m Schleifendurchläufe erforderlich. quadratischer linearerzusätzlicher zusätzlicher Aufwand Aufwand Je Durchlauf 11 Elementaroperationen (selbst nachzählen). Außerhalb der Schleife noch einmal 4 Operationen. Insgesamt also höchstens 11(n+m)+4 Operationen.

Mischen - Beweis Komplexität Behauptung: Zum Mischen zweier Folgen mit n+m Elementen benötigt Funktion misch höchstens 11(n+m)+4 elementare Operationen. Beweis: Seien s1=[x1,...,xn] mit x1... xn und s2=[y1,...,ym] mit y1... ym die zu mischenden Folgen. Korrektheitsbeweis höchstens n+m Schleifendurchläufe erforderlich. exponentieller quadratischer zusätzlicher linearerzusätzlicher Aufwand zusätzlicher Aufwand Aufwand Je Durchlauf 11 Elementaroperationen (selbst nachzählen). Außerhalb der Schleife noch einmal 4 Operationen. Insgesamt also höchstens 11(n+m)+4 Operationen.

Zusammenfassung Zwang zur Präzisierung des Verteilungsalgorithmus Programm in PRO Objekte deklarieren, benennen, einlesen, verändern, ausgeben Anweisungen und die Konstruktoren formulieren Prozeduren und Funktionen mit Parameterübergabe Programmiersprachen Syntax Semantik