Table Of ContentLeitfaden und Monographien
der In formati k
Bolch: Leistungsbewertung von Rechensystemen
mittels analytischer Warteschlangenmodelle
320 Seiten. Kart. OM 44,-
Brauer: Automatentheorie
493 Seiten. Geb. OM 62,-
Brause: Neuronale Netze
291 Seiten. Kart. OM 39,80
Oal Cin: Grundlagen der systemnahen Programmierung
221 Seiten. Kart. OM 36,-
Ooberkat/Fox: Software Prototyping mit SETL
227 Seiten. Kart. OM 38,-
Ehrich/GogollaiLipeck: Aigebraische Spezifikation abstrakter Datentypen
246 Seiten. Kart. OM 38,-
Engeler/Liiuchli: Berechnungstheorie fur Informatiker
2. Auf!. 120 Seiten. Kart. OM 28,-
Erhard: Parallelrechnerstrukturen
X, 251 Seiten. Kart. OM 39,80
Eveking: Verifikation digitaler Systeme
XII, 308 Seiten. Kart. OM 46,-
Guting: Datenstrukturen und Algorithmen
XII, 308 Seiten. Kart. OM 39,80
HeinemannIWeihrauch: Logik fur Informatiker
2. Auf!. VIII, 240 Seiten. Kart. OM 38,-
Hentschke: Grundzuge der Digitaltechnik
247 Seiten. Kart. OM 36,-
Hotz: Einfuhrung in die Informatik
548 Seiten. Kart. OM 52,-
Kiyek/Schwarz: Mathematik fUr Informatiker 1
2. Auf!. 307 Seiten. Kart. OM 39,80
Kiyek/Schwarz: Mathematik fUr Informatiker 2
X, 460 Seiten. Kart. OM 54,-
Klaeren: Vom Problem zum Programm
2. Auf!. 240 Seiten. Kart. OM 32,-
KollaiMolitor/Osthof: Einfuhrung in den VLSI-Entwurf
352 Seiten. Kart. OM 48,-
LoeckxlMehlhornlWilhelrn: Grundlagen der Programmiersprachen
448 Seiten. Kart. OM 48,-
Mathar/Pfeifer: Stochastik fUr Informatiker
VIII, 359 Seiten. Kart. OM 48,-
B. G. Teubner Stuttgart
Steffen Stock
KaIllerfelder Str. 16-18
D-47059 Duisburg
Tel. 0203/31 1899
Teubner StudienbOcher Informatik
N. Wirth
Systematisches Programmieren
Leitfaden der angewandten
Mathematik und Mechanik LAMM
Herausgegeben von
Prof. Dr. G. Hotz, SaarbrOcken
Prof. Dr. P. Kall, ZOrich
Prof. Dr. K. Magnus, MOnchen
Prof. Dr. E. Meister, Darmstadt
Band 17
Die LehrbOcher dieser Reihe sind einerseits allen mathematischen
Theorien und Methoden von grundsatzlicher Bedeutung fOr die An
wendung der Mathematik gewidmet; andererseits werden auch die
Anwendungsgebiete selbst behandelt. Die Bande der Reihe sollen
dem Ingenieur und Naturwissenschaftler die Kenntnis der mathema
tischen Methoden, dem Mathematiker die Kenntnisse der Anwen
dungsgebiete seiner Wissenschaft zuganglich machen. Die Werke
sind fOr die angehenden Industrie- und Wirtschaftsmathematiker, In
genieure und Naturwissenschaftler bestimmt, darOber hinaus aber
soli en sie den im praktischen Beruf Tatigen zur Fortbildung im Zuge
der fortschreitenden Wissenschaft dienen.
Systematisches
Programmieren
Eine EinfUhrung
Von Dr. Niklaus Wirth
Professor an der Eidg. Technischen Hochschule ZOrich
6. Auflage
Unveranderter Nachdruck der 5. Auflage
Mit 55 Figuren, 64 Ubungen und
zahlreichen Beispielen
B.G.Teubner Stuttgart 1993
Prof. Dr. Niklaus Wirth
Geboren in Winterthur, Schweiz. Von 1954 bis 1958 Studium an der Eidg. Tech
nischen Hochschule Zurich mit AbschluB als Dipl. EI.-Ing. Von 1959 bis 1960
Studium an der Universite Laval, Quebec, Canada, und Erlangung des Grades M.
Sc. Von 1960 bis 1963 Studium und anschlieBend Promotion an der University of
Califomia, Berkeley. Von 1963 bis 1967 Assistant Professor of Computer Science
an der Stanford University. Von 1967 bis 1968 Assistenzprofessor an der Univer
sitat Zurich. Seit 1968 Professor fUr Informatik an der Eidg. Technischen Hoch
schule Zurich. 1984 Turing Award der Association for Computing Machinery
(ACM).
ISBN-13: 978-3-519-02375-3 e-ISBN-13: 978-3-322-89538-7
DOI: 10.1007/978-3-322-89538-7
Die Deutsche Bibliothek - CIP-Einheitsaufnahme
Wirth, Niklaus: ..
Systematisches Programmieren : eine EinfUhrung ; mit 64 Ubungen
und zahlreichen Beispielen I von Niklaus Wirth. - 6. Aufl., unverand. Nachdr. -
Stuttgart: Teubner, 1993
(Leitfaden der angewandten Mathematik und Mechanik ; Bd. 17)
NE:GT
Das Werk einschlieBlich aller seiner Teile ist urheberrechtlich geschGtzt. Jede Ver
wendung auBerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne
Zustimmung des Verlages unzulassig und strafbar. Das gilt besonders fUr Verviel
faltigungen, Ubersetzungen, Mikroverfilmungen und die Einspeicherung und Ver
arbeitung in elektronischen Systemen.
© B. G. Teubner Stuttgart 1983
Gesamtherstellung: Druckhaus Beltz, Hemsbach/BergstraBe
Oberhaupt verhlilt es sich mit allen solchen Kalkiils so, daf> man
durch sie nichts leisten kann, was nicht auch ohne sie zu leisten
ware; der Vorteil ist aber der, daJ1 wenn ein solcher Kalkiil dem
innersten Wesen vielfach vorkommender Bediirfnisse korrespon
diert, jeder ... die dahin geharigen Aufgaben lasen, ja selbst in
so verwickelten Fiillen gleichsam mechanisch lasen kann, wo ohne
eine solche Hilfe auch das Genie ohnmachtig wird. So ist es mit
der Erfmdung der Buchstabenrechnung iiberhaupt, so mit der Dif
ferentialrechnung gewesen, ...
Es ist der Charakter der Mathematik in der neueren Zeit, daJ1
durch unsere Zeichensprache und Namensgebung wir einen Hebel
besitzen, wodurch die verwickeltsten Argumentationen auf einen
gewissen Mechanismus reduziert werden. An Reichtum hat da
durch die Wissenschaft unendlich gewonnen, an Schiinheit und
Soliditat aber, wie das Geschiift gewOOnlich betrieben wird, eben
soviel verloren. Wie oft wird jener Hebel eben nur mechanisch
angewandt, obwohl die Befugnis dazu in den meisten Fiillen ge
wisse stillschweigende Voraussetzungen impliziert. Ich fordere,
man soli bei aIIem Gebrauch des Kalkiils, bei allen Begriffsver
wendungen sich immer der urspriinglichen Bedingungen bewuJ1 t
bleiben und aile Produkte des Mechanismus niemals iiber die kla
re Befugnis hinaus als Eigentum betrachten.
C.F. Gatill, in Briefen an Schumacher Yom 15.5.1843 und 1.9.1850
Vorwort
Das Angebot an Lehrbtichern zum Programmieren in Computer-Sprachen alier Arten
ist enorm, und der erforderliche Aufwand, urn einen entsprechenden Lehrgang zu ver
fassen, ist durchaus nicht unbedeutend. Die Herausgabe dieses Studienbuches erfor
dert unter diesen UmsHinden eine Begriindung - fast sogar eine Rechtfertigung.
Es geht mir hier vor aliem darum, das Prograrnmieren als eine eigenstandige Disziplin,
als das systematische Konstruieren und Formulieren von Algorithrnen, einzuflihren.
Algorithmen sind Rezepte flir Klassen von Datenverarbeitungs-und Steuerungsprozes
sen im allgemeinsten Sinn. Sie solien solide Gebaude von logisch, zuverlassig und
zweckmafl,ig konzipierten Bausteinen darstelIen.
Der Sinn des Programmierers fill exaktes und methodisches Vorgehen solI vor allem
geschiirft werden durch die Betonung von Problemkreisen und Techniken, die fUr das
Programmieren an und fUr sich typisch sind, unabhangig vom Anwendungsgebiet, aus
dem eine bestimmte Programmieraufgabe gerade stammen mag. Aus diesem Grund
wird hier kein Anwendungsgebiet als Selbstzweck hervorgehoben; die Aufgaben und
Beispiele sind lediglich auf Grund ihrer Eignung zur Veranschaulichung,rtlgemeingiil
tiger Probleme und Losungsmethoden ausgewiihlt. Ebenfalls mehr in den Hintergrund
tretensolI die gewiihlte Programmiersprache; sie ist Werkzeug, aber nicht Endzweck.
Es solI nicht das vordringliche Anliegen eines Programmierkurses sein, Perfektion in
der Handhabung alIer Details einer spezifischen Sprache zu vermitteln. Die Sprache
oder Notation solI hingegen die wesentlichen und typischen Bestandteile von Algo
rithmen klar, verstandlich und auf nattirliche Weise widerspiegeln und auf die grundl&
genden Eigenschaften und Grenzen von digitalen Rechenanlagen Rticksicht nehmen.
Ferner habe ich versucht, die grundlegenden Ideen und Techniken der Programm
Verifizierung miteinzubeziehen. Es geht schliefl,lich beim Programmieren nicht darum,
lediglich einen einzelnen Rechenvorgang zu spezifizieren, sondern ganze Klassen von
Prozessen allgemeingiiltig als Algorithmen zu formulieren. Ein gewissenhafter Kon
strukteur mufl, aber darlegen konnen, dafl. sein Produkt die angepriesenen Eigenschaf
ten unter all e n Umstanden besitzt. Durch die in der Praxis tiblichen Methoden
des experimentellen Priifens von Prograrnmen wird aber lediglich eine Aussage tiber
einen einzelnen Rechenprozefl, gewonnen, nicht aber tiber das Programm als Reprasef}
tant der gesamten Klasse von Prozessen, die nach ihm abgewickelt werden konnen.
Urn verbindliche Aussagen tiber Programme machen zu konnen, ist daher eine analy
tische Verifikation unumganglich.
Durch Einbeziehen der Grundlagen der analytischen Programm-Verifikation ergeben
sich gewisse Erfordernisse an die Abstraktionsfahigkeit des Studenten, die tiber das
tibliche Niveau von gangigen Programmierkursen hinausgehen. Gewisse Bedenken tiber
die Eignung dieses Themas fUr einen Einflihrungskurs sind denn auch verschiedentlich
geiiufl,ert worden. Ich bin jedoch zur festen Dberzeugung gelangt, dafl. die hier behan
delten minimalen Grundlagen, die sich auf die Konzepte der Zusicherungen und der
8 Vorwort
Invarianten beschranken, von zentraler Bedeutung sind; sie gehoren daher im Lehr
gang des Programmierens an keinen anderen Ort als an den unmittelbaren Anfang. Sie
bilden den eigentlichen Kern fur das tiefere Verstandnis von Algorithmen, ohne das
dem Prograrnmierer keine andere Basis als die unzuHingliche Intuition fUr seine Arbeit
zur VerfUgung steht. Es wird damit klar, d~ dieses Studienbuch vor allem auf die Be
diirfnisse jener zugeschnitten ist, die das methodische Konstruieren von Algorithmen
und Computer-Prograrnmen als einen Bestandteil ihrer mathematischen Grundausbil
dung betrachten, und weit weniger jenen Lesem entgegenkommt, die lediglich hie und
da ein anfallendes Rechenproblem codieren und ihrem Computer anvertrauen moch
ten.
Als Grundlage der im vorliegenden Buch verwendeten Notation dient die 1960 ent
standene Programmiersprache ALGOL 60. Da£ sie nicht buchstabengetreu iibemom
men wurde, liegt darin begriindet, d~ das Programmieren ein wesentlich weiteres An
wendungsfeld besitzt als zu jener Zeit und daB eine Einftihrung nicht auf ein einzel
nes Anwendungsgebiet ausgerichtet werden solI. ALGOL 60 wurde vor allem fur das
Gebiet der Numerik entwickelt und gestattet die Formulierung von Programmen aus
anderen Problemkreisen oft nur unter unschonem MiBbrauch der Sprache. Aber gera
de der MiBbrauch von Werkzeugen fill Zwecke, fill die sie nicht ersonnen wurden, solI
im Unterricht vermieden und sicher nicht als nachahmenswertes Beispiel angepriesen
werden.
Meine Forderung nach einer Notation, in der sich Strukturen von Prozessen und von
Daten klar und systematisch darstellen lassen, beruht auf der Erfahrung, daB Program
mierer oft zeitlebens mit jener Sprache operieren, die sie als erste erlemt haben. Diese
Feststellung beruht nicht nur auf der viel zitierten menschlichen Bequemlichkeit, son
dem weit mehr auf dem Umstand, d~ die zuerst erlemte Sprache das Geriist darstellt,
an dem sich Gedanken konkretisieren, an dem sie Form annehmen, indem sie formu
liert werden. Mit der ersten Sprache erlemt man nicht nur ein Vokabular und eine
Grarnmatik, sondern man erschlieBt sich eine Gedankenwelt. Der Wahl dieser Sprache
ist daher besondere Sorgfalt zu widmen.
Die Vorbedingungen fUr diesen Kurs sind lediglich elementare Kenntnisse der Mathe
matik, wie sie an hOheren Schulen vermittelt werden. Speziell zu erwahnen sind die Ele
mente des logischen Prapositionskalkiils und das Konzept der rnathematischen Induk
tion. Einige Grundkenntnisse der Wahrscheinlichkeitsrechnung sind niitzlich, wmrend
die Infrnitesimalrechnung auBer in einigen Aufgaben (die iibersprungen werden kon
nen) nicht benotigt wird.
Ich lege stets groBen Wert auf Obungsaufgaben; ohne intensive Beschaftigung mit Auf
gaben ist das Programmieren nicht zu erlemen, denn es ist im wesentlichen eine kon
struktive, synthetisierende Tatigkeit, wo man viel aus eigener Erfahrung und Fehlem
lemt. Aufgabenstellungen sol1ten klar formuliert sein; ihr Zweck und das gewiinschte
Resultat sol1ten ohne aufwendigen mathematischen Formalisrnus ersichtlich sein,
einfach weil die Aufgabe an und fur sich sinnvoll ist. Der Zweck von Aufgaben ist vor
allern, den Studenten die Anwendung behandelter Konzepte und Techniken iiben zu
Vorwort 9
lassen, und nicht etwa, ihn mit einem verzwickten Ritsel zu konfrontieren, dessen
LOsung viel Zeit und sogar Erfahrung benotigt. Die am Ende jedes Kapitels angeftihr
ten Aufgaben mogen als Muster dienen; sie lassen sich beliebig variieren und erwei
tern.
Der Erfolg eines Prograrnmierkurses hiingt nach meiner Erfahrung entscheidend vom
lokalen Rechenzentrum abo Sind gewisse Minimalforderungen bezliglich Zugiinglich
keit und Bedienung nicht erfiillt, so verbreitet ein Programmierkurs allzu leicht Ent
tiiuschung und MiBmut. Vorerst sollte eine Reckenanlage zur Verfligung stehen, die
kleine Arbeiten sogleich annirnmt und erledigt. FUr Programme, die einen Rechner
wiihrend hochstens einiger Sekunden in Anspruch nehrnen und nur wenige Dutzend
Zeilen an Resultaten liefern, sollte stets eine Rlickgabezeit von hochstens einer Vier
telstunde garantiert werden. Die wichtigste Forderung, die an das verwendete Compi
ler-System gestellt werden muB, ist diejenige nach Verstiindlichkeit und Richtigkeit
der Antworten. Ganz besonders bei Anfangern bestehen diese Antworten selten aus
den erwarteten Rechenresultaten, sondern aus Mitteilungen liber entdeckte Fehler.
Das verwendete System muB diese Meldungen entweder in natUrlicher Sprache oder
in der zugrunde liegenden Prograrnmiernotation formulieren. Auf keinen Fall dUrfen
kryptische oder unbegriindete Meldungen eines Betriebssystems oder gar oktale oder
hexadezimale Speicherauszlige erscheinen. Nicht zum eigentlichen Programm geho
rende Anweisungen, z.B. an das Betriebssystem, solien auf ein Minimum reduziert
werden.
Dieses Buch entstand aus Vorlesungsnotizen; es ist unmoglich, fur alle Amegungen
namentlich zu danken. Mein besonderer Dank gebiihrt aber meinen Koliegen
E.W. D i j k s t r a (Eindhoven), C.A.R. H 0 are (Belfast) und P. N a u r (Ko
penhagen), deren ldeen nicht nur diesen Text, sondern das Gebiet des Programmie
rens liberhaupt tiefgreifend beeinfluBt haben. Mit groBer Dankbarkeit denke ich auch
an die Diskussionen mit H. Rut ish au s e r zuruck; als Begriinder der Idee der
Prograrnrniersprachen liberhaupt und als Mitautor von ALGOL 60 hat er wohl von
allen den groBten EinfluB ausgelibt. Und schlieBlich bin ich meinen Mitarbeitern
U. A m man n, E. Mar m i e r, und R. S chi 1 d dankbar fur ihre tatkriiftige
Unterstiitzung durch die Erstellung des PASCAL-Compilers, der den Beweis erbrachte,
daB die hier verwendete Notation nicht nur zur Konstruktion abstrakter Algorithrnen,
sondern auch zur Formulierung von effIzienten Programmen flir reelie Rechenanlagen
bestens geeignet ist.
Die zweite Auflage dieses Lehrbuches bot die willkommene Moglichkeit, den in der
Praxis gemachten Erfahrungen Rechnung zu tragen, die eine geringfugige Revision
der diesem Text zugrunde liegenden Programmiersprache PASCAL als wiinschenswert
erscheinen lieBen [12]. Die zweite Auflage wurde dementsprechend der revidierten
Sprache angeglichen. Es betraf dies die Abschnitte der File-Behandlung (Abschn. 10)
und der Prozedur-Parameter (Abschn. 12.3). 1m letzteren wurde der Konstanten
Parameter durch den von ALGOL her bekannten Werte-Parameter ersetzt. Eine kurze
10 Vorwort
GegenuberstelIung der drei allgemein bekannten Substitutions-Prinzipien wurde neu
in den Abschn. 12 aufgenommen. Die zweite Revision betraf die File-und vor alIem
die Textflle-Behandlung. Hier wurde das Postulat, daB ein Zeichensatz ein explizites
Zeilentrennzeichen aufweisen solI, fallen gelassen, was nicht unbedingt eine Verein
fachung, aber doch eine Angleichung an weitverbreitete Usanzen darstelIt.
Die dritte und vierte sowie die vorliegende ftinfte Auflage sind Nachdrucke der zwei
ten Auflage, bei der bekannt gewordene Druckfehler beseitigt wurden.
Zurich, im Herbst 1984 Niklaus Wirth