| |
|
SOFTWARE |
|
|
|
|
|
Wiederhole Anweisungen, bis (Abbruch-)Bedingung erfüllt ist
Unterablaufstrukturen:
Führe Anweisungen aus, führe Unterprogramm aus, kehre
zurück und fahre im Hauptprogramm fort.
Sequenz (Folgestruktur)
Linearer Ablauf: Jedes Programm besteht aus einer
Aneinanderreihung von Anweisungen an den Computer. Die Sequenz
ist eine Folge von Anweisungen, die in der Reihenfolge ihrer
Niederschrift ausgeführt werden. Man spricht deshalb auch vom
linearen Ablauf bzw. unverzweigten Ablauf, vom Geradeaus-Ablauf
oder von einer Sequenz. In verschiedenen Programmiersprachen wird
die "Klammerung" einer solchen Anweisungsfolge
unterstützt (Pascal: BEGIN ... END, C: { ... }).
Auswahl (Bedingte Verzweigung, Mehrfachauswahl)
Sie ist gekennzeichnet durch einen nicht linearen Ablauf mit
einer Vorwärtsverzweigung. Der Ablauf gelangt an einen
Entscheidungspunkt, an dem, abhängig von einer Bedingung,
unterschiedliche Verarbeitungswege eingeschlagen werden. Das
Entscheidungssymbol gibt eine Bedingung an (i. a. ein bedingter
Ausdruck), deren Ergebnis ein Wahrheitswert ist (WAHR oder
FALSCH).
- einseitige Auswahl
Diese Alternativstruktur führt nur auf einem der beiden
Verzweigungspfaden eine Anweisung(sfolge) aus und endet
in der Zusammenführung beider Pfade. WENN
Bedingung DANN Anweisungsfolge;
- zweiseitige Auswahl Bei dieser Alternativstruktur führt
jeder Verzweigungspfad auf jeweils eine eigene
Anweisungsfolge. Sie endet auch wieder in einer
Zusammenführung der Pfade.
WENN Bedingung DANN
Anweisungsfolge 1 SONST Anweisungsfolge 2;
- Mehrfachauswahl Bei dieser Struktur gibt es mehr als zwei
Auswahlpfade, die aus einer Verzeigung ihren Ausgang
nehmen und in einer Zusammenführung enden. Hier erfolgt
die Abfrage nicht nach einer Bedingung, sondern der
bedingte Ausdruck liefert einen Wert. Für jeden
möglichen Ergebniswert ist ein Zweig vorgesehen.
Existiert nicht für jeden möglichen Ergebniswert der
Bedingung ein Pfad, ist ein zusätzlicher Pfad für alle
nicht behandelten Fälle vorzusehen
("SONST"-Zweig).
WENN bedingter
Ausdruck Wert1:
Anweisung1;
Wert2:
Anweisung2; ...;
Wertn:
Anweisungn; SONST Anweisungs;
(Wenn der Ausdruck den Wert "Werti"
besitzt, wird die Anweisungsfolge "Anweisungi"
ausgeführt).
Wiederholung
Wiederholungsstrukturen ergeben sich, wenn eine
Anweisungsfolge zur Lösung einer Aufgabe mehrfach durchlaufen
werden soll (z. B. das Bearbeiten aller Komponenten eines Vektors
oder Berechnung des Monatslohns aller Mitarbeiter). Es liegt ein
nichtlinearer Verlauf mit Rückwärtsverzweigung vor. Die
Programmierung einer Wiederholungsstruktur führt zu einer
sogenannten "Programmschleife". Wichtig ist die
Terminierung der Schleife, d. h. mindestens eine Anweisung muß
dafür sorgen, daß nach einer endlichen Zahl von Durchläufen
die Bedingung für die Wiederholung nicht mehr erfüllt ist.
- Abweisende Wiederholung (Eingangsbedingung)
In diesem Fall steht die Bedingung zu Beginn der Schleife
(also vor der Anweisungsfolge). Ist die Bedingung schon
beim Eintritt in die Anweisungsstruktur nicht erfüllt,
wird die Anweisungsfolge überhaupt nicht ausgeführt. SOLANGE
Bedingung FÜHRE AUS Anweisungsfolge;
- Nichtabweisende Wiederholung (Ausgangsbedingung)
In diesem Fall steht die Bedingung am Ende der Schleife
(also nach der Anweisungsfolge). Die Anweisungsfolge wird
auf jeden Fall mindestens einmal ausgeführt. FÜHRE
AUS Anweisungsfolge BIS Bedingung;
- Zählschleife
Diese Anweisungsstruktur stellt eine Sonderform der
abweisenden Wiederholung dar. Eine Zählvariable wird vor
dem Durchlaufen der Schleife mit einem Anfangswert
besetzt. Darauf folgt eine abweisende Wiederholung, wobei
in der Abbruchbedingung die Zählvariable auf das
Erreichen eines Endwertes geprüft wird. Die
Anweisungsfolge wird um eine Anweisung zum Inkrementieren
bzw. Dekrementieren der Zählvariable erweitert. Die
Zählvariable muß skalar sein (z. B. ganzzahlig). VON
Zählvariable = Startwert BIS Zählvariable =
Endwert FÜHRE AUS Ink./Dek. Zählvariable,
Anweisungsfolge;
Unterablaufstrukturen (Unterprogramme)
Es wurde bereits die Aufteilung von Programmen in einzelne
Module angesprochen. Diese Aufteilung auch in einem Programm zu
vollziehen erscheint daher wünschenswert. In allen höheren
Programmiersprachen und auch im Befehlsumfang nahezu aller
Prozessoren ist diese Möglichkeit in Form von Unterprogrammen
realisiert. Für die Verwendung von Unterprogrammen (UP) sprechen
weitere Gründe:
- Übersichtlichkeit
Durch die Verwendung von UP steigen Lesbarkeit und
Verständlichkeit des Programms, da sich UP als direkte
Abbildung eines Funktionsblocks unter einem
aussagekräftigen Namen ins Programm einfügen lassen.
Zudem erlauben sie den vom Rest des Programms
unabhängigen Test von einzelnen Funktionsblöcken und
machen so auch große Programme überschaubar und
(relativ) fehlerfrei.
- Wirtschaftlichkeit
Häufig werden die gleichen Anweisungsfolgen für
unterschiedliche Daten und an verschiedenen Stellen im
Programm benötigt. Durch ein Unterprogramm kann eine
Anweisungsfolge definiert werden, die dann mehrfach und
mit unterschiedlichen Daten "aufgerufen" werden
kann --> Code wird kürzer --> weniger
Speicherbedarf.
- Änderungsfreundlichkeit
Änderungen (z. B. aufgrund neuer Hardware) und
Optimierungen betreffen immer nur einige wenige
Unterprogramme. Da die Verbindung zum Rest des Programms
über eine fest definierte Schnittstelle erfolgt, wirken
sich Änderungen in einem i. a. Unterprogramme nicht auf
den übrigen Programmcode aus. Voraussetzung dafür sind
möglichst unabhängige Unterprogramme.
- Lokalität
Die lokale Begrenztheit von Variablen kann durch die
Vereinbarung einzelner Variablen im UP hervorgehoben und
unterstützt werden. Viele Hochsprachen erlauben es,
solche Variablen in ihrer Gültigkeit auf das
Unterprogramm zu beschränken (siehe später). Wird der
gleiche Variablenname in verschiedenen Unterprogrammen
verwendet, ergeben sich keine Konflikte der lokalen
Variablen untereinander.
- Allgemeingültigkeit
Durch die Erarbeitung möglichst allgemein gültiger UP
kann eine "UP-Bibliothek" erstellt werden,
deren Inhalt immer wieder bei Programmierproblemen
herangezogen werden kann. Die Zeit zum Erstellen neuer
Programme wird verkürzt. Sind die Bibliotheks-Routinen
sorgfältig getestet, sinkt auch die Fehlerrate bei neu
erstellten Programmen. Vielfach lassen sich Bibliotheken
zur Lösung spezieller Probleme auch käuflich erwerben.
- Programmentwicklung im Team
Mehrere Mitarbeiter entwickeln jeder für sich
Unterprogramme mit fest definierten Schnittstellen für
die Ein- und Ausgabe von Daten. Die Unterprogramme werden
später zum Gesamtprogramm zusammengeführt.
Ein Unterprogramm muß vor seiner Verwendung vereinbart
werden. Die Anweisungsfolge des Unterprogramms wird unter einem
möglichst aussagekräftigen Namen zusammengefaßt. Der Aufruf
besteht dann nur noch in der Nennung des Unterprogramm-Namens.
Dem Unterprogramm können beim Aufruf aktuelle Werte zur
Verarbeitung übergeben werden --> Argumente oder Parameter
(siehe später).
Einige Programmiersprachen unterscheiden bei Unterprogrammen
Prozeduren und Funktionen (z. B. Pascal). Funktionen sind
Unterprogramme, die einen Wert zurückliefern und daher auf der
rechten Seite einer Wertzuweisung auftreten dürfen (z. B. Y =
SIN(X), SIN ist eine Funktion mit einem Real-Argument, die einen
Real-Wert zurückliefert). Bei anderen Sprachen (z. B. C) gibt es
ausschließlich Funktionen. Zusätzlich gibt es einen Datentyp
VOID, den "leeren" Datentyp, mit dem Funktionen
gekennzeichnet werden, die keinen Wert zurückliefern. Für die
technische Realisierung von Unterprogrammen auf Maschinenebene
bieten sich zwei Möglichkeiten an:
- offene Unterprogramme
Bei dieser Form wird der Code des UP an der jeweiligen
Aufrufstelle einkopiert. Das UP bildet also nur auf der
Ebene der Programmiersprache eine abgeschlossene Einheit
und ist im fertigen Programmcode u. U. mehrfach
enthalten. Diese Form wird auch als Makro-Technik
bezeichnet (naives "Einkopieren").
- geschlossene Unterprogramme
Bei dieser Form existieren speziellen Befehle für den
Ansprung eines Unterprogramms und den Rücksprung zur
Aufrufstelle. Das Unterprogramm ist als Code nur einmal
vorhanden. Bei jedem Aufruf wird die aktuelle Positeon in
der Anweisungsfolge zwischengespeichert und das
Unterprogramm ausgeführt. Danach wird die
Programmausführung an der Aufrufstelle fortgesetzt. Wir
werden uns nur mit dieser Unterprogramm-Typ befassen.
Anmerkungen:
- Es gibt verschiedene Bezeichnungen für den
Unterprogramm-Sprung: Jump to Subroutine
(Maschinensprache), Function-Call, Funktionsaufruf,
Procedurecall, ..
- Der Rücksprung muß nur in Maschinensprache explizit
programmiert werden, z. B. als Return from Subroutine -
Befehl (RTS); in höheren Programmiersprachen übersetzt
der Compiler das Ende einer Function in den
entsprechenden Maschinenbefehl.
- Von beliebigen Stellen des Hauptprogramms aus kann das
selbe Unterprogramm aufgerufen werden, es wird jedoch
dafür gesorgt, daß der entsprechende Rücksprung
jeweils zu der Anweisung erfolgt, die im Hauptprogramm
auf den zuletzt ausgeführten Unterprogrammsprung folgt.
Darstellung von Algorithmen
Algorithmen lassen sich auf unterschiedliche Weise darstellen:
- Verbale Beschreibung
Der Algorithmus wird in natürlicher Sprache beschrieben.
Man kann dies in einer Aufzählung der Befehle machen
oder zur Vereinfachung und um die Beschreibung eindeutig
zu gestalten, die sprachliche Beschreibung formalisieren;
z. B.: WENN x größer 0 DANN
"berechne Y" SONST "Fehlermeldung
ausgeben"
Also genau das, was im Skript bisher verwendet wurde.
- Programmablaufplan (PAP)
Dies ist eine zeichnerische Darstellung mit genormten
Symbolen (DIN 66001). Die Verarbeitungssymbole werden von
geometrischen Formen umschlossen, deren Bedeutung genormt
ist. Ihre Verknüpfung erfolgt durch eine
Verbindungslinie, deren Durchlaufrichtung mit Pfeilen
markiert ist.
- Struktogramme
Auch dies ist eine zeichnerische Darstellung
(Nassi-Shneidermann), die jedoch auf Ablauflinien und
Übergangsstellen verzichtet (bessere
Übersichtlichkeit). Die Beschreibung des Algorithmus
besteht aus geschachtelten Strukturelementen.
PAP und Struktogramm werden in der folgenden Beschreibung der
Anweisungsstrukturen gezeigt.
|
| |
|
|
|