240 41 11MB
German Pages 167 [168] Year 1980
Niemeyer
de Gruyter Lehrbuch Programmieren in PASCAL
Gerhard Niemeyer
Einführung in das Programmieren in PASCAL mit Sonderteil UCSD-PASCAL-System
w DE
G
Walter de Gruyter Berlin New York 1980
Dr.rer.pol. Gerhard Niemeyer, o. Professor für Wirtschaftsinformatik an der Universität Regensburg
CIP-Kurztitelaufnahme der Deutschen Bibliothek Niemeyer, Gerhard: Einführung in das Programmieren in PASCAL: mit Sonderteil UCSD-PASCAL-System/Gerhard Niemeyer. - Berlin, New York: de Gruyter, 1980. (De-Gruyter-Lehrbuch) ISBN 3-11-008280-2 © Copyright 1980 by Walter de Gruyter & Co., vormals G. J. Göschen'sche Verlagshandlung, J. Guttentag, Verlagsbuchhandlung Georg Reimer, Karl J. Trübner, Veit & Comp., Berlin 30. Alle Rechte, insbesondere das Recht der Vervielfältigung und Verbreitung sowie der Übersetzung, vorbehalten. Kein Teil des Werkes darf in irgendeiner Form (durch Photokopie, Mikrofilm oder ein anderes Verfahren) ohne schriftliche Genehmigung des Verlags reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Printed in Germany. - Satz: Satzstudio Frohberg, Freigericht. - Druck: Karl Gerike, Berlin. - Bindearbeiten: Dieter Mikolai, Berlin.
Vorbemerkungen
Seit einigen Jahren macht das Schlagwort von der Strukturierten Programmierung die Runde. Mit dieser insbesondere von E.W. Dijkstra konzipierten Methode wird gegenüber dem herkömmlichen Vorgehen ein grundsätzlich neuer Ansatz zur Problemlösung im allgemeinen und zur Programmentwicklung im besonderen aufgezeigt. Das Neuartige besteht in einer hierarchisch-rekursiven Zerlegung eines Problems in Teilprobleme, und zwar solange, bis leicht überschaubare und lösbare Problemgrössen erreicht werden. Der bei der Zerlegung anzuwendende strenge Hierarchismus bietet die Gewähr, daß sich alle Teillösungen einer bestimmten Unterordnung zur Lösung des übergeordneten Problems zusammenfügen. Auf die Programmentwicklung Ubertragen ermöglicht dieses Konzept die Untergliederung einer Daten Verarbeitungsaufgabe von der allgemeinen Problemdefinition über Prozedurhierarchien bis hin zu den ausführenden Anweisungen einer Programmiersprache. Dabei sind die Prozeduren einer bestimmten Hierarchiestufe voneinander unabhängig, da ein Datenaustausch nur Uber die nächsthöhere Hierarchiestufe stattfindet. Daraus ergeben sich insbesondere bei hochkomplexen Datenverarbeitungsaufgaben folgende Vorteile gegenüber herkömmlichen „flow-chart"-Lösungen: (1) Die Programmentwicklung wird wegen der größeren Übersichtlichkeit und Unabhängigkeit der Teilprobleme erheblich beschleunigt. (2) Die Programmwartung wird wegen der besseren Lesbarkeit und Auffindbarkeit der zu ändernden Prozeduren wesentlich vereinfacht. (3) Die Übertragung von Teilaufgaben auf verschiedene Personen wird wegen der guten Integrierbarkeit erleichtert. Mit dem Aufkommen dieses Konzepts wurde allerdings deutlich, daß die meisten der gängigen Programmiersprachen keine unmittelbare Unterstützung für den strengen Hierarchismus im Programmaufbau bieten. Zwar können auch mit FORTRAN oder COBOL strukurierte Programme geschrieben werden; jedoch kann dies nur durch eine intensive Anwendung der Unterprogrammtechnik sowie über selbst auferlegte Beschränkungen bei der Anwendung von Sprunganweisungen erreicht werden. Neuere Sprachen erzwingen hingegen förmlich die hierarchische Strukturierung durch das Fehlen oder die Einschränkung von Sprunganweisungen in der Sprachdefinition, sowie durch die Möglichkeit der geschachtelten Prozedurdefinition.
6
Vorbemerkungen
Zu diesen neueren Entwicklungen gehört neben ELAN und ALGOL 68 vor allem die von Jensen und Wirth definierte Programmiersprache PASCAL. PASCAL hat dank der Aktivitäten der University of California/San Diego (UCSD) insofern eine gewisse Verbreitung gefunden, als dort ein komplettes Betriebssystem für PASCAL auf Mikrocomputersystemen entwickelt wurde. Diese Mikrocomputer werden in großen Stückzahlen verkauft und das UCSD-PASCALSystem ist mit Abstand das sicherste und komfortabelste Programmierinstrument in dieser Computerkategorie. Allmählich dringt PASCAL aber auch in die Domäne der größeren Computer ein, so daß zumindest an den meisten Hochschulrechenzentren PASCALCompiler verfügbar sind. Beim gegenwärtigen Definitions- und Implementierungsstand von PASCAL erscheint jedoch der in den USA verbreitete Optimismus ein wenig verfrüht, daß ALGOL, COBOL, PL/I und FORTRAN völlig ersetzt werden könnten. Hierzu bedarf es sicherlich noch eines weiteren Ausbaus u.a. bei den mathematischen Standardfunktionen, bei den Ein- und Ausgabeprozeduren und bei den Dateizugriffsmethoden. Andererseits ist zumindest das UCSD-PASCAL durch eine Schnittstelle zum ASSEMBLER so flexibel, daß fehlende Teile vom Benutzer selbst erzeugt werden können. Ziel des vorliegenden Lehrbuches ist es, eine einfache Einführung in die Sprache PASCAL zu geben; denn die Durchsicht der einschlägigen PASCAL-Publikationen hat gezeigt, daß PASCAL zumeist als esoterische Domäne der Informatiker begriffen wird. Der gewöhnliche Anwender wird i.d.R. durch die Kompliziertheit der Beispiele und durch den Formalismus bei der Sprachdefinition von der Benützung abgeschreckt oder gar ausgeschlossen. Der eigene Umgang mit dieser Sprache hat indessen erwiesen, daß PASCAL zu den am leichtesten erlernbaren Programmiersprachen gehört, sofern man sich mit dem für normale betriebswirtschaftliche und wissenschaftliche Anwendungen erforderlichen Niveau begnügt. Eben dieses Niveau wird im folgenden angestrebt und zwar in der Absicht, PASCAL und das Konzept der strukturierten Programmierung einem möglichst großen Benutzerkreis zu erschließen. Zugleich besteht die Absicht, eine solide Basis für ein vertieftes Studium dieser Sprache zu schaffen. Der Leser soll durch Programmbeispiele zu allen wichtigen Sprachelementen zum Selbststudium angeregt werden. Die Beispiele sind bewußt einfach gehalten, um die Aufmerksamkeit direkt auf die Sprache lenken zu können. Femer wird auf die nur Informatikern geläufige Backus-Notation verzichtet, denn es erscheint didaktisch nicht sinnvoll, dem Anfänger das Erlernen einer Sprache nur über das Erlernen einer formalen Metasprache zu gestatten.
Vorbemerkungen
7
Schließlich werden die anspruchsvollen Datentypen SET und POINTER nicht behandelt, weil deren Anwendungen das Niveau einer Einfuhrung bei weitem überschreiten. Besonderes Augenmerk wird indessen auf die hierarchische Strukturierung der Programme gelegt. Dazu wird eine an meinem Lehrstuhl entwickelte Variante der Nassi-Shneiderman-Diagramme verwendet, die den Vorzug einer flexibleren graphischen Gestaltung bietet. Sicherlich kann das Anliegen der Strukturierung wegen der Einfachheit der Beispiele nicht voll überzeugend dargestellt werden. Es muß also an die Phantasie und die Kreativität des Lesers appelliert werden, sich die abgedruckten Programme als Teillösungen komplexerer Datenverarbeitungsaufgaben vorzustellen und die Inhalte einzelner Strukturblöcke durch Abwandlung und Erweiterung zu komplizieren. Im letzten Teil dieses Buches findet sich eine Darstellung der wichtigsten Optionen des UCSD-PASCAL-Systems in Form einer Benutzeranleitung; insbesondere werden der Editor und das Dateisystem behandelt. Damit werden für die Benutzer dieses Systems die Voraussetzungen für einen unmittelbaren Einstieg in das Selbststudium geschaffen. An dieser Stelle möchte ich meinen Mitarbeitern Fräulein Gutschmidt, Fräulein Riegger und Herrn Kammermeier für ihre Unterstützung bei der Entwicklung und Erprobung der Programmbeispiele danken. Anerkennung gebührt insbesondere auch meinem Assistenten, Herrn Dr. Ferstl, für die Entwicklung des o.g. Struktogrammkonzepts. Schließlich möchte ich meiner Sekretärin Fräulein Thumser für ihre Geduld bei der „iterativen" Herstellung des druckreifen Manuskripts danken. Regensburg, im Februar 1980
Gerhard Niemeyer
Inhalt
1. Der Aufbau von PASCAL-Programmen
13
2. Der 2.1 2.2 2.3
18 18 18 20 20 20 21 21 21 22 22 24 25 27 27 29 29 31 32 33 34
3. Der Ablaufteil von PASC AL-Programmen 3.1 Ausdrücke 3.1.1 Aufruf von Konstanten, Variablen und Funktionen 3.1.1.1 Konstantenaufruf 3.1.1.2 Variablenaufruf 3.1.1.3 Funktionsaufruf 3.1.2 Arithmetische Ausdrücke 3.1.2.1 INTEGER-Ausdrücke 3.1.2.2 REAL-Ausdrücke 3.1.3 Boolesche Ausdrücke 3.1.4 Sonstige Ausdrücke 3.2 Wertzuweisungen 3.3 Alternative Programmzweige 3.3.1 Die GOTO-Anweisung
39 39 39 39 39 43 45 45 46 47 50 51 52 52
Definitionsteil von PASC AL-Programmen Labeldefinition Konstantendefinition Typendefinition 2.3.1 Einfache Typen 2.3.1.1 Der Typ BOOLEAN 2.3.1.2 Der Typ INTEGER 2.3.1.3 Der Typ REAL 2.3.1.4 Der Typ CHAR 2.3.2 Komplizierte Typen 2.3.2.1 Der Aufzählungstyp 2.3.2.2 Der Ausschnittstyp 2.3.2.3 Der Feldtyp 2.3.2.4 Der String-Typ 2.3.2.5 Der Satztyp 2.3.2.6 Der Dateityp 2.4 Variablendefinition 2.5 Definition von Prozeduren und Funktionen 2.5.1 Definitionsanweisungen 2.5.2 Definitionskörper 2.5.3 Hierarchische Definitionen
10
Inhalt
3.3.2
Die IF-Anweisung 3.3.2.1 Die unechte Alternative 3.3.2.2 Die echte Alternative 3.3.2.3 Geschachtelte IF-Anweisungen 3.3.3 Die CASE-An Weisung 3.4 Programmschleifen 3.4.1 Die FOR-An Weisung 3.4.2 Die WHILE-Anweisung 3.4.3 Die REPEAT-Anweisung 3.5 Datentransfer, Datenhaltung 3.5.1 Standardein/ausgabe 3.5.1.1 Die READ-An Weisung 3.5.1.2 Die READLN-Anweisung 3.5.1.3 Die WRITE-Anweisung 3.5.1.4 Formatierte Ausgabe 3.5.1.5 Die WRITELN-Anweisung 3.5.2 Dateibehandlung 3.5.2.1 Die REWRITE-Anweisung 3.5.2.2 Die RESET-Anweisung 3.5.2.3 Die SEEK-Anweisung 3.5.2.4 Die GET-Anweisung 3.5.2.5 Die PUT-Anweisung 3.5.2.6 Die CLOSE-An Weisung 3.5.2.7 Dateibehandlung mit READ und WRITE 3.6 Prozeduraufrufe 3.6.1 Aufrufformate 3.6.2 Hierarchische, lineare und rekursive Aufrufe 4. SONDERTEIL: Das UCSD-PASCAL-SYSTEM 4.1 Systemspezifikation 4.1.1 Ein/Ausgabeeinheiten (volumes) 4.1.2 Dateitypen 4.1.3 Dateispezifikation 4.1.4 Arbeitsdatei (work file) 4.1.5 Start und Handhabung des Systems 4.2 Editor 4.2.1 Insert 4.2.2 Adjust 4.2.3 Exchange 4.2.4 Delete 4.2.5 Zap 4.2.6 Copy
53 54 55 57 65 70 70 74 76 78 79 79 81 84 85 87 89 89 90 90 91 91 92 96 97 97 99 105 105 105 106 107 107 108 108 110 Ill 112 112 113 113
Inhalt
4.2.7 Set 4.2.8 Jump 4.2.9 Page 4.2.10 Find 4.2.11 Replace 4.2.12 Quit 4.3 File Handler 4.3.1 Volumes 4.3.2 List directory 4.3.3 Extended list directory 4.3.4 Zero 4.3.5 Date 4.3.6 Prefix 4.3.7 Make 4.3.8 Kiunch 4.3.9 Bad Blocks 4.3.10 Examine 4.3.11 Change 4.3.12 Transfer 4.3.13 Remove 4.3.14 Get 4.3.15 Save 4.3.16 What 4.3.17 New 4.3.18 Quit 4.4 Programmausführung 4.4.1 Der PASCAL-Compiler 4.4.1.1 Wirkungsweise und Handhabung 4.4.1.2 Fehlermeldungen des Compilers 4.4.1.3 Compiler Optionen 4.4.2 Der PASCAL-Linker 4.4.3 Der PASCAL-Loader 4.4.4 Die RUN-Funktion 4.5 Unterprogrammtechnik 4.5.1 Unterprogrammarten 4.5.2 Bibliotheksdienst 4.5.2.1 Das Einrichten von Bibliotheken 4.5.2.2 Das Aktualisieren von Bibliotheken 4.5.3 Units 4.5.3.1 Die Definition von Units 4.5.3.2 Die Benutzung von Units 4.5.4 Segments (Overlay)
11
114 114 115 115 116 117 118 119 119 120 121 122 122 123 124 125 125 127 127 129 129 130 131 131 131 131 131 131 133 135 137 139 139 140 140 140 141 143 145 145 147 148
12
Inhalt
4.5.5
ANHANG A ANHANG B
Einige UCSD-PASCAL-Unterprogramme 4.5.5.1 STRING-Prozeduren 4.5.5.2 CHAR-Prozeduren
150 150 154
Tabelle der PASCAL-Standard-Funktionen Tabelle des ASCII-Code
158 159
Literatur Sachregister Sachregister Sonderteil UCSD-PASCAL
161 162 165
1. Der Aufbau von PASCAL-Programmen
Der grundsätzliche Aufbau eines PASCAL-Programms läßt sich im folgenden Schema darstellen: PROGRAM rnrne-, Definitionsteil BEGIN Ablauf teil END. Für die häufig parallel zum Code angegebene Struktogrammdarstellung soll jede zwischen BEGIN und END eingeschlossene Anweisungsfolge als Block bezeichnet und graphisch als Rechteck dargestellt werden.
block
Gelegentlich werden auch einzelne Anweisungen als Blöcke gezeichnet. Es soll ferner vereinbart werden, sämtliche Programmwörter, die den Ubersetzungsvorgang steuern (reserved words), in Großbuchstaben und sämtliche Benutzerwörter in Kleinbuchstaben zu notieren. Metasprachliche Benutzerwörter (Erklärungen für Benutzerwörter in Schemata oder Formatbeschreibungen) werden kursiv geschrieben. Zu den nachfolgenden zahlreichen Programmbeispielen ist anzumerken, daß diese wegen der stets angestrebten Lauffähigkeit i.d.R. dem im Text erreichten Definitionsstand vorauseilen. Es wird jedoch immer auf die Punkte des Programms hingewiesen, auf die es in der betreffenden Situation ankommt. Programmbeispiel: PROGRAM learnl»{bottom up - Entwurf VAR operandrsumme»Produkt J REAL»
(l-stufiä)>
BEGIN WRITELN ('bitte Operand eingeben !')» READLN (Operand)» summe 2= operarid + 10» Produkt != Operand # 10» WRITELN ('SUMME = '»summe)« WRITELN ('PRODUKT = '»Produkt)! END.
1. Der Aufbau von PASCAL-Programmen
14
Die Zeichenfolge „{bottom up-Entwurf (1 -stufig)}" ist ein Kommentar, der für den Ubersetzungsvorgang ohne Wirkung ist und lediglich der Programmdokumentation dient. Kommentare können in beliebiger Zahl und an beliebigen Stellen eines Programms stehen. Struktogramm: Bottom up-Entwurf (ein-stufig) Stufe 1 learnl
Das Programm learnl zeigt die drei Grundphasen jeder vollständigen Datenverarbeitungsaufgabe, nämlich die Eingabe, die Verarbeitung und die Ausgabe. Der Definitionsteil besteht in diesem Beispiel nur aus der Variablenerklärung. Allgemein kann der Definitionsteil jedoch folgende Komponenten enthalten: (1) Labelerklärungen (2) Konstantenerklärungen (3) Typenerklärungen (4) Variablenerklärungen (5) Prozeduren, Funktionen Eine rekursive hierarchische Zerlegung einer Datenverarbeitungsaufgabe wird dadurch ermöglicht, daß für die unter (5) genannten Prozeduren und Funktionen wiederum das gleiche Aufbauschema gilt wie für das Programm. PROCEDURE name; Definitionsteil BEGIN Ablaufteil END;
FUNCTION name: typ; Definitionsteil BEGIN Ablauf teil END;
Ein geringfügiger Unterschied besteht lediglich darin, daß eine Prozedur bzw. Funktion mit einem ";", während ein Programm mit einem "." endet. Programmbeispiel: PROGRAM learn2r-Cbottom up - Entwurf WAR operand»sumnie»produk.t ! REAL»
>
PROCEDURE eingeben? BEGIN WRITELN »
1. Der Aufbau von PASCAL-Programmen Produkt end;
15
5= o p e r a n d # 10»
PROCEDURE aussehen» BEGIN U R I T E L N ('SUMME = URITELN ('PRODUKT = end;
'»summe)» '»Produkt)i
BEGIN eingeben » verarbeiten» aussehen » END.
Struktogramm: Bottom up-Entwurf (zwei-stufig) Stufe 1
Stufe 2
Das Programm learn2 zeigt, wie die drei Grundphasen Eingabe, Verarbeitung und Ausgabe als Prozeduren vereinbart und im Ablaufteil des Programms aufgerufen werden. Struktogrammtechnisch ergeben sich drei Blöcke, die sich in einer sequentiellen Anordnung befinden; und es gilt die Konvention, daß diese in der angegebenen Reihenfolge durchlaufen werden. Programmbeispiel : P R O G R A M learn3»-Cbottom uP - E n t w u r f ( 3 - s t u f i ä ) > VAR O p e r a n d » s u m m e » P r o d u k t ! REAL» PROCEDURE eingeben» BEGIN U R I T E L N ('bitte O p e r a n d e i n g e b e n R E A D L N (Operand)» END» PROCEDURE
verarbeiten»
• ')»
16
1. Der Aufbau von PASCAL-Programmen
PROCEDURE addieren» BEGIN summe 5= operand + 10» END» PROCEDURE multiplizieren» BEGIN P r o d u k t 5= o p e r a n d # 10» end; BEGIN addieren» multiplizieren» END» PROCEDURE ausgeben» BEGIN URITELN ('SUMME = '»summe)» WRITELN ('PRODUKT = ' » P r o d u k t ) ? end; BEGIN eingeben» verarbeiten; ausgeben» END.
Struktogramm: Bottom up-Entwurf (drei-stufig) Stufe 1
Stufe 2
Stufe 3
Das Programm learn3 zeigt dasselbe Problem in einer dreistufigen Hierarchie. Eine Vorgehensweise, die zunächst die prozedurale Zerlegung eines Problems und ganz zum Schluß die unterste Anweisungsebene realisiert, nennt man top down-Methode. Umgekehrt nennt man ein Vorgehen, das von der untersten Anweisungsebene ausgehend allmählich zu einem hierarchischen Programmaufbau gelangt bottom up-Methode. In der Praxis werden beide Methoden der Strukturierung in beliebiger Folge und auf beliebigen Zerlegungsstufen eines Problems gemischt. Die bevorzugte Richtung sollte jedoch stets „top down" sein, weil man
1. Der Aufbau von PASCAL-Programmen
17
hiermit am schnellsten zu einer sauberen Struktur gelangt. Da jedoch die Abschätzung der Komplexität der einzelnen Prozeduren i.d.R. schwerfallt, wird man häufig erst bei der Realisierung auf Anweisungsebene die Notwendigkeit einer weiteren Problemzerlegung erkennen und dann als Korrekturphase die bottom up-Richtung einschlagen. Die bisherigen Programmbeispiele zeigen in der Reihenfolge learnl, learn2, learn3 ein reines bottom up-Verfahren. Die nachfolgenden Codebeispiele zeigen dagegen die zwei Vorphasen des Programmbeispiels learn3 bei reiner top downKonstruktion: 1. Phase (nicht lauffähig) PROGRAM
learn3»
BEGIN eingeben» verarbeiten» ausgeben? END.
2. Phase (nicht lauffähig) P R O G R A M learri3»-Ctop d o w n - E n t w u r f ( 2 . P h a s e ) > VAR operand»summe»Produkt 5 REAL» PROCEDURE eingeben» BEGIN URITELN ('bitte operand eingeben READLN (operand)» END»
!')»
PROCEDURE verarbeiten» BEGIN addieren» multiplizieren» END» PROCEDURE ausgeben» BEGIN = URITELN ('SUMME URITELN ('PRODUKT = END»
'»summe)» '»Produkt)»
BEGIN einäeben» verarbeiten» ausgeben» END.
Die dritte Phase ist identisch mit der dritten Stufe des zuvor beschriebenen bottom up-Entwurfs.
2. Der Definitionsteil von PASCAL-Programmen
Definitionen müssen in der nachfolgend angegebenen Reihenfolge vorgenommen werden. (1) Labeldefinitionen (2) Konstantendefinitionen (3) Typendefinitionen (4) Variablendefinitionen (5) Prozeduren, Funktionen Einzelne Definitionsarten können fallweise fehlen. Für die Namensbildung bei Kohstanten, Typen, Variablen, Prozeduren und Funktionen gelten im UCSD-PASCAL-System folgende Regeln: Ein Name kann beliebig viele Zeichen (Buchstaben, Ziffern) haben, von denen allerdings nur die ersten 8 signifikant sind. Das erste Zeichen muß ein Buchstabe sein; Sonderzeichen dürfen nicht verwendet werden.
2.1 Labeldefinition Label sind Sprungadressen im Ablaufteil eines Programms oder einer Prozedur, die mit einer GOTO-Anweisung erreicht werden können (siehe S. 52f.). Die Sprungadressen müssen im Definitionsteil mit Hilfe der LABEL-Anweisung vereinbart werden. Das allgemeine Format lautet: LABEL Liste der Sprungadressen; Die Sprungadressen dürfen nur voizeichenlose ganze Zahlen sein. Treten mehrere auf, so sind sie durch Kommata zu trennen. Codierbeispiel: LABEL
l»2»5,999i
2.2 Konstantendefinition Konstanten sind Werte, die bei den Definitionen oder im Ablaufteil eines Programms verwendet werden und ihre Werte stets unverändert beibehalten. Konstanten können entweder durch Wertangabe unmittelbar oder im Definitionsteil durch Zuordnung zu frei wählbaren Namen vereinbart werden. Zur Namensbildung siehe oben.
2.2 Konstantendefinition
19
Im ersten Fall spricht man von direkten Konstanten und im zweiten von indirekten Konstanten. Indirekte Konstanten können unter ihrem Namen aufgerufen werden; dabei kann sich ein Codiervorteil ergeben, wenn eine Konstante von erheblicher Länge, der Name hingegen kurz und die Verwendung häufig ist. Andernfalls empfiehlt sich die Anwendung von direkten Konstanten. PASCAL kennt folgende Konstantentypen: Ganzzahlige, reelle, boolesche und Zeichen-Konstanten. Das UCSD-PASCAL-System bietet darüberhinaus noch Zeichenketten-Konstanten (string-Konstanten). Die Erzeugung indirekter Konstanten geschieht durch eine CONST-Anweisung. Das allgemeine Format lautet: CONST
kname i = wert1 •,...; kmmen = wertn;
Codierbeispiel: CDNST x = 31745» neäx = - x i e 2.7183» on TRUE» o f f = FALSEi mesä ' u n z u l a e s s i ä e r Operand»Einäabe
wiederholen'»
Im obigen Beispiel sind „x" und „negx" ganzzahlige, „e" eine reelle, „on" und „off" boolesche und „mesg" eine string-Konstante. Der Typ wird durch die Wertzuweisung festgelegt; besonderer Typenerklärungen bedarf es nicht. Beachtenswert ist, daß „negx" bereits die unmittelbar vorausgehende Definition benutzen kann. Manche PASCAL-Implementierungen liefern häufig vorkommende Konstanten wie e, 11, etc., gleich als Systemkonstanten, d.h. eine Vereinbarung ist nicht erforderlich. Eine häufig implementierte Systemkonstante ist ferner MAXINT, die die größtmögliche ganze Zahl des betreffenden Rechners angibt. Programmbeispiel: PROGRAM l e a r n 4 » { D e f i n i t i o n u . Verwendung von K o n s t a n t e n } CONST a = 10000 i b = 0 . 0 0 1 » c = 'INTEGER'» d = 'REAL 'f e = ' - KONSTANTE '» UAR v a r i n t : INTEGER» v a r r e a l J REAL» v a r c h a r ! CHAR» BEGIN varchar URITELN WRITELN varint varreal URITELN WRITELN END
i= ' • ' » ;2fx3»t ! REAL 5 END;
c ) TYPE werte = FILE OF ARRAY C1..1003 OF REALi
Mit jedem Schreib- (Lese-)befehl würde im Falle a) ein Kundensatz gemäß Definitionsbeispiel auf S. 28, im Falle b) ein Meßdatensatz bestehend aus den Teiltypen „messung", „Xi", „ x 2 " , „ x 3 " , „ t " und im Falle c) ein Datenfeld mit 100 REAL-Elementen geschrieben (gelesen).
2.4 Variablendefinition Variablen sind Datenfelder, denen im Gegensatz zu den Konstanten während eines Programmablaufs Werte zugewiesen werden können. Variablen werden durch Vergabe eines Namens und die Zuordnung eines Typs definiert. Das allgemeine Format der Definitionsanweisung lautet: VAR vnamex : typ i ; . . . ; vname„ : typn \
2. Der Definitionsteil von PASCAL-Programmen
30
Zur Namensbildung (vgl. S. 18). Die Typen können zuvor definierte Benutzertypen oder Systemtypen sein. Im ersten Fall spricht man von indirekter und im zweiten von direkter Typenvereinbarung (vgl. S. 20). Codierbeispiele: (indirekte Typenvereinbarung) a ) TYPE t y p l t«p2 tap3 t«p4 WAR
= = = =
varl var2 var3 var4
INTEGERi REAL; ( b 7 r b6» t i 5 > b 4 r b 3 r b 2 » b l ibO) i b5..b3r
: taplf : t«p21 t tap3i i tap4f
b ) TYPE s a t z = RECORD nurnmer name adresse saldo END;
INTEGER? STRING C243 R ARRAY CI..243 OF CHAR; REAL I
WAR k ü n d e 5 s a t z î lieferî satzî C) TYPE d a t e i
= FILE OF RECORD Hummer name adresse saldo END;
WAR k u n d e n d a t e i 1ieferdatei
INTEGER; STRING [243; ARRAY CI..243 OF CHAR; REAL;
datei; datei;
Codierbeispiele: (direkte Typenvereinbarung) d ) WAR v a r i var2 var3 var4 f ) WAR k u n d e
: i : •
INTEGER; REAL;
STRINGC33 i STRINGC24]F REAL;
Indexn].
42
3. Der Ablaufteil von PASCAL-Programmen k u n d a t e i = FILE OF k u n d s a t z » VAR k u n d e n d a t e i ! k u n d a t e i » einrrauf1 : STRINGC13» PROCEDURE e i n r i c h t e n » LABEL l » 2 i WAR k ü n d e ' k u n d s a t z » BEGIN REWRITE(kundendatei»'*5JKUNDEN')» WITH k ü n d e DO BEGIN 1ÎWRITE('NUMMER : ' ) * READLN(knr)i IF k n r = ' 9 9 9 ' THEN GOTO 2f WRITECNAME ! ')» READLN(name)» WRITE('SALDO : 'Ii READLN(saldo)» 2 { k u n d e n d a t e i " 5= künde» PUT » IF k n r ' 9 9 9 ' THEN GOTO 1» END» C L O S E ( k u n d e n d a t e i »LOCK)» END» PROCEDURE a u f l i s t e n » LABEL BEGIN RESET(kundendatei»'*5:KUNDEN')9 15 IF k u n d e n d a t e i " . k n r < > ' 9 9 9 ' THEN BEGIN WRITELN(kundendatei".knr)» URITELN(kunderid3tei".riame> » WRITELN(kundendatei".saldo)» GET(kundendatei)» GOTO 1» END» C L O S E ( k u n d e n d a t e i » LOCK)f END» BEGIN WRITE('EINRICHTEN ? (a/n)')» READLN(einr)» IF e i n r = ' u ' THEN e i n r i c h t e n » WRITE('VERARBEITEN ? ( u / n ) ' ) i READLN(aufl)f IF a u f l = ' a ' THEN a u f l i s t e n » END.
Das P r o g r a m m l e a m l l zeigt die D e f i n i t i o n u n d d e n A u f r u f verschiedener Var i a b l e n t y p e n sowie den A u f r u f d i r e k t e r K o n s t a n t e n des T y p s C H A R ( S T R I N G ) . I n s b e s o n d e r e wird die H a n d h a b u n g von Satz- u n d Dateivariablen sowie die Anw e n d u n g der WITH-Anweisung vorgeführt. Bei der WITH-Anweisung ist zu b e a c h t e n , d a ß sie n u r für Satzvariablen zulässig ist, so d a ß in der P r o z e d u r „ e i n r i c h t e n " der Inhalt d e r Satzvariablen „ k ü n d e " an die Dateivariable „ k u n d e n d a t e i " übergeben w e r d e n m u ß .
3.1 Ausdriicke
3.1.1.3
43
Funktionsaufruf
Der Aufruf einer Funktion geschieht durch Nennung des im Definitionsteil mit der FUNCTION-Anweisung vereinbarten Namens, der gegebenenfalls von einer Liste aktueller Parameter gefolgt wird. Der Funktionsname ist eine symbolische Adresse, die bei der Übersetzung in eine Arbeitsspeicheradresse umgewandelt wird. Durch den Funktionsaufruf erfolgt eine Programm Verzweigung in die betreffende Routine und es wird normalerweise der Funktionswert an dieser Adresse zur Verfügung gestellt. Das allgemeine Aufrufformat lautet: funktionsname (Liste der aktuellen Parameter) bzw. funktionsname Die aktuellen Parameter sind Ausdrücke, wenn die entsprechenden formalen Parameter als Wertparameter vereinbart wurden; sie sind Variablennamen, wenn die entsprechenden formalen Parameter als Variablenparameter vereinbart wurden. Ausführliche Betrachtungen hierzu finden sich auf S. 98f.; Codierbeispiel: Gegeben sei folgende Funktionsdefinition: FUNCTION func(wl,w2: REAL, VAR v3: REAL): REAL; BEGIN
END; Dann könnte ein Aufruf dieser Funktion wie folgt lauten: wert:= func(3+v[i,j], wert*7, zahl); Man beachte, daß für die formalen Wertparameter wl, w2 als aktuelle Parameter Ausdrücke eingesetzt werden müssen, während für den formalen Variablenparameter v3 der aktuelle Parameter ein Variablenname sein muß: ,,v[i,j]" ist der Aufruf einer Variablen und „wert" der Aufruf einer Konstanten, dagegen ist „zahl" ein Variablenname. Programmbeispiel:
PROGRAM CONST TYFE VAR
learnl2!-CFuriktionsauf rufe am Beispiel • Mittelwert} wert = Ii vector = ARRAYC1..10D OF REAL! anzahl 5 INTEGER! xauernnittelwertrsumx ! REAL! x t vector!
FUNCTION mittel (inmax ! INTEGER! VAR xi : vector! VAR summe : REAL) : REAL!
44
3. Der Ablaufteil von PASCAL-Programmen VAR i t INTEGERi BEGIN summe J= 0.0» FOR i := 1 TO inmax DO summe ' = summe + xitili m i t t e l J = summe/inmaxi END» PROCEDURE einäabe(UAR i : INTEGER)i LABEL lf VAR i n p u t : REALi BEGIN WRITELNi i := i:URITEf READLN (operndl)»
3.3 Alternative Programmzweige URITELN C b i t t e operand2 einaeben')» READLN (opernd2)i URITELN C b i t t e operator einaeben')» READLN (operator)» IF o p e r a t o r = ' + ' T H E N B E G I N a d d i e r e n f END.
55
ausgebenr
END J
Struktogramm: Zulässiger Operator
Das Programm learnl7 fuhrt die Prozeduren „addieren" und „ausgeben" nur aus, wenn der boolesche Ausdruck ,,operator='+'" den Wert TRUE hat; andernfalls endet es ohne Ergebnis.
3.3.2.2 Die echte Alternative Das allgemeine Format lautet: IF boolescher ausdruck THEN bbckl ELSE block2; Die Wirkung ist folgende: Der Block block 1 wird ausgeführt, wenn boolescher ausdruck den Wert TRUE hat, und block2 wird ausgeführt, wenn boolescher ausdruck den Wert FALSE
56
3. Der Ablaufteil von PASCAL-Programmen
hat. Das Programm geht in beiden Fällen mit der auf block2 folgenden Anweisung weiter, bzw. endet, wenn IF die letzte Anweisung ist, bzw. verzweigt, wenn einer der Blöcke eine GOTO-Anweisung enthält. Die echte Alternative ist immer dann anzuwenden, wenn im FALSE-Fall ein Programmzweig durchlaufen werden soll, der im TRUE-Fall nicht durchlaufen werden darf. Für die Struktogrammkonstruktion ist folgende Symbolik vorgesehen:
Programmbeispiel:
PROGRAM learnl8» •CTest auf zulaessiäen Operator mit Korrektureinäabe> LABEL Ii VAR resultfOPerndliOPernd2 5 REAL! operator ! CHAR» PROCEDURE addiereni BEGIN result S= operndl + opernd25 END» PROCEDURE ausgeben; BEGIN URITELN » END.
Struktogramm: Zahlen kumulieren (IF . . . AND . . . E L S E )
59
3. Der Ablaufteil von PASCAL-Programmen
60
Das Programm learnl9 soll eingelesene Operanden kumulieren und bei Erreichen oder Überschreiten des Wertes 100 abbrechen. Damit diese Aufgabe erfüllt werden kann, werden nur positive Operanden und nur Operanden kleiner 100 akzeptiert. Diese Bedingungen werden in einer I F . . . A N D . . . ELSE-Konstruktion formuliert. Bei Eingabe unzulässiger Operanden wird zur Eingaberoutine zurückgesprungen. Form 2: IF bool.ausdr.1 THEN block ELSE IF bool.ausdr.2 THEN block ' ELSE IF boolausdr.n
THEN block;
Der Block block wird ausgeführt, sobald ein boolescher Ausdruck mit dem Wert TRUE entdeckt wird. Die Konstruktion wird danach sofort verlassen, ohne die gegebenenfalls noch folgenden IF-Anweisungen zu durchlaufen; dabei wird entweder im „weiter"-Zweig oder, falls block eine GOTO-Anweisung enthält, am Sprungziel fortgefahren. Wenn bis zum Ende der Folge kein boolescher Ausdruck mit dem Wert TRUE entdeckt wird, fährt das Programm ohne die Ausführung von block im „weiter"Zweig fort. Diese Form entspricht einer OR-Verknüpfung der booleschen Ausdrücke 1 bis n und ist äquivalent mit der Form
IF(bool.ausdr.1)
OR/bool.ausdr.2)
OR . . .
OR(bool.ausdr.n) THEN block-,
3.3 Alternative Programmzweige
61
Programmbeispiel : •C»G+> PROGRAM l e a r n 2 0 » < Z a h l e n k u m u l i e r e n LABEL l î VAR o p e r a n d » r é s u l t a t : REAL»
( I F . .OR. .ELSE)>
BEGIN r é s u l t a t i= 0 . 0 » 1.URITELN ( ' b i t t e o p e r a n d e i n d e b e n : ' ) » READLN < ope r a n d ) » IF ( o p e r a n d = 1 0 0 . 0 ) THEN BEGIN URITELN ('OPERAND UNZULEASSIG')f GOTO l i END ELSE BEGIN r é s u l t a t 5= r é s u l t a t + o p e r a n d » URITELN ('RESULTAT = ' » r é s u l t a t ) » IF r é s u l t a t < 1 0 0 . 0 THEN GOTO 1» END» URITELN ('PROGRAMMENDE')! END.
Das P r o g r a m m l e a r n 2 0 realisiert dieselbe D a t e n Verarbeitungsaufgabe wie l e a m l 9 , diesmal aber m i t einer I F . . . O R . . . E L S E - K o n s t r u k t i o n . Man b e a c h t e die U m k e h r u n g der relationalen O p e r a t i o n e n u n d der Blockfolge.
S t r u k t o g r a m m : Zahlen k u m u l i e r e n ( I F . . . O R . . . E L S E )
3. Der Ablaufteil von PASCAL-Programmen
m 3:
IF bool.ausdr.1 THEN bbckl ELSE IF bool.ausdr.2 THEN block2
ELSE IF boolausdr.n THEN block n ELSE block n+1
3.3 Alternative Programmzweige
63
Die Form 3 ist aus der Form 2 abgeleitet, indem in den TRUE-Zweigen statt des einen Blocks block die Blöcke blockl bis block n ausgeführt werden. Ferner gibt es noch einen ELSE-Zweig mit dem Block block n+1. Diese Konstruktion kann zur alternativen Ausführung n+1 verschiedener Programmzweige benutzt werden; denn es wird auf jeden Fall ein Block ausgeführt. Sobald ein Block ausgeführt ist, wird die Konstruktion verlassen und entweder im „weiter"-Zweig oder an einem Sprungziel fortgefahren. Programmbeispiel : {•G+> PROGRAM learn21 i-COperatorauswahl} LABEL 1> VAR result»operndl»opernd2 ! REAL; operator { CHARr PROCEDURE addieren* BEGIN result '= operndl + opernd2» END; PROCEDURE multiplizieren; BEGIN result '= operndl # opernd2ì END; PROCEDURE ausgeben; BEGIN URITELN ('RESULTAT = '.result)» END; PROCEDURE fehlmeldr BEGIN URITELN ('OPERATOR UNZULAESSIG» EINGABE WIEDERHOLEN'); END; BEGIN URITELN ('bitte operandi eingeben ')» READLN (operndl); URITELN ('bitte operand2 eingeben')» READLN (opernd2)» 1'URITELN ('bitte operator eingeben'); READLN (operator); IF operator = '+' THEN addieren ELSE IF operator = '-' THEN result {= operndl - operrid2 ELSE IF operator = '#' THEN multiplizieren ELSE IF operator = '/' THEN result •= operndl / opernd2 ELSE BEGIN fehlmeld»' GOTO li END; ausgeben; END.
64
3. Der Ablaufteil von PASCAL-Programmen
Struktogramm: Operatorauswahl
Im Programm learn21 sollen zwei Operanden und ein arithmetischer Operator eingegeben werden; dabei sind „+", „ - " , „*", „ / " zugelassen. In Abhängigkeit vom Operator wird sodann eine der vier Grundrechnungsarten ausgeführt. Bei unzulässigen Operatoren erfolgt eine Fehlermeldung und die Eingabe wird wiederholt.
3.3 Alternative Programmzweige
65
Diese dritte Form der geschachtelten IF-Anweisungen leitet zur CASE-Anweisung Uber. 3.3.3 Die CASE-Anweisung Die CASE-Anweisung dient der Ausführung von alternativen Programmzweigen in Abhängigkeit von verschiedenen Werten eines Ausdrucks. Die Anzahl der maximal möglichen Programmverzweigungen hängt von der verfügbaren Wertemenge des betreffenden Ausdrucks ab: Bei booleschen Ausdrücken ist die Maximalzahl n = 2, womit die Möglichkeiten der einfachen IF-Anweisung abgedeckt werden. Bei arithmetischen und sonstigen Ausdrücken ist i.d.R. die Maximalzahl n > 2. Das allgemeine Anweisungsformat lautet: CASE ausdruck OF werf j : block\; wert2 : bbck2;
wertn END;
:
bbckn;
Die Wirkung ist derart, daß der aktuelle Wert des Ausdrucks mit der angegebenen Werteliste verglichen wird und bei Gleichheit der jeweilige Block ausgeführt wird. Danach wird die CASE-Konstruktion verlassen. Ist keiner der angegebenen Werte mit dem Wert des Ausdrucks gleich, so wird die Konstruktion ohne Wirkung verlassen. Für die Struktogrammkonstruktion ist folgende alternative Symbolik vorgesehen:
66
3. Der Ablaufteil von PASCAL-Programmen
Codierbeispiele: a) CASE i It GOTO 2! GOTO 3! GOTO ENDf
OF 5? 3f 6f
b ) CASE (operandX) .0)AND(operandf ('MITTUOCH')f ('DONNERSTAG')f ('FREITAG')f ('SAMSTAG')f ('SONNTAG')f
Beispiel a) entspricht dem Computed-GOTO der Sprache FORTRAN; d.h. in Abhängigkeit von den Werten 1, 2, 3 der Variablen ,4" wird zu den Adressen 5, 3 oder 6 gesprungen. Beispiel b) realisiert die IF . . AND . . ELSE-Konstruktion des Programmbeispiels learnl9 auf S. 58f. mittels einer CASE-Anweisung. Das Beispiel c) zeigt die Verwendung der Variablen „tag", die als Aufzählungstyp definiert wurde. Einen ELSE-Ausgang für den Fall des Auftretens eines Wertes, der nicht in der Werteliste angegeben ist, sieht die ursprüngliche Sprachdefinition von Jensen und Wirth nicht vor; einige PASCAL-Implementierungen beheben diesen Mangel; allerdings gehört das UCSD-PASCAL-System nicht dazu. Da andererseits ein derartiger ELSE-Ausgang häufig benötigt wird, müssen aufwendige Hilfskonstruktionen gemacht werden. Siehe Codierbeispiele d), e) und f). d)
BEGIN
URITELN ( ' b i t t e o p e r a n d i e i n g e b e n ')f READLN ( o p e r r i d l ) f
URITELN ( ' b i t t e o p e r a n d 2 READLN
(opernd2)f
1 'URITELN ( ' b i t t e o p e r a t o r READLN ( o p e r a t o r ) f CASE o p e r a t o r OF '+'
! BEGIN
addierenf
'-' ! BEGIN r e s u l t '*'
! BEGIN
einsehen'>f
GOTO
2 f END;
!= o p e r n d l - o p e r n d 2 f
multiplizieren;
'/' ! BEGIN r e s u l t end;
einsehen'>f
GOTO
!= o p e r n d l
goto
2;
GOTO
2; ENDf
2 f END;
/ OPernd2;
end;
3.3 Alternative Programmzweige
67
fehlmeldf G O T O 1} 2¡ausgeben? END.
e) B E G I N W R I T E L N ( ' b i t t e o p e r a n d i e i n g e b e n '); READLN (operndl)f WRITELN ('bitte operand2 eingeben')i READLN (opernd2)i 1¡WRITELN ('bitte operator eingeben')» READLN (operator)f IF (operator='+') OR (operator»'-') OR (operator='#') OR (operator»'/') THEN CASE operator OF '+' * a d d i e r e n ! '-' i result i - operndl - opernd2i '*' ¡ m u l t i p l i z i e r e n ; '/' ¡ r e s u l t ¡= o p e r n d l / o p e r n d 2 i END ELSE BEGIN fehlmeld; G O T O 1? END; ausgeben; END.
f)
BEGIN WRITELN ('bitte operandi READLN (operndl); WRITELN ('bitte operand2 READLN (opernd2); 1JWRITELN ('bitte operator READLN (operator); CASE operator OF '+','-'»'#'»'/' ¡ BEGIN CASE '+' '-' '#' '/' END; GOTO END; END; fehlmeld» G O T O i; 2¡ausgeben; END.
eingeben
');
eingeben'); eingeben');
operator OF : addieren; ¡ r e s u l t ¡= o p e r n d l ¡ multiplizieren; ¡ result ¡ = operndl /
opernd2; opernd2i
2i
Die Beispiele d), e) und 0 zeigen drei alternative Möglichkeiten, die IF . . ELSE . . . IF . . . ELSE-Konstruktion des Programmbeispiels learn21 mit CASEKonstruktionen zu realisieren.
68
3. Der Ablaufteil von PASCAL-Programmen
Struktogramm: Codierbeispiel f)
Das Programm learn22 zeigt die Anwendung der CASE-Anweisung anhand eines Würfelspiels: Durch den Zufallszahlengenerator „würfel" werden Zahlen von 1 bis 6 erzeugt und der Variablen „wurf" zugewiesen. Die CASE-Anweisung ordnet die Ergebnisse den verschiedenen Punktezählern „eins" bis „sechs" zu. Programmbeispiel : -C«G+> PROGRAM l e a r n 2 2 » < U u e r f e l s p i e l > LABEL 1* VAR e i n s » z w e i » d r e i » v i e r r f u e n f » s e c h s w u r f » i x » i 5 INTEGER » e n d e : CHAR »
S INTEGER»
PROCEDURE i n i t i a l » BEGIN e i n s { = 0 » z w e i J = 0 » d r e i 5 =0 » v i e r S=0 » f u e n f 5=0 » s e c h s T = 0 » i x := 181 » i := 0»' END» PROCEDURE e i n g ä b e » BEGIN URITE('BITTE UUERFELN SIE » URITELN('PROGRAMMENDE < E > ' > i
')»
3.3 Alternative Programmzweige READLN ( e n d e ) « END » PROCEDURE w u e r f e l i BEGIN i î= i + I i i x ;= i x # 183 + i i IF i x < 0 THEN i x 5= - i x i u u r f := i x - := ' a ' TO ' z ' DO URITE ( z e i c h e n » '
")i
Das Programm learn23 zeigt die Anwendung geschachtelter FOR-Anweisungen anhand einer Matrizenmultiplikation. Die miteinander zu multiplizierenden Matrizen a und b werden zuvor mit Zufallszahlen aufgeladen. Programmbeispiel: PROGRAM l e a r n 2 3 F < M 3 t r i z e n m u l t i p l i k a t i o n > TYPE m a t r i x = ARRAYCl..15»1..15D OF REALi
72
3. Der Ablaufteil von PASCAL-Programmen WAR
arbic seed m»n»l
i matrix; : integer; : integer;
FUNCTION d ( e * INTEGER» WAR f BEGIN f := e # f + l i d 5= f MOD 10 end;
• INTEGER)? INTEGER?
PROCEDURE f i l l i END.
l»m»n 5 INTEGER) f
!= c i J + a t i » J 3 * b C J » k 3 »
3.4 Programmschleifen
Struktogramm: Matrizenmultiplikation
73
74
3. Der Ablaufteil von PASCAL-Programmen
3.4.2 Die WHILE-Anweisung Die WHILE-Anweisung dient der wiederholten Ausfuhrung eines Blocks in Abhängigkeit vom Wert eines booleschen Ausdrucks. Das allgemeine Anweisungsformat lautet: WHILE boolescher ausdruck DO block-, Die Wirkung ist derart, daß die Ausführung von block solange wiederholt wird, wie der Wert von boolescher ausdruck TRUE ist; dabei erfolgt die Prüfung des Wertes jeweils vor der Ausfuhrung von block. Sobald boolescher ausdruck den Wert FALSE annimmt, wird die Konstruktion verlassen. Im allgemeinen wird der Wert des booleschen Ausdrucks in block verändert, weil sonst eine Endlosschleife entsteht, die nur durch eine Sprunganweisung verlassen werden kann. Für die Struktogrammkonstruktion ist folgende Symbolik vorgesehen:
Programmbeispiel:
PROGRAM 1 e a r n 2 4 » { K a p i t a l e n t u i e k l u n a » Zins» Rente> LABEL 1$ VAR k a p i t a l » z i n s s a t z r e n t n ä h m e S REAL» w i e d e r h o l e n 5 CHAR» J a h r J INTEGER» PROCEDURE e i n ä a b e » BEGIN WRITE('BITTE ANFANGSKAPITAL EINGEBEN ( z . B . 1000.00) READLN(kapital)» URITE('BITTE ZINSSATZ EINGEBEN ( z . B . 7 . 5 ) READLN ( z i n s s a t z ) » URITE('BITTE ENTNAHME EINGEGEN ( z . B 100.00) READLN(entnähme)» END»
J ')5 :
')»
• ') i
3.4 Programmschleifen BEGIN 1Seinäabe! J a h r {= 0 ! UHILE ( k a p i t a l > 0 . 0 0 ) AND ( J a h r k a p i t a l THEN e n t n ä h m e {= k a p i t a l » k a p i t a l J = k a p i t a l - entnähme! WRITELN ( ' ' » J a h r ? 2 » ' . J a h r 5 ' » k a p i t a l : 1 0 ) S J a h r {= J a h r + 1» END! WRITELN! URITELN('WEITERER LAUF ? ( Y / N ) ' ) ! READLN(wiederholen)! IF ( w i e d e r h o l e n = ' u ' ) OR ( w i e d e r h o l e n = ' Y ' ) THEN GOTO 1 ! END.
Struktogramm: Kapitalentwicklung, Zins, Rente
75
76
3. Der Ablaufteil von PASCAL-Programmen
Das Programm learn24 simuliert den Zeitverlauf eines Kapitalbestandes bei unterschiedlichen Anfangsbeständen, Entnahmen und Zinssätzen. Anhand dieser Aufgabenstellung wird die Wirkungsweise einer WHILE-Konstruktion vorgeführt, die in diesem Falle entweder bei Erreichen eines Kapitalbestandes von Null oder spätestens nach 20 Zeitschritten verlassen wird. 3.4.3 Die REPEAT-Anweisung Die REPEAT-Anweisung dient wie die WHILE-Anweisung der wiederholten Ausführung eines Blocks in Abhängigkeit vom Wert eines booleschen Ausdrucks. Das allgemeine Anweisungsformat lautet: REPEAT block UNTIL boolescher ausdruck', Der Unterschied zur WHILE-Anweisung besteht darin, daß der Wert von boolescher ausdruck erst nach der Ausführung von block geprüft wird; d.h. block wird auf alle Fälle mindestens einmal ausgeführt, während bei der WHILE-Anweisung mit einem Anfangswert FALSE die Konstruktion sofort wieder verlassen wird. Auch bei der REPEAT-Anweisung muß zur Vermeidung einer Endlosschleife der Wert des booleschen Ausdrucks in block verändert werden. Für die Struktogrammkonstruktion ist folgende Symbolik vorgesehen:
FALSE
bool. ausdruck
,weiter"-Zweig
Programmbeispiel : PROGRAM l e a r n 2 5 i - C W u e r f e l t e s t } CONST w u r f l = ' WURF "t w u e r f e = ' WUERFE'J VAR i > J r X f z a h l r w u r f : INTEGERr t e x t J STRINGC73 i FUNCTION w u e r f e l BEGIN
J INTEGER»
3.4 Programmschleifen
77
w u e r f e l '.= x MOD 7i END;
BEGIN J J= Of X := 181 f z a h l := 0» REPEAT BEGIN z a h l != z a h l + 1! i 5= Oi wurf := Of REPEAT i J= i + If wurf J= w u e r f e l » URITEC '»wurf) » UNTIL wurf = z a h l i IF i = 1 THEN t e x t 5= w u r f l ELSE t e x t 5= wuerfef URITELNf URITELN < i 5 3 f t e x t »' BIS ZUR ERSTEN ' » z a h l ) » END» UNTIL z a h l = 6i END.
Das Programm learn25 soll einen „Würfeltest" durchführen: Es wird nacheinander für jede Augenzahl „zahl" geprüft, wieviele Würfe nötig waren, um diese Zahl zu treffen. Diese Aufgabenstellung wird benutzt, um eine geschachtelte REPEATKonstruktion vorzuführen. Die übergeordnete Schleife dient dem sukzessiven Weiterschalten der Augenzahl und die eingebettete Schleife dem wiederholten „würfeln". Struktogramm: Würfeltest
78
3. Der Ablaufteil von PASCAL-Programmen
3.5 Datentransfer, Datenhaltung Die Ein- und Ausgabe von Daten sind wesentliche Funktionen einer jeden Datenverarbeitungsaufgabe : Durch das Vorsehen von Dateneingabefunktionen wird ein Programm für den wiederholten Gebrauch mit unterschiedlichen Werten ausgestaltet; durch das Vorsehen von Datenausgabefunktionen erhält der Benutzer oder irgendein mit dem Rechner gekoppelter Datenempfänger die Resultate dieser Datenverarbeitungsaufgabe bzw. irgendwelche Fehlermeldungen. Unter Datenhaltung wird im allgemeinen die Speicherung von Eingabedaten, Zwischenresultaten und Endresultaten auf externen Speichern verstanden. Die Notwendigkeit hierzu ergibt sich aus der wiederholten Verwendung von längerfristig konstanten Eingabedatenbeständen, ferner aus der kapazitätsbedingten Entstehung von „Zwischenlagern" im Daten Verarbeitungsprozeß und schließlich aus der zeitlichen Verkettung von Datenverarbeitungsaufgaben, bei denen die Resultate einer vorangehenden zu Eingabedaten einer nachfolgenden Programman wendung werden. Datentransfer und Datenhaltung haben bei kaufmännischen und verwaltungstechnischen Datenverarbeitungsaufgaben gegenüber der eigentlichen Verarbeitung eine übergewichtige Bedeutung; wohingegen sie bei mathematischen und wissenschaftlichen Aufgaben in den Hintergrund treten.
3.S Datentransfer, Datenhaltung
79
Die Programmiersprache PASCAL — in einer überwiegend mathematisch-wissenschaftlichen Umgebung definiert und realisiert - bietet infolgedessen für Datentransfer und Datenhaltung nur bescheidene Möglichkeiten; so sind in der Sprachdefinition zunächst nur serielle Schreib- und Lesebefehle und dementsprechend nur sequentielle Dateien vorgesehen. Das UCSD-PASCAL-SYSTEM realisiert zumindest über einen schnellen Positionierungsbefehl für externe Speicher eine Art von Direktzugriffsdateien, die für die integrierte Datenverarbeitung im kaufmännischen Bereich unerläßlich sind. Indexdateien oder indexsequentielle Dateien sind allerdings in keiner der bekannten Implementierungen vorgesehen. Trotzallem läßt sich PASCAL mit einigen Komfortabstrichen für kaufmännische Aufgaben einsetzen, was anhand der nachfolgenden Ausführungen und Beispiele dokumentiert werden soll. 3.5.1
Standardein/ausgabe
3.5.1.1 Die
READ-Anweisung
Die READ-Anweisung dient dem Einlesen von Daten und deren Bereitstellung in den dafür vorgesehenen Variablen eines PASCAL-Programms. Das allgemeine Anweisungsformat lautet: READ {dateivariable, variablei,..,
variablek);
Die Anwendung dieses umfassenden Formats wird erst später im Zusammenhang mit der Dateibehandlung dargestellt (vgl. S. 96f.). Sollen Daten von einem Standardeingabegerät, wie z.B. Bildschirm- oder Blattschreiberterminal, eingelesen werden, so entfällt die Angabe von dateivariable. Die gebräuchliche Form lautet dann: READ (variablei,...,
variablek);
Als variable kommen nur Variablen vom Typ INTEGER, REAL und CHAR in Betracht; die zugehörigen Feld typen können komponentenweise als indizierte Variablennamen angegeben werden. Gepackte Feldtypen werden beim UCSD-PASCAL-System für alle Grundtypen außer CHAR akzeptiert. Gepackte Felder vom Grundtyp CHAR können dagegen nur in der Form des Typs STRING angegeben werden; dies muß durch einfache Nennung des Variablennamens geschehen; indizierte Komponenten werden nicht akzeptiert. Codierbeispiele: a) READ
(iirtcisii
b) FOR k. := 1 TO 5 DO READ (aCkD)f
80
3. Der Ablaufteil von PASCAL-Programmen
In Beispiel a) seien „i", „r", „c", „s" Variablen vom Typ INTEGER, REAL, CHAR und STRING. In Beispiel b) werden 5 Werte in die Variablen-Felder a[l] bis a[5] eingegeben. Der Basistyp von a kann wiederum einer der 4 oben genannten sein. Bezeichnet man mit den einzugebenden Wert (Zeichenfolge) einer Variablei und mit t\ ein nachfolgendes Trennzeichen (z.B. blank oder carriage return), so erwartet die READ-Anweisung Eingabedatensequenzen in der Form
11 t2 • • tk—l tk Die eingegebenen Werte (Zeichen) werden den Variablen in der angebenen Reihenfolge zugewiesen, wobei für die einzelnen Variablen typen folgende Besonderheiten gelten: Für den Typ INTEGER werden als Zeichen nur Ziffern und die Vorzeichen „+" und „ - " akzeptiert; für den Typ REAL werden nur Ziffern, Vorzeichen sowie der (Dezimal-)Punkt akzeptiert; führende blanks und carriage return sind bei beiden Typen möglich. Für den Typ CHAR werden sämtliche Zeichen akzeptiert. Bei den Typen INTEGER und REAL werden beliebig viele Ziffern akzeptiert, die dann bei der Zuweisung gegebenenfalls in den maximal zulässigen Wert transformiert werden: Zu lange INTEGER-Zahlen ergeben unvorhersehbare Resultate; zu lange REALZahlen werden von hinten abgeschnitten. Führende blanks oder carriage return werden bei der Zuweisung bei beiden Typen ignoriert. Folgen auf zulässige Zeichen unzulässige, so werden diese als Trennzeichen interpretiert. Beim Typ CHAR wird nur jeweils ein Zeichen pro Variablenangabe akzeptiert; das nachfolgende Zeichen wird entweder als Trennzeichen interpretiert oder, falls eine nachfolgende Variablenangabe auch den Typ CHAR hat, dieser als Wert zugewiesen. Letzteres kann u.U. zu unerwünschten Resultaten fuhren und ist durch besondere Vorkehrungen (vgl. READLN-Anweisung S. 81 ff.) auszuschließen. Beim Typ STRING werden beliebig viele Zeichen aller Art akzeptiert und nur carriage return wird als Trennzeichen erkannt. Werden mehr Zeichen eingegeben, als die Stringvariable aufnehmen kann, so werden die letzten Zeichen abgeschnitten. Wird eine Eingabe vorzeitig durch carriage return beendet, so werden nur die vor carriage return eingegebenen Zeichen in die ersten Positionen der string-Variable übertragen. Trennzeichen dienen u.a. als Signal dafür, daß die Eingabe eines Wertes abgeschlossen ist und die Zuweisung zu der betreffenden Variable beginnen kann. Handelt es sich bei den Trennzeichen um carriage return, so wird zugleich am Eingabegerät ein Zeilenwechsel bewirkt.
81
3.5 Datentransfer, Datenhaltung
Nach Abschluß einer READ-Anweisung steht der Adreßpegel des Eingabepuffers auf dem letzten Trennzeichen Dieses kann mit der booleschen Standardfunktion EOLN inspiziert werden und zwar liefert der Funktionsaufruf EOLN bzw. EOLN (dateivariable) den Wert TRUE ab, wenn es sich bei f k um ein carriage return handelt; andernfalls hat EOLN den Wert FALSE.
3.5.1.2 Die READLN-Anweisung Die READLN-Anweisung dient dem Einlesen von Daten mit abschließendem carriage return. READLN steht also für „read line". Das allgemeine Anweisungsformat lautet: READLN (dateivariable, variable^,..., variablek); READLN {variablei,.. ,,variablek)\
bzw.
Die Wirkungsweise entspricht der READ-Anweisung. Der Unterschied besteht lediglich darin, daß die READLN-Anweisung das Ende einer Eingabedatensequenz nur erkennt, wenn in
ij ... rk_! rk der Trenner f k ein carriage return ist; ferner setzt die READLN-Anweisung den Adreßpegel des Eingabepuffers hinter das letzte Trennzeichen i k (= carriage return), so daß der Wert der booleschen Standardfunktion EOLN stets FALSE ist. Der Anwendungsbereich der READLN-Anweisung umschließt zunächst den der einfachen READ-Anweisung. Darüberhinaus kann mit ihrer Hilfe die Eingabe und Zuweisung unerwünschter Zeichen abgefangen werden. Verwendet man in einer READLN-Anweisung nur eine Variable, so gilt: Unzulässige Zeichen, die auf zulässige folgen, werden als Trennzeichen interpretiert. Das erste Trennzeichen löst die Zuweisung aus. Alle nachfolgenden Zeichen bleiben wirkungslos, weil keine weitere Variable mehr auftritt und die Anweisung erst durch ein carriage return beendet wird. Dadurch, daß der Adreßpegel hinter das abschließende carriage return gesetzt wird, kann dieses auch nicht an Variablen in nachfolgenden READ-Anweisungen übergeben werden. Diese hier beschriebene Funktion wird durch eine weitere parameterlose Form der READLN-Anweisung abgerundet: Das allgemeine Format lautet: READLN; Diese Anweisung akzeptiert beliebige Zeichenfolgen und wird durch ein carriage return beendet. Auch hier wird der Adreßpegel hinter das carriage return gesetzt,
82
3. Der Ablaufteil von PASCAL-Programmen
so daß Variablen in nachfolgenden READ-Anweisungen nicht berührt werden können. Diese Eigenschaften sind für zwei Anwendungsfälle von Bedeutung. Einmal kann auf diese Weise das letzte Trennzeichen einer vorangehenden einfachen READ-Anweisung abgefangen werden. Zum zweiten läßt sich auf diese Weise eine 2-dimensionale Eingabe am Bildschirm erreichen: Der Cursor kann vor der jeweils nächsten wirklichen Dateneingabe auf jede beliebige Stelle positioniert werden, so daß eine Eingabe in Tabellenform möglich wird; die vorgelagerte, parameterlose READLN-Anweisung fängt die Cursorsteuerzeichen oder Tabulatorzeichen ab. Programmbeispiel: » 6 : IF eol THEN WRITE ('» EOLN nach READ ' ) î 7 i WRITELN» 8 : WRITE ('BITTE REALZAHL EINGEBEN i ')» 9 ! READLN (r)»' 10 t eol 5= E0L.N» 11 t WRITE (echo»' ' » r ) i 12 ! IF eol THEN WRITELN ('» EOLN nach READLN')» 13 J WRITELN» 14 J WRITE ('BITTE ZEICHEN EINGEBEN ! ' ) ! 15 : READLN (c>$ 16 WRITELN (echo»' '»c)f 17 t WRITELN» 18 5 WRITE ('BITTE C I R EINGEBEN : ')> 19 5 READ ( c r i i p ) i 20 : URITELN(echo»' '»c»' ' » i » ' '»r)» END» PROCEDURE feider» LABEL 1»2»3»4»5»6»7»8»9»10»11»12»13»14»15»16»17»18»19»20» BEGIN 1 : FÜR k '.= 1 TO 5 DO WRITELN» 2 J WRITE ('BITTE 3 INTEGERZAHLEN EINGEBEN : ')f
3.5 Datentransfer, Datenhaltung 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 END 5
: FOR k := 1 TO 3 DO READ ( a i Ck3)» • URITE ( e c h o ) i : FOR k 5= 1 TO 3 DO URITE ( ' '»aiCk3)f • URITELNr • • URITE ('BITTE 3 REALZAHLEN EINGEBEN 5 ' ) ; : READ 0 123457.
(2) Wenn die Zahl der Stellen vor dem Dezimalpunkt größer als 6 ist, so wird die Zahl in normalisierter Gleitpunktdarstellung ausgegeben, wobei die letzten Stellen gerundet und abgeschnitten werden. Beispiel: : stellenzahl: Ausgabe:
1234567.89 >0 1.23457E6
3.5 Datentransfer, Datenhaltung
87
(3) Die Differenz zwischen gewünschter und noch darstellbarer Dezimalstellenzahl wird von der Verschiebezahl abgezogen. Nur im Fall (2) bleibt die Stellenzahl ohne Wirkung. Beispiel: : 12.3456 verschiebezahl. 20 stellenzahl: 10 — Differenz 6
Ausgabe:
- Gesamtlänge 7
1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 IAdreßpegel Anfangswert
3.5.1.5 Die
+ 20
WR/TELN-Anweisung
Sollen Zeilenwechsel erzeugt werden, so kann dies n u r durch die WRITELNAnWeisung geschehen. Das allgemeine Anweisungsformat lautet: WRITELN (dateivariable, ausdrucke,. .., ausdruckm)\ WRITELN (ausdrucki,.. . ,ausdruckm)\
bzw.
Die Wirkung ist, daß die Druckaufbereitung der angegebenen Liste von Ausgabeobjekten durch ein carriage return abgeschlossen wird, also folgende Ausgabedatensequenz erzeugt wird:
. .. CR Sollen zum Zweck einer formulargerechten Datenausgabe, nur Leerzeilen ausgegeben werden, so kann dies durch die parameterlose Form WRITELN; geschehen. Programmbeispiel: {•G+> PROGRAM l e a r n 2 7 » -CWRITE» f o r m a t i e r t e A u s ä s t e t PROCEDURE a u s d r u e c k e » LABEL l » 2 » 3 r 4 » 5 » 6 » 7 » 8 » 9 i CONST t e x t k = 'TEST FUER "t WAR textv ! STRINGC433} z a h l t i r J i INTEGER» feld J ARRAYC1. . 3 3 OF CHAR t matrix ! A R R A Y C 1 . . 5 t 1 . . 3 3 OF REAL»
div.Ausdruecke>
88
3. Der Ablaufteil von PASCAL-Programmen BEGIN textv S= 'DIE AUSWERTUNG ARITHMETISCHER AUSDRUECKE : 'i zahl != 10i WRITE (textkFtextVF(zahl-3)#100)i WRITELN i textv S= ' DIE VERWENDUNG VON DIREKTKONSTANTEN 5 '; WRITELN (textkftextvf13.00 54J2f'X',' MEHRWERTSTEUER')i textv 5= ' DIE VERWENDUNG VON FELDVARIABLEN J 'i feldC13 := 'h'i feldC23 5= ' feldC33 5= ' = '» WRITE (textkFtextv)» FOR i :=1 TO 5 DO BEGIN WRITELN»
FOR J 5= 1 TO 3 DO
BEGIN matrixCifJ3 5 = 12.345 + i#J MOD 5» WRITE(' '»feldClJri»J»feldC23»feldC33»matrixCi,JJ) r
end;
end;
end;
PROCEDURE verschiebezahi; LABEL 1F2F3F4F5F6F7F8F9F10F11;
VAR irk : integer; BEGIN 1 2 3 4 6 7 8
J 5 : 5 : : J
FOR k. }= 1 TO 5 DO WRITELN; WRITE ('BITTE VERSCHIEBEZAHL EINGEBEN (Beenden mit READ (i>; IF i < 0 THEN GOTO Ii; WRITELN ('123456789012345678901234567890'); WRITE('VOR'); WRITE('PREIS'• i f'MENGE' .6f'WERT' • 8) ;
9 : writeln; 10 : goto 2; 11 *. end;
PROCEDURE stellenzahl; LABEL 1F2F3F4F5F6F7F8F9F10F11F12;
var irk
: integer; real;
zahl :
begin 1 2 3 4 5 6 7 8 9 10
: : : J J J J : i J
FOR k != 1 TO 5 DO WRITELN; WRITE ('BITTE REALZAHL EINGEBEN (Beenden mit 999.9) 5 ') READLN (zahl); IF zahl = 999.9 THEN GOTO 12; WRITE ('BITTE VERSCHIEBEZAHL EINGEBEN {'); READLN (i>; WRITE ('BITTE STELLENZAHL EINGEBEN ! '>; READLN (k >; WRITELN ('123456789012345678901234567890'); WRITELN(zahl * i•k ) ;
11 5 GOTO 2; 12 ; end;
BEGIN ausdruecke» verschiebezahif stellenzahl; END. Das Programm learn27 enthält 3 Prozeduren zur D e m o n s t r a t i o n verschiedener A n w e n d u n g e n von WRITE und WRITELN.
3.5 Datentransfer, Datenhaltung
89
Prozedur „ausdruecke": Es wird zunächst vorgeführt, wie ein arithmetischer Ausdruck „(zahl—3)# 100" in einer WRITE-AnWeisung verwendet werden kann. Sodann wird die Verwendung von direkten und indirekten Konstanten in einer WRITELN-Anweisung gezeigt; dabei ist die Verwendung der direkten REAL-Konstante„ 13.00"besonders hervorzuheben. Schließlich wird die Verwendung von Feldvariablen in einer WRITE-Anweisung anhand des Ausdruckens einer mit Zufallszahlen gefüllten Matrix vorgeführt. Prozedur „verschiebezahl": 1: Es werden 5 Leerzeilen erzeugt. 3: Es wird die Verschiebezahl „i" eingelesen. 6: Ein Orientierungsraster wird ausgegeben. 8: Es werden die STRING-Konstante „PREIS" mit unterschiedlichen Verschiebezahlen „i" und die STRING-Konstanten „MENGE" und „WERT" mit konstanten Verschiebezahlen ausgegeben. Anhand des Orientierungsrasters lassen sich die Wirkungen studieren. Prozedur „stellenzahl": Es kann das Zusammenspiel variabel eingelesener REAL-Zahlen, Verschiebezahlen und Stellenzahlen studiert werden.
3.5.2
Dateibehandlung
3.5.2.1
Die
REWRITE-AnWeisung
Die REWRITE-Anweisung dient dem Einrichten neuer oder dem Überschreiben existierender Dateien auf externen Speichereinheiten wie Disketten oder Platteneinheiten. Das allgemeine Anweisungsformat lautet: REWRITE (dateivariable, dateiname)-, Als dateivariable kommen nur Variablen vom Dateityp (FILE OF) in Betracht; dateiname ist hingegen eine Variable oder Konstante des Typs STRING, die die Dateibezeichnung auf der externen Speichereinheit enthält. Codierbeispiel: REUIRITE i
END;
PROCEDURE a u s g e b e n ; BEGIN URITELN(kundendatei".knr> » URITELN(kundendatei".name>; WRITELN(kundendatei".saldoJ7{2)i END;
PROCEDURE a u f l i s t e n ; BEGIN RESET(kundendatei»'*55KUNDEN'); WHILE NOT E O F ( k u n d e n d a t e i ) DO BEGIN ausâeben; GET(kundendatei); END;
i
')}
94
3. Der Ablaufteil von PASCAL-Programmen READLNR C L O S E ( k u n d e n d a t e i R NORMAL)? END;
PROCEDURE s a t z s u c h e n ? WAR s n r S INTEGER« BEGIN RESET(kundendatei»'*55KUNDEN')i URITE«'SATZNUMhER J ' ) i READLN(snr)5 SEEK(kundendatei » s n r ) i GET(kundendatei)i ausgebenf READLN;
CLOSE(kundendatei)i END! BEGIN REPEAT FOR i 1= 1 TO 24 60 URITELNi URITELN('BITTE VERARBEITUNGSART AUSUAEHLEN'>î URITELN('EINRICHTEN ( 1 ) AUFLISTEN (2)')i URITELN('SATZSUCHEN ( 3 ) BEENDEN (4)')î READLN(mode)f CASE mode OF 1 ! einrichten» 2 : auflisten? 3 S satzsuchen$ END! UNTIL mode = 4? END.
Das Programm learn28 zeigt verschiedene Routinen zur Dateibehandlung anhand eines kleinen Datenbankproblems: Zunächst wird mit der Prozedur „einrichten" eine Reihe von Kundensätzen in eine neueröffnete Datei eingegeben. Hierbei kommt es auf die Demonstration der I/O-Prozeduren REWRITE, PUT und CLOSE (LOCK) an. Die Prozedur „auflisten" zeigt die Verwendung der I/O-Prozeduren RESET, GET und CLOSE (NORMAL) für das Auflisten aller Kundensätze. Die Prozedur „satzsuchen" schließlich gestattet mit Hilfe der I/O-Prozedur SEEK das Aufsuchen bestimmter Sätze. Im Hauptprogramm wird gezeigt, wie diese Prozeduren unabhängig von einander durch den Benutzer mit Hilfe der menu-Technik ausgewählt werden können.
95
3.5 Datentransfer, Datenhaltung Struktogramm:
Dateibehandlung
Eingeben Daten für kundensatz (READ) Schreiben kundensatz auf Platte (PUT)
GOTO 1
Eingeben Satznr, Suchen Lesen, Ausgeben, Festhalten Bild Schließen kundendatei
96
3. Der Ablaufteil von PASCAL-Programmen
3.5.2.7
Dateibehandlung
mit READ and WRITE
Die ausführlichen Anweisungsformate READ (dateivariable, variable WRITE {dateivariable, ausdrucki,.
variablek); und .., ausdruckm)-,
sind konzipiert, um bestimmte Satzteile eines Dateisatzes zu lesen bzw. auszugeben. Dieses Konzept ist jedoch in dieser allgemeinen Form bisher nicht realisiert. In eingeschränkter Form läßt es sich indessen für reine Textdateien anwenden und bildet damit die Basis für das Texteditieren. Die eingeschränkten Formate lauten: READ (dateivariable, variable)-, WRITE {dateivariable, ausdruckt READLN {dateivariable, variable)-, WRITELN {dateivariable, ausdruck)-, Ferner sind möglich: READLN {dateivariable)-, WRITELN {dateivariable) -, Als dateivariable kommen nur Variablen des Typs FILE OF CHAR in Betracht, als variable nur Variablen des Typs CHAR und als ausdruck nur Variablen- oder Konstantenaufrufe vom Typ CHAR. Unter diesen Voraussetzungen ist die Anweisung READ {dateivariable, variable) äquivalent mit der Anweisungsfolge GET {dateivariable)-, variable := dateivariable t; Ferner ist die Anweisung WRITE {dateivariable, variable)-, äquivalent mit der Anweisungsfolge dateivariable t:= variable PUT {dateivariable)-, Programmbeispiel:
PROGRAM l e a r n 2 9 » { E i n f a c h e r Texteditor} TYPE f i l t s p e = F I L E O F CHARR WAR datei i f i l t a p e f c : CHARJ einrrauf1 : CHARr
3.6 Prozeduraufrufe
97
PROCEDURE e i n r i c h t e n » LABEL 1 » 2 i BEGIN REWRITE(datei » ' « 5 J D A T E I ' ) r WRITELN('SATZEINGABE (Beenden m i t • # • ) : ' ) i 1SREAD(c)» IF c = ' * ' THEN GOTO 2» IF EOLN THEN U R I T E L N ( d a t e i ) ELSE WRITE(datei» c > » GOTO l r 2 !CLOSE c ) i IF E O L N ( d a t e i ) THEN BEGIN WRITELN(c)J READLNidatei)» END ELSE WRITE(c)f ENDr CLOSE(dateirLOCK)» END;
BEGIN WRITE('EINRICHTEN ? (a/n>'); READLN(einr); IF e i n r = ' a ' THEN e i n r i c h t e n » WRITE('VERARBEITEN ? ( a / n ) ' ) » READLN(aufl); IF a u f 1 » ' a ' THEN a u f l i s t e n » END.
Das Programm learn29 zeigt eine einfache Anwendung der ausführlichen Anweisungsformate für READ und WRITE; dabei wird zunächst eine Textdatei eingerichtet, die vom Benutzer mit beliebigen Zeichen beschrieben werden kann. Die Ausnahme bildet das Zeichen „#", welches im Programm als Endekriterium definiert wurde. Anschließend oder bei späteren Programmstarts kann die Angabe des Textes veranlaßt werden.
3.6 Prozeduraufrufe 3.6.1 Aufrufformate Prozeduren und Funktionen haben identische Aufrufformate; der Unterschied zwischen Prozeduren und Funktionen ist jedoch, daß Prozeduraufrufe programmtechnisch als Anweisungen zu betrachten und daher hier als wesentliche Bestandteile des Ablaufteils abzuhandeln sind, während Funktionsaufrufe programmtechnisch Ausdrücke darstellen und daher als Anweisungsbestandteile bereits vorher zu behandeln waren (vgl. S.43f.). Sämtliche Überlegungen, die für
98
3. Der Ablaufteil von PASCAL-Programmen
die Prozeduraufrufe angestellt werden, gelten völlig analog auch für die Funktionsaufrufe. Die Aufrufformate richten sich nach den Definitionsformaten und -inhalten, die auf S. 32ff. ausführlich beschrieben sind. Hierbei ergeben sich folgende Möglichkeiten (1) Parameterloses Format Definition: PROCEDURE prozedurname-, Aufruf: prozedurame-, Anfangswerte, Steuergrößen und Resultate werden zwischen aufrufender Einheit und Prozedur nur über die globalen Variablen ausgetauscht. (2) Format mit Parametern Definition: PROCEDURE prozedurname (Liste der formalen Parameter)-, Aufruf: prozedurname (Liste der aktuellen Parameter)-, Die Liste der aktuellen Parameter muß Ausdrücke enthalten, wenn an den entsprechenden Positionen der Parameterliste bei der Definition formale Wertp a r a m e t e r vereinbart wurden; der Typ eines Ausdrucks muß gleich dem Typ des formalen Parameters sein. Grundsätzlich kommen alle unter 3.1 auf S. 39ff. behandelten Formen von Ausdrücken als aktuelle Wertparameter in Betracht, also einfache Konstanten-, Variablen- und Funktionsaufrufe sowie arithmetische oder logische Verknüpfungen aus diesen. Die Ausdrücke dienen als aktuelle Wertparameter ausschließlich der Übergabe von Anfangswerten oder Steuergrößen aus der aufrufenden Einheit an das Unterprogramm. Der Hauptgrund, diesen Transfer über die Parameterliste anstatt über globale Konstanten und Variablen vorzunehmen ist, daß auf diese Weise eine Unabhängigkeit der Prozedur von den aktuellen Variablennamen der aufrufenden Einheit erreicht wird. Die Liste der aktuellen Parameter muß V a r i a b l e n n a m e n enthalten, wenn an den entsprechenden Positionen der Parameterliste bei der Definition formale V a r i a b l e n p a r a m e t e r vereinbart wurden. Der Typ eines aktuellen Variablenparameters muß gleich dem Typ des entsprechenden formalen Variablenparameters sein; grundsätzlich kommen alle unter 2.3 auf S. 20ff. behandelten
3.6 Prozeduraufrufe
99
Typen in Betracht. Zu den Besonderheiten bei der Definition von Variablenparametern mit komplizierten Typen vgl. S. 33. Variablenparameter dienen sowohl der Eingabe von Anfangswerten und Steuergrößen in die Prozedur als auch der Rückgabe von Resultaten an die aufrufende Einheit. Auch hier wird der Datentransfer über die Parameterliste anstatt über globale Konstanten und Variablen vorgenommen, wenn eine allgemein verwendbare Prozedur erzeugt werden soll. Codierbeispiel: Definition: PROCEDURE p r o c ( r o w s r c o l s 5 INTEGER» VAR
i matrix)?
Aufruf: proc3)i
Dabei möge fn der Aufruf einer Funktion des Typs INTEGER sein. Da für Anfänger in diesem Zusammenhang die Unterscheidung von Ausdrücken und Variablennamen häufig Schwierigkeiten bereitet, sei folgende Regel genannt: Als Variablennamen gelten grundsätzlich die bei der Definition mit der VARAnweisung vereinbarten Namen; dies bedeutet, daß z.B. indizierte Variablen wie a[i,3], Dateisatzvariablen wie künden toder Satzteilvariablen wie satz.name nicht akzeptiert werden, denn bei diesen Beispielen handelt es sich um Ausdrücke; die zugehörigen Variablennamen lauten vielmehr a, künden und satz. 3.6.2 Hierarchische, lineare und rekursive A u f r u f e
Alle in einer bestimmten Einheit (Programm, Prozedur, Funktion) definierten Prozeduren und Funktionen befinden sich zueinander im Verhältnis der Nebeno r d n u n g ; definierende und definierte Einheiten befinden sich im Verhältnis der Unter- bzw. Ü b e r o r d n u n g .
100
3. Der Ablaufteil von PASCAL-Programmen
Definitionsstruktur: Über/Unterordnung
PI 12
c •8 z
PI 13
g3 P12
P121
0 1
Normalerweise rufen die definierenden die definierten Einheiten auf: z.B. P l l ruft PI 13. In diesen Fällen spricht man von hierarchischen Aufrufen. Es können sich aber auch Einheiten einer bestimmten Nebenordnung gegenseitig aufrufen: z.B. PI 13 ruft PI 12. Diese Fälle sollen als lineare Aufrufe bezeichnet werden, wobei gegebenenfalls FORWARD-Situationen zu beachten sind (vgl. S.35f.). Schließlich können Einheiten einer bestimmten Nebenordnung alle übergeordneten Einheiten und sich selbst aufrufen. In diesen Fällen spricht man von rekursiven Aufrufen. Allerdings muß man unechte und echte sowie indirekte und direkte Rekursionen unterscheiden:
3.6 Prozeduraufrufe
101
Unechte Rekursionen sind Aufrufe, von denen kein Rückweg zur rufenden Prozedur existiert. Beispiel: PI21 ruft PI 1, wird aber von dort nicht mehr erreicht. Echte Rekursionen sind dadurch gekennzeichnet, daß ein Rückweg zur rufenden Prozedur existiert. Bei indirekten Rekursionen wird die rufende Prozedur durch Aufruf aus einer anderen Prozedur wieder erreicht. Beispiel: PI 1 ruft PI und PI ruft wieder PI 1. Bei direkten Rekursionen ruft die Prozedur sich selbst auf, z.B. P131 ruft sich selbst auf. Bei echten rekursiven Aufrufen entstehen Endlosschleifen, die im Programm abgefangen werden müssen. Ausgeschlossen ist: (1) der direkte Aufruf von Prozeduren aus einer anderen als der eigenen Unterordnung; z.B. kann P l l nicht P121 oder P122 aufrufen, weil diese nur P12 bekannt sind; (2) der direkte Aufruf von Prozeduren aus einer anderen als der eigenen Nebenordnung; z.B. kann P i l l nicht PI21 aufrufen, weil diese nur in P I 2 bekannt ist. Programmbeispiel: PROGRAM
LEARN30»{Hierarchische»lineare u.rekursive Prozeduraufrufe> VAR x»a : REAL)
PROCEDURE pl , so findet die Ersetzung statt; antwortet der Benutzer mit , so findet keine Ersetzung statt; die Suche wird gegebenenfalls fortgesetzt. Mit wird die replace-Funktion ohne weitere Aktionen beendet. Genau so kann die Funktion nach irrtümlichem < R > abgebrochen werden. Durch die same-Option können sowohl target string als auch substitute string wiederverwendet werden; denn für beide gibt es entsprechende Puffer, die ihre Inhalte bis zu einer expliziten Veränderung durch den Benutzer behalten. Die Eingabe lautet dann für den target string: 'substitute string' und für den substitute string 'target string' < S > und schließlich fur beide
4 . 2 . 1 2 Quit Durch < Q > in der edit-Ebene wird die quit-Funktion aufgerufen. Das Programm antwortet dann mit dem Kommando-menu: >Quit: U(pdate the workfile and leave ECxit without updating R < e t u r n to t h e e d i t o r w i t h o u t u p d a t i n ä U K r i t e to a f i l e n a m e a n d r e t u r n
Durch < U > in der quit-Ebene wird die soeben mit dem Editor bearbeitete Datei aus dem Arbeitsspeicher in die Arbeitsdatei (work file) auf der System-Diskette geschrieben. Falls vorher keine Arbeitsdatei existierte, wird sie jetzt angelegt. Danach wird der Editor verlassen und es erscheint das menu der höchsten Kommandoebene.
4. Sonderteil: Das UCSD-PASCAL-System
118
Durch < E > in der quit-Ebene wird der Editor ohne Wirkung für irgendeine Disketten-Datei verlassen. Die im Arbeitsspeicher befindliche Datei ist verloren. Dieser Ausgang wird sinnvollerweise nur dann gewählt, wenn eine Datei mit Hilfe des Editors nur angesehen werden sollte oder wenn durch Fehlbedienung im Editor, z.B. durch die replace- oder copy-Funktion, soviel verdorben wurde, daß ein Neubeginn mit dem vorherigen Dateizustand günstiger ist. Durch < R > in der quit-Ebene kehrt man in die edit-Ebene zurück und am Bildschirm erscheint der Dateiausschnitt, der vor dem Aufruf der quit-Funktion dort stand. < R > wird i.d.R. dann gegeben, wenn < Q > aus Versehen erfolgt ist. Bei < W > in der quit-Ebene meldet sich das Programm mit der Anfrage >Quit:
Name o f O u t p u t f i l e
Antwortet der Benutzer mit < r e t > , so gelangt man in die edit-Ebene zurück. Antwortet der Benutzer durch Ein tippen einer Dateispezifikation (vgl. S. 107) und < r e t > , so wird die gerade mit dem Editor bearbeitete Datei aus dem Arbeitsspeicher auf eine der Disketten herausgeschrieben. Beispiel: #5: LEARN.TEXT Das Programm protokolliert und fragt >auit: Uritinsf • . Your f i l e i s 256 b u t e s l o n ä . Do «ou want t o E < x i t from o r R gelangt man in die höchste Kommandoebene; durch < R > gelangt man in die edit-Ebene zurück und am Bildschirm erscheint der Dateiausschnitt, der vor dem Aufruf der quit-Funktion dort stand.
4.3 File handler Durch < F > auf der höchsten Kommandoebene wird der Filer (file handler) geladen. Dieses Programm dient der Dateiverwaltung sowie der Information des Benutzers über den Inhalt der Disketten und den Zustand der Dateien. Das Programm antwortet mit der Ausgabe des Kommando-menu der fller-Ebene: F i l e r : G(et» S W in der filer-Ebene wird die ldir-Funktion aufgerufen. Sie zeigt den aktuellen Stand des Dateiendverzeichnisses (directory) einer Diskette, welches der Platzverwaltung und Adressierung der Dateien auf dieser Diskette dient. Bei jeder Neuaufnahme, Veränderung oder Löschung einer Datei wird dieses Verzeichnis fortgeschrieben (updating) und gibt daher dem Benutzer u.a. Aufschluß über den auf der Diskette noch verfugbaren Platz, über den Platzbedarf einzelner Dateien, über den Erfolg einer Dateierzeugung, -löschung, -Übertragung, etc.. Das Programm stellt zunächst die Frage: Dir l i s t i n g o f what v o l
?
120
4. Sonderteil: Das UCSD-PASCAL-System
Die Benutzerantwort besteht normalerweise in einer Disketten-Bezeichnung (unit number oder volume name) gemäß Tab. i auf S. 105. Ferner können Dateinamen und/oder Dateitypen angegeben werden, wobei Teil-strings genügen und der ausgelassene Rest durch ein Gleichheitszeichen angedeutet wird. Beispiele: (1) #5: (2) PROGRAMS: (3) * -*• (4) #5: L= .TEXT-*
das directory der Diskette auf dem linken Laufwerk das directory der Diskette mit dem Namen „PROGRAMS" das directory der Diskette auf dem default Laufwerk (siehe unten)
TESTDAT: LEARN10.TEXT LEARN11.TEXT LEARN12.TEXT LEARN13.TEXT LEARN14.TEXT LEARN15.TEXT LEARN16.TEXT LEARN17.TEXT LEARN18.TEXT LEARN19.TEXT
6 6 6 6
4 4 4 4 4 4
8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80 8--Feb--80
4.3.3 Extended 1 ist directory Durch < E > in der filer-Ebene wird die extdir-Funktion aufgerufen; sie verlangt die gleichen Benutzerangaben wie die ldir-Funktion, zeigt aber das Dateien Verzeichnis ausführlicher als jene. Beispiel für das Dateienverzeichnis des system disk: USER: SYSTEM.MICRO SYSTEM.FILER SYSTEM.EDITOR SYSTEM.LINKER SYSTEM.COMPILER SYSTEM.SYNTAX SYSTEM.PASCAL LIBRARY.CODE MYG0T0XY.RES SYSTEM.MISCINFO SYSTEM.LIBRARY AUX.REGENT.CODE ABSCHLUSS.CODE PUCHHALT.CODE DATINPUT.CODE < UNUSED > SYSTEM.WRK.TEXT < UNUSED >
10 28 45 22 68 14 33 7 4 1 40 2 23 32 30 4 4 105
9--Feb-•79 24--Maa-•79 22--Maa-•79 17--Maa-•79 8--Feb- 79 2--Maa-•79 10--Feb- 79 7--Mar-•79 16--Oct-79 16--Oct-•79 14--Jan-•80 16--Jan-80 16--Jan-•80 16--Jan-•80 16--Jan-80 16--Jan-80
10 26 54 99 121 189 203 236 243 247 248 288 290 313 345 381 385 389
512 512 512 512 512 512 512 512 512 192 512 512 512 512 512
Datafile Codefile Codefile Codefile Codefile Textfile Datafile Codefile Textfile Datafile Datafile Codefile Codefile Codefile Codefile
512
Textfile
Diese Darstellung zeigt neben dem Dateinamen (bzw. unbenutzten DiskettenBereichen) die Anzahl der jeweils belegten Blöcke, das Datum der Erzeugung,
4.3 File handler
121
die jeweilige Blockadresse des Dateianfangs (bzw. unbenutzten Disketten-Bereichs), die Anzahl der Bytes im letzten Datenblock und den jeweiligen Dateityp.
4.3.4 Zero Durch < Z > in der filer-Ebene wird die zero-Funktion aufgerufen, die dem Löschen aller Dateien einer Diskette oder dem Neueinrichten eines Dateienverzeichnisses dient. Das Löschen wird durch das „Nullsetzen" des Dateienverzeichnisses erreicht. Das Programm fragt zunächst Zero dir of w h s t vol
?
Die Benutzerantwort besteht normalerweise in der Eingabe einer DiskettenBezeichnung (unit number oder volume name) und < r e t > . Darauf generiert das Programm eine Sicherheitsabfrage: Destroa TESTDAT!
?
Der Benutzer kann dann mit < Y > oder < N > antworten. Im Falle von < Y > bietet das Programm eine Sicherheitsoption an: Duplicate dir
?
Durch die Benutzerantwort < Y > wird vom neuen Dateiverzeichnis ein Duplikat angelegt und später automatisch neben dem eigentlichen fortgeschrieben. Durch das Dienstprogramm COPYDUPDIR kann dann ein versehentlich gelöschtes Datei Verzeichnis wiederhergestellt werden. Antwortet der Benutzer mit < N > , so wird diese Option übergangen. Sodann wird eine weitere Option durchlaufen, indem das Programm nach der Anzahl der zu löschenden Blöcke fragt und zunächst die Löschung der Gesamtzahl der momentan belegten Blöcke anbietet: Are there 494 blks on the disk ?
(Y/N)
Antwortet er mit < N > , fragt das Programm: * of talocks o n t h e d i s k
?
Der Benutzer gibt dann die gewünschte Anzahl der zu löschenden Blöcke an. Die Maximalzahl beträgt bei Disketten üblichen Formats (single-density soft-sectored 8") 494 Blöcke. Danach oder bei Antwort mit < Y > verlangt das Programm die Angabe eines neuen volume name: N e u vol n a m e
?
Antwortet der Benutzer mit < r e t > , so wird die zero-Funktion ohne Wirkung
122
4. Sonderteil: Das UCSD-PASCAL-System
beendet. Gibt der Benutzer einen (bis zu 7 Zeichen langen) Namen und < r e t > ein, so fragt das Programm: TESTDAT?
correct
?
Antwortet der Benutzer mit < N > , so wird die Frage „New vol name?" wiederholt; antwortet der Benutzer mit < Y > , so quittiert das Programm TESTDAT:
zeroed
Die komplette Frage- und Antwortsequenz im Zusammenhang dargestellt lautet: Zero dir of w h a t vol ? * 5 Oestro« TESTDAT: ? Y Duplicate dir ? N A r e t h e r e 4 9 4 b l k s o n t h e d i s k ? N e w vol n a m e ? T E S T D A T TESTDAT? correct ?
4.3.5
Y
Date
Durch < D > in der filer-Ebene wird die date-Funktion aufgerufen, womit der Benutzer das Tagesdatum setzen kann. Dieses Datum wird auf der SystemDiskette gespeichert und automatisch als Erzeugungsdatum für eine Datei in das Dateiverzeichnis eingetragen (vgl. S. 120f.). Das Programm zeigt zunächst das Eingabeformat und das zuletzt auf der SystemDiskette eingetragene Datum: D a t e set? < 1 . . 3 1 > - < J a n . . D e c > - < 0 0 . . 9 9 > T o d a y is 1 6 - J a n - 8 0 New date ?
Antwortet der Benutzer mit < r e t > , so wird die Funktion ohne Änderung verlassen. Antwortet der Benutzer durch Datumseingabe nach dem vorgegebenen Format und < r e t > , so wird das alte Datum verändert. Neben einer vollständigen Änderung können auch einzelne Komponenten des Datums verändert werden: Tagesänderung Monatsänderung Jahresänderung Tages- und Jahresänderung 4.3.6
< r e t > — < r e t > — < 0 0 . ,99> — < 0 0 . . 99> < r e t >
Prefix
Durch < P > in der filer-Ebene wird die prefix-Funktion aufgerufen; damit ist es möglich, eine bestimmte Einheit zur default unit (vgl. S. 119) zu erklären.
4.3 File handler
123
Normalerweise ist die System-Diskette die default unit; d.h. beim Fortlassen der Disketten-Bezeichnung (unit number oder volume name) bei der Dateispezifikation wird automatisch diese Einheit adressiert. Das Programm stellt die Frage P r e f i x t i t l e s bu « h a t v o l ?
Der Benutzer antwortet normalerweise durch Eintippen der Disketten-Bezeichnung der neuen default unit.
4.3.7 Make Durch < M > in der filer-Ebene wird die make-Funktion aufgerufen; sie gestattet die Erzeugung einer (zunächst leeren) Datei auf einer Diskette unter einem frei bestimmbaren Benutzernamen. Das Programm fragt zunächst hake what f i l e ?
Der Benutzer kann mit einer Dateispezifikation (vgl. S. 107) antworten. Beispiele: (1) LEARN22.TEXT (2) # 5 :LEARN22 .CODE (3) ARB: TEST.BACKUP Die make-Funktion stellt eine Alternative zur Dateierzeugung mit Hilfe des Editors dar. Durch die Möglichkeit, bei der Dateispezifikation eine Dateigröße anzugeben, erhält der Benutzer darüberhinaus einen gewissen Einfluß auf die Disketten-Belegung: Normalerweise wird eine neue Datei in die jeweils größte verfügbare Lücke auf der Diskette geschrieben. Nennt der Benutzer bei der Dateispezifikation jedoch den Platzbedarf in Blöcken ä 512 Bytes, so versucht die make-Funktion unter den unused-Eintragungen im Dateienverzeichnis (vgl. S. 120) eine Lücke dieser Größe auf der Diskette zu finden. Die Bedarfsangabe erfolgt durch eine in eckige Klammern gekleidete Zahl unmittelbar hinter der Dateispezifikation. Beispiel: TEMPFILE.TEXT[20] Bei der Spezifikation in diesem Beispiel versucht die make-Funktion eine Lücke von 20 Blöcken ( « 10 kB) auf der default disk zu finden und reserviert diese für die betreffende Datei durch einen Eintrag in das Dateien Verzeichnis. Damit eröffnete sich eine weitere wichtige Anwendung der make-Funktion: Versehentlich gelöschte Dateien können durch Belegung der entstandenen Blocklücke mit einem Namen wieder aktiviert werden. Wichtig ist allerdings, daß
124
4. Sonderteil: Das UCSD-PASCAL-System
inzwischen keine andere Datei durch save, transfer oder krunch auf diese Stelle geschoben wurde.
4.3.8 Krunch Durch < K > in der filer-Ebene wird die krunch-Funktion aufgerufen; sie bewirkt das Zusammenrücken der Dateien auf einer Diskette in Richtung DiskettenAnfang (Blocknummer 0). Damit werden alle Blocklücken (unused areas) zwischen den Dateien beseitigt und der gesamte verfügbare Platz auf der Diskette bildet eine zusammenhängende Blockfolge am Disketten-Ende. Blocklücken können entstehen (1) durch die Löschung von Dateien mit der remove-Funktion (vgl. S. 129) (2) durch das Rückschreiben von Dateien mit der update-, save- oder transferFunktion, wobei stets die alte Datei gelöscht und die neue Datei in die größte Blocklücke geschrieben wird. (3) durch entsprechende Anwendung der file size-Option in der make-Funktion. Hauptgründe für die Anwendung der krunch-Funktion sind, daß eine Vielzahl kleinerer Blocklücken zu Störungen führen kann, z.B. wenn kein Platz für das Herausschreiben einer neuen oder erweiterten Datei vorhanden ist. Durch das Zusammenschieben kann Platz geschaffen werden. Das Programm fragt zunächst Crunch w h a t vol
?
Die Benutzerantwort besteht normalerweise in der Angabe einer DiskettenBezeichnung (unit number oder volume name) und < r e t > . Das Programm reagiert mit der Sicherheitsrückfrage: From end of diskf
block 494
?
(Y/N)
Durch < Y > wird der Verschiebevorgang gestartet; jede verschobene Datei wird dabei protokolliert. Durch < N > wird die Frage generiert Startinä at block * ?
und der Benutzer kann eine kleinere Blocknummer angeben. Durch < 0 > oder < r e t > wird die krunch-Funktion verlassen. In [10] wird dringend empfohlen, vor jeder Anwendung der krunch-Funktion die Diskette mit Hilfe der bad blocks-Funktion auf schadhafte Blöcke zu untersuchen und diese mit Hilfe der examine-Funktion entweder zu regenerieren oder zu sperren (vgl. S. 125 ff.). Damit soll verhindert werden, daß Dateien auf schadhafte Blöcke geschoben werden. Ferner wird dringend gewarnt, während des Verschiebevorgangs versehentlich den reset-Knopf am Computer zu berühren
4.3 FUe handler
125
oder die Laufwerksklappen zu öffnen. Derlei Störungen können zum Verlust aller Dateien und des Dateien Verzeichnisses fuhren. Diese Warnung sollte auf alle Operationen des filer ausgedehnt werden, da fast immer Eintragungen im Dateien Verzeichnis vorgenommen werden.
4 . 3 . 9 Bad Blocks Durch < B > in der filer-Ebene wird die bad-blocks-Funktion aufgerufen. Diese liest eine angegebene Diskette Block für Block, spürt dabei schadhafte Blöcke auf und listet deren Nummern auf. Diese Funktion ist vorzugsweise anzuwenden, wenn man eigentlich keine schadhaften Blöcke erwartet, jedoch wegen der beabsichtigten Anwendung der krunch-Funktion sichergehen möchte. Die gleiche Prüfung kann auch mit der nachfolgend beschriebenen examine-Funktion durchgeführt werden, jedoch ist jene wegen verschiedener Optionen zur Behandlung der schadhaften Blöcke langsamer und umständlicher zu bedienen, als die bad blocks-Funktion. Das Programm fragt Bad b l o c k s c a n of what v o l ?
Die Benutzerantwort besteht normalerweise in der Angabe einer DiskettenBezeichnung (vgl. S. 105) und .
4.3.10
Examine
Durch < X > in der filer-Ebene wird die examine-Funktion aufgerufen. Mit dieser werden angebbare Bereiche einer Diskette auf schadhafte Blöcke überprüft. Auf Benutzerverlangen kann für schadhafte Blöcke ein Restaurierungsversuch unternommen werden oder es können schadhafte Blöcke für die weitere Benutzung gesperrt werden. Das Programm fragt zunächst: Exaitiine b l o c k s on what v o l ?
Die Benutzerantwort besteht normalerweise in der Angabe einer DiskettenBezeichnung (vgl. S. 105) und ; darauf fragt das Programm Block-ranäe ?
Der Benutzer kann jetzt entweder den gesamten Blockbereich der Diskette oder Teilbereiche, z.B. Anfangsblockadressen zweier aufeinanderfolgender Dateien, oder schließlich die durch die bad block-Funktion gemeldeten Blocknummern eingeben.
4. Sonderteil: Das UCSD-PASCAL-System
126
Beispiele: (1) 0 493 -*• examinieren der gesamten Diskette (2) 6 27 -*• examinieren eines Blockbereiches (3) 5 examinieren eines einzelnen Blocks Liegt der angegebene Block bzw. Blockbereich ganz oder teilweise im Bereich einer Datei, so meldet sich das Programm mit File(s) endanäeredJ Director« 0 SYSTEM.MICRO 10 SYSTEM.FILER 26 Fix them ?
10 26 54
Antwortet der Benutzer mit < N > , so wird die examine-Funktion verlassen; antwortet er mit < Y > , so wird die Blockprüfung durchgeführt: Jeder Block wird in den Arbeitsspeicher gelesen, auf die Platte herausgeschrieben und wieder gelesen. Die beiden eingelesenen Versionen eines Blocks werden miteinander verglichen. Ergeben sich keine Abweichungen, so meldet das Programm Block Block Block Block Block
1 2 3 4 5
ma» ma» ma» ma» ma»
be be be be be
ok ok ok ok ok
Dies bedeutet jedoch lediglich, daß der betreffende Block physikalisch in Ordnung ist. Vielfach enthält ein zunächst als schadhaft erkannter und dann „reparierter" Block unsinnige Zeichenfolgen, und der Benutzer muß versuchen, diese mit dem Editor zu eliminieren. Ergeben sich bei dem zuvor beschriebenen Lese-Schreib-Lese-Vorgang Abweichungen, so meldet das Programm z.B. Block 492 TRANSIENT TRANSIENT TRANSIENT TRANSIENT PERMANENT TRANSIENT TRANSIENT TRANSIENT TRANSIENT PERMANENT
BISK DISK DISK DISK DISK DISK DISK DISK DISK DISK
ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR ERROR
* # # * • * • • * *
10 10 10 10 24 10 10 10 10 24 is bad
Am Ende des Prüfvorgangs wird die Option angeboten, alle fehlerhaften Blöcke zu markieren Mark bad blocks
? (files will be removed
!) , so geschieht dies: Markierte Blöcke erhalten den Namen BAD und den Typ .BAD und werden bei
127
4 . 3 File handler
einem krunch weder bewegt noch beschrieben. Außerdem werden auch Dateien, die hinter den fehlerhaften Blöcken stehen, nicht mehr bewegt. 4.3.11 Change Durch < C > in der filer-Ebene wird die change-Funktion aufgerufen; damit können bei einer Dateispezifikation der Name und die Typenangabe oder bei einer Disketten-Bezeichnung der Name geändert werden. Das Programm fragt zunächst Chsnäe what file
?
Die Benutzerantwort besteht normalerweise zunächst in der Spezifikation der zu ändernden Datei (bzw. in der Bezeichnung der umzubenennenden Diskette). Unmittelbar darauf müssen, durch < , > oder < r e t > abgetrennt, die neue Dateispezifikation (bzw. der neue Disketten-Name) und < r e t > folgen. Die neue Dateispezifikation muß keine Disketten-Bezeichnung haben; etwaige Angaben werden ignoriert, weil mit der change-Funktion nur eine Namens- oder Typenänderung, nicht aber eine physikalische Ortsveränderung bewirkt werden kann. Trennt man alte und neue Spezifikation durch < r e t > , so stellt das System die Zwischenfrage Chariäe to « h a t
?
Beispiel (Änderung der Dateispezifikation): #5: TEMPFILE .BACK < r e t > Change to what? TEMPFILE .TEXT < r e t > Beispiele (Änderung des Disketten-Namens): (1) ARB: .PROGRAMS: (2) L5: .PROGRAMS: 4.3.12 Transfer Durch < T > in der filer-Ebene wird die transfer-Funktion aufgerufen; damit ist die Übertragung von Dateien auf andere Einheiten (disks, printer, screen, etc.) möglich. Das Programm fragt zunächst: Transfer what file
?
Die Benutzerantwort besteht normalerweise in der Spezifikation einer Quellendatei und einer Zieldatei; beide Angaben sind d u r c h < , > o d e r < r e t > z u trennen und insgesamt durch < r e t > abzuschließen. Werden die Angaben durch < r e t > getrennt, so fragt das Programm To w h e r e
?
128
4. Sonderteil: Das UCSD-PASCAL-System
Beispiele: a) # 4 : LE ARN .TEXT, # 5 : LEARN.RESERVE b) LEARN.TEXT < r e t > To where? A R B : TEMPFILE < r e t > Soll eine Datei auf eine andere Diskette übertragen werden und sollen dabei der Name und der Typ der Datei auf der Ziel-Diskette unverändert bleiben, so kann die Spezifikation der Ziel-Datei durch < $ > abgekürzt werden. Beispiel: # 5 : LEARN.TEXT, # 4 : $ < r e t > Soll eine Datei nicht auf eine Diskette sondern auf den Drucker oder Bildschirm übertragen werden, so kann die Spezifikation der Zieldatei entfallen; es genügt die Angabe der unit number oder des volume name. Beispiel (Ausgabe auf einem Drucker): LEARN.TEXT, # 6 : < r e t > oder LEARN.TEXT, PRINTER: < r e t > Beispiel (Ausgabe auf dem Bildschirm): LEARN.TEXT, CONSOLE: < r e t > Die transfer-Funktion kann auch dazu benutzt werden, eine ganze Diskette zu kopieren. Dies geschieht durch eine Benutzerantwort, die nur die beiden Laufwerke nennt. Beispiele (Übertragung einer Diskette auf eine andere): #4:,#5: ARB:,#4: # 4 : ,BACKUP: < r e t > In diesem Fall fragt das Programm zurück: T r a n s f e r 494 b l o c k s ?
, so kommt die Frage * of b l o c k s to t r a n s f e r
?
und der Benutzer kann die gewünschte Blockzahl eingeben. Danach oder bei Antwort mit < Y > fragt das Programm: Destroy TESTDATJ
?
Durch < Y > wird dieser Übertragungsvorgang eingeleitet, bei dem am Ende das Inhaltsverzeichnis der Ziel-Diskette zerstört und die Ziel-Diskette eine exakte Kopie der Quellen-Diskette geworden ist. Allerdings wird bei System-Disketten der bootstrap-Bereich nicht mitübertragen, so daß durch dieses Kopieren keine
4.3 File handler
129
neue System-Diskette erzeugt werden kann. Dies kann vielmehr z.B. nur durch die COPY ALL-Funktion des Basis-Betriebssystems CP/M geschehen. Mit < N > wird in die filer-Ebene zurückgegangen. 4.3.13 Remove Durch < R > in der filer-Ebene wird die remove-Funktion aufgerufen; sie dient der Löschung von Dateien auf einer Diskette durch Löschung des Eintrags im Dateien Verzeichnis. Das System fragt: Remove what f i l e ?
Die Benutzerantwort besteht normalerweise in einer Dateispezifikation. Dabei können auch Teil-strings angegeben werden; der ausgelassene Rest muß dann durch ein < = > angedeutet werden. Beispiele: (1) BAUDAT.DATA ->• Löschen dieser Datei von der default disk (2) #5: L=.CODE -»• Löschen aller mit L beginnenden Dateien des Typs Code von der Diskette auf dem Laufwerk #5. Das Programm stellt danach die Sicherheitsfrage: Update d i r e c t o r a ?
Antwortet der Benutzer mit < Y > , wird die Löschung wirksam; antwortet er anders oder mit < N > , wird die remove-Funktion ohne Wirkung verlassen. 4.3.14 Get Durch < G > in der filer-Ebene wird die get-Funktion aufgerufen; damit kann eine Benutzerdatei zur Arbeitsdatei (work file) erklärt werden. Wenn bereits eine Arbeitsdatei existiert, fragt das Programm zunächst: Throw away c u r r e n t w o r k f i l e ?
Antwortet man mit < Y > , oder existiert keine Arbeitsdatei, so kommt die Frage Get what f i l e ?
Der Benutzer kann durch die Spezifikation einer existierenden Datei und < r e t > antworten; es wird dann zunächst nach der betreffenden Datei des Typs .TEXT und dann nach der Datei des Typs .CODE gesucht. Adressiert werden beide oder der jeweils vorhandene Dateityp. Eine etwaige Typenangabe durch den Benutzer hat darauf keinen Einfluß. Die get-Funktion bestätigt den erfolgreichen Adressiervorgang durch
130
4 . Sonderteil: Das UCSD-PASCAL-System Text
oder oder
£ Code file loaded
Text file loaded Code file
loaded
Danach kehrt das Programm automatisch in die filer-Ebene zurück. Das wirkliche Laden der Benutzerdatei in die Arbeitsdatei geschieht erst mit dem Aufruf des Editors. Aus diesem Grunde darf die Diskette mit der Benutzerdatei nicht vorher entfernt werden. Für den Fall, daß weder ein text file, noch ein code file des angegebenen Namens existieren oder ein unzulässiger Typ angegeben wurde, kehrt das Programm (ohne Fehlermeldung) in die filer-Ebene zurück. Das gleiche kann für den Fall einer irrtümlichen Auswahl der get-Funktion durch < e s c > erreicht werden.
4.3.15 Save Durch < S > in der filer-Ebene wird die save-Funktion aufgerufen; damit kann die Arbeitsdatei (work file) in eine existierende oder neue Benutzerdatei übertragen werden. Wurde die Arbeitsdatei zuvor durch die get-Funktion definiert, so ist der Name der Benutzerdatei dem Programm noch bekannt und es wird z.B. die Frage generiert: Save as TESTDAT5LEARN2
?
Antwortet man mit < Y > , so kommt die Frage Remove old TESTDAT:LEARN2.TEXT
?
Falls auch eine code-Version der Datei existiert und ein Übersetzungs- und Binderlauf stattgefunden hat, fragt das Programm ferner R e m o v e o l d T E S T D A T 5 L.EARN2. C O D E
?
Der Benutzer kann jeweils mit < Y > antworten, woraufhin die alte Version der Datei gelöscht und die neue in die größte Blocklücke geschrieben wird. Antwortet er mit < N > , so fragt das Programm: Save as what file
?
Das gleiche geschieht, wenn die Arbeitsdatei nicht mit der get-Funktion, sondern z.B. mit der update-Funktion des Editors (vgl. S. 117f.) erzeugt wurde. Der Benutzer kann dann durch Eingabe einer Dateispezifikation und < r e t > die Übertragung steuern. Existiert die genannte Datei noch nicht, so wird sie nunmehr erzeugt. Andernfalls wird die alte Version gelöscht und die neue in die größte Blocklücke geschrieben.
4.4 Progratnmausfuhrung
131
Existiert eine Datei des angegebenen Benutzernamens noch nicht und wird bei der Dateispezifikation die Disketten-Bezeichnung (unit number oder volume name) der alternate disk angegeben, so wird die Datei ohne weitere Rückfragen erzeugt. Wird bei der Dateispezifikation der volume name der system disk oder keine Diskettenbezeichnung angegeben, so erhält die Arbeitsdatei den „Benutzernamen"; steht aber weiterhin als Arbeitsdatei (named work file) zur Verfügung.
4.3.16 What Durch < W > in der filer-Ebene werden Name und Zustand der als Arbeitsdatei definierten Datei ausgegeben. Die Zuordnung eines Namens ist unter 4.3.15 beschrieben.
4.3.17 New Durch < N > in der filer-Ebene wird die new-Funktion aufgerufen; damit können die Arbeitsdateien SYSTEM.WRK.TEXT und SYSTEM.WRK.CODE, soweit vorhanden, gelöscht werden, um dem Editor den Beginn einer neuen Datei zu ermöglichen (vgl. S. 107ff.). Eine mit < G > zur Arbeitsdatei deklarierte Benutzerdatei wird nicht gelöscht, sondern lediglich aus dieser Rolle entlassen. Wenn tatsächlich eine der Arbeitsdateien existiert, fragt das Programm Throw away current workfile ? Antwortet der Benutzer mit < Y > , so wird gelöscht; wird mit N oder irgendeiner anderen Eingabe geantwortet, wird die new-Funktion verlassen. Das gleiche geschieht ohne Systemmeldungen, wenn keine der Arbeitsdateien existiert.
4.3.18 Quit Durch < Q > in der filer-Ebene wird der Filer verlassen und in die höchste Kommandoebene zurückgekehrt.
4.4 Programmausführung 4.4.1
Der PASCAL-Compiler
4.4.1.1 Wirkungsweise und
Handhabung
Der UCSD-PASCAL-Compiler wird durch < C > in der höchsten Kommandoebene aufgerufen. Es handelt sich um einen 1-pass-Übersetzer, der PASCAL-
132
4. Sonderteil: Das UCSD-PASCAL-System
Quellenprogramme aus Textdateien in einen interpretativen Objektcode übersetzt und in CODE-Dateien ablegt. Der Compiler stellt zunächst fest, ob eine Arbeitsdatei SYSTEM.WRK.TEXT auf der Systemdiskette existiert und übersetzt diese unmittelbar, ohne daß eine Dateiangabe nötig wäre. Existiert keine Arbeitsdatei, so wird nach dem Dateinamen des zu übersetzenden Programms gefragt: Compiliriä.. . Compile uhat te;
CII.0.A.13
LEARN28 C 6647 w o r d s ] < 7> BEGIN lJF'RINT « « Line 7t e r r o r 104i < s p > ( c o n t i n u e ) i
(terminate)r
E(dit
Antwortet der Benutzer mit , so wird bis zum nächsten Fehler bzw. bis zum Programmende weiterübersetzt. Antwortet der Benutzer mit , so wird in die höchste Kommandoebene zurückgekehrt. Lautet die Antwort < E > , so wird der Editor aufgerufen und es erscheint die fehlerhafte Stelle sowie deren Umgebung. Der Cursor steht hinter dem Fehler und wieder erscheint die Fehlernummer, oder eine etwas ausführlichere Fehlerbezeichnung.
4.4 Programmausführung
133
Beispiel: Undeclared i d e n t i f i e r .
Type
PROGRAh l e a r n 2 8 r { C o m p i 1 e r LABEL l f 2 i
Optionen>
UAR a ? b 5 REALt i J INTEGER» c : ARRAYC1..33 OF INTEGERi BEGIN 1 SPRINT i
' f i)i
i
Der Cursor steht hinter „1: PRINT".
Durch Eingabe von wird das Programm editierbar und kann korrigiert werden. Durch dieses Verfahren kann man sukzessive ein Programm von Syntaxfehlern befreien. Da der Wechsel zwischen Compiler und Editor relativ rasch geht, bietet dieses Verfahren gegenüber der vollständigen Übersetzung erhebliche Vorteile, da bei letzterem alle Fehler notiert werden müssen oder ein besonderes list file angelegt werden muß (vgl. Compiler-Optionen). 4.4.1.2 Fehlermeldungen des Compilers Der UCSD-PASCAL-Compiler generiert eine Reihe von Fehlermeldungen, die bereits von Jensen und Wirth in ihrer Sprachdefinition festgelegt wurden, hier aber um einige wichtige Fälle erweitert sind. Der Benutzer dieses Systems kann sich eine Liste aller Fehlercodes ausgeben lassen, die in der Datei SYSTEM .SYNTAX niedergelegt sind. Dies geschieht am bequemsten durch die transfer-Funktion in der filer-Ebene und zwar mit folgender Eingabesequenz:
Der nachfolgende Computerausdruck zeigt einen Auszug dieser Liste. Liste der Compiler-Fehlermeldungen des UCSD-PASCAL-Systems (Auszug) l J E r r o r in simple t a p e 2tIdentifier expeeted 3 : ' PROGRAM' e : ; p e c t e d
134
4. Sonderteil: Das UCSD-PASCAL-System •45')' e x p e c t e d 5!'!' expected 6:illeSal sambol (terminator expected) 7 ! E r r o r in p a r a m e t e r l i s t 8:'OF' expected V!' 20!'•' expected 215'#' expected 22:'INTERFACE' expected 23:'IMPLEMENTATION' expected 24:'UNIT' expected 5 0 : E r r o r in c o n s t a n t 5 1 5 ' ! =;' e x p e c t e d 52:'THEN' expected 53!'UNTIL' expected 54:'DO' expected 5 5 : ' T O ' or ' D 0 U N T 0 ' e x p e c t e d in f o r s t a t e m e n t 56«'IF' expected 57:'FILE' expected 5 8 : E r r o r in < f a c t o r > (bad e x p r e s s i o n ) 5 9 : E r r o r in v a r i a b l e 101:Identifier declared twice 102:Low bound exceeds hish bound 1 0 3 « I d e n t i f i e r is n o t o f the a p p r o p r i a t e c l a s s 104:Undeclared identifier 105:sisn not allowed 106:Number expected 107:Incompatible subrange tapes 108:File not allowed here 109":Tape m u s t n o t b e real 110: t a p e m u s t b e s c a l a r or s u b r a n g e 111:Incompatible with part 112: I n d e x t a p e m u s t n o t be real 1 1 3 : I n d e x t a p e m u s t b e a s c a l a r or a s u b r a n g e 1 1 4 : B a s e t a p e m u s t n o t b e real 1 1 5 : B a s e t a p e m u s t be a s c a l a r or a s u b r a n g e 1 1 6 : E r r o r in t a p e of s t a n d a r d p r o c e d u r e p a r a m e t e r 117.:Unsatisified f o r w a r d r e f e r e n c e 1 1 8 : F o r w a r d r e f e r e n c e t a p e i d e n t i f i e r in v a r i a b l e d e c l a r a t i o n 1 1 9 : R e - s p e c i f i e d p a r a m s n o t OK for a f o r w a r d d e c l a r e d p r o c e d u r e 1 2 0 : F u n c t i o n r e s u l t t a p e m u s t b e s c a l a r » s u b r a n g e or p o i n t e r 1 2 i : F i l e v a l u e p a r a m e t e r riot a l l o w e d 1 2 2 : A f o r w a r d d e c l a r e d f u n c t i o n ' s r e s u l t t a p e c a n ' t be r e - s p e c i f i e d 1 2 3 : M i s s i n a r e s u l t t a p e in f u n c t i o n d e c l a r a t i o n 124:F-format for reals only 1 2 5 : E r r o r in t a p e o f s t a n d a r d p r o c e d u r e p a r a m e t e r 1 2 6 : N u m b e r of p a r a m e t e r s d o e s n o t a s r e e w i t h d e c l a r a t i o n 127!Illegal parameter substitution 128:Result tape does not agree with declaration 1 2 9 : T a p e c o n f l i c t of o p e r a n d s 1 3 0 ! E x p r e s s i o n is n o t of s e t t a p e 131!Tests on eaualita allowed onla
4.4 Programmausführung
135
132!Strict inclusion not allowed 133JFile comparison not allowed 134 {II leaal t y p e of operarid(s) 1 3 5 ! T a p e of o p e r a n d m u s t be b o o l e a n 1 3 6 2 S e t e l e m e n t t a p e m u s t be s c a l a r or s u b r a n g e 1 3 7 * S e t e l e m e n t t a p e s m u s t be c o m p a t i b l e 1 3 8 : T a p e of v a r i a b l e is n o t a r r a a 1 3 9 : I n d e x t a p e is n o t c o m p a t i b l e w i t h t h e d e c l a r a t i o n 1 4 0 5 T a p e of v a r i a b l e is n o t r e c o r d 1 4 1 ¡ T a p e o f v a r i a b l e m u s t be f i l e or p o i n t e r 142JIlleSal parameter solution 1 4 3 ! I l l e g a l t a p e of loop c o n t r o l v a r i a b l e 144illleaal tape of e x p r e s s i o n 145•Tape conflict 146!AssiSnmerit of f i l e s n o t a l l o w e d 147JLabel tape incompatible with selecting expression 1 4 8 ' S u b r a n a e b o u n d s m u s t be s c a l a r 149 J Index t a p e m u s t b e i n t e a e r 1 5 0 J A s s i 3 n m e n t to s t a n d a r d f u n c t i o n is n o t a l l o w e d 1 5 1 : A s s i g n m e n t to f o r m a l f u n c t i o n is n o t a l l o w e d 1 5 2 J N O s u c h f i e l d in t h i s r e c o r d 1 5 3 ! T a p e e r r o r in r e a d 1 5 4 5 A c t u a l p a r a m e t e r m u s t be a v a r i a b l e
4.4.1.3 Compiler Optionen Die Arbeitsweise des UCSD-Compilers kann durch verschiedene Benutzeroptionen modifiziert werden. Die allgemeine Form der Optionsangabe lautet {%buchstabei ±, buchstabe2 ±,. -.} Sie muß die erste Zeile eines Quellenprogramms (PROGRAM, PROCEDURE, FUNCTION, UNIT) sein. Mit buchstabe wird ein Schlüssel für die betreffende Option angegeben; mit „+" wird angegeben, daß die Option gewünscht ist; mit „—" wird eine Option, die ohne Nennung wirksam ist (default option), ausgeschaltet. Die Optionen können in beliebiger Menge und Reihenfolge angegeben werden. Das „$"-Zeichen soll dem Compiler die Unterscheidung von einem Kommentar ermöglichen (vgl. S. 14). Codierbeispiel: •C*I-»R-»G+rS + > P R O G R A M learn28»-CCompiler O p t i o n e n > LABEL 1 r 2 i V A R a rb : R E A L » i 5 I N T E G E R ? c 5 A R R A Y C 1 . • 3 3
OF
INTEGER?
Die wichtigsten Optionen sind im folgenden beschrieben: (1) GOTO OK-Option Schlüssel: G default: G— sperrt die Benutzung von GOTO-Anweisungen, indem Syntaxfehler gemeldet und damit kein code file generiert wird, option: G+ veranlaßt den Compiler, GOTO-Anweisungen zu akzeptieren.
136
4. Sonderteil: Das UCSD-PASCAL-System
(2) 10 CHECK-Option Schlüssel: I default: 1+ Der Compiler generiert für jede Input/Output-An Weisung eine Kontrollroutine, die den Ablauf eines Datentransfers überwacht. Kommt es zu Fehlern z.B. falsche Dateneingabe (Buchstabe statt Zahl), so endet das Programm mit einem run time error, option: I— verhindert die Erzeugung derartiger Prüfroutinen und damit die Möglichkeit von Programmabbrüchen bei fehlerhaftem Datentransfer. Allerdings werden Ein/Ausgabefehler nicht entdeckt und müssen daher vom Benutzerprogramm abgefangen werden. Programme ohne Prüfroutinen laufen schneller und belegen weniger Speicherplatz. (3) LISTING-Option Schlüssel: L default: L— Es wird kein Übersetzerprotokoll erzeugt, option: L+ Der Compiler erzeugt für das Übersetzerprotokoll eine Datei unter der Bezeichnung SYSTEM. LST. TEXT auf der Systemdiskette, die allerdings nur nach Umbenennung editierbar ist. Der Benutzer kann jedoch das Laufwerk durch eine Dateispezifikation angeben oder direkt auf einen Drucker oder Bildschirm ausgeben lassen. a) Ausgabe auf eine Benutzerdatei (*$ Llaufwerksbezeichnung: name. TEXT*) laufwerksbezeichnung kann fehlen, wenn die default disk gemeint ist. Die LST-Datei enthält den Quellencode sowie Meldungen für alle eventuell entdeckten Fehler. Sie ist editierbar oder kann mit < T > in der filer-Ebene ausgedruckt werden (vgl. S. 127ff.). b) Ausgabe auf dem Drucker (*$LPRINTER:*) oder (*$L #6:*) oder {$L+#6:} c) Ausgabe auf dem Bildschirm (*$L #1:*) oder {$L+#1:> (4) RANGE-CHECK-Option Schlüssel: R default: R+ Der Compiler erzeugt zu allen Wertzuweisungen, bei denen Variablen vom Feld-, Mengen-, Aufzählungs- oder Ausschnittstyp beteiligt sind, eine besondere Routine zur Gültigkeitsprüfung des aktuellen Indexwertes. Bei Über- oder Unterschreitung der zulässigen Indexmenge endet das Programm mit einem run time error.
4.4 Programmausführung
option:
137
R— verhindert die Erzeugung derartiger Prüfroutinen, wodurch die betreffenden Programme schneller laufen und weniger Speicherplatz belegen. Allerdings werden Bereichsverletzungen nicht erkannt, was zu unvorhersehbaren Resultaten führen kann.
(5) SWAPMODE-Option Schlüssel: S default: S— Der swapping mode ist ausgeschaltet, womit sich die zwei Hauptprozeduren des Compilers, nämlich der Symbol-Prozessor und der Statement-Prozessor, simultan im Arbeitsspeicher befinden und eine maximale Übersetzungsgeschwindigkeit erreicht wird. Option; S+ Der swapping mode ist eingeschaltet, wodurch sich der SymbolProzessor und der Statement-Prozessor gegenseitig überlagern und dadurch Platz für eine größere Symboltabelle schaffen. Die Zahl der möglichen Symbole verdoppelt sich und die Übersetzungsgeschwindigkeit halbiert sich. Letzteres ist in Kauf zu nehmen, wenn dadurch große Programme übersetzbar werden. Beispiel: in der höchsten Kommandoebene aufgerufen. Er dient dem Einbinden von separat erzeugten, in Bibliotheken eingetragenen Prozeduren oder Funktionen in ein Programm, welches diese Module aufruft. Die besonderen Erfordernisse bei der Erzeugung und Eintragung von Bibliotheksmodulen werden in Abschnitt 4.5 auf S. 140ff. beschrieben.
138
4. Sonderteil: Das UCSD-PASCAL-System
Nach dem Aufruf des Linker meldet sich dieser mit der Frage Host file?
Die Antwort kann die Eingabe der Spezifikation (laufwerksbezeichnung: name) einer existierenden Datei des Typs CODE oder sein. Im ersten Fall wird die genannte Datei, im zweiten Fall die SYSTEM.WRK.CODE-Datei als Hauptprogramm betrachtet. Der Linker fragt sodann nach den Bibliotheksdateien, in denen die einzubindenden Module gesucht werden sollen: Lib file?
Der Benutzer kann daraufhin bis zu 8 Bibliotheksnamen mit abschließendem eingeben. Antwortet er hingegen mit , so wird automatisch nur die SYSTEM.LIBRARY durchsucht. Nach dieser Eingabe fragt der Linker, ob ein map file mit Referenzen, Adressen und Längen angelegt werden soll: MBP name?
Spezifiziert der Benutzer eine Datei (laufwerksbezeichnung-. name), so erzeugt der Linker ein entsprechendes map file vom Typ TEXT. Achtung: Diese Spezifikation sollte u n b e d i n g t von der Quellcode-Datei verschieden sein, weil diese sonst von der map-Datei überschrieben wird. Antwortet der Benutzer nur mit , so wird diese Option übergangen. Schließlich verlangt der Linker noch die Spezifikation der Datei (laufwerksbezeichnung: name .CODE), in die der fertig gebundene Code abgelegt werden soll: Output, file?
Antwortet der Benutzer nur mit , so wird dieser Code in die SYSTEM. WRK.CODE-Datei gebracht. Erst nach Abschluß all dieser Eingaben beginnt der Linker mit seiner eigentlichen Aufgabe. Die vollständige Frage- und Antwortsequenz für ein konkretes Beispiel lautet wie folgt: Linker CII.O a23 Host file? #5•LEARN28 Openins *5:LEARN28.C0DE Lib file? * Openiriä »SYSTEM.LIBRARY Lib file? Map name? LEA Resdinä LEARN28 Reading PASCALIO Output file? *55LEARN28•CDDE
4.4 Programmausführung
139
4.4.3 Der PASCAL-Loader Der UCSD-PASCAL-Loader wird mit < X > in der höchsten Kommandoebene aufgerufen. Er dient dem Laden und Starten von lauffähigen PASCAL-Programmen, die in Dateien des Typs CODE gespeichert sind. Nach dem Aufruf des Loader meldet sich dieser mit E x e c u t e what
file?
Antwortet der Benutzer mit der Spezifikation einer existierenden Datei (laufwerksbezeichnung: name) des Typs CODE, so wird diese im Dateienverzeichnis gesucht und mit Hilfe der dort angegebenen Blockadresse in den Arbeitsspeicher eingelesen. Unmittelbar nach Beendigung des Ladevorgangs wird das Programm gestartet. Antwortet der Benutzer mit einer falschen Dateispezifikation, so meldet der Loader Na f i l e name>CODE
Antwortet er mit , so wird diese Funktion sofort verlassen und in die oberste Kommandoebene zurückgekehrt. 4.4.4 Die RUN-Funktion Die RUN-Funktion wird mit < R > in der höchsten Kommandoebene aufgerufen; sie kombiniert die Aufrufe < C > , < L > und < X > in intelligenter Weise und unter ausschließlichem Bezug auf die Arbeitsdatei. Die „Intelligenz" besteht darin, daß die Funktion den jeweils erreichten Zustand der Arbeitsdatei berücksichtigt: Nach einem updating der Arbeitsdatei durch den Editor werden bei < R > , soweit möglich, alle drei o.g. Phasen durchgeführt, wobei sich sämtliche Funktionen stets auf die Arbeitsdatei und eventuell auf die SYSTEM.LIBRARY beziehen. Weitere Eingaben sind weder nötig noch möglich. Allerdings entfällt damit die Möglichkeit, ein map file anzulegen sowie andere Bibliotheken als die SYSTEM.LIBRARY zu benutzen. Wird der Kompilierungsvorgang erfolgreich abgeschlossen, und kommt es beim Bindevorgang zu Störungen (z.B. Fehlen eines Modul in einer Bibliothek), so wird, nach Beseitigung dieser Störung durch den Benutzer bei erneutem < R > sogleich mit dem Binden begonnen und nicht etwa nocheinmal übersetzt. Sind schließlich Übersetzungs- und Bindevorgang erfolgreich abgeschlossen worden, so wird mit jedem < R > sogleich der Loader in Bezug auf die SYSTEM. WRK.CODE-Datei angesprochen. In keiner Phase bedarf es irgendeiner Namenseingabe durch den Benutzer. Die Handhabung ist derart bequem, daß die Mehrzahl aller Programmentwick-
140
4. Sonderteil: Das UCSD-PASCAL-System
lungen mit dieser RUN-Funktion abgewickelt werden sollte. Nur in folgenden Fällen muß man explizit die einzelnen Teil-Funktionen benützen: (1) Die Einzelanwendung des Compilers ist dann notwendig, wenn Unterprogramme für eine Bibliothek erzeugt werden sollen, die erst später an ein Hauptprogramm gebunden werden (vgl. S. 145). (2) Für die Einzelanwendung des Linker kommt zunächst das probeweise Erzeugen von code files in Betracht, um Störungen des Binde Vorgangs, z.B. durch Speicherplatzprobleme oder nichtbefriedigte Referenzen, über die Erzeugung de's map file transparent zu machen. Vor allem aber ist eine explizite Anwendung erforderlich, wenn andere Bibliotheken als die SYSTEM .LIBRARY benutzt werden sollen. (3) Die Einzelanwendung des Loader ist immer dann angezeigt, wenn Arbeitsläufe mit fertigen Programmen durchgeführt werden sollen. Hier wäre es viel zu unbequem, die Programme zuerst in die SYSTEM .WRK.CODE-Datei zu bringen, um sie dann mit RUN laufen zu lassen.
4.5 Unterprogrammtechnik 4.5.1 Unterprogrammarten Die Unterprogrammarten, die von UCSD-PASCAL-System unterstützt werden, lassen sich nach folgenden drei Begriffspaaren klassifizieren: (1) nach Benutzer- und Systemmodulen, (2) nach internen und externen Modulen, (3) nach permanenten und transienten Modulen. Benutzermodule sind Unterprogramme, die der Benutzer definiert und realisiert hat; Systemmodule werden mit dem Betriebssystem geliefert. Interne Module sind solche, die innerhalb eines Programms definiert sind und daher nur diesem Programm bekannt sind; externe Module sind selbständige Unterprogramme, die in einer Modulbibliothek stehen und somit allen möglichen Programmen bekannt gemacht werden können. Permanente Module sind solche, die im Zuge des Bindevorgangs zum festen Codebestandteil des aufrufenden Programms gemacht werden; transiente Module werden hingegen erst bei ihrem Aufruf in einen Überlagerungsbereich geladen und an das aufrufende Programm gebunden. Sie teilen sich den Überlagerungsbereich dynamisch mit anderen transienten Modulen. 4.5.2 Bibliotheksdienst Der Benutzer kann eine Systembibliothek SYSTEM.LIBRARY sowie mehrere private Bibliotheken einrichten und später aktualisieren. Jede Bibliothek kann
4.S Unterprogrammtechnik
141
maximal 16 Objekte aufnehmen. Objekte können alle möglichen Dateien sein; zur Unterstützung der Unterprogrammtechnik mit externen PASCAL-Modulen sind jedoch allein die UNITs von Bedeutung (vgl. S. 145ff.). Der Vorteil der SYSTEM.LIBRARY ist, daß diese automatisch mit der RUN-Funktion adressiert wird, während die privaten Bibliotheken nur explizit mit der LINKERFunktion benutzt werden können. Das Einrichten und Aktualisieren geschieht mit Hilfe des UCSD-PASCAL-Dienstprogramms LIBRARY.CODE.
4.5.2.1
Das Einrichten
von
Bibliotheken
Durch < X > in der höchsten Kommandoebene wird das LIBRARY-Programm gestartet, welches sogleich die Angabe des Namens einer Datei verlangt, in der die neue Bibliothek abgelegt werden soll. Output code file - >
Der Benutzer antwortet mit dem Namen einer noch nicht existierenden Bibliothek, z.B. CUSERl ,LIB> oder Danach fragt das Programm nach dem Namen einer Datei, die in die neue Bibliothek übernommen werden soll. Link Code File - >
Die Benutzerantwort sollte < r e t u r n > sein; daraufhin erscheint die menu-Zeile Seämerit • t o link a n d < s p a c e > »
N(ew file» CHuitt
A(bort
Wählt der Benutzer das Kommando < N > , so erscheint wieder die Frage Link Code File - >
und er kann die Spezifikation (laufwerksbezeichming: name.CODE) der in die Bibliothek aufzunehmenden Datei angeben. Daraufhin erscheint der Katalog einer „Scheinbibliothek" mit 16 (zumeist leeren) Positionen von denen eine die angegebene Datei enthält. Beispiel: S e ä m e n t * t o link a n d < s p a e e > r Link Code File - > 00 10 20 30
N ( e u filer
»5JMAT0PER.C0DE 40 50 60 70
CXuitr
89lO-MATOPER 11-
A < s p a c e > an. Nach jeder Eingabe erscheint als Quittung der Katalog der neuen Bibliothek: Seäment * to link and » N #5 : STATIST.CODE 00 40 10 50 20 60 30 70
A SYSTEM.LIBRARY Code file lenäth - 9 0-MATOPER 1-STATIST 23-
302 30 0 0
4567-
0 0 0 0
0 0 0 0
Sollen weitere Objekte übernommen werden, so beantwortet der Benutzer die Frage „Segment # to link . . ." mit < N > und es kann eine neue Datei angegeben werden. Ist die neue Bibliothek komplett, so antwortet der Benutzer auf die Frage „Segment # to link . . ." mit < Q > . Es kommt dann noch die Frage Notice?
deren Bedeutung in [10] aber nicht ausreichend dokumentiert ist; mit irgend-
143
4.5 Unterprogrammtechnik
einer Eingabe, z.B. < r e t u r n > , wird das LIBRARY-Programm beendet, wobei in der Endroutine die neue Bibliothek auf die Diskette herausgeschrieben wird. Antwortet der Benutzer in irgendeiner Phase auf die Frage „Segment # to link . . ." mit < A > , so wird das Programm ohne das Herausschreiben der neuen Bibliothek verlassen.
4.5.2.2
Das Aktualisieren
von
Bibliotheken
Das Aktualisieren einer Bibliothek wird notwendig, wenn neue Objekte aufgenommen, alte Objekte gelöscht, oder alte Objekte in veränderter Form eingetragen werden sollen. Das Aktualisieren erfolgt in analoger Weise wie das Neueinrichten: Da eine unmittelbare Änderung in einer bestehenden Bibliothek nicht möglich ist, muß also stets eine neue Bibliothek eingerichtet werden; d.h. es müssen stets alle noch brauchbaren Teile der alten in die neue Bibliothek Ubertragen werden. Allerdings können neue und alte Bibliotheken denselben Namen haben, so daß keine Umbenennung nötig wird. Das Aktualisieren erfordert dementsprechend eine leichte Modifikation in der Reihenfolge der Benutzerantworten. Dies soll an einem Beispiel gezeigt werden, bei dem in der SYSTEM.LIBRARY ein bestehendes Objekt durch ein verändertes mit gleichem Namen aber veränderter Größe ersetzt und danach ein neues Objekt eingetragen wird. In der folgenden Frage- und Antwortsequenz mögen S: Systemfrage und B: Benutzerantwort bedeuten. (1) Eingeben Name der neuen Bibliothek S: output code file -*• B: (2) Eingeben Name der alten Bibliothek S: Link code file -* B: Segment • t o l i n k snd > N SYSTEM.LIBRARY O-PASCALIO 1824 46704 51-GDSP 2-DATEI 2160 630 7-
0 0 0 0
891011-
CKuitr
A SYSTEM.LIBRARY Code f i l e l e n ä t h - 1
(3) Eingeben Objektnummer (alt) und Objektnummer für die drei ersten Objekte B: < 0 > S: Segment to link into B: < 0 >
144
4. Sonderteil: Das UCSD-PASCAL-System
S: Segment#to . . . B: < 1 > S: Segment to link into B: < 1 > S: Segment#to . . . B: < 2 > S: Segment to link into B: < 2 > S: Segment#to . . . (4) Aufnehmen verändertes Objekt „MATOPER" B: < N > S: link code file -* B: < # 5 : MATOPER.CODE> S: S e ä m e n t • to link a n d < s p a e e > »
Link C o d e F i l e 0123-
-> 0 0 0 0
N < e w filer
*5JMATOPER.CODE 40 50 60 70
CHuitr
8910-MAT0PER 11-
A(bort
0 0 302 0
12131415-
0 0 0 0
(5) Eingeben Objektnummer (in Scheinbibliothek) und Objektnummer neu B: < 1 0 > S: Segment to link into B: < 3 > S: Segment#to . . . (6) Aufnehmen neues Objekt „STATIST" B: < N > S: link code file B: < # 5 : STATIST.C0DE> B: < # 5 : STATIST.CODE> S: S e ä m e n t • to link a n d < s p a c e > r Link C o d e F i l e 0123-
-> 0 0 0 0
N S: Segment to link into B : < 4 > S: Segment#to . . . (8) Beenden B: < Q > S: Notice? B:
0 0 0 0
145
4.5 Unterprogrammtechnik
Das Löschen von Objekten aus einer Bibliothek geschieht einfach dadurch, daß diese nicht in das output code file übernommen werden. 4.5.3 Units
UNITs bieten, ähnlich wie PROGRAMs, den erforderlichen Definitionsrahmen für PASCAL-Prozeduren und -Funktionen und sind im UCSD-PASCAL-System die einzig mögliche Form für die Definition und Benutzung externer PASCALUnterprogramme. Ein Definitionsrahmen ist einmal wegen der Arbeitsweise des Compilers erforderlich, der ein Programmende nur durch „END." erkennt; Prozeduren und Funktionen werden aber nur akzeptiert, wenn sie mit „END;" abschließen. Zum anderen bedarf es bei der Definition von formalen Parametern für komplizierte Typen eines globalen Definitionsraums (vgl. S. 33). Beispiel: Es soll eine Variable vom Feld typ ARRAY [1 . . 15] als formaler Parameter einer Funktion definiert werden; dies kann bekanntlich weder in der Parameterklammer noch in der Funktion geschehen, sondern nur über einen im nächsthöheren Globalraum definierten Benutzertyp.
4.5.3.1 Die Definition
von Units
UNITs werden wie PROGRAMs zunächst mit dem Editor erstellt und in TEXTDateien abgelegt; sie haben folgende allgemeine Form: UNIT unitname; INTERFACE global wirksame Definitionen IMPLEMENTATION lokal wirksame Definitionen END. Die global wirksamen Definitionen bestehen zunächst aus Konstanten, Typen und Variablen, die sowohl intern für alle nachfolgenden Definitionen als auch extern für diejenigen Programme wirksam sind, welche die betreffende Unit benutzen. Sodann folgen Definitionsanweisungen für Prozeduren und Funktionen ohne Definitionskörper analog den FORWARD-Definitionen. Die lokal wirksamen Definitionen bestehen ebenfalls aus Konstanten, Typen und Variablen, die jedoch nur intern für alle nachfolgenden Definitionen wirksam sind. Sodann folgen die Definitionskörper für die Prozeduren und Funktionen, die analog den FORWARD-Definitionen nur noch mit parameterlosen Definitionsanweisungen eingeleitet werden.
146
4. Sonderteil: Das UCSD-PASCAL-System
Für die Definition von Units gelten u.a. folgende Restriktionen: (1) es dürfen maximal 127 Prozeduren/Funktionen in einer Unit vereinbart werden; (2) der Dateityp darf nicht in den lokalen Definitionen auftreten. (3) es dürfen keine Segmente vereinbart werden (vgl. S. 148). UNIT Diatoperi INTERFACE TYPE matrix = ARRAYC1..15»1..153 OF REALS vector = ARRAYC1..153 OF REAL» PROCEDURE matmult - 0.0» FOR J := 1 TO n DO scalar 5= scalar + aCi»J3*bCJ»k3» cCi»J3 '= scalar» WRITE (cCi»J3*8°3); ENDS END; END; FUNCTION scalpro» VAR i : INTEGER; BEGIN scalar 5= 0.0; FOR i 5= 1 TO n DO scalar i= scalar + dCi3*eti3; scalpro J= scalar; END; END.{End of Unit> UNIT statist; INTERFACE FUNCTION rn
4.5.3.2 Die Benutzung von Units Die mit dem Editor erstellten Units werden lediglich mit < C > oder < C > übersetzt und in ungebundener Form als CODE-Dateien in eine Bibliothek eingetragen. Das angemessene Verfahren für letzteres wurde bereits in Abschnitt 4.5.2 auf S. 140ff. ausführlich beschrieben. Der Aufruf von Units in einem Programm geschieht zunächst durch die USESAnweisung. Das allgemeine Anweisungsformat lautet: USES u n i t n a m e i , . . . , unitnamet; Die USES-Anweisung muß unmittelbar hinter der ersten Zeile „PROGRAM name;" stehen*. Danach können in den nachfolgenden Prozeduren und Funktionen oder im Ablaufteil des Programms sämtliche Prozeduren und Funktionen der genannten Units aufgerufen werden, und zwar in den Formaten, wie sie im INTERFACE der betreffenden Units definiert sind. Programmbeispiel: PROGRAM I e a r n 3 2 ; - C u n i t s i USES m a t o p e r » s t a t i s t i WAR a»b»c : m a t r i x ! xry S vector» seed ! INTEGER; irJ S INTEGER» n.n.l : INTEGER»
Matrizenoperationen»St3tistik>
PROCEDURE f i l l i sein; andernfalls steht nachher in allen Feldern das gleiche Zeichen aus der Position i. Programmbeispiel : PROGRAM l e a r n 3 5 ! {UCSD-PASCAL-char-Proceduren/-Funktionen> LABEL Ir2r3r4r5r6r7r8r9fl0rllrl2rl3rl4rl5fl6rl7i CONST t e x t c o n = ' D i e s i s t e i n T e s t - TeKt'5 TYPE s i z e = PACKED ARRAYCO..723 OF CHARf VAR Printline ! size» i,Jrk J INTEGER? textvsr J STRINGî position : INTEGER» BEGIN l . t e M t v a r 5= t e x t c o n î 2 ! WRITE ( te; ?
@
A B C D E F G
160
Anhang B
Dezimalwert
Sedezimalwert
Steuerzeichen
Dezimalwert
Sedezimalwert
Steuerzeichen
72 73 74 75 76 7 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69
H I J K L M N 0 P Q R S T U V W X Y Z
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
j
[ \ ] •
*
a b c d e f g h i
k 1 m n o
P q r
s t
u V w X
y z
{ 1 }
n DEL
Literatur
[1]
Bowles, K.L.: Problem Solving Using PASCAL. Berlin-HeidelbergNew York 1977. [2] Dahl, O.-J., E.W. Dijkstra, C.A.R. Hoare: Structured Programming. London-New York 1972,1-82. [3] Ferstl, O.: Flowcharting by Stepwise Refinement. SIGPLAN Notices 1978. [4] Ferstl, 0.: Konstruktion und Analyse von Simulationsmodellen. Meisenheim am Clan 1979. [5] Ferstl, 0.: Top Down Entwurf von Simulationsmodellen. In: DGORTagung (Proceedings) 1979. [6] Herschel, R., F. Pieper: Systematische Darstellung von PASCAL und CONCURRENT PASCAL für den Anwender. München-Wien 1979. [7] Jensen, K., N. Wirth: PASCAL User Manual and Report. Berlin-Heidelberg-New York 1978. [8] Rohlfing, H.: PASCAL - Eine Einführung. Mannheim—Wien—Zürich 1978. [9] Schauer, H.: PASCAL für Anfänger, 3. Aufl. München-Wien 1979. [10] UCSD PASCAL Version II.O, März 1979, Institute for Information Systems, University of California, San Diego.
Sachregister
Ablaufteil von Funktionen 33 - von PASCAL-Programmen 13, 39ff. - von Prozeduren 33 ABS-Funktion 4 6 , 4 7 AND-Operator 47, 58 ARCTAN-Funktion 47 ARRAY-Typ 26 f. - , PACKED 27 ASCII-Code 21 ASCII-Tabelle 159f. ASCII-Zeichen 51 Aufbau eines PASCAL-Programms 13 Aufruf von Dateivariablen 41, 90 ff. - von einfachen Variablen 40 - von Feldvariablen 40 - von Funktionen 4 3 f. - von Konstanten 39 - von Prozeduren 97ff. - von Satzvariablen 40f. - von Variablen 3 9 ff. Aufzählungstyp 2 2 ff. Ausdrücke 39ff., 51 - , arithmetische 45 ff. - , BOOLEAN 47ff., 51 —, einfache 39 - , gemischte 51 - , INTEGER 45 f. - , REAL 46 f. - , sonstige 50f. —, zusammengesetzte 39 Ausgabe, formatierte 85 f. - von Daten 78ff. - - - auf externe Speicher 91 f. Ausschnittstyp 24 f.
CLOSE-Option, LOCK 92 - , NORMAL 92 PURGE 92f. CONST-An Weisung 19 COS-Funktion 47
Block, Programm 13, 54 ff. - , Daten 90, 92 BOOLEAN-Ausdrücke 47 ff., 54 ff. BOOLEAN-Operatoren 47 BOOLEAN-Typ 20 BOOLEAN-Wertebereich 20 bottom-up-Methode 16 f.
Eingabe, formatierte 80ff. - , zweidimensionale 82 - von Daten 78 ff. - von externen Speichern 90f. ELSE-Operator 55 ff. EOF-Funktion 4 8 , 9 1 EOF-Marke 89f„ 91 f. EOLN-Funktion 48, 82f. EXP-Funktion 47
CASE-Anweisung 65 ff. CASE-Konstruktion 5 3 , 6 5 , 6 7 CHAR-Typ 21 f. CHAR-Wertebereich 21 CHR-Funktion 50f. CLOSE-Anweisung 92f.
Datei, Einrichten einer 89f. - , Schließen einer 92ff. - , Text- 96 - , Überschreiben einer 89 - , Wiedereröffnung einer 90 Dateibehandlung 89 ff. Dateiendemarke 89f. Dateityp 2 9 , 4 1 Dateivariable 30, 41 f., 89ff. Dateiverzeichnis 89 ff. Datenblock 90, 92 Datenfeld 20, 26 Definition 18 - , FORWARD- 35 f. - , Konstanten- 18f. - , Label- 18 - , Reihenfolge der 18 - , Typen- 20 - , Variablen- 29 ff. - von Funktionen 31 ff. - von Prozeduren 31 ff. Definitionsteil von Funktionen 38 - von PASCAL-Programmen 14, 18 ff. - von Prozeduren 33 Direktzugriff 90 DIV-Operator 45 DO-Operator 41, 71, 74 DOWN TO-Operator 71
FALSE-Wert 20 Feldtyp 25 f. - , gepackter 27 FILE-Typ 29
Sachregister FOR-Anweisung 70ff. FORWARD-Definition 35 f. FUNCTION-Anweisung 32, 43 Funktionen 31 ff. Ablaufstruktur von 38 - , Definitionsanweisungen für 32f. Definitionskörper von 33f. Definitionsstruktur von 37 Hierarchische Ordnung von 31 ff. - , Nebenordnung von 35 Standard- (siehe PASCAL-Funktionen) - , Wertausgabe aus 32f. Werteingabe in 32f. Funktionstypen 32 Funktionsaufrufe 31, 4 3 ff. hierarchische 31, 100 - , lineare 100 —, rekursive 100 f. Funktionsdefinition 31 ff. - , hierarchische 31 ff., 34 ff. - , FORWARD- 35 f. GET-Anweisung 91 Gleitpunktdarstellung 86 GOTO-Anweisung 52f. IF-AnWeisung 5 3 ff. echte Alternative 5 5 ff. geschachtelte 5 7 ff. unechte Alternative 54f. I F . . . ELSE-Konstruktion 55 ff. Indizierung 26 - mit Aufzählungstyp 23 - von Feldvariablen 40 f. Inhaltsoperator 41 INTEGER-Ausdrücke 45 ff. INTEGER-Operatoren 45 INTEGER-Typ 21 INTEGER-Wertebereich 21 Kommentarzeile 14 Konstanten 18 f. arithmetische Verknüpfung von 20 - , direkte 19 —, globale 31 f. System- 19 Konstantenaufruf 39 Kontantendefinition 18 f. Konstantentypen 19 LABEL-An Weisung 18 LABEL-Definition 18 LN-Funktion 47 LOCK-Option 92
163 Matrizenmultiplikation 7 I f f . MAXINT-Wert 19 menu-Technik 94 f. MOD-Operator 47 Name 18 Namensbildung 18 NORMAL-Option 91 NOT-Operator 47 ODD-Funktion 48 OR-Operator 47, 60 f. ORD-Funktion 2 2 , 4 6 Ordinalzahlen 22ff. PACKED ARRAY 27 PACKED ARRAY OF CHAR 27 PACKED RECORD 29 Parameter 32 - , aktuelle 43, 98f. - , formale 3 2 , 4 3 , 98f. Variablen- 3 2 f „ 43, 98f. - , Wert- 32f., 43, 98f. Parametertypen 33 PASCAL-Funktion, ABS 4 6 , 4 7 - , ARCTAN 47 CHR 50f. COS 47 EOF 48, 91 EOLN 48 - , EXP 47 LN 47 - , ODD 4 8 ORD 22, 46 - , ROUND 46 SIN 47 - , SQR 46, 47 - , SQRT 47 - , TRUNC 46 PROCEDURE-AnWeisung 32, 98 Programmhierarchie 31 Programmschleifen 70ff. Programmzweige 5 2 ff. Prozeduraufrufe 31, 97 ff. - , hierarchische 99 lineare 99 ff. - , rekursive 99 ff. Prozedurdefinition 31 FORWARD 35f. - , hierarchische 3 I f f . Prozeduren 3 I f f . - , Ablaufstruktur von 38 - , Definitionsanweisungen für 32f. - , Definitionskörper von 3 3 f. - , Definitionsstruktur von 37 - , Hierarchische Ordnung von 90f.
164 - , Nebenordnung von 35, 99f. Wertausgabe aus 32f. - , Werteingabe in 32f. PURGE-Option 92f. PUT-Anweisung 91 f. READ-Anweisung 79ff. READLN-Anweisung 81 f. REAL 21 REAL-Ausdriicke 46 f. REAL-Operatoren 46 REAL-Typ 21 REAL-Wertebereich 21 RECORD-Typ 28 Rekursion lOOf. Relationsoperatoren 47 f. REPEAT-Anweisung 76 ff. RESET-Anweisung 90 REWRITE-AnWeisung 87f. ROUND-Funktion 4 6 , 5 1 Satztyp 27ff., 40 Satzteüname 40 f. Schleifenzähler 70f. SEEK-Anweisung 90 SIN-Funktion 47 Speicherplatzreservierung 20 Sprungadressen 18f. Sprung-Anweisung 52 SQR-Funktion 4 6 , 4 7 SQRT-Funktion 47 Stellenzahl 86 STRING-Typ 27, 150 Struktogramm 15 ff. Strukturierte Programmierung 5 , 5 2 System-Konstante 19 Systemtypen 20 Textdatei 96 TO-Operator 71 top-down-Methode 16 f. Trennzeichen 80 ff. TRUE-Wert 20 TRUNC-Funktion 4 6 , 5 1 Typ, Aufzählungs- 22ff. - , Ausschnitts- 24 f. - , Datei 29 - , Feld- 25f. - , Satz- 27ff.
Sachregister - , STRING- 27 - BOOLEAN 20 - CHAR 21 f. - INTEGER 21 - REAL 21 TYPE-Anweisung 20 Typen, Benutzer- 20 - , direkte 20 - , einfache 20 - , globale 31 f. - , indirekte 20 - , komplizierte 22ff. - , lokale 31 f. - , System- 20 Typendefinition 20 ff. Typenkonversion 51 Typenvereinbarung, direkte 30f. - , indirekte 30f. UCSD-PASCAL-System 105 ff. UNTIL-Operator 76 VAR-AnWeisung 29 f. Variablen 29 - , globale 31 f. - , lokale 31 f. Variablenaufruf 3 9 ff. Varriablendefinition 29 ff. Variablenparameter 32f., 43 Verknüpfung, arithmetische 45 f. - , logische 47f. Verschiebezahl 85 f. Wertebereich, BOOLEAN 20 - , CHAR 21 f. INTEGER 21 REAL 21 Wert-Parameter 32f.,43 Wertzuweisung 20, 51 f. WHILE-Anweisung 74 ff. WITH-Anweisung 41 f. WRITE-AnWeisung 84 ff. WRITELN-Anweisung 87f. Würfelspiel 6 8 ff. Zufallszahlengenerator 68 Zugriff, Direkt- 90 - , Lese- 90f. - , Schreib- 91 f.
Sachregister Sonderteil UCSD - PASCAL
Adjust-Editorfunktion 111 Alternate disk 105 Arbeitsdatei 107 Anlegen einer (GET) 129f. Laden einer 130 —, Löschen einer (New) 131 Retten einer (Save) 130f. Ausrichten von Zeilen (Adjust) 111 backspace 109 Bad blocks-Filerfunktion 125 Bibliotheken, Aktualisieren von 143 Einrichten von 141 ff. Bibliotheksdienst 140ff. Bibliotheksmodul 137 Blättern in einer Datei (Page) 115 Blöcke, Daten- 120ff. - , schadhafte 125 - , unused 120, 124 Change-Filerfunktion 127 CHAR-Prozeduren, FILLCHAR 156 - , MOVELEFT 156 - , MOVERIGHT 156f. SCAN 155 SIZEOF 155 Compiler 13 I f f . Aufruf des 131 f. Fehlermeldungen des 133ff. Compiler-Option 135 ff. - , GOTO OK 135 - , IOCHECK 136 - , LISTING 136 RANGE CHECK 136f. - , SWAPMODE 137 CONCAT-Funktion 152f. CONSOLE: 105 Copy buffer 112f. COPYDUPDIR 121 Copy-Editorfunktion 112f. COPY-Funktion 152 Crunch-Filerfunktion 124 f. Cursorbewegung 110 Date-Filerfunktion 122 Dateien, Ausdrucken von 128 - , Erzeugen von 117f., 123f. - , Löschen von 121 f. - , Löschen von (Remove) 129 - , Reaktivieren von 123 f.
- , Reparieren von (Examine) 125 ff. - , Übertragen von (Transfer) 127f. - , Umbenennen von (Change) 127 Zusammenschieben von 124 f. Dateienverzeichnis (Directory) 119f. Dateiname 107 Dateispezifikation 107 Dateityp, BAD 106f. - , CODE 106 - , DATA 106 - , TEXT 106 Datenblöcke 120 ff. Datensicherungsdatei 106 default unit 107, 119, 122 f. Delete-Editorfunktion 112 delete line 109 DELETE-Prozedur 151 f. Disketten, Löschen von 121 f. - , Reparieren von (Examine) 125ff. Überprüfen von (Bad blocks) 125 - , Übertragen von (Transfer) 128 —, Umbenennen von 127 - , System 105 Diskettenbezeichnung 107 ff. Duplizieren von Zeilen 112 Editor 108ff. Editor-Funktion, Adjust 111 - , Delete 112 Exchange 112 Find 115 f. Insert 110 - , Jump 114 - , Page 115 Quit 117f. Replace 116 f. - , Set 113 - , Zap 113 Ein-/Ausgabeeinheiten 105 Einfügen von Dateien (Copy) 113 f. - von Zeichen (Insert) 11 Of. - von Zeilen (Copy) 112f. Einrückautomatik 111 end of text 109 Ersetzen von strings (Replace) 116 f. Erzeugen von Bibliotheken 141 - von Dateien (Make) 123 f. escape 109 Examine-Filerfunktion 125 ff. Exchange-Editorfunktion 112
166 Execute (siehe Loader) Extended directory-Filerfunktion
Sachregister SONDERTEIL UCSD-PASCAL 120f.
File-handler (Filer) 118ff. Filer-Funktion, Bad blocks 125 - , Change 127 - , Date 122 - , Extended directory 120f. - , Examine 125 ff. - , Get 129f. - , List directory 119f. - , Make 123f. - , New 131 - , Prefix 119, 122 - , Quit 131 - , Save 130 - , Transfer 127f. - , Volumes 119 - , What 131 - , Zero 121 f. File size option 123f. FILLCHAR-Prozedur 153, 156 Finden von strings (Find) 115 Find-Editorfunktion 115 f. Get-Filerfunktion 129f. IMPLEMENTATION-An weisung 145 Insert-Editorfunktion 110 INSERT-Prozedur 151 INTERFACE-Anweisung 145, 147 Jump-Editorfunktion 114f. Kopieren von Dateien (Copy) 112f. - von Zeilen (Copy) 112 Krunch-Funktion (siehe Crunch-Funktion) LENGTH-Funktion 150 LIBRARY. CODE 141 Linker 13 7f. - Map-Option 138 List directory-Filerfunktion 119f. Loader 139 Loader-Funktion, Execute 139 - , Run 139f. Löschen von Dateien (Remove) 129 - von Disketten (Zero) 121f. - von einer Arbeitsdatei (New) 131 - von Zeichen (Delete) 112 Make-Filerfunktion 123f. Markierung von schadhaften Blöcken 126 f. - von Zeilen (Set) 113ff. Map-File 138, 139 Maschinencode 106
MOVELEFT-Prozedur 156 MOVERIGHT-Prozedur 156 New-Filerfunktion 131 P-Code 106 P-Maschine 106 Page-Editorfunktion 115 PAOC-Variable 154 POS-Funktion 150f. Prefix-Filerfunktion 119, 122 PRINTER: 105 f. Programmbibliothek 137 Programmdatei 106 Quit-Editorfunktion 117 f. Quit-Filerfunktion 131 Remove-Filerfunktion 129 Replace-Editorfunktion 115 f. return < r e t > () 109 Run-Funktion 139f. Same option 1 1 6 , 1 1 7 Save-Filerfunktion 130f. SCAN-Funktion 155 SEGMENT-FUNCTION 148f. SEGMENT-PROCEDURE 148 f. Set-Editorfunktion 114 Setzen von Markierungen (Set) 113 f. SIZEOF-Funktion 155 space 109 Springen in einer Datei (Jump) 114 Statement-Prozessor 137 STRING-Prozeduren 150ff. - , CONCAT 152f. - , COPY 152 - , DELETE 1 5 I f . - , FILLCHAR 153f. - , INSERT 151 - , LENGTH 150 - , POS 150f. Substitute string 116 f. Symbolprozessor 137 System disk 105 SYSTEM. LIBRARY 138 SYSTEM. LST. TEXT 136 Systemstart 108 SYSTEM. SYNTAX 133 ff. SYSTEM. WRK. CODE 107 SYSTEM. WRK. TEXT 107ff. target buffer 116 target string 115, 116 Transfer-Filerfunktion 127 f.
Sachregister SONDERTEIL UCSD-PASCAL Überschreiben von Dateien 118 - von Zeichen (Exchange) 112 Übersetzerprotokoll 136 Übertragen von Dateien (Transfer) 127f. - von Disketten (Transfer) 128 Umbenennen von Dateien (Change) 127 - von Disketten (Change) 127 Unitnumer 105 UNITs 141 ff., 145 ff. Benutzung von 147f. Definition von 145 ff. Unterprogrammtechnik 140ff. Unterprogrammarten 140 update workfile 117f. USES-Anweisung 147f.
167 Verarbeitung rückwärts 109, 115 - vorwärts 109,115 Verlassen des Editors (Quit) 117f. Volume-Filerfunktion 119 volume name 105 volumes 105 What-Filerfunktion 131 workfile 107 - , get 129f. - , update 117f. Zap-Editorfunktion 113 Zero-Filerfunktion 121 f. Zusammenschieben von Dateien (Crunch) 124 f.
w DE
G G. Niemeyer
Walter de Gruyter Berlin-New York Einführung in das Programmieren in ASSEMBLER Systeme IBM, Siemens, Univac, Interdata 3., erweiterte Auflage. 15,5 x 23 cm. 303 Seiten. 1979. Plastik flexibel DM 38,- ISBN 3 11 007949 6 (de Gruyter Lehrbuch)
w. E. Spieß
Einführung in das Programmieren in
F. G. Rheingans FORTRAN
6. Auflage. 15,5 x 23 cm. 217 Seiten. Mit 19 Abbildungen und 13 Tabellen. 1980. Plastik flexibel DM 22,- ISBN 3 11 008135 0 (de Gruyter Lehrbuch)
W. E. Spieß G. Ehinger H. Siebert
Programmierübungen in FORTRAN 2., durchgesehene und erweiterte Auflage. 15,5 x 23 cm. 157 Seiten. 1980. Plastik flexibel DM 22,ISBN 3 11 008367 1 (de Gruyter Lehrbuch)
Höhere FORTRAN-Programmierung Eine Anleitung zum optimalen Programmieren 2., bearbeitete Auflage. 15,5 x 23 cm. 237 Seiten. 1980 Plastik flexibel DM 38,- ISBN 3 11 008226 8 (de Gruyter Lehrbuch)
IDV-Lernprogramm: FORTRAN Ein PU-Lehrgang für Ingenieure, Techniker, Ökonomen und Naturwissenschaftler Autor: IDV-Institut für elektronische Datenverarbeitung, Zürich M. Kryka und B. Flükiger 2 Bände in 1 Band. 21,3 x 30 cm. XXIV, 190 Seiten. 1971. Gebunden DM 68,- ISBN 3 11 003576 6 (Coproduktion mit dem Verlag Paul Haupt, Bern)
K. Hambeck
Einführung in das Programmieren in COBOL 2., verbesserte und erweiterte Auflage. 15,5 x 23 cm. X, 163 Seiten. 1978. Kartoniert DM 24,- ISBN 3 11 007574 1 (de Gruyter Lehrbuch)
Preisänderungen vorbehalten