240 91 11MB
German Pages 167 [168] Year 1983
Niemeyer
de Gruyter Lehrbuch Programmieren in PASCAL
Gerhard Niemeyer
Einführung in das Programmieren in PASCAL mit Sonderteil UCSD-PASCAL-System Zweite, verbesserte Auflage
W DE G
Walter de Gruyter • Berlin • New York 1983
Dr.rer.pol. Gerhard Niemeyer, o. Professor für Wiitschaftsinformatik an der Universität Regensburg
CIP-Kurztitelaufnahme der Deutschen Bibliothek Niemeyer, Gerhard: Einfühlung in das Programmieren in PASCAL: mit Sonderteil UCSD-PASCAL-System/Gerhard Niemeyer. - 2. Aufl., verb. Auflage. - Berlin; New York: de Gruyter, 1983. (De-Gruyter-Lehrbuch) ISBN 3-11-009532-7 © Copyright 1982 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 übertragen ermöglicht dieses Konzept die Untergliederung einer Daten Verarbeitungsaufgabe von der allgemeinen Problemdefinition über Prozedurhierarchien bis hin zu den ausfuhrenden Anweisungen einer Programmiersprache. Dabei sind die Prozeduren einer bestimmten Hierarchiestufe voneinander unabhängig, da ein Datenaustausch nur über 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
Votbemerkungen
Zu diesen neueren Entwicklungen gehört neben E L A N und A L G O L 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 F O R T R A N 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 A S S E M B L E R so flexibel, daß fehlende Teile vom Benutzer selbst erzeugt werden können. Ziel des vorliegenden Lehrbuches ist es, eine einfache Einfuhrung 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 fiir 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 Einführung 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 druckfreien Manuskripts danken. Regensburg, im Februar 1980
Gerhard Niemeyer
Vorwort zur zweiten Auflage
Eine Analyse der Sprachsituation im Jahre 1982 zeigt, daß sich PASCAL im Bereich der Mikrocomputer einen sicheren Platz erobert hat und hier auch gegenüber BASIC an Bedeutung gewinnt. Neuere Sprachversionen bieten gegenüber der ursprünglichen Wirthschen Definition erhebliche Komfortsteigerungen insbesondere bei der Dateiorganisation und den Input/Output-Funktionen. Einige Versionen bieten integrierte ASSEMBLER-Schnittstellen sowie Möglichkeiten der bit-Manipulation, der port-Adressierung und der physikalischen Dateimanipulation, wodurch PASCAL zur idealen Implementierungssprache wird. Nach wie vor ist das UCSD-PASCAL-System das sicherste und komfortabelste Betriebssystem, dessen Standard selbst von großen Betriebssystemen nicht erreicht wird. Bei den Herstellern mittlererund größerer Anlagen wie z.B. Siemens und Nixdorf gehört PASCAL mittlerweile zum Standardangebot. Mit Interesse wird vermerkt, daß PASCAL-Compiler auch für IBM-Anlagen verfügbar sind und daß das UCSDPASCAL-System auf dem neuen Personal-Computer von IBM implementiert ist. Die vorliegende zweite Auflage des Buches „Programmieren in PASCAL" wurde in didaktischen Einzelheiten überarbeitet und von den bisher entdeckten Druckfehlern befreit. Regensburg, im Juli 1982
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 PASCAL-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 PASCAL-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-Anweisung 3.4 Programmschleifen 3.4.1 Die FOR-An Weisung 3.4.2 Die WHILE-An Weisung 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 RE ADLN-An Weisung 3.5.1.3 Die WRITE-An Weisung 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-Anweisung 3.5.2.7 Dateibehandlung mit READ und WRITE 3.6 Prozeduraufrufe 3.6.1 Aufmfformate 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 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
file)
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 Krunch 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 Programmausfuhrung 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 name-, 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 Übersetzungsvorgang 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: P R O G R A M learnl »-Cbottom UP - E n t w u r f WAR o p e r a n d » s u m m e » P r o d u k t : REAL» BEGIN W 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)f s u m m e t= o p e r a n d + 10! P r o d u k t *= o p e r a n d * 10» W R I T E L N ('SUMME = '»summe); U R I T E L N ('PRODUKT = '»Produkt)! END.
VAR Operand » summerprodukt ! REAL; PROCEDURE e i n s e h e n ; BEGIN URITELN ( ' b i t t e Operand e i n s e h e n READLN
(operarid);
end; PROCEDURE v e r a r b e i t e n ;
:'>;
16
1. Der A u f b a u von PASCAL-Programmen PROCEDURE addieren» BEGIN summe *= operand + 10! END; PROCEDURE multiplizieren» BEGIN P r o d u k t ! = operand # 10» END» BEGIN addieren» multiplizieren» END»
PROCEDURE ausgeben» BEGIN WRITELN OKT)(wertnamei)
und ORD(wertnamem) < ORD(wertnamen) (wertnamei, wertnamen s. 2.3.2.1) Codierbeispiel: TYPE fach = CONST tx = 'STUDIERENDE'» TYPE fach =(bwl»vwl»soz>mat»phy»che»bio)» wiso = bwl.>soz> irisäes»swiwi : INTEGER» VAR s t u d z a h l : ARRAYCfaehD OF INTEGER? i ! fach? k • wiso» PROCEDURE s t u d i e r e n d e ! BEGIN insSes 5= 0» swiwi 0» studzahlCbwl3 1395! studzahlCvwl] 289 i studzahlCsoz] 78 » studzahlCrnat] 258 » studzahlCphy] 64 i studzahlCche] 112! studzahlCbioD 237} END» BEGIN studierende» FOR i 5= bwl FOR k 5= bwl WRITELN(txi' URITELN !'.swiwi)i
2.3 Typendefinition
25
Das Programm learn7 zeigt die Verwendung des Aufzählungstyps „fach" und Ausschnittstyps „wiso" in Laufanweisungen (zu FOR vgl. S. 70ff.). Zu beachten ist, daß die Laufvariablen hier ebenfalls vom Aufzählungstyp „fach" bzw. Ausschnittstyp „wiso" sein müssen. Die Laufvariable k könnte allerdings auch vom Aufzählungstyp „fach" sein. Laufvariablen etwa vom Typ INTEGER werden hier nicht akzeptiert. Damit wird demonstriert, wie durch die Aufzählungs- und Ausschnittstypen die Lesbarkeit erhöht und die Wertbereiche von Laufvariablen sogleich bei der Codierung auf die zugehörige Indexmenge festgelegt werden können. Eine Besonderheit stellen Ausschnittstypen aus dem Bereich der ganzen Zahlen und der druckbaren Zeichen dar: Sie lassen sich ohne vorangehenden Aufzählungstyp definieren. Codierbeispiel: TYPE l o w c a s e = Ziffern =
'a'.,'z'» 1..9»
Programmbeispiel : PROGRAM l e a r n 8 i { A u s e h n i t t s t ü p e n m i t CHAR u.INTEGER} TYPE b u c h s t a b e = 'a'..'h'f Ziffern = 1..5» VAR b u ! b u c h s t a b e » zi ! Z i f f e r n »
zeichen : CHAR» Ziffer : INTEGER »
BEGIN WRITELN ('BITTE BUCHSTABE a . . h EINGEBEN J ' > » READLN ( z e i c h e n ) » bu != z e i c h e n » WRITELN ('ECHO i ' , b u ) f WRITELN ('BITTE ZIFFER 1 . . 5 EINGEBEN ! ' ) * READLN (Ziffer)i zi
t=
Ziffer»
WRITELN ('ECHO END.
'»zi)»
Das Programm learn8 zeigt, daß von allen möglichen Zeichen und Ziffern nur die der Ausschnittstypen akzeptiert werden. Allerdings erfolgt die Wertprüfung nur bei den Wertzuweisungen „bu:= zeichen" und „zi:= Ziffer". Eine direkte Verwendung der Variablen „ b u " und „zi" im Lesebefehl zeigte, daß zumindest im UCSD-PASCAL beim Einlesen keine Wertprüfung erfolgt.
2.3.2.3
Der
Feldtyp
Der Feldtyp definiert 1 - bis n-dimensionale Datenfelder (Matrizen) mit Elementen von angebbarem Typ. Die Anzahl n der Dimensionen ist nach oben theoretisch unbegrenzt.
2. Der Definitionsteil von PASCAL-Programmen
26
Das allgemeine Definitionsformat lautet: TYPE tname = ARRAY [Bereichsangabe] OF typenangabe-, Die Bereichsangabe liefert den Wertebereich für eine Indizierung (Adressierung) der Elemente eines Datenfeldes. Codierbeispiele: a) TYPE v e k t o r = ARRAY CO..993 OF BOOLEAN» b ) TYPE m a t r i i ! = ARRAY C 0 . . 9 > 0 . . 3 3 OF CHARi C) TYPE i 3
= ARRAY C O . . 9 , 0 . . 1 4 1 0 . . 2 3 OF INTEGERf
Beispiel a) definiert ein 1-dimensionales Datenfeld (Vektor) für 100 BOOLEANElemente. Der Wertebereich für die Indizierung geht von 0 bis 99. Beispiel b) definiert ein 2-dimensionales Datenfeld (Matrix) für 10 • 4 = 40 CHAR-Elemente. Der Wertebereich für die Indizierung geht von 0 bis 9 in Zeilenrichtung und von 0 bis 3 in Spaltenrichtung. Beispiel c) definiert ein 3-dimensionales Datenfeld für 10 • 15 • 3 =450 INTEGER-Elemente; der Wertebereich für die Indizierung geht von 0 bis 9 in x-Richtung, von 0 bis 14 in y-Richtung und von 0 bis 2 in z-Richtung. Die Bereichsangaben in den obigen Beispielen a) bis c) sind durchweg Ausschnittstypen aus dem Bereich der natürlichen Zahlen. Ebenfalls zulässig sind Ausschnittstypen aus dem Bereich der ganzen Zahlen, beliebige andere Ausschnittstypen sowie Aufzählungstypen. Codierbeispiele: d) TYPE V e r t e i l u n g = ARRAY C - 9 5 . . 9 5 3 OF REALf e)
TYPE t a ä e
= (mordí»mirdn»frrsarso)i
f)
uerktasle
= ARRAY C m o . . f r 3 OF INTEGER»
g)
taänrl
= ARRAY C t a ä e i OF INTEGERr
Beispiel d) definiert ein 1-dimensionales Datenfeld für 191 Elemente des Typs REAL. Der Wertebereich für die Indizierung geht von - 9 5 bis +95. Beispiel e) definiert einen Aufzählungstyp mit der Indexmenge mo bis so. Beispiel f) definiert gemeinsam mit dem Benutzer-Typ „tage" ein 1-dimensionales Datenfeld für 5 Elemente des Typs INTEGER; der Wertebereich für die Indizierung geht von mo bis fr. Beispiel g) definiert ein 1-dimensionales Datenfeld für 7 Elemente des Typs INTEGER; der Wertebereich für die Indizierung geht von mo bis so. Die Systemtypen in obigen Beispielen a) bis g) sind durchweg einfache Typen. Ebenfalls zulässig sind alle bisher behandelten komplexen Datentypen einschließlich Feldtypen.
2.3 Typendefinition
27
Codierbeispiele: h)
ta«irir2
ARRAY Ctaäe} OF 1 . . 7 Í
i)
woche
ARRAY C1..73 OF tagei
j) TYF'E artnum = 001.. 999) a r t i k e l = ARRAY Cartnum] OF ARRAY CO..9.1 OF REAL} Beispiel h) definiert in Verbindung mit Beispiel e) ein 1 -dimensionales Datenfeld mit 7 Elementen, deren Wertebereich 1 bis 7 ist; der Wertebereich für die Indizierung geht von mo bis so. Beispiel i) definiert in Verbindung mit Beispiel e) ein 1-dimensionales Datenfeld mit 7 Elementen, deren Wertebereich mo bis so ist; der Wertebereich für die Indizierung ist 1 bis 7. Beispiel j) definiert ein 1-dimensionales Datenfeld mit 999 Komponenten, deren „Wertebereich" je ein ¡-dimensionales Datenfeld mit 10 Elementen des Typs REAL ist. Als besondere Form des Feldtyps sieht PASCAL den „gepackten" Feldtyp vor, bei dem aus Gründen einer rationellen Speicherbelegung u.a. führende Nullen eliminiert sowie Umschichtungen der Elemente vorgenommen werden. Das allgemeine Format der Definitionsanweisung lautet: TYPE tname = PACKED ARRAY [Bereichsangabe]OF Typenangabe-, Die Anwendung dieser Form ist insbesondere bei Datenfeldern vom Typ CHAR angezeigt, weil hier Speicherplatzeinsparungen bis zu 50% möglich sind.
2.3.2.4
DerString-Typ
Der string-Typ ist eine spezielle Implementierung des UCSD-PASCAL; er stellt eine Sonderform des PACKED ARRAY OF CHAR dar und bietet gegenüber jenem einige Annehmlichkeiten bei der Definition und im Gebrauch. Das allgemeine Format der Definitionsanweisung lautet: TYPE tname = STRING [Längenangabe] -, Codierbeispiel: TYPE z f e l d = STRING C103Í Hier wird ein Feld für 10 Zeichen definiert. Fehlt die Längenangabe, so setzt der Compiler die default-Länge 80 ein. Die maximale Länge beträgt 255. Nähere Einzelheiten vgl. Abschnitt 4.5.5.1 auf S. 150 ff.
2.3.2.5
Der
Satztyp
Der Satztyp gestattet die Vereinigung mehrerer Typendefinitionen gleicher oder
28
2. Der Definitionsteil von PASCAL-Programmen
verschiedener Art unter einem einheitlichen Typennamen und gestattet damit die Erzeugung von Datensätzen mit heterogenen Inhalten und Codes, wie sie z.B. in der kaufmännischen Datenverarbeitung gebräuchlich sind. Das allgemeine Format für die Definitionsanweisung lautet: TYPE tname = RECORD tname ^: typenangabe x; tname2: typenangabe2;
tnamen: typenangaben END Haben mehrere Teildefinitionen eines Satzes denselben Typ, so können sie zusammengefaßt werden: TYPE tname = RECORD tnamey, tnamek+1,.. tnamem: typenangabe END
.,
Man beachte die Syntaxeigenart, daß weder die letzte Teildefinition, noch das abschließende END ein ";" erhalten. Das UCSD-PASCAL akzeptiert jedoch diese Trennzeichen. Codierbeispiele: a)
TYPE a d r e s s e
RECORD strasse i hausnr S postleitz! ort ! ENDr
ARRAY ARRAY ARRAY ARRAY
CO»•193 CO..3] CO..4] CO..233
OF OF OF OF
CHAR. CHAR» CHAR» CHAR»
b)
buchzeile
RECORD d a t u m » ä e ä k t o ! INTEGER» b e t r a ä : REAL! END«
c)
kundensatz
RECORD krir i 0 0 0 1 . . 9 9 9 9 » kadr* a d r e s s e > kktot RECORD saldo REAL»' blatt ARRAY C0..23D OF b u c h z e i l e » b l a t t n r ! INTEGER i zeilennr INTEGERi END » END»
Das Beispiel c) enthält die Benutzer-Typen „adresse" und „buchzeile", die in den vorangehenden Satzvereinbarungen a) bzw. b) definiert wurden. Die Teildefinition „blatt" im Beispiel c) erzeugt ein Datenfeld mit 24 Elementen des Typs „buchzeile".
2.4 Variablendefinition
29
Ebenso wie beim Feldtyp gibt es beim Satztyp die gepackte Form. Das allgemeine Format der Definitionsanweisung lautet: TYPE
tname = PACKED RECORD teildefinitionen END
2.3.2.6 Der Dateityp Der Dateityp stellt eine Folge gleichartiger Datentypen dar, die i.d.R. seriell auf externe Datenträger geschrieben bzw. von diesen gelesen werden. Das UCSD-PASCAL läßt darüberhinaus noph einen Direktzugriff zu den Sätzen einer Datei zu. Nähere Einzelheiten vgl. Abschnitt 3.5.2 auf S. 89ff. Das allgemeine Format für die Definitionsanweisung lautet: TYPE tname = F I L E OF typenangabe: Für typenangabe können alle bisher behandelten Typen ausgewählt werden, allerdings nicht der Dateityp selbst. In der kaufmännischen Datenverarbeitung wird man häufig den Satztyp verwenden. Codierbeispiele: a) TYPE
kundensatz...
kunderidatei
= FILE OF k u n d e n s a t z f
b ) TYPE m e s s d a t e n = FILE OF RECORD messunä J INTEGER» xlfx2rx3tt : REAL» END r c ) TYPE w e r t e = FILE OF ARRAY C 1 . . 1 0 0 D OF REALr
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", „ X ! " , „ 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 vnamel : typ i;. .. ; vnamen : 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 typl typ2 typ3 t«p4 VAR
varl var2 var3 var4
= INTEGER» = REAL; = (b7»b6fb5rh4fb3»b2»t)lrb0)r = b5••b3 f ! : ! S
tupl; typ2! tap35 t«p4f
b ) TYPE sät: = RECORD nummer name adresse saldo END;
INTEGER; STRING C24J; ARRAY CI..243 OF CHAR; REAL;
VAR kunde : satzr liefert satz> c) TYPE datei = FILE OF RECORD nummer name adresse saldo END; VAR kundendatei lieferdatei
INTEGER; STRING C24j; ARRAY CI..243 OF CHAR; REAL;
datei! datei ;
Codierbeispiele: (direkte Typenvereinbarung) d) VAR varl var2 var3 var4
J ! ! !
INTEGER; REAL; b6tb5»b4rb3.b2»bl»bO>! b5. .t>3;
f) VAR kunde 5 RECORD nummer name adresse SALDO END; g) VAR kunddatei
! ! ! :
INTEGER; STRING C24D; ARRAY C1..24;] OF CHAR; REAL;
: FILE OF RECORD nummer name adresse saldo END;
! 5 ! :
INTEGER; STRING C243; ARRAY C1..24] OF CHAR; REAL;
2.5 Definition von Prozeduren und Funktionen
31
Aus den Beispielen b) und c) wird ein wichtiger Vorteil der indirekten Typenvereinbarung ersichtlich: Ein und diesselbe Typenvereinbarung kann bei indirekter Vereinbarung für verschiedene Variablen benutzt werden; bei direkter Vereinbarung würde sich der Codieraufwand mit der Variablenzahl multiplizieren. Eine Definition wie etwa VAR liefer: künde ist unzulässig, da „künde" eine Variable und kein Typ ist.
2.5 Definition von Prozeduren und Funktionen Prozeduren und Funktionen sind Programmstücke, die zum Zweck einer hierarchischen Strukturierung und zur Verallgemeinerung häufig wiederkehrender Algorithmen gleichsam aus dem eigentlichen Programm herausgezogen und im Definitionsteil vereinbart werden. Der Unterschied zwischen Prozeduren und Funktionen besteht, abgesehen von einigen Formalismen bei der Definition, im wesentlichen in der Art ihres Aufrufs: Prozeduraufrufe sind Anweisungen, während Funktionsaufrufe Ausdrücke sind (vgl. S. 39ff.). Innerhalb des Ablaufteils einer Funktionsdefinition muß daher eine Wertzuweisung des Resultats zum Funktionsnamen enthalten sein. Eine mehrstufige Hierachisierung wird dadurch möglich, daß in jeder Prozedur und Funktion wiederum Prozeduren und Funktionen vereinbart werden können. Dabei ist zu beachten, daß eine in einer Einheit (Programm, Prozedur, Funktion) vereinbarte Prozedur oder Funktion nur innerhalb dieser verwendet werden kann; d.h. den anderen nebengeordneten oder gar übergeordneten Prozeduren (Funktionen) ist sie nicht bekannt, dagegen kann sie in allen Prozeduren (Funktionen), die der definierenden Einheit hierarchisch untergeordnet sind, verwendet werden. Die Konsequenz ist, daß die Verallgemeinerung um so größer ist, je weiter oben eine Prozedur (Funktion) in der Programmhierarchie angesiedelt wird. Ähnliche Überlegungen gelten für die Konstanten-, Typen- und Variablendefinitionen: Ihre Gültigkeit (Bekanntheit) ist auf die definierende Einheit und damit auf alle hierarchisch untergeordneten Prozeduren (Funktionen) beschränkt. Aus diesem Grund heißen sie aus der Sicht der definierenden Einheit auch l o k a l e Konstanten, Typen und Variablen. Aus der Sicht der untergeordneten Einheiten heißen sie jedoch globale Konstanten, Typen und Variablen, da sie für diese Einheiten in einer weitergefaßten Umgebung gelten. Die größtmögliche Verallgemeinerung (absolute Globalität) wird durch die Definition im eigentlichen Programm erreicht.
32
2. Der Definitionsteil von PASCAL-Programmen
Soll eine allgemein definierte Prozedur (Funktion) der speziellen Datenumgebung einer aufrufenden Einheit angepaßt werden, so ist der Informationsaustausch mit Hilfe von Parametern abzuwickeln; dabei müssen i.d.R. sowohl Werte (Konstanten, Variablen) aus der übergeordneten Einheit an die lokalen Variablen der untergeordneten Prozedur (Funktion) als auch umgekehrt Werte von lokalen Variablen an Variablen der übergeordneten Einheit übergeben werden.
2.5.1
Definitionsanweisungen
Die Definition von Prozeduren und Funktionen geschieht mit Hilfe der PROCEDURE-An Weisung bzw. FUNCTION-An Weisung im Definitionsteil eines Programms, einer Prozedur oder einer Funktion. Die allgemeine Anweisungsformate lauten a) für Prozeduren ohne Parameter: PROCEDURE prozedurname-, b) für Prozeduren mit Parametern: PROCEDURE prozedurname (Liste der formalen Parameterj\ c) für Funktionen ohne Parameter: FUNCTION funktionsname: ftyp\ d) für Funktionen mit Parametern: FUNCTION funktionsname (Liste der formalen Parameter): ftyp \ Für die Namensbildung gelten die üblichen PASCAL-Konventionen (vgl. S. 18). Als Funktionstypen ftyp kommen nur die einfachen Typen INTEGER, REAL, BOOLEAN und CHAR in Betracht. Im UCSD-PASCAL-System ist ferner auch der Typ STRING erlaubt. Für die formalen Parameter können zwei Formen gewählt werden: Wertparam e t e r und V a r i a b l e n p a r a m e t e r . (1) Wertparameter. Das allgemeine Format lautet: (namei: ptypy; • • • ; namek:
ptypk)
Sie dienen ausschließlich der Eingabe von Werten (Anfangswerte, Steuergrößen) in eine Prozedur (Funktion). Diese Werte stehen unter den formalen Namen innerhalb der Prozedur (Funktion) zur Verfügung; eine Rückgabe von Werten an die übergeordnete Einheit ist mit Wertparametern nicht möglich. (2) Variablenparameter. Das allgemeine Format lautet: (VAR namex: ptypi;.
. . ; VAR namek:
ptypk)
Sie dienen der Werteingabe (Anfangswerte, Steuergrößen) in eine und der Wert-
2.5 Definition von Prozeduren und Funktionen
33
ausgabe aus einer Prozedur bzw. Funktion. Die Eingabewerte stehen unter den formalen Namen innerhalb der Prozedur (Funktion) zur Verfügung; die gegebenenfalls in der Prozedur (Funktion) veränderten Werte stehen unter den beim Aufruf angegebenen aktuellen Namen in der übergeordneten Einheit zur Verfügung. Als Parametertypen ptyp kommen sämtliche System- und Benutzertypen in Betracht. Allerdings können nur die einfachen Systemtypen INTEGER, REAL, BOOLEAN und CHAR unmittelbar in die Parameterklammer eingetragen werden; komplexe Typen wie ARRAY, STRING, RECORD, etc. müssen zuvor als Benutzertypen definiert werden.* Sind bei den o.g. Parameterdefinitionen einige Werte oder Variablen vom gleichen Typ, so können sie durch Kommata getrennt unter einer Typenbezeichnung ptyp zusammengefaßt werden; also namex, name2,..., VAR namex name2,...,
namem: ptyp; name\: ptyp\
bzw.
2.5.2 Definitionskörper Der Definitionskörper besteht bei Prozeduren wie Funktionen wiederum aus einem Definitionsteil und einem Ablaufteil. Zusammen mit den Definitionsanweisungen ergibt sich somit folgender allgemeiner Aufbau: PROCEDURE prozedumame definitionsteil BEGIN ablauft eil END;
.. .
FUNCTION funktionsname . .. definitionsteil BEGIN ablaufteil mit funktionsname: = résultat END;
Zu beachten ist, daß die in den Listen der formalen Parameter definierten Namen nicht noch einmal im Definitionsteil erscheinen dürfen. Ferner ist anzumerken, daß bei Funktionen, die mehr als einen Resultatwert haben, einige Resultate auch über globale Variablen oder über die Parameterliste an das aufrufende Programm zurückgegeben werden können. Programmbeispiel: PROGRAM l e 3 r n 9 » < F ' r o z e d u r e n - u . F u n k t i o n e n d e f i n i t i o n > CONST w e r t = l f VAR v a r i a b l e r i n p u t v a n o u t p u t v a r ! INTEGER? r e a l o u t p u t ! REALr
* Eine Angabe des Typs STRING ohne Längenvereinbarung ist in der Parameterklammer direkt möglich.
2. Der Defmitionsteil von PASCAL-Programmen
34
PROCEDURE proci (inwert J INTEGER ; WAR invar»outvar } INTEGER? WAR reaout : REAL); BEGIN outvar J= invar + inwert» reaout S = outvar! END» PROCEDURE proc2r BEGIN outputvar 5= inputvar + wert; ENDi FUNCTION funcl VAR i , a s c i i n r ( INTEGER; BEGIN FÜR i : = 1 TO 19 DO WRITELN ( ' * * * * DIESER TEXT WIRD GLEICH GELOESCHT * * * » ' | 5 5 ) | WRITELN ( ' t y p e < r e t u r n > f o r a c t i o n ' ) ) READLN; WRITE (CHR(27),CHR(42));{CLEAN SCREEN FUER SOROC> WRITELN ( ' t y p e < r e t u r n > f o r n e x t ' ) ; READLNs WRITELN ( C H R ( 6 5 ) , C H R ( 3 2 ) , C H R ( 6 6 ) , C H R ( 3 2 ) , C H R ( 6 7 ) > ; REPEAT BEGIN WRITE ( ' B I T T E ASCII-NUMMER U. < s p > EINGEBEN ' ) ( WRITE ('BEENDEN MIT < 3 2 ) « ' ) ; READ(asci i n r ) ; WRITELN ( ' > ',CHR(asciinr)); END; UNTIL a s c i i n r < 32s END.
3.2 Wertzuweisungen Wertzuweisungen bilden einen Großteil der Anweisungen eines jeden Programms. In PASCAL-Programmen lautet das allgemeine Format: variablem ausdrucke Als ausdruck kommen arithmetische und boolesche Ausdrücke in Betracht. Ferner können Variablen komplizierter Typen wie z.B. STRING, ARRAY, RECORD, FILE, Aufzählung und Ausschnitt verwendet werden. Die Grundregel dabei lautet, daß variable und ausdruck vom gleichen Typ sein müssen. Eine wichtige Ausnahme bildet die Typenkonversion zwischen INTEGER und REAL, die allerdings nur in einer Richtung funktioniert; d.h. ein INTEGERAusdruck wird REAL, wenn er einer REAL-Variablen zugewiesen wird. Das gleiche gilt für gemischte Ausdrücke, die REAL- und INTEGER-Komponenten enthalten. Soll ein Ausdruck vom Typ REAL einer Variablen vom Typ INTEGER zugewiesen werden, so kann dies nur über die Funktionen TRUNC oder ROUND geschehen. Codierbeispiel:
i
i= TRUNC(R/ioo.o-A) i
3. Der Ablaufteil von PASCAL-Programmen
52
Dabei seien i vom Typ INTEGER und r,a vom Typ REAL. Programmbeispiel: PROGRAM l e a r n l 5 ; i S t a n d a r d - F u n c t i o n s TRUNC,ROUND> VAR a , b : REAL; i : INTEGER) BEGIN REPEAT WRITE ; WRITELN i := TRUNC ( a ) ; WRITELN ('INTEGER - WERT NACH TRUNC s ' , i > ; i s= ROUND (a>; WRITELN ('INTEGER - WERT NACH ROUND ! ' , I ) J WRITELN ( ' t y p e < r e t u r n > -for n e x t ' ) ; READLN; END; UNTIL a = - 9 9 9 . 9 ; END.
('WIRD's5);
3.3 Alternative Programmzweige 3.3.1 Die GOTO-AnWeisung Die Sprunganweisung GOTO dient dem Anspringen verschiedener Programmzweige. Sie gehört zu den geächteten Elementen der strukturierten Programmierung; denn zweifellos wird das strenge hierarchische Konzept gestört, wenn Programmsprünge zwischen den Blöcken eines oder — schlimmer noch — verschiedener Zweige einer Hierarchie möglich sind. Da in diesen Sprüngen die größte Fehlerquelle für die Ablauflogik eines Programms gesehen wurde, hat man die GOTO-Anweisung bei neueren Programmiersprachen entweder verbannt oder, wie bei PASCAL, stark eingeschränkt: PASCAL gestattet Sprünge nur innerhalb einer Prozedur (Funktion) oder innerhalb des Hauptprogrammblocks. Das UCSD-PASCAL erfordert darüberhinaus noch eine besondere Parametrisierung des Übersetzers durch Angabe eines {G+} als erste Programmzeile (vgl. S. 135). Hier soll der pragmatische Standpunkt vertreten werden, daß Sprünge unter Wahrung des hierarchischen Programmaufbaus immer dann erlaubt sein sollen, wenn damit eine bequeme Lösung eines Problems erreicht werden kann. Insbesondere erweisen sich bedingte Sprünge zu bestimmten Fehler- oder Endroutinen als hilfreich. Aus diesem Grund wird die GOTO- Anweisung vor der IF-AnWeisung behandelt. Die Sprungziele müssen im Definitionsteil als LABEL erklärt werden (siehe S. 18). Das allgemeine Format fiir die Sprung-Anweisung lautet: GOTO Sprungziel;
53
3.3 Alternative Programmzweige
Für die Struktogrammkonstruktion ist folgendes Symbol vorgesehen: —^GOTO
ziel
Programmbeispiel:
;
-C*6+> PROGRAM learnlAf-tGOTO 5 Uiederholunä» LABEL 1 »2» VAR operand»summe»Produkt * REAL»
Pro3r3mmende>
modus : INTEGER»
PROCEDURE eingeben» BEGIN URITELN ('bitte operand eingeben J')» READLN (operand)»
end;
PROCEDURE verarbeiten» BEGIN summe i - operand + 10;
Produkt 5= operand * 10;
END»
PROCEDURE aussieben» BEGIN = '» summe); URITELN ('SUMME URITELN ('PRODUKT = '»Produkt);
end; BEGIN 1¡URITELN ('BITTE UAEHLEN !'>» URITELN ('EINGEBEN (1) VERARBEITEN URITELN ('AUSGEBEN (3) BEENDEN READLN (modus)» CASE modus OP 1 ! eingeben» 2 S verarbeiten» 3 < ausäeberi» 4 ! GOTO 2»
END»
GOTO 2 : END.
(2>')$ (4)')»
1;
Das Programm learnlö zeigt die Verwendung der GOTO-Anweisung an einer modifizierten Form des Programmbeispiels learn2. Die verwendete CASE-Konstruktion (vgl. S. 65 ff.) leitet die Programmkontrolle in Abhängigkeit vom Wert „modus" in vier verschiedene Zweige. Hier interessiert vor allem der 4. Ausgang, der über eine GOTO-Anweisung zum Programmende führt. Die GOTO-Anweisung hinter der CASE-Konstruktion führt zur Wiederholung des Programms.
3 . 3 . 2 Die IF-Anweisung Die IF-Anweisung dient der bedingten Ausführung von alternativen Programm-
3. Der Ablaufteil von PASCAL-Programmen
54
zweigen in Abhängigkeit von dem Wert eines booleschen Ausdrucks. Boolesche Ausdrücke sind auf S. 47 f. behandelt. Die IF-Anweisung hat zwei Grundformate, die unechte und die echte Alternative. Ferner sind geschachtelte Formen von Bedeutung. 3.3.2.1
Die unechte
Alternative
Das allgemeine Format lautet: IF boolescher ausdruck THEN block; Die Wirkungsweise ist folgende: Der Block block wird ausgeführt, wenn boolescher ausdruck den Wert TRUE hat; block wird übergangen, wenn boolescher ausdruck den Wert FALSE hat. Die Prozedur geht in beiden Fällen mit der auf block folgenden Anweisung weiter bzw. endet, wenn IF die letzte Anweisung ist, bzw. verzweigt, wenn block eine GOTO-Anweisung enthält. Für die Struktogrammkonstruktion ist folgende Symbolik vorgesehen:
Programmbeispiel : P R O G R A M learnl7»-CTest a u f z u l a e s s i a e n VAR result»operndl»opernd2 S REAL» operator ! CHAR» PROCEDURE addieren» BEGIN r e s u l t J= o p e r n d l END; PROCEDURE aussehen; BEGIN URITELN ('RESULTAT END»
Operatori
+ opernd2»
=
'»result)S
BEGIN URITELN ('bitte operandi READLN (operndl)f
eingeben')»
3.3 Alternative Programmzweige WRITELN C b i t t e oper3nd2 einseben')! READLN (opernd2). WRITELN C b i t t e operator einaeben')» READLN (operator)i 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 r END.
55
aussebeni
END?
Struktogramm: Zulässiger Operator
Das Programm leaml7 führt 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 blockl ELSE bbck2; Die Wirkung ist folgende: Der Block blockl wird ausgeführt, wenn boolescher ausdruck den Wert TRUE hat, und blockl wird ausgeführt, wenn boolescher ausdruck den Wert FALSE
3. Der Ablaufteil von PASCAL-Programmen
56
hat. Das Programm geht in beiden Fällen mit der auf bbck2 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 learnlB; {Test auf zulaessigen Operator mit Korrektureingabe> VAR result,operndl,opernd2 i REAL) operator i CHAR; PROCEDURE addieren; BEGIN result !» opernd1 + opernd2; END» PROCEDURE ausgeben; BEGIN WRITELN ('RESULTAT • END;
result);
PROCEDURE fehl meld; BEGIN WRITELN ('OPERATOR UNZULAESSIG, EINGABE MIEDERHOLEN'); END; BEGIN WRITELN READLN WRITELN READLN REPEAT
('bitte operandi eingeben '); (operndl>; ('bitte operand2 eingeben '); (opernd2>;
3.3 Alternative Programmzweige
57
BEGIN WRITELN ('bitte operator eingeben ')a READLN (operator)| IF operator '+' THEN fehl meld; END) UNTIL operator addieren| ausgeben; END.
Struktogramm: Zulässiger Operator mit Korrektureingabe
Das Programm learnl8 führt die Prozeduren „addieren" und „ausgeben" nur aus, wenn der boolesche Ausdruck ,,operator='+'" den Wert TRUE hat; danach endet das Programm. Wenn der boolesche Ausdruck den Wert FALSE hat, wird eine Fehlermeldung ausgegeben und zur Operatoreingabe zurückgesprungen. 3.3.2.3 Geschachtelte IF-AnWeisungen Der Block bzw. die Blöcke in einer IF-Anweisung dürfen wiederum IF-Anwei-
58
3. Der Ablaufteil von PASCAL-Programmen
sungen enthalten, so daß Schachtelungen entstehen können. Hierbei sind folgende drei Grundformen vor Bedeutung: Form 1: IF bool.ausdr.1 THEN IF bool.ausdr.2 THEN ' IF bool.ausdr.n THEN block;
Der Block block wird nur ausgeführt, wenn alle booleschen Ausdrücke den Wert TRUE haben. Sobald bei Durchlaufen der IF-Anweisungsfolge ein Ausdruck mit dem Wert FALSE entdeckt wird, verläßt das Programm sofort die Konstruktion und fährt im „weiter"-Zweig fort. Diese Form der Schachtelung entspricht einer AND-Verknüpfung der booleschen Ausdrücke 1 bis n und ist äquivalent mit der Form: IF (bool.ausdr.1) AND 0bool.ausdr.2) AND. . . AND (boolausdr.n) THEN block; Programmbeispiel: PROGRAM learnl.9 ! {Zahlen kumuliern ( IF.. AND. . ELSE ) > LABEL Ii
59
3.3 Alternative Programmzweige VAR o p e r a n d » r é s u l t a t
« REAL»
BEGIN r é s u l t a t 5= 0 . 0 » 1 { U R I T E L N ( ' b i t t e o p e r a n d e i n a e b e n :')» READLN < operand)r IF ( o p e r a n d > 0 . 0 ) A N D ( o p e r a n d < 1 0 0 . 0 ) THEN BEGIN r é s u l t a t î= r é s u l t a t + o p e r a n d » URITELN ('RESULTAT = '»résultat)? IF r é s u l t a t < 1 0 0 . 0 T H E N G O T O 1» END ELSE BEGIN URITELN ('OPERAND UNZULEASSIG')» G O T O If END» URITELN ('PROGRAMMENDE')» END.
Struktogramm: Zahlen kumulieren (IF . . . A N D . . . ELSE)
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 boo Lausdr. 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.l) OR/bool.ausdr.2) OR . . . ORfbool.ausdr.n)
THEN block]
3.3 Alternative Programmzweige
61
Programmbeispiel: -C*G+> PROGRAM l e a r r i 2 0 » -CZahlen k u m u l i e r e n LABEL 1» WAR o p e r a n d » r é s u l t a t { REAL»
(IF..OR..ELSE)>
BEGIN r é s u l t a t î= 0 . 0 » 1;URITELN ( ' b i t t e o p e r a n d e i n â e b e n : ' ) » READLN ( o p e r a n d ) » IF ( o p e r a n d = 1 0 0 . 0 ) THEN BEGIN URITELN ('OPERAND UNZULEASSIG' ) i GOTO 1» 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')i END.
Das P r o g r a m m l e a r n 2 0 realisiert dieselbe D a t e n v e r a r b e i t u n g s a u f g a b e 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.
Struktogramm: 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
3:
IF bool.ausdr.1 THEN blockl ELSE IF bool.ausdr.2 THEN block2
ELSE IF booì.ausdr.n THEN block n ELSE block n+1
3.3 Alternative Programmzweige
63
Die F o r m 3 ist aus der F o r m 2 abgeleitet, indem in den T R U E - Z w e i g e n statt des einen B l o c k s block
die B l ö c k e blockl
bis block
gibt es n o c h einen E L S E - Z w e i g mit d e m B l o c k block
n ausgeführt werden. F e r n e r n+1.
Diese K o n s t r u k t i o n kann zur alternativen Ausführung n + 1 verschiedener P r o grammzweige b e n u t z t w e r d e n ; denn es wird a u f jeden Fall ein B l o c k ausgeführt. Sobald ein B l o c k ausgeführt ist, wird die K o n s t r u k t i o n verlassen und e n t w e d e r im „ w e i t e r " - Z w e i g oder an einem Sprungziel fortgefahren. Programmbeispiel : •C«G+> P R O G R A M learn21 K O p e r a t o r a u s w a h l } L A B E L Ii YAR r e s u l t j o p e r n d l » o p e r n d 2 5 REAL» o p e r a t o r 5 CHARf PROCEDURE addieren; BEGIN result 5= o p e r n d l + o p e r n d 2 ? ENDf PROCEDURE multiplizieren; BEGIN r e s u l t S= o p e r n d l # opernd2» ENDf P R O C E D U R E aussieben i BEGIN U R I T E L N ('RESULTAT = END»'
'.result)5
P R O C E D U R E fehlmeldf BEGIN U R I T E L N ('OPERATOR U N Z U L A E S S I G , E I N G A B E W I E D E R H O L E N ' ) i END i BEGIN U R I T E L N ('bitte operandi e i n g e b e n ')» R E A D L N (operndl>i U R I T E L N ('bitte o p e r a n d 2 e i n g e b e n ' ) » READLN (opernd2)! 1 ¡ U R I T E L N ('bitte o p e r a t o r e i n s e h e n ' ) f R E A D L N (operator) t IF o p e r a t o r = '+' THEN addieren E L S E IF o p e r a t o r = ' - ' THEN result *= o p e r n d l - o p e r n d 2 E L S E IF o p e r a t o r = '#' THEN multiplizieren E L S E IF o p e r a t o r = '/' THEN result i= o p e r n d l / operrid2 E L S E B E G I N f e h l m e l d i GOTO If END» ausgeben f 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 über. 3 . 3 . 3 Die C A S E - A n w e i s u n g 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 werti : block x; wert2 : block2;
wertn END;
:
blockn;
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 OF 1 ! GOTO 5» 2 ! GOTO 3» 3} GOTO 6» end; b ) CASE ( o p e r a r i d X ) . 0 ) AND < o p e r a n d i l O O . 0 ) OF TRUE? BEGIN a d d i e r e n i a u s s l e b e r i i IF r e s u l t a t d O O . O THEN GOTO i! END» FALSE: BEGIN f e h l e r m e l d u n a ! GOTO 1! END» END f c) CASE t a ü OF mo: URITELN d i ; URITELN m i ; URITELN d o : URITELN f r : URITELN s s ! URITELN s o : URITELN END»
('MONTAG')» ('DIENSTAG')» < 'MITTUOCH' ) f ('DONNERSTAG' ) f ' ) i
')»
3.3 Alternative Programmzweige READLN ( e n d e ) i END;
PROCEDURE w u e r f e l i BEGIN i != i + l i i x := ix * 183 + i i IF i>: < 0 THEN i x != - i x i wurf 5= i ( i x DIV 6) # 6 + I i END» PROCEDURE z a e h l e r i BEGIN CASE wurf OF 1 5 e i n s t= e i n s + 2 } zwei 5= zwei + 3 5 d r e i 5= d r e i + 4 ! v i e r != v i e r + 5 : fuenf'= fuenf+ 6 ! sechsJ= sechst END; ENDI
Ii 1» Ii Ii Ii Ii
PROCEDURE a u s ä a b e i BEGIN WRITELN ('WURF NUMMER: ',it' PUNKTE : ' r w u r f ) i URITELN ;
3.5 Datentransfer, Datenhaltung
£2Î
; WRITE ( e c h o ) ; FOR k r= 1 TO 3 DO WRITE ( ' ",acCk3>; WRITELNI WRITE ('BITTE STRING # 1 0 0 ) » b) WRITE < 1 3 . 0 0 » ' % ' » '
MEHRWERTSTEUER')»
c) WRITE < f e 1 d C13 »f e 1 d C 2 ] » f e 1 d C 3 3 »roat r i C1»k 3 ) !
Im Beispiel a) sei „textk" eine Textkonstante und „textv" eine Textvariable; beide seien vom Typ STRING. Ferner sei „zahl" eine INTEGER-Variable. In Beispiel b) ist 13.00 eine Direktkonstante vom Typ REAL, '%' eine Direktkonstante vom Typ CHAR und 'MEHRWERTSTEUER' eine Direktkonstante vom Typ STRING. In Beispiel c) sei „feld" eine Feldvariable vom Typ CHAR und „matrix" eine Feldvariable vom Typ REAL. Beachtenswert ist, daß in der WRITE-Anweisung auch zusammengesetzte Aus-
3.5 Datentransfer, Datenhaltung
85
drücke vorkommen können, deren Werte erst bei der Ausgabe berechnet werden; siehe Beispiel a). 3.5.1.4 Formatierte Ausgabe Bezeichnet man mit den Wert (Zeichenfolge) des auszugebenden Ausdrucks^ so erzeugt eine WRITE-Anweisung folgende Ausgabedatensequenz:
...
Der Aufbau der auszugebenden Zeichenfolge erfolgt zunächst in einem Ausgabepuffer, in den die Werte sukzessive übertragen werden. Nach jeder Übertragung eines Wertes steht der Adreßpegel im Ausgabepuffer hinter dem letzten Zeichen der zugehörigen Zeichenfolge. Erst wenn alle Ausdrücke übertragen sind, wird an das Ausgabegerät bzw. die Ausgabedatei gesendet. Sollen Zwischenräume zwischen den Werten erscheinen, so müssen blanks durch geeignete Ausdrücke (direkte oder indirekte Konstanten) an den entsprechenden Stellen in der Liste der Ausgabeobjekte vorgesehen werden. Codierbeispiel: URITE ( z s h 1 f '
'rzahl#10fblanks»2ahl#100)(
Eine weitere Möglichkeit der Druckbildgestaltung wird durch einen Verschiebeparameter zur Verfügung gestellt; die allgemeine Form lautet: ausdrucke verschiebezahl{ Als verschiebezahl kommen nur positive arithmetische Ausdrücke vom Typ INTEGER in Betracht. Die Wirkung ist, daß verschiebezahl vor der Übertragung auf den aktuellen Wert des Adreßpegels im Ausgabepuffer addiert und die Länge der auszugebenden Zeichenfolge von diesem Wert subtrahiert wird; ab dieser Stelle im Ausgabepuffer wird sodann die betreffende Zeichenfolge abgelegt. Beispiel: WRITE ('PREIS':7, 'MENGE':6, 'WERT':8). V 0 R
P R E I S
+7 Anfangswert des Adreßpegels
M E N G E
W E R T *
Die Zeichenfolge „VOR" möge durch eine vorangehende WRITE-Anweisung erzeugt worden sein.
3. Der Ablaufteil von PASCAL-Programmen
86
Ausdrücke des Typs REAL werden in PASCAL i.d.R. in normalisierter Gleitpunktdarstellung, also in der Form x.xxxxxE±n ausgegeben. Für die formatierte Ausgabe in gewohnter Dezimalpunktdarstellung besteht jedoch in Form einer Stellenzahl die Möglichkeit einer entsprechenden Druckbildgestaltung; diese kann allerdings nur in Verbindung mit der Verschiebezahl benutzt werden. Die allgemeine Form lautet: REAL-ausdrucki'. verschiebezahl. stellenzahl Als stellenzahl kommen nur positive arithmetische Ausdrücke vom Typ INTEGER in Betracht; damit können im Rahmen der Darstellbarkeit von REAL-Zahlen die Stellen hinter dem Dezimalpunkt angegeben werden. Hat ein REAL-Ausdruck mehr Stellen hinter dem Dezimalpunkt als verlangt sind, so werden die letzten Stellen hinter dem Dezimalpunkt gerundet und abgeschnitten. Beispiel: : stellenzahl: Ausgabe:
12.3456 3 12.346
Sind weniger Stellen hinter dem Dezimalpunkt vorhanden, als durch stellenzahl angegeben, so werden Nullen angefügt. Beispiel: : 12.3 stellenzahl-. 3 Ausgabe: 12.300 Diese Regeln gelten mit der generellen Einschränkung, daß REAL-Zahlen mit maximal n Mantissenstellen ausgegeben werden, wobei im UCSD-PASCALSystem für Mikrocomputer n = 6 (vgl. S. 21). Daraus ergeben sich folgende Konsequenzen: (1) Wenn die Zahl der Stellen vor dem Dezimalpunkt bereits gleich 6 ist, so werden die letzten Stellen gerundet und abgeschnitten. Beispiel: : stellenzahl-. Ausgabe:
123456.78 >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 Daten transfer, 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 Ausgabe:
— Differenz 6
t
— Gesamtlänge 7
t
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 f I Adreßpegel Anfangswert
* + 20
3.5.1.5 Die WRITELN-Anweisung Sollen Zeilenwechsel erzeugt werden, so kann dies n u r durch die WRITELNAnweisung geschehen. Das allgemeine Anweisungsformat lautet:
WRITELN(dateivariable,ausdrucke,. . .,ausdruckm)\ WRITELN (ausdrucke,.. ., 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: PROGRAM l e a r n 2 7 ;
{WRITE, f o r m a t i e r t e A u s g a b e ,
d i v. Ausdrueclee)
PROCEDURE a u s d r u e c k e ; CONST t e x t k = 'TEST FUER VAR textv : STRINGC43]; z a h l , i , j : INTEGER; •feld : ARRAYC1..33 OF CHAR; matrix : ARRAYC1..5,1..3D OF REAL; BEGIN t e x t v := ' D I E AUSWERTUNG ARITHMETISCHER AUSDRUECKE s zahl 10; WRITE ( t e x t k , t e x t v , ( z a h l - 3 ) * 1 0 0 ) ; WRITELN;
';
3. Der Ablaufteil von PASCAL-Programmen
88
textv s= ' D I E VERWENDUNG VON DIREKTKONSTANTEN : WRITELN ( t e x t k , t e x t v , 1 3 . 0 0 : 4 : 2 , ' 7 . ' , ' MEHRWERTSTEUER' ) ; textv := ' D I E VERWENDUNG VON FELDVARIABLEN : f e l d t n :=• ' M ' s f e l d t 2 ] WRITE (textk,textv); FOR i : = 1 T O 5 DO BEGIN WRITELN; FOR j BEGIN
END;
END)
PROCEDURE VAR i , k BEGIN tl>
= 0 T H E N BEGIN WRITELN('123456789012345678901234567890'>; WRITE ('VOR'); WRITE ( ' P R E I S ' : I,'MENGE': WRITELN; END;
END; UNTIL
i
;
(Beenden
EINGEBEN
EINGEBEN
mit
999.9)
:
' ) ;
:
' ) ;
:
' ) ;
('123456789012345678901234567890');
3.5 Datentransfer, Datenhaltung
89
Das Programm learn27 enthält 3 Prozeduren zur Demonstration verschiedener Anwendungen von WRITE und WRITELN. 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. 2: Es wird die Verschiebezahl „i" eingelesen. 3: Ein Orientierungsraster wird ausgegeben. 4: 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 RE)N
RITE-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: R E U R I T E C k u n d e n d s t e i » ' # 5 JKUNDEN')f
Die Wirkung ist, daß zunächst dateiname im Dateienverzeichnis der externen Speichereinheit gesucht wird. Wird der Name nicht gefunden, so wird dateiname eingetragen und die Datei-Ende-Marke (EOF) wird auf den Dateianfang gesetzt. Existiert bereits eine Datei dieses Namens, so wird nur die Datei-Ende-Marke auf den Dateianfang gesetzt; d.h. alle bisherigen Sätze sind nicht mehr erreichbar.
90
3. Der Ablaufteil von PASCAL-Programmen
Das Weiterrücken dieser EOF-Marke geschieht nur durch das Herausschreiben neuer Sätze auf diese Datei. In beiden Fällen wird schließlich durch REWRITE die betreffende Datei durch einen Eintrag in das Dateiverzeichnis als geöffnet markiert. 3.5.2.2 Die
RESET-AnWeisung
Die RESET-Anweisung dient dem Wiedereröffnen existierender Dateien auf externen Speichereinheiten. Das allgemeine Anweisungsformat lautet: RESET (dateivariable,dateiname); Zu dateivariable und dateiname siehe REWRITE auf S. 89. Die Wirkung ist, daß zunächst die Existenz von dateiname im Dateiverzeichnis festgestellt und die Datei dann als geöffnet markiert wird. Sodann wird der erste Satz von der Speichereinheit eingelesen und in dateivariable geladen. Beim UCSD-PASCAL-System wird der erste Block (ä 512 Bytes) der Datei gelesen und der erste Satz in dateivariable übertragen. Greift ein Satz über mehrere Blöcke, so werden alle zur Füllung von dateivariable notwendigen Blöcke eingelesen. Zugleich wird der Satzadreßpegel auf den Anfang des unmittelbar nachfolgenden Satzes eingestellt. Der geladene Satz steht über den Variablenaufruf dateivariable ^ zur Verfügung; einzelne Satzteile können durch die Variablenaufrufe dateivariablei .satzteilvariable erreicht werden. 3.5.2.3 Die SEE K-Anweisung
Die SEEK-Anweisung ist eine Besonderheit des UCSD-PASCAL-Systems, die dem direkten Auffinden von Sätzen auf externen Speichereinheiten dient. Das allgemeine Anweisungsformat lautet: SEEK (dateivariable,satznummer)] Zu dateivariable siehe REWRITE auf S. 89. Als satznummer kommen nur positive arithmetische Ausdrücke vom Typ INTEGER in Betracht. Die Wirkung ist, daß satznummer in eine Satzadresse umgerechnet und die Differenz mit dem aktuellen Satzadreßpegel gebildet wird. Liegt die Differenzadresse außerhalb eines zuvor eingelesenen Blocks, so wird der Zugriffsarm auf den der Differenzadresse entsprechenden Block eingestellt; ferner wir der Satzadreßpegel auf den Anfang des mit satznummer angegebenen Satzes gesetzt. Liegt die Differenzadresse innerhalb eines zuvor eingelesenen Blocks, so wird lediglich der Satzadreßpegel verändert. Zu beachten ist, daß mit SEEK noch kein Lese- oder Schreibzugriff und damit auch keine Bereitstellung (bzw. Ausgabe) eines Satzes in (bzw. aus) datei-
3.5 Datentransfer, Datenhaltung
91
variable verbunden ist; dies erfolgt vielmehr erst durch eine nachfolgende GETbzw. PUT-An Weisung.
3.5.2.4 Die
GET-Anweisung
Die GET-Anweisung dient dem Einlesen von Daten von externen Speichergeräten. Das allgemeine Anweisungsformat lautet: GET (dateivariable)', Als dateivariable kommen nur Die Wirkung ist, daß ein Satz variable geladen wird. Zugleich mittelbar nachfolgenden Satzes
Variablen von Dateityp (FILE OF) in Betracht. von einer externen Datei gelesen und in dateiwird der Satzadreßpegel auf den Anfang des uneingestellt.
Der geladene Satz steht über den Variablenaufruf dateivariable t zur Verfugung; einzelne Satzteile können durch die Variablenaufrufe dateivariable t .satzteilvariable erreicht werden. Wird bei irgendeinem Lesezugriff durch GET (oder RESET) das Dateiende erreicht, so können danach durchaus noch weitere GET-Anweisungen gegeben werden, die allerdings i.d.R. zur Bereitstellung unerwünschter Daten in dateivariable fuhren. Aus diesem Grunde empfiehlt es sich, nach jeder GET- (und auch RESET-) Anweisung das erste Byte von dateivariable auf die EOF-Marke hin zu untersuchen. Dies kann durch die Boolesche Standardfunktion EOF geschehen: Der Funktionsruf EOF (dateivariable) hat den Wert TRUE, wenn das erste BYTE von dateivariable die EOF-Marke enthält; anderfalls ist der Wert FALSE. Steht die EOF-Marke auf dem Dateianfang, so wird durch die RESET-Anweisung gleich zu Beginn eine EOF-Marke eingelesen; dies kann ebenfalls durch die Funktion EOF erkannt werden.
3.5.2.5 Die
PUT-Anweisung
Die PUT-Anweisung dient dem Ausgeben von Daten auf externe Speichergeräte. Das allgemeine Anweisungsformat lautet: PUT (dateivariable)-, Zu dateivariable siehe GET-Anweisung oben. Die Wirkung ist, daß der Inhalt von dateivariable als Dateisatz auf eine externe
92
3. Der Ablaufteil von PASCAL-Programmen
Speichereinheit geschrieben wird.* Zugleich wird der Satzadreßpegel auf den unmittelbar nachfolgenden Satz eingestellt. Ist der gerade ausgegebene Satz der neue letzte Satz einer Datei, so wird zugleich die EOF- Marke hinter diesen Satz gestellt. 3.5.2.6
Die
CLOSE-AnWeisung
Die CLOSE-Anweisung ist eine Sonderfunktion des UCSD-PASCAL-Systems, die dem Schließen von Dateien auf externen Speichereinheiten dient. Das allgemeine Anweisungsformat lautet: CLOSE (dateivariable, option)-, Zu dateivariable siehe die GET-AnWeisung auf S. 91. Als option kommen die Parameter „leer", NORMAL, LOCK und PURGE in Betracht. Die Formen CLOSE (dateivariable) ', und CLOSE (dateivariable, NORMAL); haben folgende Wirkung: Wenn die betreffende Datei mit der RESET-Anweisung eröffnet wurde, wird sie als geschlossen markiert. Wenn die betreffende Datei über eine REWRITE-Anweisung eröffnet wurde, wird sie nicht in das Dateienverzeichnis eingetragen und steht daher später nicht mehr zur Verfugung. Die Form CLOSE (dateivariable,LOCK); hat folgende Wirkung: Wenn eine Datei mit REWRITE eröffnet wurde, wird der dort angegebene dateiname in das Dateienverzeichnis auf der Speichereinheit eingetragen. Damit steht die Datei später zur Verfugung. Zugleich wird die Datei als geschlossen markiert. Wenn eine Datei mit RESET eröffnet wurde, ergibt sich die gleiche Wirkung wie ein CLOSE mit „leer"-oder NORMAL-Parameter. Die Form CLOSE {dateivariable,PURGE);
* Beim UCSD-PASCAL-System wird, wenn die Länge von dateivariable < 5 1 2 Bytes ist, zunächst in einen internen Blockpuffer (512 Bytes) übertragen; erst wenn dieser gefüllt ist, wird auf die Diskette geschrieben.
3.S Datentransfer, Datenhaltung
93
hat folgende Wirkung: Wenn eine Datei mit REWRITE eröffnet wurde, hat PURGE die gleiche Wirkung wie „leer" oder NORMAL, dJi. es wird keine dauerhafte Datei angelegt; wenn eine Datei mit RESET eröffnet wurde, wird durch PURGE der Dateiname aus dem Dateienverzeichnis gelöscht, womit die Datei nicht mehr zur Verfügung steht. Programmbeispiel: PROGRAM l e a r n 2 8 ; { D a t e i b e h a n d l u n g D TYPE k u n d s a t z = RECORD knr : STRINGC33; name : STRINGC24]j s a l d o : REAL; END; 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 ; mode,i : INTEGER; PROCEDURE e i n r i c h t e n ; VAR künde : k u n d s a t z ; BEGIN REWRITE ( k u n d e n d a t e i , ' # 5 ¡ K U N D E N ' ) ; WITH künde DO REPEAT BEGIN WRITE ('NUMMER ( b e e n d e n m i t "999") READLN(knr); IF knr ' 9 9 9 ' THEN BEGIN WRITE ('NAME : '); READLN ( n a m e ) ; WRITE ('SALDO : '); READLN ( s a l d o ) ; k u n d e n d a t e i ^ := künde; PUT ( k u n d e n d a t e i ) ; END; END; UNTIL knr = ' 9 9 9 ' ; CLOSE ( k u n d e n d a t e i , L O C K > ; END; PROCEDURE a u s g e b e n ; BEGIN WRITELN ( k u n d e n d a t e i k n r ) ; WRITELN ( k u n d e n d a t e i ^ . n a m e ) ; WRITELN ( k u n d e n d a t e i sal do:7:2); END; PROCEDURE a u f l i s t e n ; BEGIN RESET ( k u n d e n d a t e i , ' # 5 : k ü n d e n ' ) ; WHILE NOT EOF ( k u n d e n d a t e i ) DO BEGIN ausgeben; GET(kundendatei); END; READLN| CLOSE(kundendatei,NORMAL); END;
:
');
94
3. Der Ablaufteil von PASCAL-Programmen
PROCEDURE matzsuchen| VAR t n r i INTEGER) BEGIN RESET(kundendatei,'#3iKUNDEN'>; WRITE CSATZNUMMER : ' ) ; READLN(snr)| SEEK(kundendatei,inr); GET(kundendatei); ausgeben; READLN) CLOSE(kundendatei)) END) BEGIN REPEAT BEGIN FOR i I - 1 TO 24 DO WRITELN; WRITELN ('BITTE VERARBEITUNGSART AUSWAEHLEN ' ) ; WRITELN ('EINRICHTEN (1) AUFLISTEN ( 2 ) ' ) ) WRITELN ('SATZSUCHEN (3) BEENDEN (4)')} READLN(mode); CASE mode OF 1 : einrichten; 2 : auflisten) 3 : satzsuchen; END; 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.
3.5 Datentransfer, Datenhaltung
95
96
3. Der Ablaufteil von PASCAL-Programmen
3.5.2.7 Dateibehandlung mit READ und WRITE Die ausführlichen Anweisungsformate READ (dateivariable, variablei,. .., variablek); und WRITE (dateivariable, ausdrucke,.. ., au sdruck m)\ 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, ausdruck)-, 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); variablem dateivariable t ; Ferner ist die Anweisung WRITE (dateivariable, variable)-, äquivalent mit der Anweisungsfolge dateivariable t:= variable PUT (dateivariable); Programmbeispiel: PROGRAM learn27;tEinfacher Texteditor> TYPE f i 1 type = FILE OF CHAR; VAR datei : filtype; c 1 CHAR; einr.au-flc CHAR;
97
3.6 Prozeduraufrufe PROCEDURE e i n r i c h t e n | BEGIN REWRITE; WRITELNCSATZEINGABE ( B e e n d e n (nit REPEAT BEGIN READ ( c ) ; IF EOLN THEN WRITELN ( d a t e i ) ELSE WRITE ( d a t e i , c > | END; UNTIL c = ' # ' ; CLOSE(datei,LOCK); END |
"*">
:
'))
PROCEDURE a u f l i s t e n ; BEGIN R E S E T ( d a t e i , ' # 5 J D A T E I ' >; WHILE NOT E O F ( d a t e i ) DO BEGIN READ ( d a t e i , c ) ; IF E O L N ( d a t e i ) THEN BEGIN WRITELN(c); R E A D L N ( d a t e i ) ; END ELSE WRITE(c); END; CLOSE(datei,LOCK); END; BEGIN WRITE('EINRICHTEN READLN(einr); IF e i n r « ' y ' THEN WRITE('VERARBEITEN READLN(auf 1 ) ; IF a u f 1 = ' y ' THEN END.
?
(y/n>'>;
einrichten; ? (y/n)'); auflisten;
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 Aufruffoimate richten sich nach den Definitionsformaten und -inhalten, die auf S. 32ff. ausfuhrlich 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ß Variablennamen 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
99
3.6 Prozeduraufrufe
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 e ( r o w s f c o l s : INTEGERi VAR
i matrix)»
Aufruf: p r o c < 5 r f n ( 3 r 6 F a C i * 3 J ) ra) r
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 Aufrufe Alle in einer bestimmten Einheit (Programm, Prozedur, Funktion) definierten Prozeduren und Funktionen befinden sich zueinander im Verhältnis der N e b e n o r d n u n g ; definierende und definierte Einheiten befinden sich im Verhältnis der U n t e r - bzw. Ü b e r o r d n u n g .
100
3. Der Ablaufteil von PASCAL-Programmen
Definitionsstruktur: Über/Unterordnung
s
PI 12
3 y -oS
r
h O c4>
S-1
V
Z PI 13
£ 3
P12
P121
C
V (4 o c &
£a> Z
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: P121 ruft P 1 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: P l l ruft P I und PI ruft wieder P I 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 P 1 2 2 aufrufen, weil diese nur P 1 2 bekannt sind; ( 2 ) der direkte Aufruf von Prozeduren aus einer anderen als der eigenen Nebenordnung; z.B. kann P i l l nicht P121 aufrufen, weil diese nur in P 1 2 bekannt ist.
Programmbeispiel: PROGRAM LEARN30i-CHierarchische» lineare u.rekursive Prozeduraufrufe> VAR x . a : r e a l ; PROCEDURE pl (WAR X»Y 5 REAL>t PROCEDURE P l l
(xia
!REAL)}
PROCEDURE P i l l » BEGIN URITELN ('HIER IST Pill')* END i PROCEDURE pl 12 i BEGIN URITELN ('HIER IST P112')S END» PROCEDURE P l l 3 f BEGIN URITELN ('HIER IST P113')i WRITELN ('PI13 RUFT P112 AUF')f Pll2( END i
102
3. Der Ablaufteil von PASCAL-Programmen BEGIN WRITELN ('HIER IST P l l ' ) ; WRITELN ( ' P l l RUFT P 1 1 1 » P U 3 UND PI AUF')? Pili; Pll3; x J= x + 1 0 . 0 0 » IF X < 3 0 . 0 THEN P l ( x » a ) ; end; PROCEDURE p12 (WAR x i a ! REAL); PROCEDURE p l 2 i ; BEGIN WRITELN ('HIER IST P 1 2 1 ' ) f WRITELN C P 1 2 1 RUFT P l l A U F ' ) ; pll(x»a); end; BEGIN WRITELN ('HIER IST P 1 2 ' ) ; WRITELN C P 1 2 RUFT P 1 2 1 ' > ; pl2i; end; PROCEDURE P l 3 ; PROCEDURE P l 3 i ; BEGIN WRITELN ('HIER IST P 1 3 1 ' ) ; u := y + 5 . 0 ; IF a < 1 5 . 0 THEN p l 3 i ; end; PROCEDURE P l 3 2 ; BEGIN WRITELN ('HIER IST P 1 3 2 ' ) ; WRITELN C P 1 3 2 RUFT P131 A U F ' ) ; Pl3i; end; BEGIN WRITELN ('HIER IST P 1 3 ' > ; WRITELN ( ' P13 RUFT F'131 UND P132 A U F ' ) ; Pl31» P132» end; BEGIN WRITELN ('HIER IST F l ' ) ; WRITELN ( ' P I RUFT P l l » F'12 UND P13 A U F ' ) ; p l l ( x » a ) ; pl2(xra>; Pl3; end; BEGIN x := o . o o ; a := o . o o ; WRITELN ('PROGRAMM RUFT Fl A U F ' ) ; pl (y.t a ) ; WRITELN C X : ' » X r ' Y ! ' » a ) . ' END.
Das Programm learn30 zeigt u.a. alle im vorangehenden T e x t beschriebenen Aufrufbeispiele.
3.6 Prozeduraufrufe
Struktogramm: Hierarchische, lineare und rekursive Prozeduraufrufe
103
104
3. Der Ablaufteil von PASCAL-Programmen
4.Sonderteil: Das UCSD-PASCAL-System
4.1 Systemspezif i kati on Die Benutzung des UCSD-PASCAL-Systems wird am Beispiel eines Mikrocomputers vom Typ ALTOS S8000 mit Z80-CPU, 64 KB RAM, zwei DiskettenLaufwerken und einem Bildschirm SOROCI2O vorgeführt. Die Darstellung beschränkt sich auf die wichtigsten Funktionen und deren gebräuchlichsten Formen. Für spezielle Funktionen und Anwendungen wird auf die ausführlichen Darstellungen in [10] verwiesen.
4.1.1 Ei ^/Ausgabeeinheiten (volumes) Das UCSD-PASCAL-System verlangt in der o.g. Form mindestens zwei Disketten: eine s y s t e m disk im rechten Laufwerk und eine a l t e r n a t e disk im linken Laufwerk. Ferner bedarf es eines Terminals (Bildschirm oder Drucker) mit einer Schreibmaschinentastatur. Darüber hinaus können weitere Einheiten wie Drucker, Disketten-Laufwerke, Bildschirme, etc. vom System bedient werden. Die nachfolgende Zusammenstellung gibt die Nummern und Namen aller möglichen Einheiten an:
Unit number
Volume name
Unit description
#1:
CONSOLE:
#2: #3: # 4 : oder * #5: #6: #8: #9:-#12:
SYSTERM: GRAPHIC: user name: user name: PRINTER: REMOTE: user name :
Terminal mit Schreibtastatur und Echo. Die eingegebenen druckbaren Zeichen werden vom Mikrocomputer an das Terminal zurückgesendet Terminal mit Schreibtastatur ohne Echo Graphics Bildschirm rechtes Laufwerk (system disk) linkes Laufwerk (alternate disk) Drucker sonstige Geräte zusätzliche Disketten-Laufwerke
Tabelle 1
Die Adressierung der Einheiten geschieht entweder mit Hilfe der u n i t n u m b e r oder mit Hilfe des v o l u m e n a m e . Dabei sind die in Tabelle 1 mit Großbuchstaben ausgeschriebenen volume names fest vereinbart und reserviert, während die übrigen vom Benutzer zu vergeben sind (vgl. S. 121,127).
106
4. Sonderteil: Das UCSD-PASCAL-System
Beispiel: Eine Datei soll ausgedruckt werden. Im Verlauf des Dialogs verlangt das System die Angabe der Einheit. Die Benutzerantwort lautet dann entweder PRINTER: oder # 6 : . 4.1.2 Dateitypen Das UCSD-PASCAL-System kennt eine Reihe von Dateitypen, die unterschiedliche Aufgaben haben und die von bestimmten Programmen des Systems nur aufgrund einer bestimmten Typenangabe erkannt werden. Die wichtigsten Dateitypen sind a) T e x t - D a t e i e n : Dies sind aus druckbaren Zeichen bestehende ProgrammDateien. Sie werden mit Hilfe des Editors erzeugt und werden nur in dieser Form vom Editor und vom Compiler akzeptiert. Die Typenbezeichnung geschieht durch das Subscript .TEXT, das einer neuen Datei vom Editor automatisch zugeordnet wird. Beispiel: LE ARN 1.TEXT Text-Dateien ohne oder mit anderen Typenbezeichnungen des Benutzers sind möglich, können aber z.B. nur als Datensicherungsdateien (back up files) benutzt werden. b) C o d e - D a t e i e n : Dies sind aus Maschinencode* bestehende Programmdateien, die durch den Kompilationsvorgang aus Programmdateien des Typs .TEXT entstehen. Sie sind nicht druckbar und werden vom Editor nicht akzeptiert. Die Typenbezeichnung geschieht durch das Subscript .CODE, das vom Compiler automatisch zugeordnet wird. Beispiel: LEARN1 .CODE Code-Dateien ohne oder mit anderen Typenbezeichnungen des Benutzers sind möglich, aber nicht bindbar und nicht startbar. c) D a t a - D a t e i e n : Dies sind Daten-Dateien, die durch Eröffnungs-, Schreibund Schließbefehle eines Benutzerprogramms erzeugt werden. Der Editor akzeptiert data-Dateien nicht. Die Typenkennzeichnung geschieht systemintern; ein Subscript wird nicht zugeordnet. Beispiel: KUNDEN d) B a d - D a t e i e n : Dies sind Blöcke auf einer Diskette, die durch den file h a n d l e r als physikalisch schadhaft erkannt worden sind (vgl. S. 125f.). Die * Beim UCSD-PASCAL-System wird kein echter Maschinencode, sondern der sogenannte P-Code generiert, der auf einer sogenannten P-Maschine interpretiert wird.
4.1 System Spezifikation
107
Typenbezeichnung geschieht durch das Prefix BAD. und das Subscript .BAD, das vom file h a n d l e r automatisch zugeordnet wird. Zwischen Prefix und Subscript erscheint die Nummer des schadhaften Blocks. Beispiel: BAD.00372.BAD
4.1.3 Dateispezifikation Die Spezifikation einer Datei besteht aus einer Disketten-Bezeichnung, einem Dateinamen sowie einer Typenbezeichnung (subscript), und zwar alternativ in den folgenden zwei Formaten:
(1) unit number : file name.subscript (2) volume name : file name.subscript Beispiele: # 5 : LEARN 1.CODE ARB : LEARN3. TEXT Befindet sich eine Datei auf einer d e f a u l t u n i t (normalerweise die system disk im rechten Laufwerk (vgl. S. 105), so kann die Disketten-Bezeichnung (unit number bzw. der volume name) entfallen. Der Dateiname darf aus 1 bis 10 Zeichen bestehen. Die Typenbezeichnung ist entweder eines der zuvor genannten Systemwörter, eine freie Benutzerbezeichnung, oder leer.
4.1.4 Arbeitsdatei (work file) Zur Steigerung des Benutzerkomforts stellt das UCSD-PASCAL-System eine Arbeitsdatei zur Verfügung. Diese wird vom Editor auf Benutzerverlangen aus der im Arbeitsspeicher erstellten oder modifizierten Datei durch ein einfaches Kommando ohne besondere Dateiadressierung auf der s y s t e m disk kreiert (vgl. S. 117); dabei ordnet der Editor automatisch den Namen SYSTEM.WRK.TEXT zu. Existiert eine Arbeitsdatei, so liest der Editor sie ohne besondere Namensangabe automatisch ein. Ebenso verfährt der C o m p i l e r , der zusammen mit dem L i n k e r daraus automatisch eine Datei mit der Adresse SYSTEM.WRK.CODE erzeugt. Die zuletzt genannte Datei wiederum wird vom Loa der automatisch geladen und gestartet Ein Datensicherungseffekt wird dadurch erreicht, daß vorläufige Versionen der Arbeitsdatei unter Verwendung eigener Benutzernamen auf die Disketten kopiert werden können (vgl. S. 118, 130). Damit ist ein Wiederaufsetzen bei unbeabsichtigtem Verlust der Arbeitsdatei oder bei fehlerhafter Dateimodifikation möglich.
108
4. Sonderteil: Das UCSD-PASCAL-System
4 . 1 . 5 Start u n d Handhabung des Systems Der Start erfolgt durch Eingeben des Großbuchstabens „U" am Bildschirm. Das UCSD-PASCAL-System meldet sich dann mit: Uelcome U.C.S.D.
USERr F'ascal
Current date i s
to System
II.O
16-Jan-80
Command: E < d i t » R(un> F i i l e r D(ebuär? [ I I . 0 3
C(omp» L ( i n k > X
A auf der höchsten Kommandoebene wird der Editor geladen. Dieses Programm dient dem Erzeugen und Verändern von Programm-Dateien. Der Editor stellt zunächst fest, ob eine Arbeitsdatei SYSTEM.WRK.TEXT auf der system disk existiert und lädt diese gegebenenfalls in den Arbeitsspeicher. Existiert keine Arbeitsdatei, so wird folgende Meldung ausgegeben: >Edit5 No w o r k f i l e i s p r e s e n t . F i l e ? < < r e t > f o r rio f i l e < e s c - r e t > t o e x i t
)
4.2 Editor
109
Antwortet man mit dem Eintippen der Spezifikation einer existierenden Datei vom Typ .TEXT und < r e t u r n > , so wird die betreffende Datei in den Arbeitsspeicher geladen. Bei der Spezifikation kann die Typenbezeichnung fehlen, da der Editor ohnehin nur TEXT-Dateien akzeptiert. Befindet sich die Datei auf der default disk, so kann auch die Disketten-Bezeichnung entfallen (vgl. S. 107). Antwortet man mit < r e t u r n > , so wird eine neue, zunächst unbenannte Datei im Arbeitsspeicher angefangen, die später als Arbeitsdatei oder unter einem frei gewählten Benutzernamen auf eine der Disketten geschrieben werden kann (vgl. S. 130f.). In beiden Fällen erscheint das Kommando-menu der e d i t - E b e n e . Dieses enthält aus Platzgründen nur die wichtigsten Editorkommandos. Weitere Kommandos stehen zur Verfügung und werden, soweit sie wichtig erscheinen, im folgenden beschrieben. > E d i t : A ( d J s t C(py D d e t e F wird beim SOROC120 durch realisiert.
: delete line; dJi. Cursorbewegung nach links an den Anfang der betreffenden Zeile. Beim SOROCI2O heißt diese Taste < r u b > .
: escape; d.h. verlassen einer Editorfunktion ohne Wirkung für die Datei.
: end of text; d.h. verlassen einer Funktion mit Verifikation der beabsichtigten Funktionswirkung für die Datei. < e t x > wird beim SOROC120 und bei vielen anderen Bildschirmen durch realisiert.
: return; liefert das Zeichen c a r r i a g e r e t u r n (Zeilenvorschub) ab und hat je nach Funktion unterschiedliche Wirkung. Bei vielen Bildschirmen heißt diese Taste . < s p a c e > : blank; liefert ein Leerzeichen ab und hat je nach Funktion unterschiedliche Wirkungen. Diese Taste ist i.d.R. die große unbenannte Leertaste der Schreibtastur.
4. Sonderteil: Das UCSD-PASCAL-System
110
Bei vielen der nachfolgend beschriebenen edit-Funktionen ist es wichtig, den Cursor vor d e m A u f r u f der Funktion genau auf die Textstelle der Datei zu positionieren, an der eine Veränderung (Einfügung, Löschung, etc.) vorgenommen werden soll. Dies geschieht in der edit-Ebene durch die Tasten < t > , < 4 > , < - > > und . < t > oder < c o n t r o l / k > : Cursorbewegung um eine Zeile nach oben; wird die oberste Bildschirmzeile erreicht, so verschiebt sich die ganze Datei um 11 Zeilen nach unten. < 4 > oder < c o n t r o l / j >
: Cursorbewegung um eine Zeile nach unten; wird die unterste Bildschirmzeile erreicht, so wird die ganze Datei um eine Zeile nach oben geschoben.
< - • > oder < c o n t r o l / l >
: Cursorbewegung um eine Schreibstelle nach rechts; wird das Ende einer Textzeile erreicht, so springt der Cursor auf den Anfang der nächsten Zeile (auf das erste druckbare Zeichen).
< « - > oder < c o n t r o l / h > : Cursorbewegung um eine Schreibstelle nach links; wird der Anfang einer Textzeile erreicht, so springt der Cursor an das Ende der vorangehenden Zeile auf das (unsichtbare) Zeichen „carriage return". Die nachfolgend beschriebenen edit-Funktionen insert, adjust, exchange, delete, zap, copy, s e t , j u m p , page, find, replace und quit werden in der edit-Ebene durch Ein tippen des jeweils erstens Buchstabens des Funktionsnamens aufgerufen; Groß- und Kleinbuchstaben werden gleichermaßen akzeptiert. Es m u ß stets das Kommando-menu des Editors auf dem Bildschirm erscheinen, bevor eine dieser edit-Funktionen gestartet werden kann. 4.2.1
Insert
Durch < I > in der edit-Ebene wird die insert-Funktion aufgerufen; damit wird das Programm an der aktuellen Cursorposition eingabebereit. Die gewünschte Cursorposition ist v o r d e m A u f r u f einzustellen. >InsertJ C
Text
«bs>
aecepts»
a char»
3
line>
escapesIi
Etwaige nachfolgende Textpassagen werden „nach hinten" verschoben und es können einzelne Zeichen, Zeilen oder eine ganze Datei eingetippt werden. Für den Editor stellt sich eine Datei als eine ununterbrochene Zeichenfolge dar. Die Darstellung der Datei am Bildschirm oder auf einem Drucker richtet sich nach den Steuerfunktionen der einzelnen Zeichen. Druckbare Zeichen erscheinen als Ziffern, Buchstaben oder Sonderzeichen. -Zeichen erscheinen
111
4.2 Editor
als leere Positionen, -Zeichen (carriage return) bewirken den Abbruch der aktuellen Zeile und den Beginn einer neuen Zeile. Unerwünschte Zeichen wie z.B. die Cursorbewegungen < t > oder < h o m e > werden durch ein „?" beantwortet. Bestimmte Zeichen dienen der Steuerung bzw. Korrektur innerhalb der insertFunktion und haben daher keine unmittelbare Wirkung auf die Textausgabe am Bildschirm bzw. Drucker. Es sind dies die im Kommando-menu der insertFunktion angegebenen Zeichentasten: < b s > — zur Löschung gerade eingetippter, unerwünschter Zeichen; < d e l > — zur Löschung einer gerade eingetippten, unerwünschten Zeile; < e s c > — zum Verlassen der insert-Funktion bei gleichzeitigem Ignorieren der gesamten Eingabe; < e t x > - zum Verlassen der insert-Funktion bei gleichzeitiger Verifikation der gesamten Eingabe. Ein besonderer Komfort wird durch die Einrückautomatik geboten: Nach jedem < r e t u r n > springt der Cursor auf die nächste Zeile genau unter das erste druckbare Zeichen der vorangehenden Zeile. Durch oder kann weiter nach rechts eingerückt und durch < b s > kann die Einrückung nach links verschoben werden. 4 . 2 . 2 Adjust Eine nachträgliche Korrektur der Einrückung kann durch die adjust-Funktion erreicht werden, die durch < A > in der edit-Ebene aufgerufen wird. Der Cursor ist vor dem A u f r u f in die zu verschiebende Zeile zu setzen. >Adjust2 L < j u s t R < j u s t CCenter
Von den gegebenen Möglichkeiten dieser Funktion werden hier nur die CursorBewegungen behandelt:
schiebt die gesamte Zeile um eine Schreibstelle nach rechts, schiebt die gesamte Zeile um eine Stelle nach links.
Ist auf diese Weise eine Zeile eventuell nach wiederholtem Tastendruck in die gewünschte Position gerückt worden, so können mit
alle darüberliegenden und mit alle darunterliegenden Zeilen um die gleiche Anzahl von Schreibstellen verschoben werden. dient dem Verlassen der adjust-Funktion und der Vertiflkation der durchgeführten Ausrichtungen in der Datei.
4. SonderteU: Das UCSD-PASCAL-System
112
4.2.3 Exchange Durch < X > in der edit-Ebene wird die exchange-Funktion aufgerufen; damit können ab der aktuellen Cursorposition Zeichen überschrieben werden. Die gewünschte Cursorposition ist vor dem A u f r u f einzustellen. >eXchanäe*
TEXT « b s >
a char> C escapesr
accepts]
Für das Überschreiben können druckbare Zeichen und < s p a c e > verwendet werden; ein Überschreiben des Zeilenendes ist nicht möglich. Durch < b s > können einzelne Überschreibungen rückgängig gemacht werden; die alten Zeichen erscheinen wieder. Durch < e s c > wird die exchange-Funktion ohne Berücksichtigung der Korrekturen verlassen. Durch < e t x > werden die Korrekturen für die Datei wirksam und die exchangeFunktion wird verlassen.
4.2.4 Delete Durch < D > in der edit-Ebene wird die delete-Funktion aufgerufen; damit kann ab der aktuellen Cursorposition gelöscht werden. Die gewünschte Cursorposition ist vor d e m A u f r u f einzustellen. In der delete-Ebene können durch < s p a c e > einzelne Zeichen und durch < r e t > oder < 4 > einzelne Zeilen gelöscht werden. >DeleteJ
< > < M o v i n ä eommmarids> -C to
< e s e > to
abort>
delete>
Mit < e s c > wird die delete-Funktion ohne Löschung verlassen; mit < e t x > wird die Löschung wirksam und die delete-Funktion wird verlassen. Die gelöschten Zeichen bzw. Zeilen werden in einem copy-Puffer abgelegt. Die Kapazität ist variabel und richtet sich nach dem erreichten Umfang der Textdatei im Arbeitsspeicher. Dieser Puffer kann zum Kopieren des gelöschten Textes an die gleiche und andere Stellen der Datei benutzt werden, wodurch ein Duplizieren oder Verschieben von Textpassagen möglich wird (vgl. „Copy" a u f S . 113). Läuft der Puffer über, so wird nach < e t x > gemeldet: T h e r e is n o r o o m to COP« t h e d e l e t i o n . Do u o u w i s h to d e l e t e s n a w a a ? (a/n)
Antwortet man mit < N > , so wird die delete-Funktion ohne Wirkung verlassen. Antwortet man mit < Y > , so wird die Löschung wirksam, der Inhalt des copyPuffers geht jedoch verloren.
4.2 Editor
113
4.2.5 Zap Durch < Z > in der edit-Ebene wird die zap-Funktion aufgerufen; mit ihr kann der gesamte Text einer Datei vom letzten Aufsetzpunkt des Cursors bis zur aktuellen Cursorposition gelöscht werden. Der letzte Aufsetzpunkt des Cursors ist der Anfang einer Textstelle, die durch die Funktionen find, replace oder insert erreicht wurde. Diese Löschfunktion ist allerdings nur dann sinnvoll, wenn die Löschentscheidung an irgendeiner Textstelle für die davorliegenden Passagen getroffen wird und nicht an den Anfang des Löschbereichs zurückgekehrt werden soll. Allerdings muß sich der Benutzer an den letzten Aufsetzpunkt erinnern, wodurch diese Form des Löschens etwas gefährlich wird. Auch die zap-Funktion füllt den copy-Puffer. Werden mehr als 80 Zeichen gelöscht, so verlangt das System eine Bestätigung: >UARNING! You a r e a b o u t t o z a p more t h a n 8 0 c h a r s » do wou w i s h t o zap"? ( y / n )
4.2.6 Copy Durch < C > in der edit-Ebene wird die copy-Funktion aufgerufen; damit kann vor die aktuelle Cursorposition der Inhalt des copy-Puffers oder eine andere Datei eingefügt werden. Die gewünschte Cursorposition ist vor dem A u f r u f einzustellen. >Cop«! H K u f f e r
F(rom f i l e
Durch < B > in der copy-Ebene wird der Inhalt des copy-Puffers eingefugt; danach wird die copy-Funktion automatisch verlassen. Der Inhalt des copy-Puffers wird durch jede Anwendung von < D > , < Z > und < I > neu gesetzt bzw. bei Uberlauf gelöscht. Eine Anwendung von < C > < B > sollte daher unmittelbar anschließend an eine gezielte Auffüllung des Puffers erfolgen, um eine unbeabsichtigte Zerstörung des Inhalts zu vermeiden. Durch < F > wird die folgende Rückfrage generiert: >Cop«{ From what
fileCmarkerrmarkerD?
Bei Spezifikation einer existierenden Datei vom Typ TEXT wird diese eingefügt; danach wird die copy-Funktion automatisch verlassen. Die Typenbezeichnung kann bei der Spezifikation fehlen. Sind in der angegebenen Datei Markierungen gesetzt worden (vgl. „Set" S. 114), so können auch Teile dieser Datei eingefügt werden; und zwar wird bei [markerl, marker2] ab der Markierung markerl bis zur Markierung marker2, bei [marker,]
114
4. Sonderteil: Das UCSD-PASCAL-System
ab der Markierung marker bis zum Dateiende und bei [,marker] vom Dateianfang bis zur Markierung marker eingefügt. Wenn eine angegebene Datei nicht existiert, so erscheint die Meldung: >CopyJ File not p r e s e n t .
Filename?
Durch < r e t > kann dann die copy-Funktion ohne Wirkung verlassen werden. Wenn eine angegebene Markierung nicht existiert, erscheint die Meldung: ERROR! Marker not there.
F'lease Press < s p a c e b a r > to
continue.
4.2.7 Set Durch < S > in der edit-Ebene wird die set-Funktion aufgerufen; damit kann an der aktuellen Cursorposition durch < M > in der set-Ebene eine Markierung eingegeben werden. Die gewünschte Cursorposition ist vor dem A u f r u f einzustellen. >Set: E(nvironment MCarker
Eine Markierung darf aus 8 Zeichen bestehen und muß von < r e t > gefolgt werden. Danach wird die set-Funktion automatisch verlassen. In einer Datei dürfen insgesamt aber nur 10 solcher Markierungen gesetzt werden. Ist diese Zahl erreicht, so erscheint bei erneutem < S > < M > folgende Meldung: Marker ovflw. 0) 1) 2) 3) 4) 5) 6> 7) 8) 9)
U h i c h o n e to
replace?
MO Ml M2 M3 M4 M5 M6 M7 M8 MV
Durch Angabe einer Ziffer zwischen 0 und 9 verschwindet die betreffende Markierung und kann durch eine neue ersetzt werden. Durch < S > < E > können die Ausgabe und einige Funktionen des Editors modifiziert werden (vgl. [10]). Durch wird die set-Funktion ohne Wirkung verlassen. 4.2.8 Jump Durch < J > in der edit-Ebene können Sprünge innerhalb einer Datei vollfuhrt werden.
115
4.2 Editor >JUMP: EKeäinninä E(nd M in der jump-Ebene wird der Cursor an den Dateianfang und durch < E > an das Dateiende gesetzt. Durch < M > wird die Rückfrage Jump to what marker?
generiert. Bei Eingabe der Markierung (vgl. 2.7 Set) und anschließend < r e t > springt der Cursor auf die Markierung. Wenn die Markierung nicht existiert, so erscheint ERRORS Not there.
Please press to continue.
4.2.9 Page Durch < P > in der edit-Ebene kann eine Datei Bildschirmseite für Bildschirmseite „durchgeblättert" werden. Durch < P > mit n als ganze Zahl können n— 1 „Seiten" übergangen werden. Mit < - > < P > bzw. < - > < P > kann rückwärts (in Richtung Dateianfang) geblättert werden. Mit < + > wird die Richtung wieder auf vorwärts (in Richtung Dateiende) eingestellt. Achtung: < - > gilt auch für diverse andere Funktionen, z.B. exchange, delete, etc. Wenn also dort die normale Vorwärtsrichtung gewünscht wird, muß diese vorher mit < + > wiederhergestellt werden. 4.2.10 Find Durch < F > in der edit-Ebene wird die find-Funktion aufgerufen. Das System meldet sich dann mit >Findt:ii: L(it
=>
Die Antwort des Benutzers besteht normalerweise in der Eingabe eines in Trennzeichen eingekleideten t a r g e t s t r i n g . Als Trennzeichen sind alle Zeichen außer Ziffern und Buchstaben zulässig. Beispiel: 'READ'. Nach dem Eintippen des schließenden Trennzeichens startet die find-Funktion ab der aktuellen Cursorposition den Suchprozeß. Wird der target string in der Datei gefunden, so rückt das System diesen in die Mitte der Bildschirmseite und positioniert den Cursor unmittelbar dahinter. Wird der target string nicht gefunden, so kommt die Meldung: ERROR! Pattern not in the file Please press to continue.
Im ersten Fall wird die Funktion automatisch und im zweiten Fall nach < s p a c e > verlassen.
116
4. Sonderteil: Das UCSD-PASCAL-System
Wird ein bestimmter target string mehrmals in einer Datei vermutet und will man nach einem Treffer weitersuchen, so kann dies bequem durch die same-Option geschehen, und zwar durch die Eingabe < F > < S > . Es wird dann der im targetPuffer befindliche string benutzt. Der target-Puffer wird erst durch eine erneute Eingabe verändert und steht daher auch nach Ausfuhrung anderer Funktionen noch zur Verfugung. Sollen bei der Suche n—1 Treffer übergangen werden, so kann ein repeat-Faktor angegeben werden: < F > , mit n als ganze vorzeichenlose Zahl. Durch Umkehr der Verarbeitungsrichtung vermittels kann ab einer bestimmten Textstelle auch in Richtung auf den Dateianfang gesucht werden. Soll nach irrtümlichem < F > die Funktion ohne Suche abgebrochen werden, so geschieht dies durch .
4.2.11 Replace Durch < R > oder < n > < R > in der edit-Ebene wird die replace-Funktion aufgerufen. n ist dabei ein repeat-Faktor oder das Zeichen „/". Mit n > 1 wird die replace-Funktion bis zu n-mal ausgeführt; mit wird die replace-Funktion so oft als möglich ausgeführt. Das Programm meldet sich auf < R > mit >ReplaceC11! L ( i t V(fy
=>
Ist beispielsweise n = 10, so antwortet das Programm auf < 1 0 > < R > mit >ReplaceC103 * L ( i t V(fa
=>
Wird < R > eingegeben, so meldet sich das Programm mit >ReplaceC/3t L ( i t V(fy
=>
Die Antwort des Benutzers besteht normalerweise in der Eingabe zweier in Trennzeichen eingekleideter strings, einem target string und einem Substitute string. Beispiel: 'WRITE' 'READ' Nach dem Eintippen des abschließenden Trennzeichens beim Substitute string beginnt die replace-Funktion ab der aktuellen Cursorposition einen Suchprozeß und ersetzt den target string durch den Substitute string, sobald der target string in der Datei gefunden wird. Wurde ein repeat-Faktor angegeben, so wird die Suche und Ersetzung bis Höchstgrenze dieses Faktors wiederholt. Wird der target string überhaupt nicht gefunden, so meldet sich die replaceFunktion mit
117
4.2 Editor E R R O R ' P a t t e r n n o t in t h e f i l e F'lease p r e s s < s p a c e b a r > to c o n t i n u e .
Will sich der Benutzer die Änderungsentscheidung vorbehalten, so kann er die verify-Option wählen: < R > < V > 'target string''substitute
string'
Sobald jetzt der target string gefunden wird, meldet sich die replace-Funktion mit der Zeile: >ReplaceC/3! aborts»
'R' r e p l a c e s »
' ' doesn't
Antwortet der Benutzer mit < R > , 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: < S > 'substitute string' und für den substitute string 'target string' < S > und schließlich für beide
4.2.12 Quit Durch < Q > in der edit-Ebene wird die quit-Funktion aufgerufen. Das Programm antwortet dann mit dem Kommando-menu: >Quit: IKpdate the workfile and leave E(xit without updatinä 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 ( 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 of Output f i l e
Antwortet der Benutzer mit < r e t > , so gelangt man in die edit-Ebene zurück. Antwortet der Benutzer durch Eintippen 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 >Quit;
Writinä.• Your f i l e i s 256 b u t e s l o n ä . Do you want t o E < x i t f r o m 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 Datei Verwaltung 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 filer-Ebene: F i l e r } G S l a v e i I K h s t » N ( e u i L < d i r r T ( r a n s r D Q ( u i t CC.21?
R(emr
C wird der zweite Teil auf den Bildschirm gebracht:
4.3 File handler FilerJ ViolSf
119 B ( 3 d - b l k s r E < x t - d i r » K oder < N > verlassen werden.
4.3.1 Volumes Durch < V > in der filer-Ebene wird die volumes-Funktion aufgerufen, welche Auskunft über die momentan an das System gekoppelten Ein-Ausgabe-Einheiten (vgl. S. 105) gibt. Beispiel einer Systemantwort: ^ols 1 2
ori-line! CONSOLEJ SYSTERM:
4 * USER• 5 # TESTDAT! PRINTERS 6 7 REMIN! Root v o l i s - USER: Prefix is - USER!
Die root vol-Angabe zeigt die Systemdiskette an. Die Prefix-Angabe bedeutet, daß die genannte Einheit automatisch adressiert wird (default unit), wenn bei einer Dateispezifikation die Disketten-Bezeichnung (unit number oder volume name) fehlt. Das System nimmt zunächst die System-Diskette als default unit an. Dies kann jedoch durch die prefix-Funktion (vgl. S. 122f.) geändert werden.
4.3.2 List directory Durch < L > 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 verfügbaren Platz, über den Platzbedarf einzelner Dateien, über den Erfolg einer Dateierzeugung, -löschung, -Übertragung, etc.. Das Programm stellt zunächst die Frage: D i r l i s t i n ä of what v o l
?
4. Sonderteil: Das UCSD-PASCAL-System
120
Die Benutzerantwort besteht normalerweise in einer Disketten-Bezeichnung (unit number oder volume name) gemäß Tab. 1 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
4.3.3
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
E x t e n d e d list d i r e c t o r y
Durch < E > in der filer-Ebene wird die extdir-Funktion aufgerufen; sie verlangt die gleichen Benutzerangaben wie die ldir-Funktion, zeigt aber das Dateienverzeichnis ausführlicher als jene. Beispiel für das Dateienverzeichnis des system disk: USER i SYSTEM.MICRO SYSTEM.FILER SYSTEM.EDITOR SYSTEM.LINKER SYSTEM.COMPILER SYSTEM.SYNTAX SYSTEM.PASCAL LIBRARY.CODE MYGOTOXY.RES SYSTEM.MISCINFO SYSTEM.LIBRARY AUX.REGENT.CODE ABSCHLUSS•CODE fUCHHALT.CODE DATINPUT.CODE < UNUSED > SYSTEM.WRK.TEXT < UNUSED >
16 28 45 22 68 14 33 7 4 1 40 2 23 32 36 4 4 105
9--Feb--79 24--Msa--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 Iiataf ile 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 Z e r o d i r of w h a 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: Destroy 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 Datei Verzeichnis ein Duplikat angelegt und später automatisch neben dem eigentlichen fortgeschrieben. Durch das Dienstprogramm COPYDUPDIR kann dann ein versehentlich gelöschtes Dateiverzeichnis 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: A r e t h e r e 494
b l k s ori t h e d i s k ?
(Y/N)
Antwortet er mit < N > , fragt das Programm: * of b.locks 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 w vol n a m e
?
Antwortet der Benutzer mit < r e t > , so wird die zero-Funktion ohne Wirkung
4. Sonderteil: Das UCSD-PASCAL-System
122
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 what vol ? #5 Oestro« TESTDATJ ? 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 ? New vol n a m e ? T E S T D A T TESTDAT5 correct ?
Y
4.3.5 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: Date set: -- 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
< r e t > - < J a n . . . Dec> < r e t > — < 0 0 . ,99> — < r e t >
4.3.6 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 F'refix t i t l e s
ba what 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 h a k e 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 ¿ 5 1 2 Bytes, so versucht die make-Funktion unter den unused-Ein tragungen im Dateien Verzeichnis (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 what y o l
?
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: Fron end o f d i s k »
b l o c k 494
?
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. 125ff.). 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 File handler
125
oder die Laufwerksklappen zu öffnen. Derlei Störungen können zum Verlust aller Dateien und des Dateien Verzeichnisses führen. Diese Warnung sollte auf alle Operationen des filer ausgedehnt werden, da fast immer Eintragungen im Dateienverzeichnis 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 o f what v o l
?
Die Benutzerantwort besteht normalerweise in der Angabe einer DiskettenBezeichnung (vgl. S. 105) und < r e t > .
4 . 3 . 1 0 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: Examine b l o c k s on what v o l
?
Die Benutzerantwort besteht normalerweise in der Angabe einer DiskettenBezeichnung (vgl. S. 105) und < r e t > ; 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.
126
4. Sonderteil: Das UCSD-PASCAL-System
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) endangered* Directora 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
may may may may may
he 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
DISK 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 Chanä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 C h a n ä e to w 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
?
4. Sonderteil: Das UCSD-PASCAL-System
128
Beispiele: a) # 4 : LEARN.TEXT, # 5 : LE ARN .RESERVE b) LEARN.TEXT < r e t > To where? ARB: 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 d u r c h < $ > 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: Transfer 494 blocks ?
Antwortet der Benutzer mit < N > , so kommt die Frage * o f 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
TESTDAT!
?
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
129
4.3 File handler
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 Dateienverzeichnis. 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 T
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 awas 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
oder oder
Text 8 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 T E S T D A T : L E A R N 2
?
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 Remove old TESTDATJLEARN2.CODE
?
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 w h a t f i l e ?
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 Programmausführung
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 e u r r e n t w o r k f i l e ?
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: Compilinä... Compile what
te;:t?
Gibt der Benutzer die Dateispezifikation (laufwerksbezeichnung: eines existierenden text flle an, so fragt der Computer To what
dateiname)
codefile?
Gibt der Benutzer die Dateispezifikation (laufwerksbezeichnung: dateiname) eines code flle an, so wird das erfolgreich übersetzte Programm später in dieser Datei abgelegt. Antwortet der Benutzer mit , so wird das erfolgreich übersetzte Programm in die Datei SYSTEM.WRK.CODE übertragen. Nach einer dieser Eingaben beginnt der Übersetzungsvorgang. Lautet die Antwort hingegen , so gelangt man zurück in die höchste Kommandoebene. Nach erfolgreicher Übersetzung wird der Objektcode in die angegebene Datei oder in die Arbeitsdatei SYSTEM .WRK.CODE geschrieben; dieser Code ist dann frei von Syntaxfehlern. Erkennt der Compiler während der Übersetzung einen Syntaxfehler, so erscheint die fehlerhafte Stelle des Quellencode auf dem Bildschirm. Zugleich wird die Fehlernummer sowie eine Kurzbezeichnung des Fehlers angegeben. Ferner wird gefragt, ob die Übersetzung abgebrochen oder fortgesetzt werden soll. Beispiel: PASCAL C o m p i l e r
0>...... .
CII.O.A.13
LEARN28 C 6647 w o r d s J 7> BEGIN 1!F'RINT « « L i n e 7r e r r o r 1 0 4 ! < s p > ( c o n t i n u e ) >
(terminate)t
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.
133
4.4 Programmausführung
Beispiel: Undeclared identifier.
Type
PROGRAM learn28r{Compiler LABEL 1*25
Optionen}
VAR 3ib : REAL.5 i ! INTEGER» c ! ARRAYCI. .33 OF INTEGER« BEGIN 1J F'RINT C R E A L - U E R T : '>5 READL.N (a) 5 IT a = -999,9 THEN GOTO 2 5 b != 35 URITELN ( b a d 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 high bound 1 0 3 : I d e n t i f i e r is n o t o f t h e a p p r o p r i a t e c l a s s 104:Undeclared identifier 105:sign not allowed 106¡Number expected 107:Incompatible subrange types 108:File not allowed here 1 0 9 1 T y p e m u s t n o t be real 1 1 0 : < t a g f . i e l d > t y p e m u s t b e s c a l a r or s u b r a n g e 1 1 1 : I n c o m p a t i b l e w i t h p a r t 1 1 2 : I n d e x t y p e m u s t n o t be real 113:index type must be a scalar or a s u b r a n g e 114:Base t y p e m u s t n o t be real H S i B a s e type m u s t be a scalar or a s u b r a n g e 1 1 6 : E r r o r in t y 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 117.!Unsatisified f o r w a r d reference 1 1 8 ! F o r w a r d r e f e r e n c e t y 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 not 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 y 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 121¡File value parameter not allowed 122iA f o r w a r d d e c l a r e d function's result type can't be r e - s p e c i f i e d 1 2 3 : M i s s i n g r e s u l t t y 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 type 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 126:Number of parameters does not agree with declaration 127!Illegal parameter substitution 128:Result type does not agree with declaration 129:Type conflict of operands 1 3 0 ! E x p r e s s i o n is n o t o f s e t t y p e 1 3 1 ! T e s t s o n erauality a l l o w e d o n l y
4.4 Programmausführung
135
132iStrict inclusion not allowed 133>File comparison not allowed 1.34 ! X1 l e g a l t y p e o f o p e r a n d i ? ) 1 3 5 ¡ T y p e of o p e r a n d m u s t he b o o l e a n 1 3 6 * S e t e l e m e n t t y p e m u s t be s c a l a r or s u b r a n g e 137!Set element types must be compatible 1 3 8 : T y p e o f v a r i a b l e is n o t a r r a y 1 3 9 * I n d e x t y 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 ! T y p e of v a r i a b l e is n o t r e c o r d 1 4 1 5 T a p e of 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 142:llle3al parameter solution 143IIllegal type of loop control v a r i a b l e .144» 11 l e g a l t y p e o f e x p r e s s i o n 145!Type conflict 146 : A s s i g n m e n t of f i l e s n o t a l l o w e d 147!Label type incompatible with selecting expression 148 ! S u b r a n g e b o u n d s m u s t be s c a l a r 149 J Index t y p e m u s t be integer 1 5 0 ¡ A s s i g n m e n t t o 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 ^ 0 s u c h f i e l d in t h i s r e c o r d 1 5 3 ^ y p e e r r o r in r e a d 154:Actual parameter must be a variable
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+»S+> PROGRAM learri28i{Compi1er Optionen} LABEL 1 > 2 f MAR a»b : REAL» i ¡ INTEGERt c ! ARRAYC1..33
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-Anweisung 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 (*$Llaufwerksbezeichruing: name.TEXT*) laufwerksbezeichrwng 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: •C*I-rR-rG+rS+X#$L * i : # > PROGRAM l e a r n 3 1 f { C o m p i 1 e r LABEL 1*25 VAR 3 f b : REALi i
Optionen}
! INTEGERi c
! ARRAYC1. . 3 3 OF INTEGERr
BEGIN 1 *URITE ('REAL-WERT ! ' ) » READLN ( a ) i IF 3 = - 9 9 9 . 9 THEN GOTO 2r b != 3 i WRITELN CREAL-UERT NACH READ i }= TRUNC < 3 ) f WRITELN ( ' . . . . - W E R T NACH TRUNC i := ROUND ; WRITELN ( ' . . . . - W E R T NACH ROUND cCiD ;= i i WRITELN ('NEUES WECTOR-ELEMENT GOTO l f 2:END.
' »b) J ' f i) i
'»i);
Am Programmbeispiel learn31 lassen sich die Effekte der einzelnen Optionen studieren: Dazu schalte man wechselweise einzelne Optionen ein und aus. 4.4.2 Der PASCAL-Linker Der UCSD-PASCAL-Linker wird durch < L > 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.
4. Sonderteil: Das UCSD-PASCAL-System
138
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: Map name?
Spezifiziert der Benutzer eine Datei (laufwerksbezeichnung: der Linker ein entsprechendes map file vom Typ TEXT.
name), so erzeugt
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. fi.le?
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 Openinä 45 5 LEARN28.CODE Lib file? * OpeninS »SYSTEM.LIBRARY Lib file? Map name? LEA Readinä LEARN28 Resdinsl PASCAL10 Output file? *5SLEARN28.C0DE
139
4.4 Programmausführung
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 e 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 No 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 Bindevorgangs, z.B. durch Speicherplatzprobleme oder nichtbefriedigte Referenzen, über die Erzeugung des 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.5 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 f i l e
->
Der Benutzer antwortet mit dem Namen einer noch nicht existierenden Bibliothek, z.B. oder Danach fragt das Programm nach dem Namen einer Datei, die in die neue Bibliothek übernommen werden soll. Link. Code F i l e
->
Die Benutzerantwort sollte < r e t u r n > sein; daraufhin erscheint die menu-Zeile Seäment * t o l i n k
arid < s p a c e > »
N(ew f i l e f
Qiuit»
Aibort
Wählt der Benutzer das Kommando < N > , so erscheint wieder die Frage Link Code F i l e
->
und er kann die Spezifikation (laufwerksbezeichnung: 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: Seäment * t o l i n k and < s p a c e > »
N(ew f i l e r
Link Code F i l e - > *5!MATOPER.CODE 00 40 10 50 20 60 30 70
G(uit»
89lO-MATOPER 11-
Aibort
0 0 302 0
12131415-
0 0 0 0
Besteht die Antwort auf „Link Code File?" in der Angabe einer bereits exisitie-
4. Sonderteil: Das UCSD-PASCAL-System
142
renden Bibliothek, die ganz oder teilweise in die neue Bibliothek übernommen werden soll, so erscheint statt der obigen Tabelle der Katalog dieser Bibliothek. Beispiel: Seäment * to link arid > N SYSTEM.LIBRARY 0-PASCALIO 1824 41-GDSP 6904 52-tiATEI 2160 630 7-
0 0 0 0
891011-
A(bort
0 0 0 0
12131415-
0 0 0 0
In beiden Fällen erneuert sich die menu-Zeile „segment # to link and , N(ew, Q(uit, A(bort". Der Benutzer kann nun Objekt für Objekt aus der „Scheinbibliothek" oder aus der angebenen Bibliothek in die neue Bibliothek übertragen. Dies geschieht durch wechselseitige Angabe der Objektnummer aus der „link code"-Tabelle und der Platznummer in der neuen Bibliothek. Soll also z.B. das Objekt STATIST an die Stelle 1 der neuen Bibliothek übertragen werden, so gibt man < 1 0 > < s p a c e > < l > < 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-
4.5 Unterprogrammtechnik
143
einer Eingabe, z.B. , 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 übertragen 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 S Y S T E M . L I B R A R Y 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: < S Y S T E M . L I B R A R Y > ( 2 ) Eingeben Name der alten Bibliothek S: Link code file B: < S Y S T E M , L I B R A R Y > Seäment
•
to
link
and < s P 3 c e > »
N(ew
L i n k Code F i l e •-> SYSTEM.LIBRARY 0-PASCALIO 1824 46904 1-GIiSF' 2-DATEI 2160 60 37Output c o d e f i l e Code f i l e l e n ä t h
0 0 0 0
file»
8910» 11 -
CHuitr
A(foort
0 0 0 0
12131415-
- > SYSTEM.LIBRARY - 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: S: S: B: S: S:
Segment to link into Segment#to . . .
Segment to link into Segment#to . . .
B: < 1 >
B: < 2 >
(4) Aufnehmen verändertes Objekt „MATOPER" B: < N > S: link code file -» B: < # 5 : MATOPER.CODE> S: Seäment • to link and » N *5!MATOPER.CODE 00 40 10 50 2-
3-
0
0
6-
7-
0
0
8-
910-MAT0PER 11-
0
0 302 0
12-
131415-
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 : S T A T I S T . C O D E > B: < # 5 : S T A T I S T . C O D E > S: Seäment * to link and » N(ew file» Q(uit» Link Code File ~> *5:STATIST.CODE 00 40 10 50 20 60 30 70
8710-STATIST 11-
Atbort
0 0 30 0
12131415-
(7) Eingeben Objektnummer (Scheinbibliothek) und Objektnummer neu B: < 1 0 > S: Segment to link into B: < 4 > S: Segment#to . . . (8) Beenden B: < Q > S: Notice? B: < r e t u r n >
0 0 0 0
145
4.5 Unterprogiammtechnik
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 Feldtyp 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 matoper» INTERFACE TYPE matrix = ARRAYC1..15»1..153 OF REAL»* vector = ARRAYC1..151 OF REAL ! PROCEDURE matmult ; < 3> DELETE ( s p r e i s , P O S ( ' . ' , s p r e i s > , 1 ) ; C 4> W R I T E L N ( ' s p r e i s n a c h d e l e t e • ' , s p r e i s , ' L a e n g e : ' , LENGTH(spreis)); < 5> I N S E R T ( ' , ' , s p r e i s , L E N G T H ( s p r e i s ) - 1 ) ; WRITELN('spreis nach i n s e r t > ' , s p r e i s , ' Laenge : ' , LENGTH(spreis));
154
4. Sonderteil: Das UCSD-PASCAL-System
{ 6> dm a= C O P Y ( » p r e i s , 1 , P O S < ' , ' > s p r e i s > - 1 ) ( t 7 ) p< 1= C O P Y ( s p r e i s , P O S ( ' , ' , s p r e i s > + 1 , 2 ) ; < B> d r u c k z e i l e : = CONCATtdm,' ' . m a r k , 7 ' , p i , ' ',pfennig); WRITELN ( d r u c k z e i l e ) ; < 9 } INSERT ( ' D E U T S C H E - ' . d r u c k z e i l e , P O S C M A R K ' . d r u c k z e i l e ) ) ; WRITELN ( d r u c k z e i l e ) ; F I L L C H A R ( d r u c k z e i 1 e C 1 ] , L E N G T H ( d r u c k z e i 1 e ) , ' * " ) } WRITELN ( d r u c k z e i l e , ' ',LENGTH(druckzei1e)); END.
Das Programm learn34 zeigt verschiedene Anwendungen der in diesem Abschnitt behandelten STRING-Prozeduren. Zur Erleichterung der nachfolgenden Beschreibungen wurden die zu erklärenden Anweisungen mit Kommentarnummern versehen. 1: Wertzuweisung der STRING-Konstanten „preis" an die STRING-Variable „spreis". 2: Zeigt u.a. den daraufhin entstandenen Wert des Längenschlüssels mit Hilfe der Funktion LENGTH. 3: Eliminieren des '.' aus dem String „spreis". Die Position wird durch die Funktion POS ermittelt. 4: Zeigt u.a. den daraufhin veränderten Wert des Längenschlüssels. 5: Einfügen eines ',' in den String „spreis". Die Funktion LENGTH (spreis)-1 zeigt auf die vorletzte Stelle des String; ab dort wird der Inhalt von „spreis" um eine Stelle nach rechts verschoben und das Komma eingefügt, so daß zwei Dezimalstellen entstehen. 6: Ab „spreisfl]" werden alle Stellen vor dem ',' nach dort übertragen. Die Anzahl der stellen vor dem ',' wird durch den Funktionsaufruf POS ( \ \ s p r e i s ) - l ermittelt. 7: Ab der Stelle hinter dem ',', also ab spreis[POS(',',spreis)+l] werden zwei Stellen nach „pf" übertragen. 8: Die als Parameter genannten Strings (dm,' ' , m a r k , ' . . . usw.) werden durch die Funktion CONCAT in der Variable „druckzeile" aneinandergereiht. 9: Ab der Stelle POS('MARK'.druckzeile) wird der Inhalt von „druckzeile" um 9 Stellen nach rechts verschoben und der Teilstring „DEUTSCHE-" eingesetzt. 10: Ab „druckzeile[1]" werden LENGTH (druckzeile) „»"-Zeichen geladen. 4.5.5.2 CHA R Prozeduren CHAR-Prozeduren dienen der Manipulation des Datentyps PACKED ARRAY OF CHAR (hier kurz PAOC genannt und auch so als Benutzertyp darstellbar). Die einzelnen Routinen sind jedoch weit weniger potent als die entsprechenden STRING-Prozeduren, weswegen sich bei PAOC-Variablen mit nicht mehr als 255 Feldern eine Übertragung in STRING-Variablen lohnt. Dies geschieht z.B. durch FOR i:= 1 TO n DO stringvar[i]:= paocvar[i-l\, stringvar[0]:= CHR(n);
4.5 Unterprogrammtechnik
155
(1) Längendiagnose Die Funktion SIZEOF liefert die Länge +1 einer angegebenen PAOC-Variablen. Da man dies auch aus den Definitionen entnehmen kann, liegt der Hauptzweck dieser Funktion in der Unabhängigkeit von den sich bei der Programmentwicklung noch ergebenden Definitionsänderungen: Verwendet man die Längenangabe einer PAOC-Variablen in einem Unterprogrammaufruf oder einer Programmschleife, so müssen die Parameter bei einer Definitionsänderung nicht mitgeändert werden. Definition: FUNCTION SIZEOF (name: PAOC): INTEGER; Aufruf: length:= SIZEOF (variable)-1; (2) Zeichen suchen Die Funktion SCAN durchsucht eine PAOC-Variable nach einem bestimmten Zeichen und liefert deren Position als INTEGER-Wert. Definition: FUNCTION SCAN (mmex: INTEGER;relation name2: CHAR; VAR name3: PAOC): INTEGER; Aufruf: positions
SCAN (length, sign character, objektvariable)-,
length ist ein INTEGER-Ausdruck, sign ist entweder „=" oder „", character ist ein Ausdruck (Variablen- oder Konstantenaufruf vom Typ CHAR) und objektvariable ist ein indizierter oder nicht-indizierter Name einer PAOC-Variablen. Beispiel: position
:= SCAN ( 5 0 1 - '
» p r i r i t l i n e C 1 5 3 ) + 15r
50 Felder der PAOC-Variablen „line" werden ab „line[20]" auf Gleichheit mit dem Zeichen „*" durchsucht. Sobald die erste Gleichheit (character = objectvariable[i]) festgestellt wird, bricht der Suchprozeß ab und SCAN erhält die Anzahl der Suchschritte bis zu dieser Stelle als INTEGER-Wert zugewiesen. Wird gleich zu Beginn Gleichheit festgestellt, so hat SCAN demgemäß den Wert Null; wird character in objektvariable nicht gefunden, so erhält SCAN den Wert length. Wird sign mit angegeben, so wird die Suche bei der ersten Ungleichheit zwischen character und objektvariable[i] abgebrochen. Wird objektvariable als nichtindizierter Variablenname angegeben, so beginnt die Suche beim kleinsten Indexwert aus der Typdefinition.
4. Sonderteil: Das UCSD-PASCAL-System
156
(3) Laden gleicher Zeichen Geschieht mit FILLCHAR. Vgl. 4.5.5.2 auf S. 153. (4) Verschieben Eine PAOC-Variable kann mit den Prozeduren MOVELEFT und MOVERIGHT geladen und ihr Inhalt kann nach rechts oder links überwälzt werden. Definition: PROCEDURE MOVELEFT (VAR name^, name2 : PAOC ;name3 : INTEGER); PROCEDURE MOVERIGHT (VAR namet, name2 : PAOC ;name 3 :INTEGER); Aufruf: MOVELEFT (source, destination, length) ; MOVERIGHT [source, destination, length)', source und destination werden als indizierte PAOC-Variablen angegeben, length ist ein INTEGER-Ausdruck: Beginnend mit source[i] und destination^'] werden length Bytes von source nach destination übertragen; und zwar mit MOVELEFT von links nach rechts fortschreitend bis zu den Stellen source[i+length— 1] bzw. destination [/+length-1 ] und mit MOVERIGHT von rechts nach links fortschreitend bis zu den Stellen source [ i—length +1 ] bzw. destination[/'—length+1 ]. Handelt es sich bei source und destination um dieselbe PAOC-Variable, so kann deren Inhalt mit MOVELEFT von links nach rechts und mit MOVERIGHT von rechts nach links überwälzt werden. Bei MOVELEFT muß j < i und bei MOVERIGHT j > i sein; andernfalls steht nachher in allen Feldern das gleiche Zeichen aus der Position i. Programmbeispiel : PROGRAM 1 e a r n 3 5 ; CONST t e x t c o n TYPE s i z e VAR Printline i ,j ,k textvar position
{UCSD-PASCAL-char-Prozeduren/-Funktionen} = = i : : i
'Dies i s t ein Test - Text'; PACKED ARRAYCO..723 OF CHAR; size; INTEGER; STRING; INTEGER;
BEGIN t e x t v a r s= t e x t c o n ; WRITE ( t e x t v a r , ' ; Textlaenge : LENGTH(textvar)); WRITELN ( ' ; Laenge der D r u c k z e i l e s ' , S I Z E O F ( p r i n t l i n e ) , '
?');
4.5 Unterprogrammtechnik
157
MOVELEFT(textvar Cl],printlineC15],LENGTH(textvar)); FOR i := 0 TO S I Z E O F ( p r i n t l i n e ) - 2 DO WRITE(print1ineCi3>; WRITELN; M0VERIGHT(printlineC15],printlineC20D J LENBTH(textvar)); FOR i := 0 TO S I Z E O F ( p r i n t l i n e ) - 2 DO WRITE(printIineCi1); WRITELN; + 15; t9> FILLCHAR(printlineCposition-33,5,'*"); FOR i s= 0 TO S I Z E O F ( p r i n t l i n e ) - 2 DO W R I T E ( p r i n t l i n e : i ] ) ; WRITELN; END. Das Programm learn35 zeigt einige Anwendungen der in diesem Abschnitt behandelten CHAR-Prozeduren. Auch hier wurden zur Erleichterung der nachfolgenden Beschreibungen die zu erklärenden Anweisungen mit Kommentarnummern versehen. 1: Der STRING-Variablen„textvar" wird eine STRING-Konstante zugewiesen. 2: Die Länge der mit 73 Feldern definierten PAOC-Variablen„printline" wird mit SIZEOF abgefragt und erbringt das Resultat 74! 3: „printline" wird in voller Länge mit „*"-Zeichen gefüllt. 4: Der Inhalt von „textvar" wird in voller Länge nach „printline" übertragen, beginnend ab ,,printline[15]". 5: Ausgeben von „printline" in voller Länge! 6: Der Inhalt von „printline" wird ab „printline[15]" in der Länge von „textvar" um 5 Stellen nach rechts versetzt. Die Stellen „printline[15]" bis „Printline[19]" bleiben stehen. 7: Der Inhalt von „printline" wird ab „printline[20]" in der Länge von „textvar" nach links versetzt. Die Stellen „printline[20]" bis „printline [16]" bleiben stehen. 8: Suchen das Ende des Textes. 9: Auffüllen des nach 7: stehengebliebenen Textes mit „»"-Zeichen damit der Zustand nach 1: wiederhergestellt wird.
Anhang A
Tabelle der PASCAL-Standard-Funktionen Funktion
Funktionstyp
Argumenttyp
Bedeutung
ABS (x) ARCTAN (x) CHR (x) COS (x) EOF (x) EOLN (x) EXP (x) LN (x) ODD (x) ORD (x) PRED (x) ROUND (x) SIN (x) SQR (x) SQRT (x) SUCC (x) TRUNC (x)
I, R R C R B B R R B I A, C, I I R I, R R A, C, I I
I, R I, R I I, R F, F, I,R I, R I A, C, I A, C,I R I, R I, R I,R A, C, I R
Absolutwert Arcustangens ASCII-Zeichen Cosinus end of file end of line Exponentialfunktion (e x ) Logarithmus naturalis Test auf ungerade Zahl Ordinalzahl Vorgänger REAL=>INTEGER (gerundet) Sinus Quadrat Quadratwurzel Nachfolger REAL=>INTEGER (abgeschnitten)
LOG (x) PWROFTEN (x)
R R
Zusätzliche UCSD-PASCAL-Funktionen
ABKÜRZUNGEN B: C: F: R: I: R: A: -:
BOOLEAN CHAR FILE REAL INTEGER REAL Aufzählung, Ausschnitt Argument kann fehlen
I, R I
dekadischer Logarithmus Zehnerpotenz (10 x )
Anhang B
Tabelle des ASCII-Code (American Standard Code for Information Interchange) Dezimalwert 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Sedezimalwert
Steuerzeichen
00 01 02 03 04 05 06 07 08 09 0A OB OC OD OE OF 10 11 12 13 14 15 16 17 18 19 1A 1B IC 1D IE 1F 20 21 22 23
NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US SP ! "
#
Dezimalwert 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
Sedezimalwert
Steuerzeichen
24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47
$ % & '
(
) *
+ -
/
0 1 2 3 4 5 6 7 8 9 *
< =
> 9
@ A B C D E F G
Anhang B
160
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 k 1
[
\
] •
*
a b c d e f g h i
m n
0 P q r
s t u V
w X
y z
{ 1 }
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 1 9 7 2 , 1 - 8 2 . [3] Ferstl, 0 . : 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 15 9 f. ASCII-Zeichen 51 Aufbau eines PASCAL-Programms 13 Aufruf von Dateivariablen 41, 90 ff. - von einfachen Variablen 40 - von Feldvariablen 40 - von Funktionen 43 f. - von Konstanten 39 - von Prozeduren 97ff. - von Satzvariablen 40f. - von Variablen 3 9 ff. Aufzählungstyp 22ff. 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 78 ff. - - - auf externe Speicher 91 f. Ausschnittstyp 24 f.
CLOSE-Option, LOCK 92 - , NORMAL 92 - , PURGE 92f. CONST-Anweisung 19 COS-Funktion 47
Block, Programm 13, 54ff. - , Daten 90, 92 BOOLEAN-Ausdiücke 4 7 f f . , 5 4 f f . BOOLEAN-Operatoren 47 BOOLEAN-Typ 20 BOOLEAN-Wertebereich 20 bottom-up-Methode 16 f.
Eingabe, formatierte 80 ff. - , zweidimensionale 82 - von Daten 78 ff. - von externen Speichern 90 f. ELSE-Operator 5 5 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 89 f. - , Schließen einer 92ff. - , Text- 96 Überschreiben einer 89 Wiedereröffnung einer 90 Dateibehandlung 89ff. Dateiendemarke 89f. Dateityp 29,41 Dateivariable 30, 41 f., 89ff. Dateiverzeichnis 89ff. Datenblock 90, 92 Datenfeld 20, 26 Definition 18 - , FORWARD- 35f. - , Konstanten- 18 f. 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, 18ff. - 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 3 I f f . - , Ablaufstruktur von 38 - , Definitionsanweisungen für 32f. - , Definitionskörper von 33f. - , Definitionsstruktur von 37 - , Hierarchische Ordnung von 3Iff. - , 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 100f. Funktionsdefinition 31 ff. - , hierarchische 31 ff., 34ff. - , FORWARD- 35 f. GET-AnWeisung 91 Gleitpunktdarstellung 86 GOTO-Anweisung 52f. IF-Anweisung 5 3 ff. - , echte Alternative 55 ff. - , geschachtelte 57ff. - , unechte Alternative 54f. I F . . . ELSE-Konstruktion 55ff. 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 Kommen tarzeile 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 71 ff. 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, 60f. ORD-Funktion 22,46 Ordinalzahlen 22ff. PACKED ARRAY 27 PACKED ARRAY OF CHAR 27 PACKED RECORD 29 Parameter 32 - , aktuelle 43, 98f. - , formale 32,43, 98f. - , Variablen- 32f.,43, 98f. - , Wert- 32f., 43, 98f. Parametertypen 33 PASCAL-Funktion, ABS 4 6 , 4 7 ARCTAN 47 - , CHR 5 Of. - , COS 47 - , EOF 48, 91 - , EOLN 48 - , EXP 47 - , LN 47 - , ODD 48 ORD 22, 46 - , ROUND 46 - , SIN 47 - , SQR 4 6 , 4 7 - , SQRT 47 - , TRUNC 46 PROCEDURE-AnWeisung 32, 98 Programmhierarchie 31 Programmschleifen 70 ff. Programmzweige 52ff. Prozeduraufrufe 31, 97 ff. - , hierarchische 99 - , lineare 99 ff. —, rekursive 99ff. 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-Ausdrücke 46 f. REAL-Operatoren 46 REAL-Typ 21 REAL-Wertebereich 21 RECORD-Typ 28 Rekursion 100 f. Relationsoperatoren 4 7 f. REPEAT-Anweisung 76 ff. RESET-Anweisung 90 REWRITE-AnWeisung 89f. ROUND-Funktion 4 6 , 5 1 Satztyp 27ff., 40 Satzteüname 4 0 f . Schleifenzähler 70f. SEEK-Anweisung 90 SIN-Funktion 47 Speicherplatzreservierung 20 Sprungadressen 18 f. 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 30 f. - , indirekte 30f. UCSD-PASCAL-System 105 ff. UNTIL-Operator 76 VAR-AnWeisung 29 f. Variablen 29 - , globale 31 f. lokale 31 f. Variablenaufruf 39ff. Varriablendefinition 29 ff. Variablenparameter 3 2 f . , 4 3 Verknüpfung, arithmetische 45 f. —, logische 4 7 f . 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 < b s > 109 Bad blocks-Filerfunktion 125 Bibliotheken, Aktualisieren von 143 Einrichten von 1 4 I f f . 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 156 f. - , SCAN 155 - , SIZEOF 155 Compiler 131 ff. Aufruf des 131 f. —, Fehlermeldungen des 133ff. Compiler-Option 135 ff. GOTO OK 135 IOCHECK 136 LISTING 136 - , RANGE CHECK 136 f. SWAPMODE 137 CONCAT-Funktion 15 2f. CONSOLE: 105 Copy buffer 112f. COPYDUPDIR 121 Copy-Editorfunktion 112 f. COPY-Funktion 152 Crunch-Filerfunktion 124 f. Cursorbewegung 110 Date-Filerfunktion 122 Dateien, Ausdrucken von 128 - , Erzeugen von 117f., 123 f. - , Löschen von 121 f. Löschen von (Remove) 129 - , Reaktivieren von 123 f.
- , Reparieren von (Examine) 125 ff. - , Übertragen von (Transfer) 127 f. - , Umbenennen von (Change) 127 - , Zusammenschieben von 124 f. Dateienverzeichnis (Directory) 119f. Dateiname 107 Dateispezifikation 107 Dateityp, BAD 106 f. - , CODE 106 - , DATA 106 - , TEXT 106 Datenblöcke 120 ff. Datensicherungsdatei 106 default unit 107, 119, 122f. Delete-Editorfunktion 112 delete line 109 DELETE-Prozedur 151 f. Disketten, Löschen von 121 f. - , Reparieren von (Examine) 125 ff. - , Ü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 115f. - , 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 < e t x > 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
Sachregister SONDERTEIL UCSD-PASCAL
Execute (siehe Loader) Extended directory-Filerfunktion 120f.
MOVELEFT-Prozedur 156 MOVERIGHT-Prozedur 156
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 123 f. FILLCHAR-Prozedur 153, 156 Finden von strings (Find) 115 Find-Editorfunktion 115f.
New-Filerfunktion 131
Get-Filerfunktion 129 f. 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 137f. - 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 123 f. Markierung von schadhaften Blöcken 126 f. - von Zeilen (Set) 113 ff. Map-File 138, 139 Maschinencode 106
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 () 109 Run-Funktion 139f. Same option 116,117 Save-Filerfunktion 130 f. 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 150 ff. - , CONCAT 15 2 f. - , COPY 152 - , DELETE 15If. - , FILLCHAR 153f. - , INSERT 151 - , LENGTH 150 - , POS 150f. Substitute string 116 f. Symbolprozessor 137 Systemdisk 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 Unit numer 105 UNITs 141 ff., 145 ff. - , Benutzung von 147f. Definition von 145 ff. Unterprogrammtechnik 140ff. Unterprogrammarten 140 update workfile 117 f. 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 4. Auflage. 15,5 x 23 cm. 303 Seiten. 1982. Plastik flexibel DM 39,50 ISBN 311 0087588 (de Gruyter Lehrbuch
K. Hambeck
Einführung in das Programmieren in COBOL 3., verbesserte Auflage. 15,5 x 23 cm. X, 163 Seiten. 1981. Kartoniert DM 26,- ISBN 311 008693 X (de Gruyter Lehrbuch)
E. W. Mägerle
Einführung in das Programmieren in BASIC 2., durchgesehene Auflage. 15,5 x 23 cm. 112 Seiten. 1980. Plastik flexibel DM 19,80 ISBN 311 008227 6 (de Gruyter Lehrbuch)
FORTRAN-Lexikon Ehinger/Fussy/ Herrmann/Hoffmann Anweisungen und Begriffe 15,5 x 23 cm. XX, 492 Seiten. 360 Stichworte. 1982. Kartoniert DM 48,- ISBN 311 008359 0
W. E. Spieß F. G. Rheingans
Einführung in das Programmieren in FORTRAN 6. Auflage. 15,5 x 23 cm. 217 Seiten. Mit 19 Abbildungen und 13 Tabellen. 1980. Plastik flexibel DM 22,- ISBN 311 0081350 (de Gruyter Lehrbuch)
W. E. Spieß G. Ehinger
Programmierübungen in FORTRAN 2., durchgesehene und erweiterte Auflage. 15,5 x 23 cm. 157 Seiten. 1980. Plastik flexibel DM 26,- ISBN 311 0083671 (de Gruyter Lehrbuch)
Preisänderungen vorbehalten