Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Dies ist die Grundidee <strong>der</strong> sogenannten Verfeinerung. Ausgehend von dem bereits abgeschlossenen Vertrag<br />
einer Routine sollte man versuchen, diesen in sinnvolle und überschaubare Teilaufträge zu zerteilen und sich<br />
erst dann nach bereits existierenden Teillösungen umschauen. Die Zielorientierung ist auch <strong>der</strong> Grund, bei <strong>der</strong><br />
Entwicklung die schwächsten Vorbedingungen und nicht etwa die stärksten Nachbedingungen einzusetzen.<br />
Bevor man zielorientiert vorgehen kann, muß man sich natürlich erst einmal vollständig und unzweideutig<br />
klarmachen, was das zu lösende Problem genau ist. Diese Aussage erscheint trivial, wird aber doch sehr<br />
häufig vernachlässigt.<br />
Entwurfsprinzip 4.5.8 (Präzise Problemstellung)<br />
Vor <strong>der</strong> Programmsentwicklung müssen Vor- und Nachbedingungen präzisiert und verfeinert werden.<br />
Die Einhaltung dieses Prinzips wird durch die Vertragsmetapher von Eiffel und die in Sektion 4.1 angesprochene<br />
Entwurfsmethodik sehr stark unterstützt. Die größte Schwierigkeit liegt jedoch darin, eine Spezifikation<br />
gleichzeitig einfach und präzise zu gestalten. Gelingt dies, so ist die nachfolgende Implementierung meist eine<br />
leichte Aufgabe.<br />
Die Verwendung natürlicher Sprache o<strong>der</strong> einer mathematischen Notation für die Spezifikation ist normalerweise<br />
ein zu hohes Niveau. Es birgt die Gefahr in sich, daß Begriffe vorkommen, die für den Programmierer<br />
nicht eindeutig o<strong>der</strong> ihm sogar unbekannt sind. Da diese Abstraktionsform jedoch notwendig ist, um die wesentlichen<br />
Absichten, was das Programm tun soll, zu vermitteln, empfiehlt es sich, eine durch mathematische<br />
Notationen ergänzte Sprache zu verwenden, in <strong>der</strong> zu jedem “Nichtstandard”-Begriff eine genaue Definition<br />
gegeben wird, auf die man im Zweifelsfall zurückgreifen kann. Dadurch werden Spezifikationen übersichtlich<br />
und bleiben dennoch präzise.<br />
Beispiel 4.5.9 (Maximum)<br />
Bei <strong>der</strong> Berechnung <strong>der</strong> maximalen Segmentsumme in Beispiel 4.5.2 haben wir uns eines Programmstücks<br />
bedient, welches das Maximum zweier Zahlen berechnet, und sind implizit davon ausgegangen, daß es<br />
klar ist, was “Maximum” bedeutet. Wir wollen nun eine Definition dieses Begriffs nachholen und das<br />
zugehörige Programmstück systematisch entwickeln.<br />
Eine Zahl z ist das Maximum zweier Zahlen x und y, wenn z die größere <strong>der</strong> beiden Zahlen ist. Ausgedrückt<br />
mit Mitteln <strong>der</strong> Logik heißt dies zum Beispiel:<br />
z = max(x,y) ≡ z≥x ∧ z≥y ∧ (z=x ∨ z=y) 50<br />
Mit dieser Definition können wir nun ohne weitere Bedenken ein Programmstück zur Berechnung des<br />
Maximums in einfacher, aber doch verständlicher Weise wie folgt spezifizieren.<br />
{ true} maximum { Result=max(x,y)}<br />
Wie können wir nun vorgehen, um anhand <strong>der</strong> Nachbedingung das Programmstück im Detail zu implementieren?<br />
Da keine weiteren Bedingungen angegeben sind als Result=max(x,y) und bisher keine<br />
Routine existiert, die diese Spezifikation erfüllt, müssen wir auf die Definition zurückgreifen und ausgehend<br />
von den einfachsten Bestandteilen <strong>der</strong> Nachbedingung unsere Anweisungen festlegen.<br />
Da die Spezifikation die Bedingung Result=x enthält, wählen wir als ersten Kandidaten für eine<br />
Teillösung die Zuweisung Result := x . Wir bestimmen nun die schwächste Vorbedingung dieser Anweisung<br />
für die gegebene Nachbedingung:<br />
wp(Result:=x, Result=max(x,y))<br />
≡ x=max(x,y)<br />
≡ x≥x ∧ x≥y ∧ (x=x ∨ x=y)<br />
≡ true ∧ x≥y ∧ (true ∨ x=y)<br />
≡ x≥y<br />
50 Denkbar wäre auch z = max(x,y) ≡ (x≤y ⇒ z=y) ∧ (x>y ⇒ z=x)