Table Of ContentDietmar Herrmann
Programrnierprinzipien
in BASIC und Pascal
Programmieren von Mikrocomputem
Die Bande dieser Reihe geben den Benutzern von Heimcomputern, Hobbycomputern
bzw. Personalcomputern iiber die Betriebsanleitung hinaus zusatzliche Anwendungshilfen.
Der Leser findet wertvolle I nformationen und H inweise mit Beispielen zur optimalen
Ausnutzung seines Gerates, besonders auch im Hinblick auf die Entwicklung eigener
Programme.
Bisher erschienene Bande
Band 1 EinfUhrung in BASIC
von W. Schneider
Band 2 lehr-und Obungsbuch fur die Rechnerserien cbm 2001 und cbm 3001
von G. Oetzmann
Band 3 BASIC fUr Fortgeschrittene
von W. Schneider
Band 4 Einfuhrung in PASCAL
von W. Schneider
Band 5 lehr-und Obungsbuch fur die Rechnerserien cbm 4001 und cbm S001
von G. Oetzmann
Band 6 BASIC-Programmierbuch zu den grundlegenden Ablaufstrukturen
der Datenverarbeitung
von E. Kaier
Band 7 lehr-und Obungsbuch fUr Commodore-Volkscomputer
von G. Oetzmann
Band S Assembler-Programmierung von Mikroprozessoren (SOSO, S085, Z SO)
mitdem ZXS1
von P. Kahlig
Band 9 Einfiihrung in die Anwendung des Betriebssystems CP/M
von W. Schneider
Band 10 Datenstrukturen in PASCAL und BASIC
von D. Herrmann
Band 11 Programmierprinzipien in BASIC und PASCAL
von D. Herrmann
Band 12 Assembler-Programmierung von Mikroprozessoren (SOSO, SOS5, Z SO)
mit dem ZX Spectrum
von P. Kahlig
Programmieren von Mikrocomputem Band 11
Dietmar Herrmann
Programmierprin,zipien
in BASle und Pascal
Mit 12 BASIC- und 13 Pascal-Programmen
Herausgegeben von Harald Schumny
Springer Fachmedien Wiesbaden GmbH
CIP-Kurztitelaufnahme der Deutschen Bibliothek
Hemnann. Dietmar:
Programmierprinzipien in BASIC und Pascal: mit
12 BASIC-und 13 Pascal-Programmen I Dietmar
Herrmann. - Braunschweigj Wiesbaden: Vieweg,
1984.
(Programmieren von Mikrocomputernj Bd. 11)
ISBN 978-3-528-04258-5 ISBN 978-3-322-86163-4 (eBook)
DOI 10.1007/978-3-322-86163-4
NE:GT
Alle Rechte vorbehO,ti on
© Springer Fachmedien Wiesbaden 1984
UrspI1lnglich erschienen bei Friedr. Vieweg & Sohn Verlagsgesellschaft 1984
Das hierin enthaltene Programm-Material ist mit keiner Verpflichtung oder Garantie irgendeiner Art
verbunden. Der Autor iibemimmt infolgedessen keine Verantwortung und wird keine daraus folgende
oder sonstige Haftung iibernehmen, die auf irgendeine Art aus der Benutzung dieses Programm-Materials
oder Teilen davon entsteht.
Die Vervielfliltigung und Obertragung einzelner Textabschnitte, Zeic;hnungen oder Bilder, auch rur
Zwecke der Unterrichtsgestaltung, gestattet das Urheberrecht nur, wenn sie mit dem Verlag vorher
vereinbart wu:rden. Im EinzelfaU md iiber die Zahlung einer Gebllhr rur die Nutzung fremden geistigen
Eigentums entschieden werden. Das gilt rur die Vervielfliltigung durch alle Verfahren einschlie1\lich
Speicherung und jede Obertragung auf Papier, Transparente, Filme, Bănder, Platten und andere
Medien. Dieser Vermerk umfdt nicht die in den §§ 53 und 54 URG ausdriicklich erwahnten AU8-
nahmen.
v
Inhaltsverzeichnis
E.infiihrung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 1
1 Top-down-Methode......................................... 5
1.1. GauB-Elimination (pascal) ................................ 5
1.2. Primzahlsieb (pascal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 7
2 Aigebraische Umformungen ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 10
2. 1.G ro6ter gememsamer Teiler (Pascal) . . . . . . . . . . . . . . . . . . . . . . . . .. 10
2.2. Elliptisches IntegralI. Art (BASIC) . . . . . . ... . . . . . . . . . . . . . . . . .. 11
2.3. Modulorest einer Potenz (BASIC) ........................... 12
3 Rekursion............................................... 16
3.1. Ackermann-Funktion (pascal) ................' . . . . . . . . . . . . .. 16
3.2. Permutationen (BASIC) .................... ;'.. . . . . . . . . . .. 18
3.3. Partitionen (pascal) ......................... '. ~ . . . . . . . . .. 19
. .-:,.
4 lteration................................................ 22
4.1. Ackermann-Funktion (BASIC) . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 22
4.2. BinomialkoefflZienten (BASIC) . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 23
4.3. Gammafunktion (BASIC). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 25
5 Backtracking-Verfahren...................................... 29
5.1. Springerzug (pascal) .................................... 29
5.2. O/l-Rucksackproblem (pascal) ............................. 31
5.3. Labyrinth (pascal) ..................................... 33
6 Teile-und-Herrsche~rinzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 37
6.1. Quicksort (Pascal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 37
6.2. Sortieren durch binăres Einftigen (pascal) ...................... 39
6.3. Wăgeproblem (pascal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 40
7 Heuristische Methoden ...................................... 43
7.1. Springerzug (BASIC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 43
7.2. Umftillaufgabe (pascal) .................................. 45
VI Inhaltsverzeichnis
8 Greedy-Methoden .......................................... 47
8.1. Rucksackproblem (BASIC) .............................. " 47
8.2. Travelling-Salesman-Problem (BASIC) ........................ 49
9 Riickwărtsrechnen ......................................... 52
9.1. Jeepproblem (pascal) .................................. " 52
9.2. Besselfunktion 1. Art (BASIC) ............................. 54
10 Simulation .............................................. 56
10.1. Warten auf einen vollstandigen Satz (BASIC) . . . . . . . . . . . . . . . . . . .. 56
10.2. Anzahlschatzung von Objekten (BASIC) . . . . . . . . . . . . . . . . . . . . . .. 58
Literaturverzeichnis ........................................... 59
Sa~hwortverzeichnis .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 60
VII
Vorwort
Sto~t man auf eine besonders elegante Formulierung eines Algorithmus, so fragt man sich
meist, wie der Autor auf die entsprechende Programmieridee gekommen ist. Mustert man
eine Vielzahl von Algorithmen genauer, so erkennt man, d~ es etwa ein Dutzend grund
legender Programmiertechniken gibt. Im vorliegenden Band sollen daher einige solche Pro
grammierprinzipien wie
- Top-down-Prinzip
- Rekursion
- Iteration
- Backtracking-Verfahren
- Teile-und-Herrsche-Prinzip
- Greedy-Algorithmen
vorgestellt werden. Thre Realisierung wird an Hand von 25 vollstandigen BASIC- und
Pascal-Programmen diskutiert. Diese Programme sind vielfaltigen Bereichen entnommen:
Neben numerischen und unterhaltungs-mathematischen Problemen werden auch kombi
natorische, Sortier-und Operations-Research-Fragen behandelt, z.B.
- Permutationen
- Springerzug
- Labyrinth
- Quicksort
- Rucksackproblem
- Travelling-Salesman.
Viele Algorithmen sind durch Struktograrnme erkliirt und konnen damit gegebenenfalls in
andere Programmiersprachen iibertragen werden.
Anzing, Oktober 1983
Einfiihrung
Wăhrend in der FrUhzeit des Programmierens die Programmerstellun~ mehr oder
weniger Sache des personlichen Geschmacks bzw. Geschicks war, hat sich mittlerweile das
"Software-Engineering" entwickelt, das eine ganze Reihe von Anforderungen an Pro
gramme erstellt.
Ausgangspunkt war die Entwicklung des strukturierten Prograrnrnierens, die sich in
dem Buch "Structured Prograrnrning" von Dijkstra, Hoare und Dahl (1972) niederschlug.
Vorausgegangen war die beriihmte Kontroverse um Dijkstra 's "GOTO-considered harmful"
(1968). ZieI des Strukturierens war, unter strikten Anwendung der Kontrollstrukturen
- repetive Anweisung (FOR .. DO,REPEAT .. UNTIL,WHlLE .. DO)
- alternative Anweisung (IF .. THEN .. ELSE,CASE .. OF)
- Verbundanweisung (BEGIN .. ENO)
und unter Vermeidung der Sprunganweisung (GOTO) den Programmablaufiiberschaubar
und kontrollierbar zu machen.
Die Korrektheit eines Prograrnms sollte formal und nicht durch Testlăufe bewiesen
werden. Was bewirkt der folgende Programmabschnitt?
x :=x -y;
y :=x +y;
x :=y-x;
Hat x anfangs den Wert a und y den Wert b, so folgt entsprechend
x :=a-'b;
y := (a - b) + b = a;
x :=(a-b)+b -(a-b)=b;
Damit ist formal gezeigt, daB bei diesem Programmabschnitt die Variablen x und y ihren
Wert austauschen.
Durch Aufstellen von Invarianten sollten Schleifen formal veriflZiert werden konnen.
Folgender Programrnausschnitt bestimmt das Maximum des Feldes ali], 1 OS;;; i OS;;; n:
i:= 1; m:= 1;
<n
while i do
begin
i := i + 1;
>
if ali] a[m] then m := i
end;
max :=a[m];
Die auftretende WHILE .. DO-Schleife hat folgende Invarianten
(1 OS;;; i OS;;; n) A (1 OS;;; m OS;;; i) A (a[m];;" a[I], ... , a[m];;" a[n])
2 EinfUhrung
Wiire eine der Invariantenbedingung verlettt, so wtirde das Programmsttick nicht den An
forderungen gentigen.
Ebenso solIte das Determinieren eines Algorithrtllls formal veriftziert werden.
>
Folgendes Programmsttick liefert das Produkt der Variablenwerte x . y(x, y O):
z:= O; u:= x;
repeat
z :=z +y;
u:= u-1
until u = O;
Da in der REPEA T .. UNTIL-Schleife gleiche Summanden y aufsummiert werden, lautet
die Invariantenbedingung
(z: u . y = x . y) Â (u ~ O).
Zusammen mit der Abbruchbedingung der Schleife (u = O) folgt
(z + u . Y = x . y) Â (u = O) ~ (z = x . y)
also das gewtinschte Resultat, da~ z den Produktwert von x und y liefert. Die Schleife
determiniert somit genau nach x Schritten.
Die eben angeflihrten Forderungen des strqkturierten Programrnierens erm6glichen
aber nicht nur die formale Veriftkation eines Programms, sondern erleichtern auch wesent
lich das ModifIzieren und Warten von Programrnen. Weitere Forderungen des Software
Engineerings k6nnen dem Diagramm auf Seite 3 entnommen werden (aus [8]).
Eine wichtige Programmiertechnik, die sich aus demPrinzip des Strukturierens ergibt, ist
die Top-down-Methode. Dabei wird das gegebene Problem in kleinere, einzeln 16sbare und
tiberschaubare Problemschritte zerlegt. Das Gegenteil des Top-down-Prinzips ist die
Buttom-up-Methode, bei der das Programrn aus einzelnen vorgefertigten Programmteilen,
Prozeduren usw. zusammengegesetzt wird.
EbenfalIs vom Gro~en ins Kleine geht das Prinzip Teile-und-Herrsche. Wie von der
Biniirsuche bekannt ist, wird die Anzahl der zu untersuchenden Alternativen bei jedem
Schritt halbiert. Dieses Prinzip wird an zwei Sortierverfahren aufgezeigt, am Quicksort
und am Sortieren durch biniires Einfligen. Da~ auch manchmal der Problemumfang ge
drittelt werden kann, wird am Beispiel eines Wăgealgorithmus dargestelIt.
Auch die Methode der algebraischen Verein[achung verlagert das Problem vom
Komplizierten zum Einfachen. Dieses Prinzip wird hier zur Berechnung des gr6~ten ge
meinsamen Teilers, des elliptischen Integrals 1. Art und des Modulorests einer Potenz
angewandt.
Ein seit langem bekanntes Programmierprinzip ist das der Rekursion. Die Rekursion
ist etwas in Miskredit geraten, da viele Programmiersprachen keine rekursiven Prozeduren
erlauben und sie, ungeschickt angewandt, wenig effektive Programme erzeugt. Manche In
formatikprofessoren sind der Meinung, d~ Rekursion prinzipiell zu vermeiden seL Je
doch gibt es eine ganze Reihe von Algorithmen, die, rekursiv formuliert, sehr effektiv sind
oder in nattirlicher Weise auf rekursiven Datenstrukturen operieren.
Ein in der numerischen Mathematik vielbentitzte Programmtechnik ist die Iteration.
Nach D. E. Knuth (1974) ist die Umwandlung eines rekursiven Schemas in ein iteratives
Einfiihrung 3
Gerăteunab-
hăngigkeit
Portabilităt
Autarkie
Genauigkeit
Zuverlăssigkeit
Volistăndigkeit
Robustheit
Integritiit
Konsistenz
ZiihIbarkeit
Effizienz
Gerăteeffizienz
Benutzer
freundlichkeit Zugănglichkeit
Assimilations-
fiihigkeit
Testbarkeit
Selbsterklărung
Wartbarkeit Verstăndlichk.
Strukturierung
Kompaktheit
Ănderbarkeit
Lesbarkeit
a ..... b: abeinhaltet b Erweiterbarkeit
eines der grundlegendsten Konzepte der Informatik. Als Anwendung werden die Acker
mann-und Gammafunktion iterativ berechnet, ebenso die Binomialkoeffizienten.
Spezielle rekursive Verfahren sind die Backtracking-Verfahren, die eine LOsung
durch systematisches Ausprobieren ansteuem. Sie sind imstande, sich aus einer "Sack
gasse" zurtickzuziehen und einen neuen Ausgangspunkt zu suchen, der eine Weiterent
wicklung erlaubt. Als typische Backtracking-Verfahren werden hier der Springerzug,
Wegsuche in einem Labyrinth und ein Rucksackproblem behandelt.
Mit dem Backtracking verwandt sind die Branch-and-Bound-Verfahren. Sie durch
mustem eine Vielzahl von Moglichkeiten (Branch) und fUhren aber nur eine beschrankte