22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!