Vom Algorithmus zum Programm
• Menschen und Maschinen
• Spezifikation
• Maschinenorientierte Präzisierung
• Präzisierung von Daten- und Anweisungskonstruktoren
• Programm und Programmiersprache
• Syntax und Semantik
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
jedes Detail
vollständig und ganz exakt beschreiben;
jede Situation berücksichtigen
Vom Algorithmus zum Programm
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 DefiziteVom Algorithmus zum Programm
technische Probleme
• Eine Maschine wird nicht ...
• “Briefkasten aufhängen”
• Eintrittskarten verkaufen
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
Spezifikation des Problems
• Spezifikation = exakte Definition, was der Computer leisten soll
• Formalisierung später
• hier nur umgangssprachlich
Vom Algorithmus zum Programm
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 dervorgeschriebenen Reihenfolge auf dem Bildschirm; M ruft die letzten drei Ziffern dieser Zahl, also die Ordnungsnummer, aus.
Vom Algorithmus zum Programm
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 dervorgeschriebenen Reihenfolge auf dem Bildschirm; M ruft die letzten drei Ziffern dieser Zahl, also die Ordnungsnummer, aus.
Aufgabe: Transformiere diese Aufgaben nun in eine
Darstellung, die C auch
versteht
Vom Algorithmus zum Programm
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]
Vom Algorithmus zum Programm
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]
oberster Zettel
Vom Algorithmus zum Programm
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]
unterster Zettel
Vom Algorithmus zum Programm
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]
kein Zettelstapel
=leere Zahlenfolge
[ ]
Vom Algorithmus zum Programm
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]
• Texte in “...”:
• z.B.: "Kommen Sie von auswärts?"
Vom Algorithmus zum Programm
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 ← [ ]Vom Algorithmus zum Programm
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)Vom Algorithmus zum Programm
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)bei Zahlen und Texten schließt
↵ die Eingabe ab
Vom Algorithmus zum Programm
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)Bei Eingabe einer
Zahlenfolge ein weiteres Mal am Schluß der Eingabe ↵
Vom Algorithmus zum Programm
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)2 7 ↵ 3 ↵ 4 6 1 ↵ ↵
[27,3,461]
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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: TextVom Algorithmus zum Programm
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: Textfertig und leerung in Zukunft nur Zahlenfolgen;
z nur eine Zahl;
frage nur ein Text
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
Präzisierung von Operationen auf Objekten
• wir können noch nicht auf Objekten operieren
• daher:
• bei Zahlen: +, -, *, /
• bei Zahlenfolgen: sort(f), misch(f,g)
Vom Algorithmus zum Programm
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 denZetteln besteht, die du bei früheren Briefkastenleerungen geholt hast, zusammen:
fertig ← misch(fertig,leerung)
Vom Algorithmus zum Programm
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 [ ].
•
5.1Anwendung:
Rufe die Ordnungsnummer des obersten Zettels aus;5.2 Lege den Zettel beiseite
wird zu
zeige(erstes(fertig));
fertig ← rest(fertig)
Vom Algorithmus zum Programm
Konkatenation von Folgen
• Konkatenation von Folgen = Verbinden zweier Zettelstapel: •
Beispiele:
• [3, 27, 5] • [8, 1] = [3, 27, 5, 8, 1].
• f • [ ] = [ ] • f = f
Vom Algorithmus zum Programm
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 sindVom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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, ... unterstreichenVom Algorithmus zum Programm
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).
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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.
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;
Vom Algorithmus zum Programm
Schachtelung von Schleifen
innere Schleife
äußere Schleife
Vom Algorithmus zum Programm
Schachtelungsdiagramm (mengenorientiert)
Vom Algorithmus zum Programm
Schachtelungsdiagramm (mengenorientiert)
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
Umsetzung beim Verteilungsalgorithmus
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
Mangel 1 Bezug zwischen
Aufruf von Mischen und dieser Beschreibung
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Mangel 2
Bezug der Zahlenfolgen fertig und leerung zu
s1 und s2
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
s1, s2 sind
formale Parameter
Vom Algorithmus zum Programm
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
s1, s2 sind
formale Parameter
fertig und leerung im Aufruf misch(fertig,leerung)
sind aktuelle Parameter
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
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
Mangel 3
Bezug zwischen Ergebnis des Mischens s3
und Aufruf
Vom Algorithmus zum Programm
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)
Vom Algorithmus zum Programm
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)
der Typ des Ergebnisses von misch, also Zahlenfolge, wird
hier festgehalten
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
Prozesse beim Aufruf
Vom Algorithmus zum Programm
Prozesse beim Aufruf
•
fertig ← misch(fertig,leerung)Vom Algorithmus zum Programm
Prozesse beim Aufruf
•
fertig ← misch(fertig,leerung)1. unterbreche Ausführung des Programms.
Vom Algorithmus zum Programm
Prozesse beim Aufruf
•
fertig ← misch(fertig,leerung)1. unterbreche Ausführung des Programms.
2. wo ist misch? Suche Beschreibung.
Vom Algorithmus zum Programm
Prozesse beim Aufruf
•
fertig ← misch(fertig,leerung)1. unterbreche Ausführung des Programms.
2. wo ist misch? Suche Beschreibung.
3. Parameter passend (Typ, Anzahl)?
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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 fertig ← misch(fertig,leerung)
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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 Suche Beschreibung
besser: aufsuchen
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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 (fertig,leerung)
zahlenfolge ↕ zahlenfolge
(s1,s2)
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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 s1 fertig s2 leerung
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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 fertig ← s3
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
Prozedurkonzept
•
jede als Algorithmus formulierte Vorschrift kann zu Elementaranweisung in anderem Algorithmuswerden
•
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 vorliegenVom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum 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 beschreibenVom Algorithmus zum Programm
Welt der Programmiersprachen
Vom Algorithmus zum Programm
Welt der Programmiersprachen
Vom Algorithmus zum Programm
Welt der Programmiersprachen
• deklarativ: Problem beschreiben
• prozedural: Lösungsweg zum Problem
beschreiben
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
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
ML, MIRANDA, Gofer, Haskell
Vom Algorithmus zum Programm
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
ML, MIRANDA, Gofer, Haskell
Prolog, Gödel, CLP
Vom Algorithmus zum Programm
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
ML, MIRANDA, Gofer, Haskell
Prolog, Gödel, CLP
PRO, ADA, ALGOL, BASIC, C, EIFFEL, FORTRAN, MODULA, OBERON,
PASCAL
Vom Algorithmus zum Programm
Syntax und Semantik
Vom Algorithmus zum Programm
Syntax und Semantik
• Programmiersprachen immer präzise und
eindeutige Syntax und Semantik
Vom Algorithmus zum Programm
Syntax und Semantik
• Programmiersprachen immer präzise und eindeutige Syntax und Semantik
• Syntax: sprachliche Notierung von
Programmen
Vom Algorithmus zum Programm
Syntax und Semantik
• Programmiersprachen immer präzise und eindeutige Syntax und Semantik
• Syntax: sprachliche Notierung von Programmen
• Semantik: Bedeutung syntaktisch
korrekter Programme
Vom Algorithmus zum Programm
Syntax und Semantik
• Programmiersprachen immer präzise und eindeutige Syntax und Semantik
• Syntax: sprachliche Notierung von Programmen
• Semantik: Bedeutung syntaktisch korrekter Programme
welche Zeichenreihen sind syntaktisch korrekte
Programme?
Vom Algorithmus zum Programm
Syntax und Semantik
• Programmiersprachen immer präzise und eindeutige Syntax und Semantik
• Syntax: sprachliche Notierung von Programmen
• Semantik: Bedeutung syntaktisch korrekter Programme
welche Zeichenreihen sind syntaktisch korrekte
Programme?
welche Wirkung hat ein syntaktisch korrektes Programm
auf dem Rechner?
Vom Algorithmus zum Programm
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
Vom Algorithmus zum Programm
Syntax und Semantik – Beispiel 1
Vom Algorithmus zum Programm
Syntax und Semantik – Beispiel 1
Programm P
def s: Zahl;
lies(s);
s ← 0;
zeige(s) .
Vom Algorithmus zum Programm
Syntax und Semantik – Beispiel 1
Programm P
def s: Zahl;
lies(s);
s ← 0;
zeige(s) .
• syntaktisch korrekt
Vom Algorithmus zum Programm
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".
Vom Algorithmus zum Programm
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: f
P: Z → Z mit f
P(s)=0 für
alle s Z.
Vom Algorithmus zum Programm
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: f
P: Z → Z mit f
P(s)=0 für alle s Z.
• Programm mit gleicher Semantik: zeige(0)
Vom Algorithmus zum Programm
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: f
P: Z → Z mit f
P(s)=0 für alle s Z.
• Programm mit gleicher Semantik: zeige(0)
• Programme können semantisch
äquivalent sein.
Vom Algorithmus zum Programm
Syntax und Semantik – Beispiel 2
Vom Algorithmus zum Programm
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)
Vom Algorithmus zum Programm
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)
n nicht
deklariert
Vom Algorithmus zum Programm
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)
n nicht deklariert
ende fehlt
Vom Algorithmus zum Programm
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)
n nicht deklariert
ende fehlt
syntaktisch nicht
korrekt
Vom Algorithmus zum Programm
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)
Vom Algorithmus zum Programm
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".
Vom Algorithmus zum Programm
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.Vom Algorithmus zum Programm
Korrektheit und Komplexität
•
Korrektheit: exakt beweisen, daß dasProgramm 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: MischenVom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
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 Werte
Vom Algorithmus zum Programm
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.
Vom Algorithmus zum Programm
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.
aufsteigend sortiert
Vom Algorithmus zum Programm
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.