229 105 15MB
German Pages 231 [232] Year 1992
Fortran-Kurs technisch orientiert Einführung in die Programmierung mit Fortran 77 von Prof. Dipl.-Ing. Günter Schmitt 8. Auflage
R. Oldenbourg Verlag München Wien 1992
Die Deutsche Bibliothek — CIP-Einheitsaufnahme Schmitt, Günter: Fortran-Kurs technisch orientiert : Einführung in die Programmierung mit Fortran 77 / von Günter Schmitt. - 8. Aufl. - München ; Wien : Oldenbourg, 1992 ISBN 3 - 4 8 6 - 2 2 2 1 0 - 4
Unveränderter Nachdruck der 7. Auflage © 1992 R . Oldenbourg Verlag GmbH, München Das Werk außerhalb lässig und filmungen
einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzustrafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverund die Einspeicherung und Bearbeitung in elektronischen Systemen.
Gesamtherstellung: Hofmann Druck, Augsburg
ISBN 3-486-22210-4
Inhaltsverzeichnis 1 1.1 1.2 1.3 1.4
Einführung Was ist e l e k t r o n i s c h e D a t e n v e r a r b e i t u n g ? Wie e n t s t e h t ein F O R T R A N - P r o g r a m m ? Wie a r b e i t e t d a s B e t r i e b s s y s t e m ? Zur G e s c h i c h t e des F O R T R A N
9 9 13 16 18
2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9
G r u n d l a g e n des F O R T R A N Allgemeine Eingaberegeln Die D a r s t e l l u n g ganzer Z a h l e n d u r c h I N T E G E R - G r ö ß e n Die D a r s t e l l u n g r e e l l e r Z a h l e n d u r c h R E A L - G r ö ß e n E i n f a c h e D a t e n e i n g a b e und D a t e n a u s g a b e im Dialog Die P r o g r a m m i e r u n g von F o r m e l n Die w i c h t i g s t e n S t e u e r a n w e i s u n g e n Die S t r u k t u r der e i n f a c h e n V e r a r b e i t u n g s s c h l e i f e Ü b u n g e n zum Abschnitt G r u n d l a g e n Die h ä u f i g s t e n F e h l e r
21 21 23 24 27 29 34 35 39 40
3 3.1 3.2 3.3 3.4 3.5 3.6
Programmverzweigungen Die V e r g l e i c h s o p e r a t i o n e n Die e i n s e i t i g b e d i n g t e Anweisung, d a s logische IF Der A u f b a u von B l o c k s t r u k t u r e n d u r c h d a s B l o c k - I F P r o g r a m m v e r z w e i g u n g e n mit dem a r i t h m e t i s c h e n IF P r o g r a m m v e r z w e i g u n g e n mit dem G O T O - B e f e h l Ü b u n g e n zum Abschnitt P r o g r a m m v e r z w e i g u n g e n
42 42 44 45 52 54 58
4 4.1 4.2 4.3 4.4 4.5
Programmschleifen Die E i n g a b e s c h l e i f e Der A u f b a u von Z ä h l s c h l e i f e n mit d e r D O - A n w e i s u n g Die P r o g r a m m i e r u n g von S c h l e i f e n mit b e d i n g t e n S p r u n g b e f e h l e n Die P r o g r a m m i e r u n g von N ä h e r u n g s s c h l e i f e n ( I t e r a t i o n ) Ü b u n g e n zum A b s c h n i t t P r o g r a m m s c h l e i f e n
60 60 61 65 68 71
5 5.1 5.2 5.3 5.4 5.5
Indizierte Variablen (Felder) Die A r b e i t mit e i n d i m e n s i o n a l e n F e l d e r n Ü b u n g e n zum Abschnitt e i n d i m e n s i o n a l e F e l d e r Die A r b e i t mit m e h r d i m e n s i o n a l e n F e l d e r n Ü b u n g e n zum A b s c h n i t t m e h r d i m e n s i o n a l e F e l d e r Die h ä u f i g s t e n F e h l e r bei der V e r w e n d u n g von F e l d e r n
6 6.1 6.2 6.3 6.4 6.5 6.6 6.7
Unterprogrammtechnik Standard-Unterprogramme Die F u n k t i o n s a n w e i s u n g FUNCTION-Unterprogramme SUBROUTINE-Unterprogramme Die V e r w e n d u n g von F e l d e r n in U n t e r p r o g r a m m e n Ü b u n g e n zum A b s c h n i t t U n t e r p r o g r a m m t e c h n i k D i e A r b e i t mit e x t e r n e n U n t e r p r o g r a m m e n
...
73 75 85 86 90 91 93 93 95 98 101 103 108 109
6
Inhaltsverzeichnis
6.8 W e i t e r e M ö g l i c h k e i t e n der U n t e r p r o g r a m m t e c h n i k 6.9 Die g r a f i s c h e D a r s t e l l u n g von U n t e r p r o g r a m m e n 6.10 F e h l e r bei d e r V e r w e n d u n g von U n t e r p r o g r a m m e n
113 120 122
7 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8
Die Eingabe und A u s g a b e von D a t e n Die l i s t e n g e s t e u e r t e E i n / A u s g a b e ü b e r die Konsole Die f o r m a t g e s t e u e r t e ( f o r m a t i e r t e ) E i n / A u s g a b e ü b e r die Konsole . . Die Arbeit mit D a t e n d a t e i e n Die A r b e i t mit z e i l e n o r i e n t i e r t e n D a t e i e n Die Arbeit mit s e q u e n t i e l l e n D a t e n d a t e i e n ( B a n d d a t e i e n ) Die Arbeit mit D a t e n d a t e i e n im d i r e k t e n Zugriff Die A r b e i t mit i n t e r n e n D a t e i e n im A r b e i t s s p e i c h e r Übungen zum A b s c h n i t t E i n / A u s g a b e von D a t e n
124 124 124 132 136 138 145 151 153
8 8.1 8.2 8.3 8.4 8.5 8.6
Datentypen Allgemeines Größen vom Typ DOUBLE PRECISION Größen vom Typ COMPLEX Größen vom Typ LOGICAL T e x t v e r a r b e i t u n g mit Größen vom Typ CHARACTER Übungen zum A b s c h n i t t D a t e n t y p e n
154 154 156 159 165 171 178
9 9.1 9.2 9.3 9.4
Aufgabensammlung Numerische Integration Fourieranalyse I n t e r p o l a t i o n und D a r s t e l l u n g von F u n k t i o n e n Elektrotechnische Aufgaben
179 179 182 183 188
10
E r g ä n z e n d e und w e i t e r f ü h r e n d e L i t e r a t u r
190
11
Lösungen der Ü b u n g s a u f g a b e n
191
12
Anhang Mathematische Bibliotheksfunktionen Mathematische Einbaufunktionen Sinnbilder f ü r P r o g r a m m a b l a u f p l ä n e und D a t e n f l u ß p l ä n e Sinnbilder f ü r S t r u k t o g r a m m e Verzeichnis d e r Beispiele und A u f g a b e n auf d e r P r o g r a m m d i s k e t t e . .
216 216 217 218 220 221
13
Stichwortverzeichnis
230
Vorwort zur 8. Auflage Die vorliegende Auflage orientiert sich weiterhin an dem Standard Fortran 77, dessen Sprachumfang in einführenden Lehrveranstaltungen nicht immer voll ausgeschöpft werden kann. Die neueren Versionen der Fortran Compiler haben inzwischen fast alle den Datentyp "COMPLEX" implementiert, so daß die Beispiele und Übungen des Abschnitts 8.3 direkt getestet werden können. Mit Hilfe der dort abgebildeten Unterprogramme lassen sich der Zahlenbereich und die Genauigkeit der komplexen Rechnung erweitern. Ich hoffe, daß damit die Diskussion um die komplexe Rechnung, die man in anderen Programmiersprachen schmerzlich vermißt, abgeschlossen ist.
G r o ß - U m s t a d t , im März 1992
Günter Schmitt
Vorwort zur 6. Auflage Aufgrund von Leserzuschriften möchte ich besonders darauf hinweisen, daß in der von mir verwendeten Version 2.0 des FORTRAN-Compilers die Variablen vom Typ COMPLEX (Abschnitt 8.3) nicht verfügbar sind. Es wird jedoch gezeigt, wie die komplexen Funktionen mit Hilfe von Unterprogrammen realisiert werden können. Allen Lesern, die mich darauf aufmerksam gemacht haben, sei an dieser Stelle herzlich gedankt.
Groß-Umstadt, im Dezember 1988
Günter Schmitt
Vorwort zur 4. Auflage Die v o r l i e g e n d e 4. A u f l a g e wurde der E n t w i c k l u n g der P r o g r a m m i e r s p r a c h e F O R T R A N und der S o f t w a r e t e c h n i k a n g e p a ß t , ohne auf d i e b e w ä h r t e S t r u k t u r und D a r s t e l l u n g s w e i s e d e s Werkes zu v e r z i c h t e n . Die L o c h k a r t e w u r d e dem Museum f ü r D a t e n v e r a r b e i t u n g ü b e r g e b e n und d u r c h das B i l d s c h i r m g e r ä t e r s e t z t , mit d e m h e u t e sowohl der Ingenieur am A r b e i t s p l a t z r e c h n e r (Personal C o m p u t e r ) als a u c h d e r P r o g r a m m i e r e r von G r o ß r e c h n e r n s e i n e P r o g r a m m e e i n gibt und t e s t e t . Der Abschnitt " E i n f ü h r u n g " vergleicht die d a t e n v e r a r b e i t e n d e n G e r ä t e Mensch, T a s c h e n r e c h n e r , M i k r o c o m p u t e r und G r o ß r e c h n e r und e r k l ä r t die B e d e u t u n g d e s Betriebssystems. Das Ziel d e s A b s c h n i t t s " G r u n d l a g e n " ist e s , d e n L e s e r möglichst s c h n e l l in d i e L a g e zu v e r s e t z e n , e i n f a c h e F O R T R A N - P r o g r a m m e e r f o l g r e i c h e n t w e r f e n und t e s t e n zu k ö n n e n . N i c h t s ist beim E r l e r n e n e i n e r P r o g r a m m i e r s p r a c h e w i c h t i g e r als die e r s t e n E r f o l g s e r l e b n i s s e , selbst auf die G e f a h r hin, d a ß die e r s t e n L ö sungen noch n i c h t a u s g e r e i f t sind. Die f o l g e n d e n A b s c h n i t t e bringen eine s y s t e m a t i s c h e E i n f ü h r u n g in d i e v e r s c h i e d e n e n P r o g r a m m i e r t e c h n i k e n von P r o g r a m m v e r z w e i g u n g e n , S c h l e i f e n , F e l d e r n und U n t e r p r o g r a m m e n . Die Beispiele und Ü b u n g s a u f g a b e n sind möglichst e i n f a c h und leicht d u r c h s c h a u b a r g e h a l t e n und k ö n n e n alle im Dialog g e t e s t e t w e r d e n . Während die e r s t e n A b s c h n i t t e nur mit g a n z e n und reellen Zahlen a r b e i t e n , f o l gen nun A b s c h n i t t e ü b e r w e i t e r e M ö g l i c h k e i t e n der E i n / A u s g a b e , über d i e A r beit mit e x t e r n e n S p e i c h e r n und über w e i t e r e D a t e n t y p e n . Die A u f g a b e n s a m m l u n g zeigt Beispiele und A u f g a b e n aus v e r s c h i e d e n e n G e b i e t e n wie z.B. M a t h e m a t i k , E l e k t r o t e c h n i k und D a t e n v e r a r b e i t u n g ; f ü r alle A u f g a b e n e n t h ä l t d e r A b s c h n i t t 11 Lösungsvorschläge. Die v o r l i e g e n d e N e u b e a r b e i t u n g o r i e n t i e r t sich am S t a n d a r d " F O R T R A N 7 7 " , ohne j e d o c h auf a l l e S p r a c h e l e m e n t e d i e s e s S t a n d a r d s o d e r h e r s t e l l e r s p e z i f i s c h e S p r a c h e r w e i t e r u n g e n e i n z u g e h e n . Alle Beispiele und Lösungen wurden a n e i n e m A r b e i t s p l a t z r e c h n e r (IBM AT) g e t e s t e t . F r a u Deinaß vom V e r l a g R. Oldenbourg d a n k e ich f ü r die s e i t l a n g e m b e w ä h r t e g u t e Z u s a m m e n a r b e i t .
G r o ß - U m s t a d t , im Juli 1985
Günter Schmitt
1 Einführung Aller Anfang ist schwer - auch der Einstieg in die Datenverarbeitung. Diese Einführung erklärt Ihnen den Aufbau eines Rechners und einige Grundbegriffe der Datenverarbeitung. Dies geschieht mit Hilfe eines einführenden Beispiels, das wir mit verschiedenen Geräten der Datenverarbeitung, dem rechnerlosen Menschen, dem Taschenrechner, dem programmierbaren Taschenrechner, dem Großrechner und dem neusten Kind der Datenverarbeitung, dem Arbeitsplatzrechner oder Personal Computer, lösen werden.
1.1 Was ist elektronische Datenverarbeitung? Der folgende Abschnitt beantwortet diese Frage anhand eines einfachen Beispiels, das sicher allen Lesern vertraut ist. Bei der Auswertung von Meßergebnissen haben Sie die Aufgabe, aus fünf Meßwerten den Mittelwert zu bilden. Bild 1 - 1 zeigt die Liste mit den fünf Zahlen für jede Meßreihe. In die letzte Spalte t r a g e n Sie als Ergebnis das arithmetische Mittel ein.
Messung 10.00 10.30 1 1 .00 1 1 .30
Bild 1 - 1 :
Nr. 1
Nr .2 JS,
s
Nr.3
Nr.4
Nr .5
Mittel
fts
Die Daten des einführenden Beispiels
Sehen wir Ihnen bei der Arbeit zu: Als rechneiloser Mensch nehmen Sie Papier und Bleistift zur Hand, addieren schriftlich die fünf Meßwerte einer Zeile, dividieren die Summe schriftlich durch die Konstante 5 und schreiben das Ergebnis in die letzte Spalte der Tabelle. Dann fahren Sie mit der nächsten Zeile f o r t , bis keine Zahlen mehr da sind. In der Fachsprache der Datenverarbeitung ausgedrückt haben Sie die veränderlichen (variablen) Zahlen oder Eingabedaten mit dem Eingabegerät Auge vom D a t e n t r ä g e r Liste gelesen und auf den Arbeitsspeicher Schmierpapier ü b e r t r a gen. Dort haben Sie gerechnet. Dabei wurde die Zwischensumme durch die konstante Zahl 5 dividiert. Dann haben Sie das Ergebnis, die Ausgabedaten , mit dem Ausgabegerät Kugelschreiber auf dem D a t e n t r ä g e r Liste ausgegeben.
10
1
Einführung
Daten sind Mitteilungen über bestimmte Dinge; sie bestehen aus Zahlen oder aus Zeichen w i e z.B. T e x t e n . Variablen sind veränderliche Daten, deren Zahlenwert erst während der D a t e n verarbeitung bekannt wird. Konstanten sind Daten, deren Zahlenwert bereits vor Beginn der A r b e i t f e s t steht und die sich im L a u f e der Verarbeitung auch nicht verändern. Daten verarbeiten heißt Daten übertragen, speichern, berechnen und auswerten.
Ergebnisse anzeigen
1
| |
Calculix programmix
RN [START11 GO
B U B e h e
Daten eingeben
Bild 1 - 2 :
Taschenrechner
OHIH LOJLJ
| i Steuertasten
H30 s m
• • 0 0
Befehle eingeben
(programmierbar)
A l s moderner Mensch rechnen Sie nicht mehr mit Papier und B l e i s t i f t , sondern benutzen einen Taschenrechner (Bild 1 - 2 ) . Für j e d e Meßreihe müssen Sie nun die Daten ( Z a h l e n w e r t e ) und Funktionstasten für die Rechenoperationen e i n g e ben. Die R e c h e n t a s t e n ( + , - , x und /) sind Anweisungen an den T a s c h e n r e c h ner, Zahlen ( D a t e n ) miteinander zu verknüpfen. Bei umfangreichen F o r m e l n w i e z.B. bei der Berechnung von Filterkurven wird es nun sehr lästig, bei j e d e r Rechnung neben den Zahlen auch noch die R e c h e n o p e r a t i o n e n eingeben zu müssen. Sie werden daher zu einem programmierbaren Taschenrechner g r e i f e n . Dieser kennt z.B. die beiden Betriebsarten " L E A R N " zur Eingabe der R e c h e n s c h r i t t e und " S T A R T " zur Eingabe der Daten, die mit den gespeicherten R e c h e n schritten berechnet w e r d e n . In unserem e i n f a c h e n Beispiel bestehen die R e c h e n s c h r i t t e ( B e f e h l e ) aus A d d i t i o n s b e f e h l e n , der Konstanten 5 und dem Divisionsb e f e h l . Sie bilden eine Arbeitsanweisung ( P r o g r a m m ) , das im Taschenrechner gespeichert wird und das sich beliebig o f t auf die eingegebenen Daten anwenden läßt. Ein Befehl ist eine Anweisung z w e i Zahlen zu addieren.
an den R e c h n e r , e t w a s B e s t i m m t e s zu tun z.B.
M e h r e r e B e f e h l e bilden zusammen mit konstanten Daten ein Programm zur Berechnung des M i t t e l w e r t e s aus fünf Zahlen.
z.B.
1.1 Was ist elektronische
Datenverarbeitung?
11
Liegt das Programm im Programmspeicher des Rechners, so kann es beliebig o f t auf verschiedene Daten angewendet werden. Sicherlich werden Sie im Laufe der Zeit mehrere Programme für Ihren programmierbaren Taschenrechner schreiben und sich eine Programmbibliothek in einem Aktenordner anlegen. Vor jedem Programmlauf müssen Sie das Programm der Bibliothek entnehmen, laden und s t a r t e n . Meßreihen lassen sich nach verschiedenen Gesichtspunkten auswerten wie z.B. Mittelwert bilden, Standardabweichung berechnen oder die Funktion grafisch darstellen. Sie werden also auch Ihre Meßreihen in einem Aktenordner aufbewahren und, natürlich mit Hilfe von Programmen, nach verschiedenen Gesichtspunkten auswerten. In der Datenverarbeitung legt man Programme und Daten auf magnetischen Speichern ab. Dazu gehören Magnetkarten (bei Taschenrechnern), Floppy Disks oder Disketten bei Personal Computern und Plattenlaufwerke und Magnetbandstationen bei Großrechnern. Ergebnisse können ebenfalls auf einem Magnetspeicher ausgegeben werden. Eine Datei ist eine Sammlung von Programmen oder Daten auf einem - meist magnetischen - Speicher. Wenn Sie als Physiker in einem Kernforschungsinstitut Meßreihen auswerten müssen, so werden Sie es vermutlich mit einem Taschenrechner nicht weit bringen, wenn bei einem Experiment die Daten schneller anfallen als Sie sie verarbeiten können. Zunächst werden Sie versuchen, die Meßwerte nicht mehr einzeln von einem Meßgerät abzulesen und aufzuschreiben, sondern automatisch zu e r fassen und auf einem Magnetband zu speichern. Für die Auswertung steht Ihnen ein Großrechner mit mehr als 1 Million Rechenoperationen pro Sekunde zur Verfügung, den Sie natürlich auch verwenden, wenn Sie für eine theoretische Überprüfung Ihrer Meßergebnisse z.B. Formeln auswerten. Die Programme w e r den Sie sowohl bei der Auswertung von Meßreihen als auch bei der Berechnung von Formeln selbst schreiben müssen, weil nur Sie das Rechenverfahren auswählen und die Ergebnisse kritisch beurteilen können. Mit den technischen Einzelheiten des Großrechners können und wollen Sie sich nicht beschäftigen, Sie interessieren sich nur für Ihre Forschungen. Sie wollen also nicht mehr wie bei der Programmierung eines Taschenrechners die einzelnen Rechenschritte, sondern nur die auszuwertende Formel eingeben. Dazu benötigen Sie ein Programm, das die Formel aus der wissenschaftlichen Schreibweise in die Befehle der Rechenanlage übersetzt. Ein derartiges Übersetzungsprogramm nennt man einen Compiler. Die Programmierung von technisch-wissenschaftlichen Anwendungen geschieht in der Regel in einer aufgabenorientierten Programmiersprache, deren Befehle durch einen Compiler in die Befehle der Rechenanlage übersetzt werden. Wie ist nun ein Großrechner aufgebaut? Bild 1 - 3 zeigt die Funktionseinheiten Eingabe, Zentraleinheit und Ausgabe. Die wichtigsten Eingabegeräte sind eine T a s t a t u r für die Bedienung und die Eingabe von Programmen bei der Programmentwicklung sowie Magnetband- und P l a t t e n g e r ä t e für die Eingabe von Daten und Programmen aus Dateien. Dazu gehört auch der Compiler für die Übersetzung von Programmen aus einer höheren Programmiersprache in die Maschinensprache. In der Ecke steht vielleicht
12
1 Einführung
Laufwerk Eingabegeräte
Bild 1 - 3 :
Zentraleinheit
Ausgabegeräte
Aufbau eines Großrechners
noch ein K a r t e n l e s e r , um auch noch ä l t e r e P r o g r a m m e aus der L o c h k a r t e n z e i t laden zu können. D i e Zentraleinheit b e s t e h t aus einem P r o g r a m m s p e i c h e r für das auszuführende P r o g r a m m und e i n e m S t e u e r w e r k , das sich d i e M a s c h i n e n b e f e h l e einzeln h o l t , d e c o d i e r t und a u s f ü h r t . Die R e c h e n w e r k v e r a r b e i t e t die D a t e n . Z w i s c h e n e r g e b nisse w e r d e n kurzzeitig im D a t e n s p e i c h e r a u f b e w a h r t . D i e w i c h t i g s t e n A u s g a b e g e r ä t e sind ein B i l d s c h i r m g e r ä t f ü r die Bedienung und d i e P r o g r a m m e n t w i c k l u n g , Drucker und P l o t t e r für L i s t e n und Zeichnungen s o w i e m a g n e t i s c h e Speicher f ü r d i e A u f b e w a h r u n g von Ergebnissen, die w e i t e r v e r arbeitet werden sollen. V i e l l e i c h t s t e h t an Ihrem A r b e i t s p l a t z a b e r auch ein Personal C o m p u t e r , Ihr p e r s ö n l i c h e r R e c h n e r , der nur e t w a 10 000 bis 100 000 R e c h e n o p e r a t i o n e n in d e r Sekunde ausführen kann. Bild 1 - 4 z e i g t den A u f b a u e i n e s Arbeitsplatzrechners . D e r M i k r o p r o z e s s o r e n t h ä l t das S t e u e r w e r k und das R e c h e n w e r k . Bei den S p e i c h e r b a u s t e i n e n u n t e r s c h e i d e t man F e s t w e r t s p e i c h e r ( E P R O M ) für B e t r i e b s p r o g r a m m e und S c h r e i b / L e s e s p e i c h e r ( R A M ) für A n w e n d e r p r o g r a m m e und D a t e n s o w i e für das B e t r i e b s s y s t e m . Ü b e r P e r i p h e r i e b a u s t e i n e sind ein B i l d s c h i r m g e r ä t für d i e Bedienung, d e r Drucker für die D a t e n a u s g a b e und m a g n e t i s c h e S p e i c h e r ( D i s k e t t e n l a u f w e r k e ) angeschlossen. A u c h mit diesem R e c h n e r können Sie in a u f g a b e n o r i e n t i e r t e n Sprachen w i e z . B . F O R T R A N p r o g r a m m i e r e n . Nur a r b e i t e t der A r b e i t s p l a t z r e c h n e r bei d e r Übersetzung und Ausführung des P r o g r a m m s l a n g s a m e r als der G r o ß r e c h n e r . Das f o l g e n d e e i n f ü h r e n d e B e i s p i e l s o w i e a l l e P r o g r a m m e d i e s e s Buches können sowohl auf e i n e m G r o ß r e c h n e r ( z . B . U N I V A C 1100) als auch auf e i n e m A r b e i t s p l a t z r e c h n e r ( z . B . IBM P C ) ü b e r s e t z t und a u s g e f ü h r t w e r d e n .
1.2
Wie entsteht
ein FORTRAN-Programm?
13
Konsole Tastatur
Bild 1 - 4 :
und
Bildschirm
Aufbau eines Arbeitsplatzrechners (Personal Computer)
1.2 Wie entsteht ein FORTRAN-Programm? Aufgabe: Man entwickle ein FORTRAN-Programm, das aus fünf einzulesenden Zahlen den Mittelwert berechnet und ausgibt. Es sollen beliebig viele Meßreihen zu je fünf Meßwerten verarbeitet werden. Für den Mittelwert Null werde das Programm beendet. Bild 1 - 5 :
Aufgabenstellung des e i n f ü h r e n d e n Beispiels
Die A u f g a b e n s t e l l u n g Bild 1 - 5 v e r l a n g t d i e B e r e c h n u n g und A u s g a b e d e s M i t t e l w e r t e s a u s fünf e i n z u l e s e n d e n M e ß w e r t e n e i n e r M e ß r e i h e . D a m i t d a s P r o g r a m m n i c h t f ü r j e d e M e ß r e i h e n e u g e l a d e n und g e s t a r t e t w e r d e n m u ß , soll e s solange W e r t e l e s e n und v e r a r b e i t e n , bis e s d u r c h e i n e E n d e b e d i n g u n g a b g e b r o c h e n wird. Sind k e i n e E i n g a b e d a t e n m e h r v o r h a n d e n , so w e r d e n fünf N u l l e n e i n g e g e b e n , d i e d e n M i t t e l w e r t Null e r g e b e n und d a m i t d a s P r o g r a m m a b b r e c h e n . Dabei muß s i c h e r g e s t e l l t s e i n , d a ß d e r M i t t e l w e r t Null n i c h t als E r g e b n i s e i n e r z u l ä s s i g e n D a t e n e i n g a b e e r s c h e i n t . Wir w e r d e n s p ä t e r b e s s e r e M ö g l i c h k e i t e n k e n n e n l e r n e n , e i n P r o g r a m m a n z u h a l t e n . Die Lösung d e r A u f g a b e wird nun in einem S t r u k t o g r a m m e n t s p r e c h e n d Bild 1 - 6 g r a f i s c h d a r g e s t e l l t . Das S t r u k t o g r a m m z e i g t e i n e Lösung als D i a l o g p r o g r a m m . Auf d e m Bildschirm e r s c h e i n t z u n ä c h s t e i n e Meldung f ü r d e n B e n u t z e r , d a ß d a s P r o g r a m m auf die E i n g a b e von D a t e n ü b e r die T a s t a t u r w a r t e t . Die E r g e b n i s s e e r s c h e i n e n auf d e m B i l d s c h i r m u n d k ö n n e n g l e i c h z e i t i g a u c h auf d e m D r u c k e r a u s g e g e b e n w e r d e n . Der Anhang e n t h ä l t eine Zusammenstellung der Sinnbilder für S t r u k t o g r a m m e .
14
1 Einführung
Meldung ausgeben 5 Meßwerte lesen Formel XM = XM
ausgeben
solange Ergebnis ungleich Null Rückkehr in das Betriebssystem
Bild 1 - 6 : S t r u k t o g r a m m des e i n f ü h r e n d e n Beispiels
Der P r o g r a m m a b l a u f p l a n Bild 1 - 7 zeigt im Gegensatz zum S t r u k t o g r a m m b e reits die einzelnen B e f e h l e . Der Anhang e n t h ä l t eine Z u s a m m e n s t e l l u n g der Sinnbilder f ü r P r o g r a m m a b l a u f p l ä n e . Nun folgt die Programmierung auf einem E n t w u r f s f o r m u l a r , das b e r e i t s die Eingabevorschriften der P r o g r a m m i e r s p r a c h e F O R T R A N b e r ü c k s i c h t i g t . Wir wollen das Programm Bild 1 - 8 kurz e r k l ä r e n .
1.2
Wie entsteht
ein
C Bei Be- fe merkung U 1
Nr
£
56 7
Anweisungen bzwv 10
15
20 ,
C. ,E,I,K) Vl,«.!X,E.(.*v¥.V
e
,=.C X I
.4-, X A
WR.I.T.E.U.^.l. I.f.l.XH
.
25
30
35
U
L
,',5, ME.ST.E,
R^iRibiCi^ifcil. X 4 m
15
FORTRAN-Programm?
,£,[ l N,6,e.ftfc,W, /
. Xil. i X 3 , x i
.^Xf.
, ,X,S
, XV, , + , ' x s , ) . / ,
> .ST-.
,',M,I.T,T,E,L. . = , ' , ,X.M.
i . i & Ö i - i IOI.I). iSiT,0,?i , i , , i . i , , i , i i ,
o, Ti 01 ,>1,0. . . . i . i . i . i . , . . i i , i . . . . t . i , •
i i i
E^IWÖI , i , i i i i i i i > . . > i > i i i i i i , ,
i i . i .1
, . i i i i i , i i i i i i i i i i i i i i i i i i , i i i i
Bild 1 - 8 :
i 1 1 i 1 1 1 i 1 1 j 1 1 ; i 1 1 > Ii
i 1 1 i i ,
F O R T R A N - P r o g r a m m des e i n f ü h r e n d e n Beispiels
Die 1. Zeile beginnt mit einem C in S p a l t e 1 und ist e i n e K o m m e n t a r z e i l e , die das P r o g r a m m b e s c h r e i b t und k e i n e Anweisung an den R e c h n e r d a r s t e l l t . Die 2. Zeile e n t h ä l t e i n e Marke 10 und eine WRITE-Anweisung, die die Meldung "5 WERTE EINGEBEN" auf dem Bildschirm e r s c h e i n e n l ä ß t . Die 3. Z e i l e b e s t e h t a u s e i n e r L e s e a n w e i s u n g READ, mit der 5 Dezimalzahlen g e l e s e n , in Dualzahlen u m g e w a n d e l t und a b g e s p e i c h e r t w e r d e n . Die 4. Zeile b e s t e h t aus der F o r m e l zur B e r e c h n u n g d e s a r i t h m e t i s c h e n M i t t e l w e r t e s a u s 5 M e ß w e r t e n . Das Ergebnis wird in der S p e i c h e r s t e l l e XM a b g e l e g t . Die 5. Zeile e n t h ä l t e i n e A u s g a b e a n w e i s u n g , mit der d a s Ergebnis z u s a m m e n mit d e m T e x t "MITTEL =" auf dem Bildschirm e r s c h e i n t . Die 6. Zeile e n t h ä l t die A b b r u c h b e d i n g u n g . Wenn sich ein M i t t e l w e r t Null e r gibt, so s t o p p t d a s P r o g r a m m . Ist der M i t t e l w e r t ungleich Null und d a m i t die Abbruchbedingung n i c h t e r f ü l l t , so s e t z t d e r S p r u n g b e f e h l GOTO d e r 7. Z e i l e das P r o g r a m m an der S p r u n g m a r k e 10 mit d e r Ausgabe e i n e r n e u e n Meldung f o r t . Die 8. Zeile mit der E N D - A n w e i s u n g zeigt d e m Ü b e r s e t z e r , d e m F O R T R A N C o m p i l e r , d a s Ende der P r o g r a m m z e i l e n a n . Das P r o g r a m m muß nun in den R e c h n e r e i n g e g e b e n , ü b e r s e t z t , g e l a d e n und g e s t a r t e t w e r d e n . Dies g e s c h i e h t mit Hilfe d e s B e t r i e b s s y s t e m s .
16
1 Einführung
1.3 Wie arbeitet das Betriebssystem? Bei einem (programmierbaren) Taschenrechner muß der Benutzer alle Arbeiten, die für die Bedienung des Gerätes erforderlich sind, selbst ausführen. Dazu muß er das Programm in der Programmbibliothek suchen, in den Rechner eingeben und dann starten. Die Ergebnisse sind von der Anzeige abzulesen und auf die Liste zu übertragen. Bei einem Arbeitsplatzrechner oder gar Großrechner würden diese einzelnen Handgriffe zu unerträglich langen Verarbeitungszeiten führen. Daher läßt man in den Rechnern Programme ablaufen, die die Arbeit der Anlage steuern und überwachen. Sie bilden das Betriebssystem. Die Programme des Betriebssystems liegen entweder fest im Arbeitsspeicher oder werden bei Bedarf von den magnetischen Speichern geladen. Der Benutzer ruft sie mit Kommandos auf. Bei einem Arbeitsplatzrechner könnten diese Befehle wie folgt aussehen:
EDLIN
TEST.FOR
Der Editor EDLIN ist ein Systemprogramm, mit dessen Hilfe das FORTRANProgramm in den Rechner eingegeben und in einer Datei gespeichert wird. Mit seiner Hilfe lassen sich Programmzeilen eingeben, ändern, löschen und einfügen. Das FORTRAN-Programm erhält in dem vorliegenden Beispiel den frei gewählten Namen TEST mit dem Zusatz FOR als Abkürzung für FORTRAN.
FORI
TEST,,,;
Der 1. Durchlauf des Compilers FORI prüft die Programmzeilen und gibt gegebenenfalls Fehlermeldungen aus. Der erzeugte Maschinencode wird auf der Diskette abgelegt.
F0R2 Der 2. Durchlauf des Compilers FOR2 optimiert den Maschinencode, um eine möglicht geringe Laufzeit des Programms zu erzielen.
LINK
TEST,,;
Der Binder LINK verbindet das übersetzte Maschinenprogramm mit Hilfsprogrammen wie z.B. Unterprogrammen des Betriebssystems für die Ein/Ausgabe.
TEST Das fertige Programm wird durch Eingabe des Namens von der Diskette in den Arbeitsspeicher geladen und g e s t a r t e t . Es meldet sich auf dem Bildschirm mit der Nachricht "5 WERTE EINGEBEN".
1.3 Wie arbeitet das Betriebssystem?
B> E D L I N T E S T , F O R Neu File »I 1 :*C E i n f ü h r e n d e s B e i s p i e l M i t t e l w e r t B : »10 UIRITEC», »D '5 LIERTE E I N G E B E N ' 3: * R E A D C « . » ) XI , x a , X3, X4. X 5 4: * X M ' CXI » X 5 X3 + X4 + X5) / 5: * lüR I T E C * , * ) ' M I T T E L - ' , X M B : * IFCXn.ED.O) STDP 7 : *_ G D T D 10 B: * END 3: * l g *_E B>FDR1
17
5
T E S T , ,., ;
IBM P e r s o n a l C o m p u t e r F O R T R A N C o m p i l e r Uersion 2.00 C C 3 C o p y r i g h t IBM C o r p 1 9 B E , 1 9 B 4 C O C o p y r i g h t MicrosciFt C o r p 19B2, 19B4 Pass
No B
One
Errors Source
Detected Lines
B> F O R E Code Cons Data
Area Area Area
Pass
TUJO
Size Size Size No
=
ttOlBE
- #0024 = #001A
Errors
C C C
302 ) 36) 2E3
Detected.
B> LINK TEST, , ; IBM P e r s o n a l U e r s i o n E.BO
Computer Linker C O C o p y r i g h t IBM C o r p
19B1,
19B2,
1993,
1994
B> TEST s ujerte eingeben 1 E 3 4 5 MITTEL = 3.0000000 5 UIERTE EINGEBEN 1 7 . 3 £ 5 . 5 4 . 9 1 1 . 7 30 MITTEL = 17.5BOOOOO S UIERTE EINGEBEN 1 . 2 E 3 3 . E E 5 33E4 1 5 E - 4 E . E 4 E 5 MITTEL = 1B3040.0000000 5 UIERTE EINGEBEN 0
0
0
MITTEL = Stop
-
0
0
O.OOOOOOE+OOO
Program
terminat3d.
B> Bild 1 - 9 :
T e s t l a u f d e s e i n f ü h r e n d e n B e i s p i e l s (IBM PC)
D e r in Bild 1 - 9 d a r g e s t e l l t e T e s t l a u f e n t s t a n d a n e i n e m A r b e i t s p l a t z r e c h n e r und zeigt die Eingabe, die Ü b e r s e t z u n g , die Verbindung mit S y s t e m p r o g r a m m e n und d e n S t a r t des e i n f ü h r e n d e n Beispiels. Alle Eingaben des B e n u t z e r s wurden n a c h t r ä g l i c h u n t e r s t r i c h e n . Es w u r d e n d r e i M e ß r e i h e n m i t j e f ü n f M e ß w e r t e n e i n g e g e b e n und z w a r in d e n Z a h l e n d a r s t e l l u n g e n g a n z z a h l i g ( z . B . 1 ) , r e e l l (z.B. 1 7 . 3 ) u n d in d e r E x p o n e n t e n s c h r e i b w e i s e ( z . B . 1 . 2 E 3 ) . D i e M e ß r e i h e 0 0 0 0 0 e r g a b d e n M i t t e l w e r t 0 und b e e n d e t e das P r o g r a m m .
18
1
Einführung
Bei der Arbeit mit dem Betriebssystem eines Großrechners gibt es andere Betriebssystemkommandos, aber die Arbeit im Prinzip die gleiche: FORTRAN-Programm mit dem Editor eingeben, FORTRAN-Programm mit dem Compiler prüfen und übersetzen, übersetztes Programm mit Systemprogrammen verbinden, fertiges Maschinenprogramm laden und s t a r t e n sowie falls im Programm vorgesehen Daten eingeben. An einem Arbeitsplatzrechner arbeitet normalerweise nur ein Benutzer gleichzeitig, und der Rechner führt auch nur ein Programm gleichzeitig aus. Bei Großrechnern unterscheidet man mehrere Betriebsarten: Großrechner arbeiten so schnell, daß besonders bei der Eingabe und Ausgabe von Daten erhebliche Wartezeiten entstehen können. Während dieser Pausen läßt man andere Programme arbeiten. Im Timesharing-Betrieb laufen mehrere Programme zeitlich verschachtelt in einer einzigen Zentraleinheit ab. Das Betriebssystem teilt jedem Programm je nach Wichtigkeit (Priorität) Rechenzeit zu. Damit können z.B. 50 Benutzer an Bildschirmgeräten an einem Großrechner arbeiten. Durch die zeitliche Verschachtelung hat jeder den Eindruck, der Rechner arbeite nur für ihn. Laufen jedoch gleichzeitig rechenintensive Programme mit höherer Priorität, so kann es zu Wartezeiten kommen. Die höchste Priorität haben Echtzeitprogramme, die z.B. für die Steuerung einer Raffinerie die ankommenden Daten sofort verarbeiten müssen. Programme werden heute f a s t ausschließlich im Dialogbetrieb mit einem Bildschirmgerät eingegeben und g e t e s t e t . Bildschirmgeräte erhalten daher die nächsthöhere Priorität, denn Programmierer sind hochbezahlte A r b e i t s k r ä f t e , die immer an ganz dringenden Projekten arbeiten. Bei der Wirkverarbeitung laufen die Anwendungsprogramme oft im Stapelbetrieb, d.h. sie werden ohne Priorität in der Reihenfolge ausgeführt, in der die Start-Kommandos eingegeben wurden. Die Programme des Betriebssystems haben die allerhöchste Priorität, denn sie müssen ja den Ablauf und den Betrieb der gesamten Rechenanlage überwachen.
1.4 Zur Geschichte des FORTRAN Nichts geschieht von allein, auch nicht in der Datenverarbeitung. Daher benötigt auch ein Computer eine Arbeitsanweisung, die Programm genannt wird und die in einer dem Rechner verständlichen Darstellung abgefaßt sein muß. In der Steinzeit der Datenverarbeitung wurde binär programmiert. Das b e d e u t e t , daß alle Daten und Befehle durch zwei Zustände verschlüsselt (codiert) werden müssen, also durch "Loch" bzw. "Nicht Loch" eines Papierstreifens oder durch "Schalter oben" bzw. "Schalter unten" eines Schalterfeldes. Dann wurde der Assembler erfunden. Der Programmierer arbeitet mit symbolischen Befehlen wie z.B. LDA für "Lade Akkumulator" oder JMP für "Springe zu einem b e s t i m m ten Befehl". Die Eingabe erfolgt über eine Schreibmaschinentastatur. Ein Ü b e r setzungsprogramm, der Assembler, wandelt die symbolischen Befehle um in den binären Code der Maschine. Da jeder Rechnertyp eine eigene Maschinensprache hat, lassen sich Assemblerprogramme nicht zwischen verschiedenen R e c h n e r typen austauschen. Beispiel:
1.4 Zur Geschichte des FORTRAN
19
A s s e m b l e r b e f e h l d e s R e c h n e r s XYZ 85: LDA
ADAT
; Lade den Akkumulator mit dem Inhalt von ADAT
Ü b e r s e t z t e r M a s c h i n e n b e f e h l d e s R e c h n e r s XYZ 85: 001110100100111100010001
D a n n w u r d e e t w a um 1954 ein F o r m e l ü b e r s e t z e r ( F O R m u l a T R A N s l a t o r o d e r F O R T R A N ) g e s c h a f f e n , der Formeln aus der m a t h e m a t i s c h - t e c h n i s c h e n Schreibw e i s e in d e n M a s c h i n e n c o d e ü b e r s e t z e n k o n n t e . Beispiel: Formel:
x
=
a + b r ^ i
FORTRAN-Schreibweise: X = (A + B) /
(C - D)
Ü b e r s e t z t e B e f e h l e in der A s s e m b l e r s c h r e i b w e i s e : LDA SUB STA LDA ADD DIV STA
CDAT DDAT RETT ADAT BDAT RETT XDAT
; ; ; ; ; ; ;
Lade den Akkumulator mit dem Inhalt von CDAT Subtrahiere vom Akkumulator den Inhalt von DDAT Speichere die Differenz in eine Hilfsspeicherstelle Lade den Akkumulator mit dem Inhalt von ADAT Addiere zum Akkumulator den Inhalt von BDAT Dividiere den Akkumulator durch den Inhalt von RETT Speichere das Ergebnis in die Speicherstelle XDAT
Zu d e m e i g e n t l i c h e n F o r m e l ü b e r s e t z e r t r e t e n E i n g a b e b e f e h l e ( R E A D ) zur U m w a n d l u n g d e r e i n g e g e b e n e n D e z i m a l z a h l e n in die i n t e r n e b i n ä r e D a r s t e l l u n g und A u s g a b e b e f e h l e ( W R I T E ) , mit d e n e n die E r g e b n i s s e a u s d e r i n t e r n e n b i n ä r e n D a r s t e l l u n g w i e d e r in D e z i m a l z a h l e n u m g e w a n d e l t w e r d e n . Ein R e c h n e r kann m e h r als nur r e c h n e n , e r k a n n a u c h Z a h l e n m i t e i n a n d e r v e r g l e i c h e n und ist a u c h i m s t a n d e , E n t s c h e i d u n g e n ü b e r d e n w e i t e r e n Ablauf d e s P r o g r a m m s zu t r e f f e n . Dies g e s c h i e h t d u r c h e i n f a c h e K o n t r o l l b e f e h l e wie z.B. " S e t z e d a s P r o g r a m m bei e i n e m b e s t i m m t e n B e f e h l f o r t " ( G O T O ) o d e r " V e r z w e i g e nur d a n n , w e n n . . . . " ( I F ) . Das Ü b e r s e t z u n g s p r o g r a m m , d a s F o r m e l n , E i n / A u s g a b e a n w e i s u n g e n und K o n t r o l l b e f e h l e in d e n b i n ä r e n M a s c h i n e n c o d e ü b e r s e t z t , wird als FORTRAN-Compiler bezeichnet. Im L a u f e d e r J a h r e w u r d e F O R T R A N w e i t e r e n t w i c k e l t und um w e i t e r e D a t e n t y p e n (z.B. C H A R A C T E R ) , D a t e n s t r u k t u r e n (z.B. F e l d e r ) , P r o g r a m m s t r u k t u r e n (z.B. D O - S c h l e i f e ) und E i n / A u s g a b e b e f e h l e (z.B. P l a t t e n d a t e i e n ) e r w e i t e r t . Der U m f a n g d e r P r o g r a m m i e r s p r a c h e F O R T R A N ist h e u t e in d e n a m e r i k a n i s c h e n N o r m e n (ANSI X3.9 - 1978) und d e u t s c h e n N o r m e n (DIN 6 6 0 2 7 , 1980) f e s t g e l e g t . D i e s e r S t a n d a r d wird als F O R T R A N 77 b e z e i c h n e t . D a m i t ist e s m ö g l i c h , ein F O R T R A N - P r o g r a m m u n a b h ä n g i g von e i n e m M a s c h i n e n t y p zu e r s t e l l e n und F O R T R A N - P r o g r a m m e zwischen verschiedenen Rechnertypen auszutauschen.
20
1
Einführung
In d e r Praxis h a t e s sich j e d o c h g e z e i g t , d a ß t r o t z d i e s e r Normung die F O R T R A N C o m p i l e r der v e r s c h i e d e n e n H e r s t e l l e r U n t e r s c h i e d e haben; meist h a n d e l t es sich um S p r a c h e r w e i t e r u n g e n g e g e n ü b e r dem S t a n d a r d - F O R T R A N 77. Neben F O R T R A N e n t s t a n d e n im L a u f e der J a h r e w e i t e r e P r o g r a m m i e r s p r a c h e n . Dazu g e h ö r e n COBOL f ü r k a u f m ä n n i s c h e A n w e n d u n g e n , BASIC als e i n f a c h e E i n s t e i g e r s p r a c h e f ü r Hobbyanwendungen und PASCAL als P r o g r a m m i e r s p r a c h e der I n f o r m a t i k . Und d a n n gibt es noch 100 w e i t e r e P r o g r a m m i e r s p r a c h e n , von d e n e n j e d e r A n w e n d e r b e h a u p t e t , sie sei die b e s t e . Und w e l c h e ist nun wirklich die b e s t e ? L a s s e n Sie mich dazu die C o m p u t e r s p r a c h e n mit den M e n s c h e n s p r a c h e n v e r g l e i c h e n . I t a l i e n i s c h für O p e r n a r i e n , Französisch f ü r L i e b e s s c h w ü r e , D e u t s c h f ü r philosophischen T i e f g a n g und Englisch f ü r Big Business. Und w o f ü r nun F O R T R A N ? F O R T R A N als d i e n s t ä l t e s t e a n w e n d u n g s o r i e n t i e r t e P r o g r a m m i e r s p r a c h e wird h e u t e vorwiegend f ü r d i e P r o g r a m m i e r u n g von P r o b l e m e n der W i s s e n s c h a f t und T e c h n i k v e r w e n d e t . Sie ist leicht e r l e r n b a r und e n t s p r i c h t d a m i t d e r A r b e i t s weise d e s I n g e n i e u r s , f ü r d e n eine P r o g r a m m i e r s p r a c h e kein S e l b s t z w e c k , s o n d e r n ein Werkzeug ist, mit d e m er seine P r o b l e m e lösen will. G e r a d e im B e r e i c h der Technik e x i s t i e r e n u m f a n g r e i c h e P r o g r a m m b i b l i o t h e k e n und P r o g r a m m s a m m lungen, in d e n e n der F O R T R A N - P r o g r a m m i e r e r f e r t i g e Lösungen o d e r A n r e gungen f ü r e i g e n e P r o g r a m m e f i n d e t . Die neuen K o n t r o l l s t r u k t u r e n (IF . . . ELSE) d e s F O R T R A N 77 e r m ö g l i c h e n es, die m o d e r n e n M e t h o d e n der " S t r u k t u r i e r t e n P r o g r a m m i e r u n g " a u c h in F O R T R A N a n z u w e n d e n .
2 Grundlagen des FORTRAN Dieser Abschnitt führt Sie in die Grundlagen der P r o g r a m m i e r u n g und der F O R T R A N - S p r a c h e ein. Am Ende können Sie Ihre e r s t e n e i n f a c h e n P r o g r a m m e schreiben und im Dialog am Bildschirm t e s t e n .
2.1 Allgemeine Eingaberegeln In FORTRAN können Sie folgende Zeichen verwenden: Ziffern Große Buchstaben Kleine Buchstaben Sonderzeichen
0 bis 9 für Zahlen A bis Z für Namen und Texte a bis z für Namen und Texte * Stern als Multiplikationszeichen . Punkt als Dezimalpunkt , Komma als Trennzeichen / Schrägstrich als Divisionszeichen + Plus als Vorzeichen und Rechenzeichen - Minus als Vorzeichen und Rechenzeichen ' Apostroph als Begrenzung von Texten $ Dollarzeichen () runde Klammern Leerzeichen (blank)
In T e x t e n sind alle Sonderzeichen der v e r w e n d e t e n R e c h e n a n l a g e außer dem Apostroph, dem Begrenzungszeichen, e r l a u b t . Kleine Buchstaben werden, außer bei T e x t e n , in große Buchstaben u m g e w a n d e l t . F O R T R A N kennt fest v e r e i n b a r t e Namen oder K e n n w ö r t e r wie z.B. READ für das Lesen von D a t e n oder WRITE für die D a t e n a u s g a b e . Andere N a m e n wie z.B. die N a m e n von Speicherstellen vergeben Sie selbst. Für diese f r e i wählbaren N a m e n g e l t e n allgemein folgende Regeln: Sie d ü r f e n aus h ö c h s t e n s sechs Buchstaben oder Z i f f e r n b e s t e h e n , das e r s t e Zeichen muß ein Buchstabe sein, Sonderzeichen als Bestandteil des Namens sind verboten und K e n n w ö r t e r sollten nicht als f r e i wählbare N a m e n verwendet w e r d e n . Alle Daten werden im R e c h n e r binär g e s p e i c h e r t . Man u n t e r s c h e i d e t ganze Zahlen (INTEGER), reelle Zahlen ( R E A L ) , doppelt genaue Zahlen (DOUBLE PRECISION), komplexe Zahlen (COMPLEX), logische Größen (LOGICAL) und T e x t z e i c h e n (CHARACTER). Für veränderliche D a t e n (Variablen) vergeben Sie einen symbolischen N a m e n , u n t e r dem diese Größe im Programm angesprochen werden kann. Beispiel: READ(*,*) X1, X2, X3, X4, X5
22
2 Grundlagen des
FORTRAN
Die fünf einzulesenden Zahlen werden unter den f r e i gewählten symbolischen Namen X I , X2, X3, X4 und X5 im Arbeitsspeicher des Rechners abgelegt. Für diese Variablen geben Sie nach dem Start des Programms dezimale Zahlenwerte ein; Hilfsprogramme des Betriebssystems rechnen sie in das duale Zahlensystem um und legen sie im Speicher ab. Daten, die bereits bei der Programmierung bekannt sind, heißen Konstanten. Sie erscheinen z.B. als Dezimalzahlen in Formeln. Beispiel: XM = (X1 + X2 + X3 + X4 + X5) / 5 . Die Zahl 5 ist eine Konstante. Sie erscheint als Dezimalzahl in einer Formel. Die Eingaberegeln des FORTRAN stammen noch aus der Lochkartenzeit. An die Stelle der 80spaltigen Lochkarte t r i t t heute die Bildschirmzeile. Die in Bild 2 - 1 an einem Beispiel dargestellte Spalteneinteilung wird bei der Eingabe durch den Editor des Betriebssystems unterstützt. Mit Hilfe der T a b u l a t o r t a s t e kann der Cursor (Schreibmarke) des Bildschirmgerätes auf b e s t i m m t e Spalten gesetzt werden. Fachhochschule d(r D B P Ditburg
FORTRAN-
Proqrtfrirft:
Aölochungshmwfrise FORT* M
Prvq'iTYTuerer.
-
Ci^Çjei^f^^1-
^ ^ ^ ^ ^
M .
b
0
SS
C — B*i Bemerkung 1
Nr
C
,e,r,rv C He.H.e.eNt>.e.s. . s . e . î . s . p . î . f . i
A.0. . .
5 G7
10
IS
Î0
?5
WRi.Tf.(..*., x . l . . ' . S .vi.est.e. Re.ft.t>.(..*. ,*,). x - f , Xi. X.M , - . .c.x.-l, .*.
^
30
Programmschema Blsll
Z.,d.n
von
^
Lochung
Anweisungen bïw Vereinbarungen 35 tO ¿5
M
55
SO
65
Kennung 70 7? 73 75
.eX.nb.e.i.eM.'
xî,
.x.v, ys.
.1, X . î ,
,V,K,
,y,s)./.5
W f U T . Ç t , * . , . * . ! . / . M . I . T . T F . L - . ' . XH tp.l.xx
, . , 6 A ,.,0,), ,S,T,0,fi , ,'
&.QT0, END,
Bild 2-1:
FORTRAN-Eingabeformular
Kommentare werden durch den Buchstaben "C" oder das Zeichen "*" in Spalte 1 gekennzeichnet. Der nachfolgende Text wird vom Compiler als Anmerkung a u f g e f a ß t und nicht in Maschinenbefehle übersetzt. Marken sind ganze Zahlen von 1 bis 99999 und stehen in den Spalten 1 bis 5. Sie bezeichnen Sprungziele oder FORMAT-Beschreibungen. Sie werden vom Programmierer vergeben und sind nicht wie in BASIC identisch mit den Zeilennummern des Editors! Eine Marke darf nur einmal im Programm erscheinen. FORTRAN-Anweisungen stehen in den Spalten 7 bis 72. Durch das Einfügen von Leerzeichen, außer in Texten, lassen sich Programmzeilen besser lesen. Die Anweisung muß nicht in Spalte 7 beginnen; Strukturblöcke lassen sich durch Einrücken besser überblicken. Jede FORTRAN-Anweisung steht auf einer neuen Zeile. Reicht eine Zeile nicht aus, so kann die Anweisung auf der nächsten Zeile fortgesetzt werden.
»
2.2 Die Darstellung ganzer Zahlen durch
INTEGER-Größen
23
Fortsetzungszeilen erhalten ein beliebiges Zeichen außer "0" oder Leerzeichen in Spalte 6 der Eingabezeile. Es sind bis zu 19 Fortsetzungszeilen möglich. Kommentarzeilen lassen sich nicht fortsetzen; jede Kommentarzeile muß mit einem "C" oder "*" in Spalte 1 beginnen. In den Spalten 73 bis 80 der Eingabezeile können beliebige Zeichen oder Zahlen stehen, die vom Compiler nicht beachtet werden. Bei langen FORTRAN-Anweisungen besteht die G e f a h r , daß man in die Spalten 73 bis 80 gerät und daß der Compiler diesen Teil der Eingabe nicht b e a c h t e t .
2.2 Die Darstellung ganzer Zahlen durch INTEGER-Größen Das Kind beginnt sein mathematisches Leben mit ganzen Zahlen: 1 Daumen, 2 Bonbons, 3 Finger usw.; erst später lernt es das Nichts, die Null, und die Schulden, die negativen Zahlen, kennen. Ganze positive und negative Zahlen einschließlich der Null werden in FORTRAN als INTEGER-Größen bezeichnet. An vielen Stellen müssen Sie INTEGER-Größen verwenden: Einheit der Marken für Exponenten bei älteren
Ein/Ausgabeanweisungen READ und WRITE, Sprungziele und FORMAT-Beschreibungen, von reellen Zahlen und Compilern Laufgrößen von DO-Schleifen und Indizes von Feldern.
INTEGER-Zahlen werden im Rechner als Dualzahlen mit Vorzeichen gespeichert; sie werden jedoch dezimal ein- und ausgegeben. Der zulässige Zahlenbereich hängt von der verwendeten Maschine ab und kann dem Handbuch des Herstellers entnommen werden. Reelle Zahlen (REAL-Größen) können Stellen hinter dem Dezimalkomma enthalten und werden im Rechner daher dual in der Mantisse-Exponent-Darstellung abgespeichert. Da der Compiler für INTEGERund für REAL-Zahlen unterschiedliche Rechenbefehle erzeugen muß, ist es nötig, diese beiden Zahlentypen im Programm voneinander zu unterscheiden. INTEGER-Konstanten sind ganze Zahlen ohne Dezimalpunkt, dabei kann ein positives Vorzeichen e n t f a l l e n . Beispiele für INTEGER-Konstanten: -100
4711 0 -2147483647 +2147483647
( k l e i n s t e Zahl bei 4 Bytes Speichergröße) (größte Zahl bei 4 Bytes Speichergröße)
Einige Rechner speichern eine INTEGER-Zahl in 36 Bits ab und haben einen größeren INTEGER-Zahlenbereich! Für die Dateneingabe von INTEGER-Zahlen während des Programmlaufes gelten die gleichen Regeln. Wenn eine Variable als ganze Zahl in der INTEGER-Zahlendarstellung verarbeitet werden soll, so müssen Sie entweder den Typ besonders vereinbaren oder Sie müssen den Anfangsbuchstaben des Namens entsprechend der Namensregel wählen. Bei der expliziten (erklärten) Typvereinbarung folgt auf das Kennwort INTEGER
24
2 Grundlagen des FORTRAN
e i n e L i s t e von V a r i a b l e n n a m e n , sollen.
INTEGER
die als I N T E G E R - G r ö ß e n
behandelt
werden
Liste von Variablennamen
Beispiele: INTEGER ZAHL,WERTE,NR In der I n d e x s c h r e i b w e i s e und bei e i n f a c h e n Z ä h l e r n v e r w e n d e t man in d e r M a t h e m a t i k s e h r o f t d i e B u c h s t a b e n i, j , k , 1 , m o d e r n. D a h e r gibt e s in F O R T R A N d i e N a m e n s r e g e l , die allen V a r i a b l e n , die m i t d e n B u c h s t a b e n
I
,
J
,
K
,
L
,
M
oder
N
beginnen, den Typ INTEGER zuweist; alle a n d e r e n A n f a n g s b u c h s t a b e n z e i c h n e n R E A L - G r ö ß e n . B e i s p i e l e f ü r die N a m e n s r e g e l : I N T E G E R - G r ö ß e n sind d i e V a r i a b l e n R E A L - G r ö ß e n sind d i e V a r i a b l e n
IN , J , KO , L A E N G , M O N A T
kenn-
und N
X , Y , Z , A N Z , RX , X3 und O T T O
V e r g i b t m a n d i e N a m e n von V a r i a b l e n e n t s p r e c h e n d d e r N a m e n s r e g e l ( i m p l i z i t e o d e r v o r a u s g e s e t z t e T y p v e r e i n b a r u n g ) , so k ö n n e n b e s o n d e r e e x p l i z i t e T y p v e r e i n b a r u n g e n e n t f a l l e n . D u r c h e i n e I M P L I C I T - V e r e i n b a r u n g läßt s i c h die N a m e n s r e gel auf w e i t e r e A n f a n g s b u c h s t a b e n a u s d e h n e n .
2.3 Die Darstellung reeller Zahlen durch REAL-Größen R e e l l e Z a h l e n k ö n n e n S t e l l e n h i n t e r d e m D e z i m a l k o m m a e n t h a l t e n . Wie b e i T a s c h e n r e c h n e r n a r b e i t e t m a n in F O R T R A N mit e i n e m D e z i m a l p u n k t a n s t e l l e des K o m m a s . Ergeben sich bei wissenschaftlichen Rechnungen sehr große oder s e h r k l e i n e Z a h l e n , so s c h r e i b t man sie b e q u e m e r als Z e h n e r p o t e n z . A n s t e l l e d e s Basis 10 s t e h t in F O R T R A N d e r K e n n b u c h s t a b e E f ü r E x p o n e n t . R E A L - K o n s t a n t e n s c h r e i b t man in F O R T R A N i m m e r als D e z i m a l z a h l m i t e i n e m D e z i m a l p u n k t . In d e r E x p o n e n t e n s c h r e i b w e i s e s t e h t d e r K e n n b u c h s t a b e E vor d e m g a n z z a h l i g e n E x p o n e n t e n zur Basis 10. B e i s p i e l e f ü r R E A L - K o n s t a n t e n : +13.5 13.5 -3.1415927 1.3E+4
für für für für
13,5 13,5 - 3,1415927 1,3•10 ^
2.3 Die Darstellung reeller Zahlen durch
1.E-3 -2.25E10 1E5 +3.0E-39 +1.7E+38 -3.0E-39 -1.7E+38
f ü r 0,001 = M O für -2,25'1010 f ü r 100000 = M O 5 k l e i n s t e p o s i t i v e Zahl (bei größte p o s i t i v e Zahl (bei 4 k l e i n s t e negative Zahl (bei größte negative Zahl (bei 4
REAL-Größen
25
4 Bytes Speichergröße) Bytes Speichergröße) 4 Bytes Speichergröße) Bytes Speichergröße)
Ein positives Vorzeichen kann sowohl bei der Basis als auch beim Exponenten e n t f a l l e n . In der Exponentenschreibweise darf auch der Dezimalpunkt der Mantisse weggelassen w e r d e n . Die Genauigkeit und der zulässige Zahlenbereich h ä n gen vom Rechner ab und können den Handbüchern des H e r s t e l l e r s e n t n o m m e n w e r d e n . N o r m a l e r w e i s e wird eine R E A L - G r ö ß e in vier Bytes g e s p e i c h e r t . Dann b e t r ä g t die Genauigkeit mindestens sechs Dezimalstellen, und der Zahlenumfang reicht von l . E - 3 8 bis l.E+38. Für die Dateneingabe von R E A L - Z a h l e n während des P r o g r a n i m l a u f e s g e l t e n die gleichen Regeln. Wenn eine Variable als reelle Zahl in der R E A L - Z a h l e n d a r s t e l l u n g v e r a r b e i t e t w e r d e n soll, so müssen Sie e n t w e d e r den Typ besonders vereinbaren oder Sie müssen den A n f a n g s b u c h s t a b e n des Namens e n t s p r e c h e n d der Namensregel wählen. Bei der expliziten ( e r k l ä r t e n ) Typvereinbarung folgt auf das Kennwort REAL eine Liste von V a r i a b l e n n a m e n , die als REAL-Größen v e r a r b e i t e t werden sollen.
L i s t e von Variablennamen
REAL
Beispiele für reelle F o r m e l g r ö ß e n : REAL XM , MITTEL , IND , KAP Nach der N a m e n s r e g e l sind alle Variablen, die mit den Buchstaben
A
bis
H
oder
0
bis
Z
beginnen, vom Typ REAL. Daher kann man sich durch die Wahl des V a r i a b l e n namens explizite Typvereinbarungen sparen. Beispiele für die N a m e n s r e g e l : REAL-Größen sind die Variablen
XM , C , FLAE , VOL , SUM
Die N a m e n s r e g e l kann mit der IMPLICIT-Anweisung auf w e i t e r e A n f a n g s b u c h staben ausgedehnt w e r d e n . Variablen sollte man e n t s p r e c h e n d den Bezeichnungen der zu p r o g r a m m i e r e n d e n F o r m e l n wählen. Dann ist jedoch darauf zu a c h t e n , daß alle mit den Buchstaben I , J , K , L , M oder N beginnenden V a r i a b l e n -
26
2 Grundlagen des FORTRAN
n a m e n zu R E A L e r k l ä r t w e r d e n , w e n n sie r e e l l e Beispiele für reelle Formelgrößen: REAL
Zahlen aufnehmen
sollen.
IND , MITTEL , MW , KAP , L
R E A L - Z a h l e n w e r d e n d e z i m a l a l s K o n s t a n t e n v e r e i n b a r t bzw. d e z i m a l w ä h r e n d d e r V e r a r b e i t u n g e i n g e l e s e n . D e r C o m p i l e r bzw. H i l f s p r o g r a m m e d e s B e t r i e b s s y s t e m s w a n d e l n die D e z i m a l z a h l um in e i n e d u a l e M a n t i s s e und e i n e n d u a l e n E x p o n e n t e n . D a b e i e n t s t e h e n U m w a n d l u n g s - und R u n d u n g s f e h l e r . Der e n d l i c h e D e z i m a l b r u c h 0 . 1 e r g i b t z.B. d e n p e r i o d i s c h e n D u a l b r u c h 0 . 0 0 0 1 1 0 0 der wegen der endlichen Stellenzahl des Rechners abgebrochen werden muß. Auch b e i m R e c h n e n s e l b s t e n t s t e h e n R u n d u n g s f e h l e r , w e n n z.B. d i e Anzahl der zur V e r f ü g u n g s t e h e n d e n S t e l l e n n i c h t a u s r e i c h t , d a s E r g e b n i s a u f z u n e h m e n . Als B e i s p i e l b e t r a c h t e n wir e i n e n R e c h n e r , d e r mit a c h t D e z i m a l s t e l l e n G e n a u i g k e i t a r b e i t e t , und s t e l l e n ihm die A u f g a b e , die Z a h l e n 100 000 000 und 1 in der R E A L - Z a h l e n d a r s t e l l u n g zu a d d i e r e n . Die d u a l e M a n t i s s e - E x p o n e n t - D a r s t e l l u n g w o l l e n wir hier zur V e r a n s c h a u l i c h u n g d e z i m a l w i e d e r g e b e n . B e i d e Z a h l e n w e r d e n auf a c h t S t e l l e n g e n a u g e s p e i c h e r t : 100 000 000 : 0 . 1 0 0 0 0 0 0 0 - 1 0 9 1 : 0.10000000-101 Vor d e r A d d i t i o n g l e i c h t d a s R e c h e n w e r k d e n E x p o n e n t e n d e r k l e i n e r e n Zahl a n d e n E x p o n e n t e n d e r g r ö ß e r e n Zahl a n . U n t e r d e r A n n a h m e , d a ß d a s R e c h e n werk mit neun Stellen Genauigkeit a r b e i t e t , ergibt sich folgende Rechnung: 100 000 0 0 0 : 1 : Ergebnis:
0.100000000 •109 + 0.000000001 • 1 0 9 = 0.100000001 - 1 0 9 = 0.10000000 -109
auf 9 Stellen genau im Rechenwerk auf 8 Stellen genau im Speicher
Wird d a s n e u n s t e l l i g e E r g e b n i s d e s R e c h e n w e r k s im S p e i c h e r a c h t s t e l l i g a b g e l e g t , so g e h t d i e l e t z t e S t e l l e v e r l o r e n . Die S u m m e d e r Z a h l e n 100 0 0 0 000 und 1 e r g i b t bei d e r R E A L - R e c h n u n g 100 000 0 0 0 und n i c h t 100 0 0 0 001. Der g l e i c h e R u n d u n g s f e h l e r t r i t t a u f , w e n n d e r R e c h n e r im d u a l e n Z a h l e n s y s t e m mit d u a l e r M a n t i s s e und d u a l e m E x p o n e n t e n a r b e i t e t . F ü h r t m a n die g l e i c h e R e c h n u n g ganzzahlig m i t z e h n s t e l l i g e n I N T E G E R - Z a h l e n d u r c h , s o ist d a s E r g e b n i s r i c h t i g 100 000 001. Will m a n die G e n a u i g k e i t in d e r M a n t i s s e - E x p o n e n t - D a r s t e l l u n g v e r b e s s e r n , so m u ß m a n m e h r S t e l l e n v o r s e h e n . Die d o p p e l t g e n a u e Z a h l e n d a r s t e l l u n g d e s F O R T R A N ( R E A L * 8 o d e r DOUBLE PRECISION) s p e i c h e r t e i n e Z a h l in a c h t B y t e s . Die G e n a u i g k e i t b e t r ä g t d a n n z.B. 15 D e z i m a l s t e l l e n bei e i n e m Z a h l e n u m f a n g von 10-307 bis 10 + 308
2.4 Einfache Dateneingabe
und Datenausgabe
im Dialog
27
2.4 Einfache Dateneingabe und Datenausgabe im Dialog F ü r die e r s t e n P r o g r a m m i e r ü b u n g e n ist e s s e h r w i c h t i g , T e s t d a t e n am E i n g a b e g e r ä t e i n z u g e b e n und E r g e b n i s s e auf d e m Bildschirm zu s e h e n , d i e mit Hilfe d e s B e t r i e b s s y s t e m s auf d e n D r u c k e r u m g e s t e u e r t w e r d e n k ö n n e n . D a h e r zeigt Ihnen d i e s e r A b s c h n i t t e i n f a c h e l i s t e n g e s t e u e r t e E i n g a b e - und A u s g a b e m ö g l i c h k e i t e n ü b e r d a s B e d i e n u n g s g e r ä t , die K o n s o l e . F a l l s Ihr B e t r i e b s s y s t e m die in d i e s e m A b s c h n i t t v o r g e s t e l l t e n B e f e h l e n i c h t k e n n t , m ü s s e n Sie sich im A b s c h n i t t 7 mit d e r f o r m a t i e r t e n E i n / A u s g a b e b e s c h ä f t i g e n . Die A n w e i s u n g
READ(*,*)
Variablenliste
liest D a t e n von der Konsole (*) o h n e F O R M A T - B e s c h r e i b u n g (*) und l e g t sie u n t e r d e n in d e r V a r i a b l e n l i s t e g e n a n n t e n N a m e n im S p e i c h e r a b . B e i s p i e l : R E A D ( * , * ) X1, X2, X3, X4, X5 Wird die A n w e i s u n g n a c h d e m S t a r t d e s P r o g r a m m s a u s g e f ü h r t , so w a r t e t d e r R E A D - B e f e h l auf die E i n g a b e von fünf D e z i m a l z a h l e n in d e r R E A L - S c h r e i b w e i s e . Die E i n g a b e z e i l e k ö n n t e z.B. l a u t e n : 3.4
5.1E3
7.4
0.
-11
Die Z a h l e n sind d u r c h m i n d e s t e n s ein L e e r z e i c h e n v o n e i n a n d e r zu t r e n n e n . Eine Z a h l d e r E i n g a b e d a t e n z e i l e e n t s p r i c h t e i n e m N a m e n d e r V a r i a b l e n l i s t e . Die 1. Z a h l (im B e i s p i e l 3.4) wird u n t e r d e m N a m e n d e r 1. V a r i a b l e n (im B e i s p i e l X l ) im S p e i c h e r a b g e l e g t . Die Z a h l e n sind in d e r R e i h e n f o l g e e i n z u g e b e n , in der d i e V a r i a b l e n n a m e n in d e r R E A D - A n w e i s u n g s t e h e n . F ü r I N T E G E R - V a r i a b l e n sind nur I N T E G E R - Z a h l e n o h n e D e z i m a l p u n k t z u l ä s s i g . F ü r R E A L - V a r i a b l e n k ö n n e n Z a h l e n mit D e z i m a l p u n k t , Z a h l e n in d e r E x p o n e n t e n s c h r e i b w e i s e und g a n z e Z a h l e n o h n e D e z i m a l p u n k t e i n g e g e b e n w e r d e n . Ein p o s i t i v e s V o r z e i c h e n kann e n t f a l l e n . In d e m o b i g e n B e i s p i e l w e r d e n d e n V a r i a b l e n f o l g e n d e W e r t e zugewiesen: X1 = 3 . 4
X2 = 5100
X3 = 7 . 4
X4 = 0
X5 = - 1 1
Die e i n f a c h e R E A D - A n w e i s u n g zur E i n g a b e von D a t e n ü b e r die Konsole kann bei I h r e m R e c h n e r und B e t r i e b s s y s t e m a u c h a n d e r s a u s s e h e n , so z.B. READ(5,*) V a r i a b l e n l i s t e
Beispiel:
R E A D ( 5 , * ) X1 , X 2 , X 3 , X 4 , X 5
Beispiel:
READ *
oder READ *
, Variablenliste
, X1,X2,X3,X4,X5
28
2 Grundlagen des
FORTRAN
Auch im Aufbau der Eingabedatenzeile können sich Unterschiede ergeben. So ist es z.B. auch erlaubt, die Eingabedaten durch ein Komma oder einen Schrägstrich zu trennen. Beispiel: 3 . 4 , 5.1E3 , 7.4 , 0. , -11 Die Anweisung
WRITE(*,*)
Ausgabeliste
dient zur Ausgabe von Daten auf der Konsole. Die Ausgabeliste kann enthalten: Namen von Variablen, deren Inhalt ausgegeben werden soll, Textkonstanten, die zwischen zwei Apostrophzeichen zu setzen sind, Zahlenkonstanten oder Rechenausdrücke, deren Ergebnis ausgegeben wird. Ältere Compilerversionen lassen nur Namen von Variablen zu. Die Ergebnisse von Rechenausdrücken sind dann vorher in eine Variable zu bringen; Texte sind in einer FORMAT-Anweisung oder in einer Variablen abzulegen. Die Anweisung zur einfachen Ausgabe von Daten auf der Konsole kann bei Ihrem Rechner auch anders aussehen, so z.B. WRITE(6,*)
Ausgabeliste
oder PRINT * ,
Ausgabeliste
Die Daten werden in der in der Liste genannten Reihenfolge auf der Konsole ausgegeben. Ihre Anordnung und das Format hängen vom Rechner und vom Betriebssystem ab. Ein Ausgabeanweisung ohne Liste erzeugt eine Leerzeile. Nach dem Start eines Programms im Dialogbetrieb sollte zunächst eine Meldung ausgegeben werden; desgleichen vor einer READ-Anweisung, um den Benutzer auf die nun einzugebenden Daten hinzuweisen. Beispiel: WRITE(*,*) '5 WERTE EINGEBEN:1 READ ( * , * ) X1 , X2 , X3 , X4 , X5 Ergebnisse sollten ebenfalls durch Bezeichnungen und Maßeinheiten kommentiert werden, denn Zahlenfriedhöfe allein sagen wenig aus und führen leicht zu Mißverständnissen und Fehlern. Beispiel: WRITE(*,*)
1
MITTEL=',XM,' KM/STUNDE1
Wenn Sie mit dieser einfachen listengesteuerten Datenausgabe nicht zufrieden
2.5 Die Programmierung
von
Formeln
29
sind, w e i l Sie z.B. T a b e l l e n d r u c k e n w o l l e n , so m ü s s e n Sie s i c h im A b s c h n i t t 7 mit der f o r m a t i e r t e n Ausgabe b e s c h ä f t i g e n . E i n g a b e - und A u s g a b e a n w e i s u n g e n e r s c h e i n e n im P r o g r a m m a b l a u f p l a n als P a r a l l e l o g r a m m . Bild 2 - 2 z e i g t e i n B e i s p i e l f ü r e i n P r o g r a m m , d a s zwei r e e l l e Z a h l e n l i e s t , d i e S u m m e b e r e c h n e t und d i e s e a u s g i b t . Die b e i d e n P a r a l l e l o g r a m m e " M e l d u n g " und " L e s e n " k ö n n t e m a n zu e i n e m S y m b o l z u s a m m e n f a s s e n . _l
\
Meldung 'A und B eingeben' Meldung A, B lesen/ Lesen A und
SUM = A +
ausgeben 1 SUMME= SUM Bild 2 - 2 :
E i n g a b e - und A u s g a b e b e f e h l e im P r o g r a m m a b l a u f p l a n
2.5 Die Progammierung von Formeln F O R T R A N t r ä g t s e i n e n N a m e n von F O R m u l a T R A N s l a t i o n ( F o r m e l ü b e r s e t z u n g ) und w u r d e u r s p r ü n g l i c h nur dazu g e s c h a f f e n , F o r m e l n a u s d e r w i s s e n s c h a f t l i c h t e c h n i s c h e n S c h r e i b w e i s e in M a s c h i n e n b e f e h l e zu ü b e r s e t z e n . B e g i n n e n wir mit einem e i n f a c h e n Beispiel: Sie w o l l e n d e n F l ä c h e n i n h a l t e i n e s K r e i s e s a u s s e i n e m D u r c h m e s s e r und f i n d e n in e i n e r F o r m e l s a m m l u n g : F
berechnen
_ j t • d2 4
Diese F o r m e l s c h r e i b e n Sie in F O R T R A N als a r i t h m e t i s c h e F = 3.1415927*D**2/4.0 Der C o m p i l e r e r z e u g t f o l g e n d e M a s c h i n e n b e f e h l e : L a d e in I n h a l t d e r S p e i c h e r s t e l l e D in d a s R e c h e n w e r k M u l t i p l i z i e r e dazu d e n I n h a l t von D
Anweisung:
30
2 Grundlagen des FORTRAN
Multipliziere das Ergebnis mit der Konstanten 3.1415927 Dividiere das Ergebnis durch die Konstante 4.0 Speichere das Ergebnis in die Speicherstelle F Eine arithmetische Anweisung enthält von links nach rechts:
name =
ausdruck
1. Den Namen der Variablen, die das Ergebnis a u f n i m m t . 2. Das Zuordnungszeichen =. 3. Einen arithmetischen Ausdruck bestehend aus Variablen, Konstanten und Rechenzeichen. Das Ergebnis einer arithmetischen Anweisung wird in der Speicherstelle a b g e legt, deren Name links vom Zuordnungszeichen s t e h t . Der alte Inhalt dieser Speicherstelle geht verloren. Das Zuordnungszeichen ist kein Gleichheitszeichen wie in der Mathematik, sondern es ordnet der links stehenden Variablen das Ergebnis der rechten Seite zu. Die Anweisung 1 = 1 + 1 ist mathematisch äußerst bedenklich; der Rechner führt sie jedoch in folgenden Schritten aus: Lade das Rechenwerk mit dem Inhalt der Speicherstelle I Addiere dazu die Konstante 1 Speichere das Ergebnis in die Speicherstelle I Nach der Ausführung der FORTRAN-Anweisung 1 = 1 + 1 hat sich der Inhalt von I um 1 erhöht. Dies bezeichnet man auch als Aufwärtszählen oder Inkrementieren. Der arithmetische Ausdruck kennt folgende Rechenzeichen: * *
*
/ + -
+ und -
Potenzieren Multiplizieren Dividieren Addieren Subtrahieren sind auch Vorzeichen
Diese Rechenzeichen gelten für alle Zahlentypen, also für REAL und INTEGER und die noch zu besprechenden doppelt genauen (DOUBLE PRECISION) und komplexen (COMPLEX) Größen. Für jeden Zahlentyp gibt es b e s t i m m t e Rechenbefehle. Der Compiler entscheidet anhand des Variablentyps und der Konstantenschreibweise, welche Befehle zu erzeugen sind. Werden Zahlen verschiedenen
2.5 Die Programmierung von Formeln
31
Typs in einem Ausdruck gemischt, so müssen sie vorher u m g e f o r m t werden. Dazu gibt es besondere B e f e h l e . Die Rechenoperationen eines arithmetischen Ausdrucks werden in folgender Reihenfolge ausgeführt: 1. 2. 3. 4. 5.
Klammerausdrücke beginnend mit der innersten Klammer, Standardfunktionen wie z.B. S Q R T (Quadratwurzel), Potenzieren, Multiplizieren und Dividieren, Addieren und Subtrahieren.
Es f o l g e n einige Regeln über den Aufbau von arithmetischen Ausdrücken. Division durch 0 ist verboten. Einige Rechner reagieren dabei mit F e h l e r m e l dungen, andere rechnen falsch w e i t e r . Arithmetische Ausdrücke können mehrfach geschachtelte runde Klammern enthalten, die die Reihenfolge der Verarbeitung f e s t l e g e n . Leerzeichen machen den Ausdruck übersichtlicher. XD = ( (X ** 2) + (Y ** 2) ) **
(1./2.)
Arithmetische Ausdrücke können auch allein aus einer Konstanten oder einer Variablen bestehen. Man spricht dann von einer einfachen Wertzuweisung. PI = 3.1415927 SUM = 0. X = X0 Vorzeichen und Rechenzeichen sind durch Klammern zu trennen. Das Multiplikationszeichen zwischen zwei Klammern muß immer gesetzt werden. Z = 12.0 * (-X) X = (A + B) * (C - D) Der Schrägstrich ist kein Bruchstrich, sondern ein Divisionszeichen. Daher sind Zähler und Nenner bei Summen und D i f f e r e n z e n zu klammern. X = (A + B) / (A - B) Die Ausführung des Potenzierens hängt vom Compiler und von der Rechenanlage ab. Bei ganzzahligem Exponenten sollte man I N T E G E R - G r ö ß e n verwenden, da dann mehrmals multipliziert wird. Bei reellem Exponenten wird über die Funktionen In und e gerechnet. In diesem Fall darf die Basis nicht negativ sein. R ** 4
wird gerechnet wie R * R * R * R
R ** 4.0
wird gerechnet w i e EXP
(4.0 * ALOG(R))
Für eine Reihe von mathematischen Funktionen stellt das Betriebssystem f e r t i g e Unterprogramme als Standaidfunktionen zur Verfügung. Die wichtigsten sind in Bild 2 - 3 zusammengestellt. Der Anhang enthält w e i t e r e Funktionen.
32
2 Grundlagen des FORTRAN
Bild 2 - 3 :
Funktion
Bedeutung
Wertebereich
SQRT(X) SIN(X) COS(X) TAN(X) EXP(X) ALOG(X) AL0G10(X) ABS(X) FLOAT(I) IFIX(X)
Snr sin x cos X tan x e* In x log x
x x x x x x x
Ix| mache reell mache ganzzahlig
positiv im Boqenmaß im Boqenmaß im Bogenmaß kleiner 88 positiv t 0 positiv * 0
I=INTEGER-Ausdruck X = REAL-Ausdruck
Die wichtigsten Standardfunktionen
Man b e a c h t e , daß alle Winkelfunktionen im Bogenmaß einzugeben sind. Beispiel: Formel:
z = h • cos ^u •
Z = H * C0S(ALFA * PI /180.) Für gemischte Ausdrücke , in denen R E A L - und I N T E G E R - G r ö ß e n gemeinsam vorkommen, gibt es die Umwandlungsfunktionen F L O A T und IFIX. In den folgenden Beispielen gelte die Namensregel, nach der die Variablen I und N vom Typ INTEGER und die Variablen SUM, X und Z vom Typ REAL sind. Die Umwandlungsfunktionen werden nur im Rechenwerk wirksam und haben keinen Einfluß auf den Inhalt der in Klammern stehenden Größe. Die Funktion F L O A T verwandelt eine I N T E G E R - G r ö ß e in die R E A L - Z a h l e n d a r stellung, so daß sie mit R E A L - G r ö ß e n verknüpft werden kann. Beispiel: X = SUM * FLOAT (N) Die in der I N T E G E R - S p e i c h e r s t e l l e N befindliche ganze Dualzahl wird in das Rechenwerk gebracht, dort in die duale Mantisse-Exponent-Darstellung umgewandelt und mit dem Inhalt der R E A L - S p e i c h e r s t e l l e SUM multipliziert. Das Produkt wird in der Mantisse-Exponent-Darstellung in der R E A L - S p e i c h e r s t e l l e X abgelegt. Der Inhalt der Speicherstellen SUM und N bleibt erhalten; die S p e i c h e r s t e l l e X erhält einen neuen Wert. Die Funktion IFIX verwandelt eine R E A L - G r ö ß e in die I N T E G E R - Z a h l e n d a r stellung, so daß sie mit I N T E G E R - G r ö ß e n verknüpft werden kann. Beispiel; I = N + IFIX (Z
+ 0.5)
Der Inhalt der R E A L - S p e i c h e r s t e l l e Z wird in das Rechenwerk g e b r a c h t , dort um die R E A L - K o n s t a n t e 0.5 erhöht und in eine ganze Dualzahl verwandelt. Dabei werden alle Stellen hinter dem Dezimalpunkt a b g e s c h n i t t e n . Das Ergebnis der dualen Addition wird in der Speicherstelle I a\s ganze Dualzahl a b g e l e g t .
2.5
Die Programmierung
von
Formeln
33
Die S p e i c h e r s t e l l e n N und Z bleiben u n v e r ä n d e r t . Da die IFIX-Funktion nicht r u n d e t , sondern alle Stellen hinter dem Dezimalpunkt a b s c h n e i d e t , wird i n d e m Beispiel die K o n s t a n t e 0.5 d a z u a d d i e r t . Die m e i s t e n Compiler wandeln g e m i s c h t e Ausdrücke selbständig um, so daß die Funktionen FLOAT und IFIX e n t f a l l e n können. S t e h t links vom Zuordnungszeichen e i n e I N T E G E R - V a r i a b l e , so ist das Ergebnis immer ganzzahlig. A r i t h m e t i s c h e Anweisungen stellen wir im P r o g r a m m a b l a u f p l a n durch ein R e c h t e c k d a r . O f t genügt es, nur den N a m e n der e m p f a n g e n d e n Variablen e i n z u t r a g e n . Bild 2 - 4 zeigt ein Beispiel, das eine Nachricht auf dem Bildschirm a u s g i b t , zwei reelle Zahlen liest, n a c h dem Satz des Pythagoras die H y p o t h e n u se b e r e c h n e t und das Ergebnis a u s g i b t . Bild 2 - 5 zeigt das vollständige a b l a u f fähige P r o g r a m m . Die beiden zusätzlichen Anweisungen STOP und END werden im n ä c h s t e n Abschnitt e r k l ä r t . f
START I
Meldung ausgeben
Meldung
A und B lesen
A, B lesen/ U
C = \T~Ä 5
Z
C = \/ A1 + B;
T Ergebnis C
Ergebnis C/
ausgeben
ausgeben
(
Bild 2 - 4 :
C BILD
STOP
^
S t r u k t o g r a m m und P r o g r a m m a b l a u f p l a n zur F o r m e l a u s w e r t u n g
E-5 SATZ DES PYTHAGORAS W R I T E C * , » ) 'A U N D B E I N G E B E N ' READ( * , * } A,B C - SQRT CA»*E + B**e) W R I T E C » , * ) 'C-',C STDP END
B> T E S T A UND B E I N G E B E N 3 . 4 . C5.0000000 Stop - Program terminated.
Bild 2 - 5 :
Programm zur Auswertung einer F o r m e l mit Testlauf
34
2 Grundlagen des FORTRAN
2.6 Die wichtigsten Steueranweisungen Sie w o l l e n nun s i c h e r Ihre e r s t e n T e s t p r o g r a m m e in d e n R e c h n e r e i n g e b e n und a u s f ü h r e n l a s s e n . Dazu b e n ö t i g e n Sie n o c h e i n i g e A n w e i s u n g e n , d i e k e i n e D a t e n ü b e r t r a g e n o d e r b e r e c h n e n , s o n d e r n die d e n Lauf d e s P r o g r a m m s s t e u e r n . Die A n w e i s u n g
GOTO
n
b e w i r k t , d a ß d a s P r o g r a m m n i c h t b e i d e r f o l g e n d e n A n w e i s u n g , s o n d e r n bei d e r A n w e i s u n g N r . n w e i t e r a r b e i t e t . D a b e i i s t die S p r u n g m a r k e n e i n e p o s i t i v e g a n ze Zahl in d e n S p a l t e n 1 bis 5 d e r P r o g r a m m z e i l e , a n d e r d a s P r o g r a m m w e i t e r a r b e i t e n soll. Die A n w e i s u n g
STOP
b r i c h t Ihr P r o g r a m m a b u n d ü b e r g i b t die s i c h w i e d e r auf d e r K o n s o l e ( B i l d s c h i r m ) a u f f o r d e r t . H i n t e r d e m K e n n w o r t STOP e i n e N a c h r i c h t a u s fünf Z e i c h e n s t e h e n , sung a u s g e g e b e n w i r d . Bild 2 - 4 z e i g t die
Kontrolle an das B e t r i e b s s y s t e m , das m e l d e t und Sie zu w e i t e r e n E i n g a b e n kann d u r c h ein Leerzeichen g e t r e n n t die beim Erreichen der S T O P - A n w e i S T O P - A n w e i s u n g im A b l a u f p l a n .
Hinter der letzten Programmzeile steht die Anweisung
END
Alle auf die E N D - A n w e i s u n g f o l g e n d e n Z e i l e n w e r d e n vom C o m p i l e r n i c h t ü b e r s e t z t . F e h l t d a s E N D , so gibt d e r C o m p i l e r e i n e F e h l e r m e l d u n g a u s . D i e E N D A n w e i s u n g d a r f k e i n e S p r u n g m a r k e h a b e n , d e n n sie ist k e i n e S T O P - A n w e i s u n g für den Rechner, sondern eine Endemarke für den Compiler.
2 . 7 Die Struktur
der einfachen
Verarbeitungsschleife
35
2.7 Die Struktur der einfachen Verarbeitungsschleife B e t r a c h t e n wir das Programm Bild 2 - 4 und Bild 2 - 5 , so stellen wir f e s t , daß es aus den drei Programmblöcken "Lesen", "Rechnen" und "Ausgeben" b e s t e h t . Bild 2 - 6 zeigt die Struktur einer Folge von Programmblöcken.
Bild 2 - 6 :
Struktur einer Folge von Programmblöcken
Wenn wir die Formel mehrmals mit verschiedenen Eingabedaten durchrechnen wollten, so müßten wir e n t w e d e r das Programm Bild 2-5 mehrmals laden und s t a r t e n oder wir müßten das Programm ändern, indem wir die Befehlsfolge zum Lesen, Rechnen und Ausgeben mehrmals p r o g r a m m i e r e n . Eine bessere Lösung läßt die Befehlsfolge einfach mehrmals ausführen. Dies bezeichnet man als Schleife. Am Ende der mehrmals auszuführenden Befehle steht die Anweisung GOTO zurück zum ersten Befehl der Schleife. Der unbedingte Sprungbefehl GOTO wird im Ablaufplan durch eine Verbindungslinie mit Pfeil zum Sprungziel d a r g e s t e l l t . Bild 2 - 7 zeigt die Struktur einer Schleife ohne Abbruchbedingung. Das Programmbeispiel Bild 2 - 8 berechnet jetzt den Satz des Pythagoras in e i ner unendlichen Schleife für beliebig viele Eingabewerte. Aber wie kann man den Rechner nach dem Start des Programms wieder a n h a l ten? Dazu gibt es sehr brutale Methoden wie z.B. Eingabefehler machen, die zum Abbruch führen, besondere Abbruchkommandos des Betriebssystems eingeben oder den Netzstecker ziehen. Für uns kommt aber nur ein programm technisch einwandfreier Programmabbruch in F r a g e . Dazu geben wir auf der Konsole ein Sonderzeichen (z.B. CTRL und C)
36
2 Grundlagen des FORTRAN
(
Bild 2 - 7 :
C BILD 10
start)
A
A
B
B
C
C
Die S t r u k t u r e i n e r unendlichen S c h l e i f e
e-B UNENDLICHER PYTHAGDRAS UIRI T E C * , * ) ' A U N D B E I N G E B E N ' READ C *,*) A,B C - SDRT CA«»2 + B»*23 URITEC*,*) 'C-',C G O T O 10 END
B> T E S T A UND B EINGEBEN 1 2 C2.23606BO A UND B EINGEBEN 3 . 4. O 5.0000000 A UND B EINGEBEN 3 . E 4 4 .E4 O 50000.0000000 A UND B EINGEBEN "2 ?
E r r o r : ü p e r a t i o n e r r o r in f i l e U S E R Error Code 129B, S t a t u s 0003 PC - 0CA9: OOD4; SS - 115C, FP - EEDA,
SP
-
EEDC
B>
Bild 2 - 8 :
P r o g r a m m b e i s p i e l für e i n e u n e n d l i c h e S c h l e i f e
2.7 Die Struktur der einfachen
Verarbeitungsschleife
37
oder e i n B e t r i e b s s y s t e m k o m m a n d o ( z . B . /* oder @ E O F ) e i n . Zur A u s w e r t u n g d i e s e r E n d e m a r k e n müssen wir die R E A D - A n w e i s u n g um e i n e Sprungbedingung erweitern.
READ ( * , * , E N D = n )
Variablenliste
Erkennen die E i n g a b e - U n t e r p r o g r a m m e des B e t r i e b s s y s t e m s d i e E n d e m a r k e , so f ü h r t das P r o g r a m m e i n e n Sprung zu der A n w e i s u n g aus, d e r e n A n w e i s u n g s n u m mer h i n t e r d e m E N D = der R E A D - A n w e i s u n g s t e h t . B e f i n d e t sich an dieser S t e l l e e i n S T O P - B e f e h l , so w i r d das P r o g r a m m o r d n u n g s g e m ä ß b e e n d e t . Es ist j e d o c h auch m ö g l i c h , das P r o g r a m m mit w e i t e r e n E i n g a b e - , A u s g a b e - oder R e c h e n b e f e h l e n f o r t z u s e t z e n . Das f o l g e n d e B e i s p i e l v e r z w e i g t nach E i n g a b e d e r E n d e m a r k e zur A n w e i s u n g 20 und v e r a b s c h i e d e t sich dort mit d e r Meldung "AUF WIEDERSEHEN".
10
READ ( * , * ,
20
WRITE STOP
END = 20)
X, Y , Z
GOTO 10 (*,*)
'AUF WIEDERSEHEN'
In der Beschreibung Ihrer R e c h e n a n l a g e f i n d e n Sie das S o n d e r z e i c h e n o d e r das S t e u e r k o m m a n d o , das auf d i e E N D - B e d i n g u n g d e r R E A D - A n w e i s u n g w i r k t . S o l l t e Ihre R e c h e n a n l a g e d i e s e A b b r u c h m ö g l i c h k e i t nicht kennen, so müssen Sie die Abbruchbedingung durch e i n e n b e d i n g t e n S p r u n g b e f e h l selbst p r o g r a m m i e ren. In d e m f o l g e n d e n B e i s p i e l b e e n d e t d e r E i n g a b e w e r t X = 0 die S c h l e i f e . 10
20
Bild Bild goras einer
READ ( * , * ) X , Y , Z IF ( X . E Q . 0 . ) GOTO 20
G0T0 10 WRITE(*,*) STOP
'AUF WIEDERSEHEN'
2 - 9 z e i g t die Struktur e i n e r E i n g a b e s c h l e i f e m i t A b b r u c h b e d i n g u n g . In 2 - 1 0 f i n d e n Sie ein P r o g r a m m b e i s p i e l mit e i n e m T e s t l a u f , das den P y t h a so lange in e i n e r S c h l e i f e b e r e c h n e t , bis das P r o g r a m m durch die E i n g a b e Endemarke abgebrochen wird.
38
2 Grundlagen
des
FORTRAN
(
START
A solange
Daten
vorhanden
/
Ende ?
\
ja STOP
jCnein
B
Bild 2-9:
C BILD 10
20
Struktur einer Eingabeschleife mit Abbruchbedingung
2 - 1 0 PYTHAGORAS M I T ABBRUCHBEDINGUNG URITEC*,*) ' A UND B E I N G E B E N ' READ(* , * , END=20) A,B C - SDRT C A * * 2 + B * * 2 ) LJRITE C * , * ) 'C-'.C GOTO 10 STOP END
FB-TASTE
B> TEST A UND B EINGEBEN 3 4 C5.0000000 A UND B EINGEBEN 3. 4. CS.0000000 A UND B EINGEBEN 'Z Stop - Program terminated.
Bild 2-10:
P r o g r a m m b e i s p i e l einer Eingabeschleife mit Abbruchbedingung
Das f o l g e n d e Beispiel z e i g t Ihnen, daß bei der Auswertung von F o r m e l n auch andere Programmstrukturen e r f o r d e r l i c h sein können. Wenn Sie den Widerstand einer Drosselspule nach der F o r m e l Z = V r 2 + (2 • K • f • L)2
2.8
Übungen zum Abschnitt
Grundlagen
39
als Funktion der Frequenz b e r e c h n e n wollen, so müssen zunächst der Ohmsche Widerstand R und die Induktivität L bekannt sein, bevor die F o r m e l für verschiedene Frequenzen d u r c h g e r e c h n e t wird. Bild 2 - 1 1 zeigt ein P r o g r a m m b e i spiel, das zuerst R und L und dann erst die Frequenz in einer E i n g a b e s c h l e i f e liest. Stellen Sie zur Übung das S t r u k t o g r a m m und den Ablaufplan a u f !
C BILD e - 1 1 WIDERSTAND ALS FUNKTION DER FREQUENZ REAL L PI - 3 . 1 4 1 5 9 E 7 UJRITEC«,«) 'R IN OHM UND L IN HENRY EINGEBEN' READ(*,*) R , L 10 URITEC * , * ) 'F IN HZ EINBEBEN' READC»,*,END-PO) F Z - SQRTCR**B + C E . 0 * P I * F Ä L 3 * * 2 5 URITEC»,* 3 ' Z - ' , Z , ' C OHM) ' GOTO 10 20 STOP END B> TEST R IN OHM UND L IN HENRY EINGEBEN 1. 0.16 F IN HZ EINGEBEN 1 Z1 . 4 1 7 3 7 3 0 COHM) F IN HZ EINGEBEN 10
21 0 . 1 0 5 7 1 0 0 COHM) F IN HZ EINGEBEN 100 Z1 0 0 . 5 3 5 3 0 0 0 COHM) F IN HZ EINGEBEN 1000 Z1 0 0 5 . 3 1 0 0 0 0 0 (OHM) F IN HZ EINGEBEN "Z Stop
- Program
Bild 2 - 1 1 :
tsrminated.
Programmbeispiel Widerstand als Funktion der Frequenz
2.8 Übungen zum Abschnitt Grundlagen Der Abschnitt 11 e n t h ä l t für alle Aufgaben Lösungsvorschläge. 1. Aufgabe: Für den Durchmesser D einer Kugel b e r e c h n e t O b e r f l ä c h e M nach folgenden F o r m e l n : 6
man das Volumen V und die
M = jt • d 2
Lesen Sie in einer E i n g a b e s c h l e i f e m e h r e r e Durchmesser und geben Sie das Volumen V und die O b e r f l ä c h e M aus!
40
2 Grundlagen des
FORTRAN
2. Aufgabe: Den Widerstand Z einer Drosselspule berechnet man aus dem Ohmschen Widerstand R, der Induktivität L und der Frequenz f nach folgender Formel: Z= j/ R 2 + (2 • jt • f • L)2 Lesen Sie in einer Eingabeschleife jeweils einen Zahlenwert für R, L und f ein, berechnen Sie den Widerstand Z und geben Sie das Ergebnis aus. 3. Aufgabe: Wenn Sie als Baustatiker Träger dimensionieren wollen, so berechnen Sie die Auflagerkraft A (kp) und das Biegemoment M (kpm) aus der Last q (kp/m) und der Länge 1 (m) nach den Formeln A=9-i M = 9— 2 8 Schreiben Sie ein Programm, das in einer Eingabeschleife jeweils einen Zahlenwert für q und 1 einliest, daraus A und M berechnet und alle vier Zahlen mit ihren Maßeinheiten ausgibt. 4. Aufgabe: Sie wollen als Elektrotechniker den Verlauf des Stromes nach dem Einschalten einer RC-Schaltung berechnen nach der Formel i i = Lk . e ~ R ' c R Lesen Sie zunächst von einer Eingabezeile Werte für U in Volt, R in Ohm und C in Farad und geben Sie die eingegebenen Zahlen mit ihren Einheiten wieder Dann folgen beliebig viele Eingabezeilen mit einer Zeit t in Sekunden nach dem Einschalten, für die der Strom zu berechnen und auszugeben ist. Geben Sie bitte zusätzlich die Einheiten mit aus.
2.9 Die häufigsten Fehler Hoffentlich h a t t e n Sie die Gelegenheit, die Übungsprogramme auf einer Rechenanlage zu testen und hoffentlich haben Sie dabei Fehler gemacht; denn nur aus Fehlern kann man lernen. Die Fehlermeldungen des Compilers geben Ihnen Hinweise auf Verstöße gegen die Regeln der FORTRAN-Sprache, die Sie mit Hilfe des Editors korrigieren müssen. Die meisten Compiler unterscheiden zwischen Warnungen (warnings) und Fehlern (errors). Die Anweisungen dürfen erst ab Spalte 7 beginnen. Die Spalten 1 bis 5 nehmen ganze positive Anweisungsnummern auf. Ist die Spalte 6 nicht leer oder 0, so wird die Zeile als Fortsetzung der vorhergehenden angesehen.
2.9 Die häufigsten
Fehler
41
Schreibt man eine Anweisung über die Spalte 72 hinaus, so werden Zeichen der Spalten 73 bis 80 nicht b e a c h t e t , weil sie der Compiler als Kennungen ansieht. Der Compiler kontrolliert die Zahl der rechten und linken Klammerzeichen. Zwischen Klammern müssen Rechenzeichen wie z.B. das Multiplikationszeichen stehen, das man in der Mathematik o f t wegläßt. REAL-Konstanten müssen mit einem Dezimalpunkt anstelle eines Dezimalkommas geschrieben werden. Links vom Zuweisungszeichen = darf nur der Name einer Variablen stehen, der ein Wert zugewiesen wird. Es sind nur Zahlenrechnungen, keine Buchstabenrechnungen oder Umformungen von Gleichungen möglich. Beachten Sie genau der Schreibweise der Kennwörter und der von Ihnen gewählten Namen. Besorgen Sie sich zusätzlich das Handbuch des FORTRAN-Compilers der Rechenanlage, mit der Sie a r b e i t e n . Nur hier finden Sie die Einschränkungen und Erweiterungen gegenüber dem Standard "FORTRAN 77" dieses Buches. Schreiben Sie gegebenenfalls kleine T e s t p r o g r a m m e , um Unklarheiten in der Sprachbeschreibung aufzuhellen. Bei der Ausführung eines Programms können Fehlermeldungen des Betriebssystems auf der Konsole erscheinen. Diese b e t r e f f e n Division durch Null, Zahlenüberlauf oder Zahlenunterlauf und Fehler bei der Dateneingabe. Alle Buchstaben und Sonderzeichen (außer Vorzeichen) führen bei der Eingabe von Zahlen zu Fehlermeldungen. INTEGER-Zahlen werden ohne Dezimalpunkt eingegeben. REAL-Zahlen wahlweise mit oder ohne Dezimalpunkt oder in der dezimalen Exponenten-MantisseDarstellung. Der Kennbuchstabe E steht vor dem Exponenten zur Basis 10. Bei der listengesteuerten Eingabe ohne FORMAT muß mindestens ein Leerzeichen zwischen zwei Zahlen stehen; Leerzeichen zwischen den Ziffern einer Zahl sind nicht zulässig. Im schlimmsten Fall entstehen f e h l e r h a f t e Ergebnisse ohne Fehlermeldungen durch den Compiler oder das Betriebssystem. Die häufigsten Ursachen sind: Falsch p r o g r a m m i e r t e Formeln oder Rechenverfahren, fehlende Wertzuweisung an Variablen eines arithmetischen Ausdrucks und Mischung von REAL- und INTEGER-Größen und dadurch Abschneiden von Stellen hinter dem Dezimalpunkt. Lassen Sie Ihr Programm mit T e s t d a t e n laufen, die alle Möglichkeiten erfassen und rechnen Sie die Ergebnisse mit dem Taschenrechner nach. Aber auch dann noch können Ihre Programme Fehler bei der Verarbeitung enthalten.
3 Programmverzweigungen Der Abschnitt 2 z e i g t e Ihnen die e i n f a c h e n P r o g r a m m s t r u k t u r e n Folge und S c h l e i f e . Der R e c h n e r f ü h r t die Anweisungen in der R e i h e n f o l g e aus, in der sie im Programm a n g e o r d n e t sind. Aber der Rechner kann mehr als nur rechnen und Daten ü b e r t r a g e n ; er kann auch D a t e n miteinander vergleichen und dann e n t s c h e i d e n , welche Anweisungen er als n ä c h s t e a u s f ü h r t . Dieser Abschnitt zeigt Ihnen die F O R T R A N - A n w e i s u n g e n , mit denen Sie Vergleiche und V e r zweigungen p r o g r a m m i e r e n können.
3.1 Die Vergleichsoperationen Im m a t h e m a t i s c h e n und im täglichen Leben begegnen Ihnen Aussagen wie z.B. Wenn A gleich B, dann . . . Für X kleiner Null b e r e c h n e . . . Liegt das Bußgeld u n t e r 50 DM, dann . . . Bei einem Einkommen von mehr als 60 000 DM müssen Sie . . . Auf diese V e r g l e i c h e gibt e s nur zwei Anworten: Bei " j a " wird das g e t a n , was h i n t e r dem Vergleich s t e h t . Bei "nein" wird die hinter dem Vergleich stehende T ä t i g k e i t nicht a u s g e f ü h r t . In FORTRAN p r o g r a m m i e r e n wir diese Entscheidungen mit dem logischen IF.
IF( Vergleich )
Anweisung
Die hinter der K l a m m e r s t e h e n d e Anweisung wird nur dann a u s g e f ü h r t , wenn die in der K l a m m e r s t e h e n d e Vergleichsbedingung e r f ü l l t ist. Die m a t h e m a t i s c h e Aussagenlogik (Bool'sche Algebra) b e s c h ä f t i g t sich mit J a N e i n - E n t s c h e i d u n g e n . Der Abschnitt über logische Größen (LOGICAL) zeigt Ihnen, daß man diese Aussagen in Formeln fassen kann und daß man mit ihnen rechnen kann wie mit Z a h l e n . Für den Vergleich zweier a r i t h m e t i s c h e r Größen gibt es die folgenden V e r g l e i c h s o p e r a t i o n e n :
.EQ. .NE. .LT. .LE. .GE. .GT.
4
>
gleich ungleich kleiner als kleiner oder gleich größer oder gleich größer als
3.1 Die
Vergleichsoperationen
43
Die beiden Punkte gehören zur Vergleichsoperation und dürfen nicht fortgelassen werden. Das Ergebnis eines Vergleiches ist ein logischer Ausdruck, der e n t w e der " w a h r " oder " f a l s c h " ist. Sie können Variablen, Konstanten und a r i t h m e tische Ausdrücke miteinander vergleichen. In den folgenden Beispielen setzen wir die Vergleichsoperation in Klammern. (I.GE.K) (M+K.LE.100) (L.GT.LMAX) (I.EQ.1000)
( I g r ö ß e r oder g l e i c h K) (Summe vom M und K k l e i n e r oder g l e i c h 100) (L g r ö ß e r a l s LMAX) ( I N T E G E R - V a r i a b l e I g l e i c h INTEGER-Koristante
1000)
Wenn Sie reelle Größen auf Gleichheit oder Ungleichheit prüfen, so bedenken Sie b i t t e , daß bei R E A L - Z a h l e n Umwandlungs- und Rundungsfehler a u f t r e t e n können. Bei eingelesenen Werten können Sie direkt abfragen, bei berechneten Größen könnte es zweckmäßig sein, auf einen B e r e i c h oder eine relative Abweichung zu prüfen. Beispiele: READ(*,*) X I F ( X . E Q . 0 . ) STOP (D.LE.0.)
X lesen Für X = 0
STOP
(D k l e i n e r oder g l e i c h 0) A -
(ABS((A-B)/A).LT.1.E-6)
TEST REELLE ZAHL EINGEBEN 3. 3.0000000 PGSITIU REELLE ZAHL EINGEBEN
-3 .
REELLE ZAHL EINGEBEN 10.E10 1.000000E+011 POSITIU REELLE ZAHL EINGEBEN 'Z Stop - Program terminated.
Bild 3-2:
Beispiel f ü r eine einseitig bedingte Anweisung
Will man bei "Ja" mehr als eine Anweisung a u s f ü h r e n , so kommt man in die Versuchung, h i n t e r das IF e i n f a c h e i n e GOTO-Anweisung zu setzen, die zu der bei " j a " a u s z u f ü h r e n d e n Befehlsfolge f ü h r t . Bei ä l t e r e n F O R T R A N - C o m p i l e r n m u ß t e t a t s ä c h l i c h so v e r f a h r e n werden; moderne Compiler, die dem Standard FORTRAN 77 e n t s p r e c h e n , kennen das im n ä c h s t e n Abschnitt b e h a n d e l t e Block-IF.
3.3 Der Aufbau von Blockstrukturen durch das Block-IF Bitte p r ü f e n Sie zunächst in dem Handbuch Ihrer R e c h e n a n l a g e , ob Ihr F O R T R A N - C o m p i l e r schon das Block-IF k e n n t . Wenn nicht, dann müssen Sie alle Beispiele dieses Abschnitts mit dem logischen IF und dem unbedingten Sprung GOTO oder dem a r i t h m e t i s c h e n IF p r o g r a m m i e r e n . Die A b s c h n i t t e 3.4 und 3.5 l i e f e r n dazu Beispiele. Ein Block ist ein geschlossenes P r o g r a m m s t ü c k , das nur einen Anfang (Eingang) und ein Ende (Ausgang) b e s i t z t . Blöcke können aus einer Folge, einer Schleife oder e i n e r Alternative b e s t e h e n
46
3
Programmverzweigungen
Eine Folge besteht aus mehreren Anweisungen oder mehreren Blöcken, die nacheinander ausgeführt werden. Bild 2 - 6 zeigt die Struktur einer Folge. Eine Schleife besteht aus einem Block, der mehrmals ausgeführt wird. Bild 2 - 9 zeigt die Struktur einer Eingabeschleife mit Abbruchbedingung. Mit dem logischen IF ist es möglich, eine Anweisung nur dann auszuführen, wenn eine Bedingung erfüllt ist. Sie läßt sich auch auf Programmblöcke anwenden.
IF( logischer Ausdruck ) THEN B l o c k END IF
Der zwischen den Anweisungen IF...THEN und END IF stehende Block wird nur dann ausgeführt, wenn die Bedingung des logischen Ausdrucks erfüllt ist. Sonst wird die Anweisung bzw. der Block ausgeführt, der auf die Anweisung END IF folgt. Bild 3 - 3 zeigt die Struktur des bedingten Block-IF.
Bild 3 - 3 :
Die Struktur des bedingten Blocks
Ist die Bedingung des logischen Ausdrucks erfüllt, so werdender Block " A " und anschließend der Block " B " ausgeführt. Ist die Bedingung nicht erfüllt, so wird nur der Block " B " ausgeführt. Bild 3 - 4 zeigt ein Beispiel, das in einer Eingabeschleife reelle Zahlen liest und nur für positive Zahlen die Wurzel zieht und ausgibt.
47
3.3 Der Aufbau von Blockstrukturen durch das Block-IF
C BILD 10
50
B>TEST REELLE
3-4 BEDINGTER BLOCK URITEC*,•5 ' R E E L L E ZAHL E I N G E B E N ' READC»,*,END-20:> X I F C X . G T . 0 . 3 THEN Z - SQRTCXJ UJRITEC * , * ) ' WURZEL ,Z END I F GOTO 10 STOP END
ZAHL
EINGEBEN
ZAHL
5.0000000 EINGEBEN
ZAHL
10.0000000 EINGEBEN
ZAHL
EINGEBEN
4 WURZEL REELLE
100 WURZEL REELLE
-9 REELLE 1 . E3B WURZEL REELLE "Z Stop -
1.000000E+019 ZAHL EINGEBEN Program
Bild 3 - 4 :
terminated.
Programmbeispiel
für einen bedingten
Block
D a s B l o c k - I F l ä ß t s i c h m i t H i l f e d e r E L S E - A n w e i s u n g zur A l t e r n a t i v e e r w e i t e r n . B e i d i e s e r P r o g r a m m s t r u k t u r w i r d i m m e r nur e i n e r v o n z w e i B l ö c k e n a u s g e f ü h r t .
IF( logischer Ausdruck ) THEN B l o c k
A
ELSE B l o c k END
Ist
die
THEN
Bedingung
des
B
IF
logischen
Ausdrucks
e r f ü l l t , so
wird
der
und E L S E s t e h e n d e B l o c k a u s g e f ü h r t . Ist d i e B e d i n g u n g
zwischen
IF...
n i c h t e r f ü l l t , so
w i r d d e r z w i s c h e n E L S E und E N D IF s t e h e n d e B l o c k a u s g e f ü h r t . B i l d 3 - 5 z e i g t die Struktur der a l t e r n a t i v e n Ist
die
Bedingung des logischen IF e r f ü l l t , so wird erst der Block " A "
schließend die
Blöcke.
der
Block
" C " ausgeführt; der Block " B "
B e d i n g u n g n i c h t e r f ü l l t , so l a u t e t d i e R e i h e n f o l g e B l o c k " B " und
ßend
Block
"C",
beim
Wurzelziehen
unterscheidet.
aber
nicht
zwischen
Block
"A".
Bild
und a n -
w i r d n i c h t a u s g e f ü h r t . Ist anschlie-
3 - 6 zeigt ein T e s t p r o g r a m m ,
d e n F ä l l e n R a d i k a n d p o s i t i v und R a d i k a n d
das
negativ
48
3
Bild 3-5:
Programmverzweigungen
Die S t r u k t u r d e r a l t e r n a t i v e n B l ö c k e
C B I L D 3 - 6 ALTERNATIUE BLOECKE 10 UJRITE ( * , * ) 'REELLE ZAHL EINGEBEN' READC*,*,END-20) X I F C X . G E . O . ) THEN Z -= SQRTCX) U R I T E C * , ' R E E L L E UURZEL - ' , Z ELSE Z - SDRTCABSCX)) U R I T E C * , » ) ' IMAGINAERE WURZEL - ' END I F GOTO 10 50 STOP END B> TEST REELLE ZAHL EINGEBEN B1 . REELLE UURZEL = 9.0000000 REELLE ZAHL EINGEBEN -B1 . IPIAGINAERE WURZEL 3.0000000 REELLE ZAHL EINGEBEN +10000 REELLE UURZEL 100.0000000 REELLE ZAHL EINGEBEN -1.E-EO IMAGINAERE UURZEL 1.000000E-010 i REELLE ZAHL EINGEBEN "Z S t o p - Program t e r m i n a t e d .
Bild 3-6:
, Z
,
'
i "
i
Programmbeispiel für alternative Blöcke
Soll im P r o g r a m m z w i s c h e n m e h r als z w e i B l ö c k e n u n t e r s c h i e d e n w e r d e n , so s p r i c h t m a n von e i n e r Fallunterscheidung . Sie l ä ß t sich auf b e l i e b i g viele B l ö c k e a n w e n d e n . D a s B e i s p i e l z e i g t nur vier B l ö c k e .
3.3
Der Aufbau
von Blockstrukturen
IF( logischer Ausdruckl B l o c k
durch das
Block-IF
49
) THEN
A
ELSE IF( logischer Ausdruck2 ) THEN B l o c k
B
ELSE IF( logischer Ausdruck3 ) THEN B l o c k
C
ELSE B l o c k
D
END IF
Es wird nur d e r Block a u s g e f ü h r t , f ü r d e n d e r l o g i s c h e A u s d r u c k w a h r i s t , a l l e a n d e r e n B l ö c k e b l e i b e n u n b e r ü c k s i c h t i g t . A n s c h l i e ß e n d wird d e r Block a u s g e f ü h r t , d e r auf d a s END IF f o l g t . Ist k e i n e Bedingung e i n e s IF e r f ü l l t , so wird d e r B l o c k a u s g e f ü h r t , d e r auf d a s ELSE f o l g t . Sind d i e B e d i n g u n g e n m e h r e r e r l o g i s c h e r A u s d r ü c k e e r f ü l l t , so wird nur d e r Block a u s g e f ü h r t , d e r auf d e n ersten a l s w a h r e r k a n n t e n A u s d r u c k f o l g t , a l l e a n d e r e n e b e n f a l l s e r f ü l l t e n B l ö c k e w e r d e n nicht a u s g e f ü h r t . Die z u e r s t d e f i n i e r t e n B l ö c k e h a b e n also V o r r a n g . Bild 3- 7 zeigt die S t r u k t u r e i n e r F a l l u n t e r s c h e i d u n g .
Bedingung 1 Bedingung 2 Bedingung 3
A
B
c
keine Bedingung
D
E Bild 3-7:
Die S t r u k t u r e i n e r
Fallunterscheidung
In A b h ä n g i g k e i t von d r e i B e d i n g u n g e n w e r d e n e i n e r d e r d r e i B l ö c k e " A " o d e r " B " o d e r " C " und a n s c h l i e ß e n d d e r auf d i e F a l l u n t e r s c h e i d u n g f o l g e n d e Block " E " a u s g e f ü h r t . Ist k e i n e d e r d r e i B e d i n g u n g e n e r f ü l l t , so w e r d e n d e r Block " D " und a n s c h l i e ß e n d d e r Block " E " a u s g e f ü h r t . Bild 3-8 z e i g t e i n P r o g r a m m b e i s p i e l , d a s die F ä l l e " r e e l l e W u r z e l " , " i m a g i n ä r e W u r z e l " und " k e i n e W u r z e l "
50
S
Programmverzweigungen
unterscheidet. Da es keine v i e r t e Möglichkeit g i b t , wird der v i e r t e Block hinter dem ELSE nie ausgeführt. Er könnte den l e t z t e n bedingten I F - B l o c k e r s e t z e n oder aber e n t f a l l e n .
C BILD 10
20
B> T E S T REELLE
3 - 0 FALLUNTERSCHEIDUNG U R I TEC * , * ) ' R E E L L E ZAHL E I N G E B E N ' REfiDC*,*,END=203 X IFCX.GT.O.) THEN Z - SQRTCX) WRITEC»,») ' R E E L L E WURZEL Z E L S E I F C X . E Q . O . ) THEN Z 0. URITE C * , * } 'WURZEL N U L L ' , Z E L S E I F C X . L T . O . D THEN 2 - SQRT C A B S C X ) ) WRITEC*,«) ' I M A G I N A E R E UURZEL - ' , Z , ' ELSE URITE(*,*) ' D A R F N I C H T E R R E I C H T WERDEN' END I F GOTO 1 0 STOP END
ZAHL
i '
EINGEBEN
9. REELLE REELLE
UURZEL ZAHL EINGEBEN
3.0000000
0. WURZEL N U L L 0.OOOOOOE+OOO REELLE ZAHL EINGEBEN -S . I M A G I N A E R E WURZEL REELLE ZAHL EINGEBEN ~Z Stop - Program terminated.
Bild 3-8:
3.0000000
i
Programmbeispiel für eine Fallunterscheidung
A l t e r n a t i v e n und Fallunterscheidungen lassen sich schachteln. Bild 3 - 9 z e i g t die Struktur einer g e s c h a c h t e l t e n Fallunterscheidung, mit der die L a g e eines Punktes im Koordinatensystem bestimmt wird. In dem Beispiel unterscheidet die erste Stufe die X - K o o r d i n a t e , die z w e i t e S t u f e die Y - K o o r d i n a t e . Es ist aber auch eine andere Struktur möglich, die zuerst die Y - K o o r d i n a t e und dann die X - K o o r d i n a t e n unterscheidet. Blöcke, die ausgeführt werden, wenn keine Bedingung e r f ü l l t ist, sind in dem Beispiel nicht vorgesehen.
Für die F O R T R A N - P r o g r a m m i e r u n g der in Bild 3 - 9 g e z e i g t e n Struktur gibt es mehrere M ö g l i c h k e i t e n , von denen nur z w e i als Beispiel ausgeführt werden s o l len. Bild 3-10 z e i g t ein Programmbeispiel, das mit geschachtelten F a l l u n t e r scheidungen a r b e i t e t . Zur besseren Lesbarkeit sind die Blöcke eingerückt.
3.3 Der Aufbau von Blockstrukturen durch das Block-IF
G
Y > u"
D ~\>—
—
9
-6
r
(h--
Die Struktur einer g e s c h a c h t e l t e n Fallunterscheidung
Bild 3 - 9 :
C BILD 10
X
3 - 1 0 GESCHACHTELTE BLOECKE UJRI T E C * , * 3 ' K O O R D I N A T E N X UND READ C * , * , E N D = 2 0 3 X , Y IFCX.GT.0.3 THEN IFCY.GT.0.3 THEN UJR I T E C * , * 3 ' L A G E A i n ELSE IFCY.EQ.O.3 THEN UJR I T E ( * , * 3 ELSE
'LAGE
B
UIRI T E C * , * 3 ' L A G E C END IF ELSE I F C X . E Q . 0 . 3 THEN IFCY.GT.0.3 THEN
AUF IM
UJR I T E C * , * 3 ' L A G E D A U F ELSE IFCY.EQ.O.3 THEN UJR I T E C * , * 3 ELSE
'LAGE
E
In
UJRI T E C * , * 3 ' L A G E END IF ELSE IFCY.GT.0.3 THEN
F
AUF
1.
Y
QUADRANTEN'
POS. 4.
EINGEBEN'
X-ACHSE'
QUADRANTEN'
POS.
Y-ACHSE'
NULLPUNKT' NEG .
Y-ACHSE'
UIRI T E C * , * 3 ' L A G E G i n 2 . QUADRANTEN' ELSE IFCY.EQ.O.3 THEN UIR I T E C * , * 3 ' L A G E H A U F N E G . X-ACHSE' ELSE UJR I T E C * , * 3 ' L A G E I in 3. QUADRANTEN' END IF END IF GOTO 10 STOP
20
END B> T E S T KOORDINATEN 1 1 LAGE
A
IM
Bild 3 - 1 0 :
X
1.
UND
Y
EINGEBEN
QUADRANTEN
Programmbeispiel einer g e s c h a c h t e l t e n Blockstruktur
Y = 0
51
Y< 0
52
3
Programmverzweigungen
Die Auswahl der in Bild 3 - 9 gezeigten neun Blöcke e r f o l g t durch die beiden Auswahlgrößen X und Y. Im Abschnitt 3.1 haben wir gesehen, daß sich a r i t h m e tische V e r g l e i c h e durch das logische UND (.AND.) und das logische ODER (.OR.) verknüpfen lassen. Deshalb zeigt das Programmbeispiel Bild 3 - 1 1 eine Lösung, die zwei a r i t h m e t i s c h e Vergleiche d u r c h .AND. v e r k n ü p f t . Da jeder Block nur aus einer WRITE-Anweisung b e s t e h t , wurde in dem Beispiel die e i n seitig b e d i n g t e Anweisung (logisches IF) a n s t e l l e der Fallunterscheidung (Block-IF) verwendet. C BILD 3 - 1 1 LOGISCH UERKNUEPFTE BEDINGUNGEN URITEC« »3 •KOORDINATEN X UND Y EINGEBEN' READC •,*,END=g03 X Y IFCX GT 0 . .AND. Y GT 0 UIRI TE C ** 3 ' 1 . QUADRANT' I FC X GT 0 . .AND . Y ED 0 3 ÜJRITEC« •3 'POS. X-ACHSE IFCX GT 0 . .AND. Y LT 0 3 URITEC* »3 ' 4 . QUADRANT' IFCX EO 0 . • AND . Y GT 0 3 U)R I TE C *•3 'POS. Y-ACHSE IFCX EQ 0 . .AND. Y ED 0 3 UIR I TE C *«3 'NULLPUNKT' IFCX ED 0 . .AND. Y LT 0 3 URITEC* «3 'NEG. Y-ACHSE IFCX LT 0 . .AND . Y GT 0 3 UIR I TE C *»3 ' 5 . QUADRANT' IFCX LT 0 . .AND . Y EQ 0 3 UIR I TE C ** 3 'NEG. X-ACHSE IFCX LT 0 . .AND. Y LT 0 3 UIR I TE C *»3 ' 3 . QUADRANT' GOTO 10 50 STOP END B> TEST KOORDINATEN X UND Y EINGEBEN 1. 1. 1. QUADRANT Bild 3-11:
Programmbeispiel logisch v e r k n ü p f t e r Bedingungen
3.4 Programmverzweigungen mit dem arithmetischen IF Die ä l t e s t e bedingte Sprunganweisung in der G e s c h i c h t e des FORTRAN ist das a r i t h m e t i s c h e IF, das einen a r i t h m e t i s c h e n Ausdruck auf kleiner Null (negativ), gleich Null und größer Null (positiv) u n t e r s u c h t . Entsprechend dem Ergebnis wird zu einem von drei Zielen gesprungen. Diese Art der Verzweigung k o m m t der A r b e i t s w e i s e des Rechners am n ä c h s t e n , der nur die Maschinenbefehle "Springe bei negativ", "Springe bei Null" und "Springe bei positiv" k e n n t . Der F O R T R A N - C o m p i l e r muß also das logische IF und das Block-IF durch R e c h e n o p e r a t i o n e n (z.B. Differenzbildung) auf diese drei G r u n d b e f e h l e z u r ü c k f ü h r e n .
IF( a r i t h m e t i s c h e r Ausdruck )
n1 , n2 , n3
Der a r i t h m e t i s c h e Ausdruck kann b e s t e h e n aus einer Variablen oder aus einer a r i t h m e t i s c h e n Verknüpfung von Variablen, K o n s t a n t e n und Funktionen. Die Sprungziele sind Anweisungsnummern, die im Programm als Sprungmarken in
3.4 Programmverzweigungen mit dem arithmetischen
IF
53
den S p a l t e n 1 bis 5 e i n e r P r o g r a m m z e i l e d e f i n i e r t sein müssen. S i e können vor oder h i n t e r dem IF l i e g e n . Die R e i h e n f o l g e der Sprungziele in der L i s t e ist festgelegt. Das 1. Sprungziel n l Ausdruck n e g a t i v i s t .
wird angesprungen
für den F a l l , d a ß der
arithmetische
Das 2. Sprungziel n2 wird angesprungen Ausdruck Null i s t .
für den F a l l , daß der
arithmetische
Das 3 . Sprungziel n 3 wird angesprungen für den F a l l , d a ß der Ausdruck positiv a b e r u n g l e i c h Null i s t .
arithmetische
M e h r e r e A u s g ä n g e d ü r f e n auf e i n e A n w e i s u n g s n u m m e r g e f ü h r t w e r d e n . Kann e i n e r der drei F ä l l e mit S i c h e r h e i t n i c h t a u f t r e t e n , so darf die A n w e i s u n g s n u m mer e n t f a l l e n ; das K o m m a muß als T r e n n z e i c h e n e r h a l t e n b l e i b e n . Wenn S i e zwei R E A L - G r ö ß e n a u f G l e i c h h e i t p r ü f e n , so b e a c h t e n Sie b i t t e , d a ß U m w a n d lungs- und R u n d u n g s f e h l e r a u f t r e t e n können. U n t e r s u c h e n S i e in d i e s e m F a l l den A b s o l u t w e r t der r e l a t i v e n A b w e i c h u n g ! B e i s p i e l e für das a r i t h m e t i s c h e I F : IF (I) 10,20,30
Es wird die Variable I untersucht
IF (I - 5) 4 0 , 3 0 , 1 0
Es w i r d
I auf k l e i n e r , g l e i c h . g r ö ß e r 5 untersucht
Das f o l g e n d e B e i s p i e l v e r g l e i c h t die R E A L - V a r i a b l e n XO und X I auf 3 S t e l l e n : IF (ABS((X0-X1)/X1) - 1.0E-3)
100 , 100
, 200
Das Bild 3 - 1 2 zeigt die S t r u k t u r d e s a r i t h m e t i s c h e n I F . Es l i e f e r t lediglich S p r u n g z i e l e , a b e r k e i n e K o n t r o l l e d e r F a l l u n t e r s c h e i d u n g wie das B l o c k - I F . D a h e r g e h ö r t an das Ende j e d e s B l o c k e s ein u n b e d i n g t e r S p r u n g b e f e h l G O T O , der an das E n d e der F a l l u n t e r s c h e i d u n g s p r i n g t .
Bild 3 - 1 2 :
Die S t r u k t u r des a r i t h m e t i s c h e n IF
54
3 Programmverzweigungen
Das P r o g r a m m b e i s p i e l Bild 3 - 1 3 u n t e r s u c h t e i n e r e e l l e Zahl auf d i e d r e i F ä l l e n e g a t i v , Null und positiv, z i e h t d i e Wurzel und g i b t d a s E r g e b n i s a u s . Die g l e i c h e A u f g a b e h a t t e n wir im Bild 3 - 8 mit d e m B l o c k - I F g e l ö s t . Die v o r l i e g e n d e L ö s u n g m i t d e m a r i t h m e t i s c h e n IF g e h o r c h t d e r s t r e n g e n R e g e l d e r S t r u k t u r i e r t e n P r o g r a m m i e r u n g , d a ß e i n Block nur e i n e n E i n g a n g und e i n e n A u s g a n g h a b e n d a r f und f ü h r t d i e A u s g ä n g e a l l e r d r e i P r o g r a m m z w e i g e auf d i e A n w e i sung 50. Als " u n s t r u k t u r i e r t e r " P r o g r a m m i e r e r w ü r d e n Sie d i e A n w e i s u n g 50 w e g l a s s e n und am E n d e a l l e r d r e i P r o g r a m m z w e i g e zur M a r k e 10 s p r i n g e n , a l s o G O T O 10 s t a t t G O T O 50. D a f ü r w ü r d e m a n Sie als " S p a g h e t t i " - P r o g r a m m i e r e r bezeichnen. C BILD 10
20
30
40
50 60
B> T E S T REELLE 4 REELLE
3-13 AR I T H M E T I S C H E S IF UJRITE C * , * ) ' R E E L L E ZAHL E I N G E B E N ' READC * , * , E N D - 6 0 ) X I FC X 3 2 0 , 3 0 ,40 2 = SDRT C ABS( X ) ) WRITEC*, *) ' I MAG I N A E R E W U R Z E L , GOTO 5 0 Z0. IJRITE C * , * ) ' WURZEL N U L L ' , Z GOTO 5 0 Z - SQRTCXD WRITEC«,*) ' R E E L L E WURZEL , Z GOTO 5 0 GOTO 1 0 STOP END
ZAHL
,
'
i'
EINGEBEN
WURZEL
Bild 3 - 1 3 :
Z
-
2.0000000
P r o g r a m m b e i s p i e l F a l l u n t e r s c h e i d u n g m i t d e m a r i t h m e t i s c h e n IF
3.5 Programmverzweigungen mit dem GOTO-Befehl F ü r a l l e A n h ä n g e r d e r S t r u k t u r i e r t e n P r o g r a m m i e r u n g ist d e r B e f e h l GOTO r o t e s T u c h , d e n n e r v e r l e i t e t d e n P r o g r a m m i e r e r , P r o g r a m m e zu e n t w e r f e n , d e n e n d i e P r o g r a m m z w e i g e u n g e o r d n e t und u n ü b e r s i c h t l i c h a n g e o r d n e t sind S p a g h e t t i auf d e m T e l l e r . L e i d e r g e h t es in F O R T R A N n i c h t ganz ohne u n b e d i n g t e n Sprung G O T O zu e i n e r M a r k e , die als p o s i t i v e g a n z e Z a h l in S p a l t e n 1 bis 5 d e s S p r u n g z i e l s s t e h t .
GOTO
ein bei wie den den
Sprungmarke
Der u n b e d i n g t e S p r u n g wird o f t z u s a m m e n mit d e m l o g i s c h e n IF d a z u b e n u t z t , P r o g r a m m Verzweigungen zu p r o g r a m m i e r e n . Bei " j a " wird g e s p r u n g e n , b e i " n e i n " wird d i e auf d a s IF f o l g e n d e A n w e i s u n g a u s g e f ü h r t . Wir w o l l e n d i e s e K o m b i n a tion als bedingten Sprungbefehl bezeichnen.
3.5 Programmverzweigungen mit dem GOTO-Befehl
55
IF( logischer Ausdruck ) GOTO Sprungmarke Anweisung
Bild 3 - 1 4 zeigt den Aufbau einer A l t e r n a t i v e mit Hilfe des bedingten Sprungb e f e h l s . Am Ausgang j e d e s B l o c k s s t e h t wieder ein G O T O - B e f e h l , der auf den g e m e i n s a m e n Ausgang des A l t e r n a t i v - B l o c k s führt.
Bild 3 - 1 4 :
Aufbau einer Alternative
mit dem b e d i n g t e n
Sprungbefehl
Mit m e h r e r e n b e d i n g t e n S p r u n g b e f e h l e n l a s s e n s i c h n a c h dem g l e i c h e n M u s t e r Fallunterscheidungen aufbauen. Dabei sollte man die bedingten Sprünge m ö g l i c h s t z u s a m m e n f a s s e n und d i e A u s g ä n g e a l l e r B l ö c k e a u f e i n g e m e i n s a m e s Sprungziel f ü h r e n , das am Ende der F a l l u n t e r s c h e i d u n g s t e h t . Bild 3 - 1 5 zeigt a l s B e i s p i e l d i e U n t e r s u c h u n g e i n e r r e e l l e n Z a h l a u f p o s i t i v , n e g a t i v und N u l l . D i e s e A u f g a b e h a b e n w i r s c h o n m i t d e m B l o c k - I F ( B i l d 3 - 8 ) und d e m a r i t h m e t i s c h e n IF (Bild 3 - 1 3 ) g e l ö s t . Auch die vorliegende Lösung mit b e d i n g t e n S p r u n g b e f e h l e n e n t h ä l t g a n z im S i n n e d e r S t r u k t u r i e r t e n P r o g r a m m i e r u n g e i gentlich überflüssige Sprunganweisungen, die das P r o g r a m m ü b e r s i c h t l i c h e r m a chen. Versuchen Sie doch einmal eine kürzere, aber " u n s t r u k t u r i e r t e " Lösung! M i t H i l f e d e s b e r e c h n e t e n G O T O ist e s m ö g l i c h , m i t e i n f a c h e n F a l l u n t e r s c h e i d u n g f ü r e i n e I N T E G E R - G r ö ß e zu p r o g r a m m i e r e n .
GOTO ( n1 , n2 , n3 , . .
nk ) , i
Mitteln
eine
56
C BILD 10
20
30
40
50 60
B> T E S T REELLE S REELLE REELLE
0
WURZEL
3
Programmverzweigungen
3-15 BEDINGTE SPRUNGBEFEHLE W R I T E C * , * J ' R E E L L E ZAHL E I N G E B E N ' READ C * , * , E N D - 6 0 ) X I F C X . L T . O . ) GOTG 5 0 I F C X . E Q . O . 3 GOTO 3 0 I F C X . B T . 0 . 3 GOTO 4 0 GOTO 5 0 Z - SQRTCABSCX) ) WRITEC«,«) ' I MAG I N A E R E WURZEL - ' , GOTO 5 0 Z0. WRITEC*,*) 'WURZEL GOTO 5 0 Z SQRTCX) WRITEC*,*) 'REELLE GOTO 5 0 GOTO 1 0 STOP END
ZAHL
Bild 3 - 1 5 :
WURZEL
,
,
'
i'
Z
,
2
EINGEBEN
WURZEL ZAHL E I N G E B E N NULL
NULL'
Z
3.0000000
0.OOOOOOE+OOO
P r o g r a m m b e i s p i e l F a l l u n t e r s c h e i d u n g mit b e d i n g t e n Sprüngen
H i n t e r d e m GOTO s t e h t e i n e K l a m m e r mit e i n e r L i s t e von m ö g l i c h e n S p r u n g z i e len ( M a r k e n ) . Hinter der K l a m m e r s t e h t ein a r i t h m e t i s c h e r A u s d r u c k vom Typ I N T E G E R ; d a s K o m m a z w i s c h e n K l a m m e r und Ausdruck kann e n t f a l l e n . Der Wert d e r I N T E G E R - G r ö ß e e n t s c h e i d e t , zu welchem Ziel g e s p r u n g e n wird.
Für i = 1 Sprung zur 1. Marke Für i = 2 Sprung zur 2. Marke Für i = 3 Sprung zur 3. Marke Für i = k Sprung zur k. Marke Die S p r u n g m a r k e n sind positive ganze Z a h l e n , die in d e n S p a l t e n 1 bis 5 der Sprungziele e r s c h e i n e n m ü s s e n . Es b e s t e h t kein Z u s a m m e n h a n g zwischen dem Z a h l e n w e r t der I N T E G E R - G r ö ß e n und der N u m m e r d e s Sprungziels, e n t s c h e i d e n d ist die Position d e s Sprungziels in der L i s t e . Ist der I N T E G E R - A u s d r u c k n e g a tiv, Null oder größer als die Anzahl der v e r e i n b a r t e n Sprungziele, so kann der Sprung nicht a u s g e f ü h r t w e r d e n , weil kein Sprungziel vorhanden i s t . Um F e h l e r a b b r ü c h e während der V e r a r b e i t u n g zu v e r m e i d e n , sollte m a n vor dem b e r e c h n e t e n G O T O den zulässigen B e r e i c h der Sprungziele ü b e r p r ü f e n . Das f o l g e n d e Beispiel verlangt die Eingabe e i n e r I N T E G E R - Z a h l vor» 1 bis 4 und verzweigt in vier P r o g r a m m b l ö c k e ; d e r F e h l e r f a l l wird vorher a b g e f r a g t .
3.5 Programmverzweigungen
mit dem GOTO-Befehl
57
C BILD 3-16 FALLUNTERSCHEIDUNG BERECHNETES GDTO 10 WRITEC* *3 '2AHL UON 1 BIS 4 EINGEBEN' READC*, END-BO 3 I IFCI.LE 0 •OR. I.GT.43 GOTO 60 GOTO C BO, 30 , 40 , 503 , I 80 WRITEC* *3 'EINS' GOTO 70 30 WRITEC* •3 'ZWEI ' GOTO 70 40 WRITEC» * 3 'DREI ' GOTO 70 SO WRITEC« * 3 ' UI ER' GDTO 70 60 WRITEC* * 3 'FEHLER' GDTO 70 70 GOTO 10 80 WRITEC* * 3 'AUF WIEDERSEHEN' STOP END B> TEST 2AHL UON 1 BIS 4 EINGEBEN 1 EINS Bild 3-16:
Programmbeispiel Fallunterscheidung mit dem b e r e c h n e t e n GOTO
Das b e r e c h n e t e GOTO eignet sich f ü r die Programmierung eines Bildschirmdialogs. Dem Benutzer werden in einem "Menü" m e h r e r e Möglichkeiten a n g e b o t e n , von denen er durch Eingabe einer Kennzahl eine a u s w ä h l t . Das zugeordnete GOTO hat keine große p r a k t i s c h e Bedeutung. Zunächst weist man mit einer ASSIGN-Anweisung einer Schaltervariablen eine Sprungmarke zu.
ASSIGN
Sprungmarke TO
Schaltervariable
Der Schaltervariablen können im Programm beliebige Sprungziele zugewiesen werden. Der l e t z t e Wert des Schalters b e s t i m m t das Sprungziel.
GOTO
Schaltervariable , ( Liste möglicher Sprungmarken )
Das Komma zwischen dem N a m e n der Schaltervariablen und der Liste möglicher Sprungmarke kann e n t f a l l e n . Mit dem zugeordneten GOTO können wie mit dem b e r e c h n e t e n GOTO Verzweigungen p r o g r a m m i e r t w e r d e n , bei denen das Sprungziel erst während des P r o g r a m m l a u f e s b e s t i m m t wird. Einige Compiler verlangen, daß die Schaltervariable vom Typ INTEGER sein muß. In dem folgenden Beispiel wird der Schaltervariablen MARKE das Sprungziel 30 zugewiesen. D a r a u f h i n springt der z u g e o r d n e t e G O T O - B e f e h l zur Anweisung 30. Es ist nicht
58
3
Programmverzweigungen
möglich, den Wert der S c h a l t e r v a r i a b l e n mit e i n e r a r i t h m e t i s c h e n b e r e c h n e n zu l a s s e n .
Anweisung
ASSIGN 30 TO MARKE GOTO MARKE ,
(10,20,30,40,50)
3.6 Übungen zum Abschnitt Programmverzweigungen Der Abschnitt 11 e n t h ä l t f ü r a l l e Aufgaben Lösungsvorschläge! 1. A u f g a b e : F ü r die Kennlinie e i n e r Diode g e l t e n f o l g e n d e B e r e i c h e : F ü r U k l e i n e r / g l e i c h 0 Volt ist I = 0 Für U im B e r e i c h größer Null und kleiner 1 Volt ist I = 0.001 * U F ü r U g r ö ß e r / g l e i c h 1 Volt ist I = 0.1 * U Man e n t w i c k l e ein F O R T R A N - P r o g r a m m , das in einer L e s e s c h l e i f e Spannungen liest und d e n Strom b e r e c h n e t und a u s g i b t . 2. A u f g a b e : F ü r die A u s g a n g s s p a n n u n g e n von T T L - B a u s t e i n e n g e l t e n f o l g e n d e B e r e i c h e : U U U U U
negativ: v e r b o t e n positiv kleiner 0.4 V o l t : LOW positiv g r ö ß e r / g l e i c h 0.4 Volt und k l e i n e r / g l e i c h 2.4 V o l t : v e r b o t e n positiv g r ö ß e r 2.4 Volt und k l e i n e r / g l e i c h 5 Volt: HIGH positiv g r ö ß e r 5 Volt: v e r b o t e n
Man e n t w i c k l e ein F O R T R A N - P r o g r a m m , das in e i n e r L e s e s c h l e i f e Spannungen liest und e i n e Meldung über den Zustand des Ausgangs a u s g i b t .
(V) ' .0
verboten HIGH
.4 -1 verboten .4
H
LOW
r
verboten
3.6
Übungen zum Abschnitt
Programmverzweigungen
59
3. Aufgabe: Man entwickle ein Programm, das in einer Eingabeschleife jeweils zwei n a c h einander aufgenommene reelle Meßwerte liest, die Differenz bildet und auswertet. Ist die Differenz positiv, so erscheine die Meldung: " S T E I G E N D " Ist die Differenz negativ, so erscheine die Meldung: " F A L L E N D " Ist die Differenz Null, so erscheine die Meldung: "GLEICH " Zusatzaufgabe: Man lese jeweils nur einen Meßwert und berechne die Differenz zum vorher eingegebenen Meßwert.
4. Aufgabe: Für die Berechnung einer Funktion soll zunächst durch einen Bildschirmdialog eine von drei Formeln ausgewählt werden. Formel 1: Y = 2 . 0 * X oder Formel 2 : Y = X * * 2 oder Formel 3: Y = 0 . 5 * X * * 3 Für die ausgewählte Formel sind in einer Eingabeschleife mehrere X - W e r t e zu lesen und daraus die Y - W e r t e zu berechnen und auszugeben. 5. Aufgabe: Eine Übertragungsschaltung habe folgendes Verhalten: Für negative Eingangsspannungen sei die Ausgangsspannung Null Für Eingangsspannungen von 0 bis 1 Volt sei die Kennlinie linear Für Eingangsspannungen von 1 bis 10 Volt sei die Kennlinie quadratisch Für Eingangsspannungen über 10 Volt sei die Ausgangsspannung auf 100 Volt begrenzt. Man entwickle ein F O R T R A N - P r o g r a m m , das in einer Eingabeschleife Eingangsspannungen liest und die Ausgangsspannung berechnet und ausgibt. Uo (y)
y = 100 ycO 1 V
10 V
(x)
4 Programmschleifen Eine S c h l e i f e b e s t e h t a u s einem P r o g r a m m b l o c k , der m e h r m a l s a u s g e f ü h r t wird. Zu der b e r e i t s b e k a n n t e n E i n g a b e s c h l e i f e z e i g t Ihnen d i e s e r A b s c h n i t t die S t r u k t u r d e r Z ä h l - und N ä h e r u n g s s c h l e i f e n .
4.1 Die Eingabeschleife Zähler N und Summe SUM löschen Meßwert
X
lesen
solange Daten vorhanden summieren zählen
SUM =
SUM + X
N = N + 1
Mittelwert berechnen und ausgeben
STOP
C B I L D 4-1 EINEABESCHLEIFE UND MITTELWERT W R I T E C * , « ) 'WERTE AUF NEUER Z E I L E E I N G E B E N ' N - 0 S U M - 0. 10 READC«,»,END-20) X SUM = SUM + X N - N + 1 G O T O 10 W M I TT - S U M / F L D A T ( N ) SO U I R I T E C » , » ) ' M I T T E L - ' ,UMITT, ' B E I ' . N , ' WERTEN' STOP END
Bild 4 - 1 :
S t r u k t u r und Beispiel einer E i n g a b e s c h l e i f e
Bild 4 - 1 z e i g t die S t r u k t u r d e r E i n g a b e s c h l e i f e , mit der wir D a t e n g e l e s e n , b e r e c h n e t und a u s g e g e b e n h a b e n . Der e r s t e Teilblock " D a t e n l e s e n " wird i m m e r a u s g e f ü h r t . Der z w e i t e Teilblock " D a t e n b e r e c h n e n und a u s g e b e n " wird nur a u s g e f ü h r t , wenn g ü l t i g e D a t e n e i n g e g e b e n w u r d e n . Dann folgt wieder der e r s t e Teilblock " D a t e n l e s e n " . Wird während der P r o g r a m m a u s f ü h r u n g a n s t e l l e g ü l t i ger D a t e n eine e n t s p r e c h e n d e S t e u e r a n w e i s u n g e i n g e g e b e n , so ist die L a u f b e d i n gung n i c h t e r f ü l l t ; die S c h l e i f e wird a b g e b r o c h e n , und es f o l g t die A u s f ü h r u n g d e s auf d i e S c h l e i f e f o l g e n d e n Blockes. A n s t e l l e d e s S T O P - B e f e h l s k ö n n t e n w e i t e r e Blöcke f o l g e n .
4.2 Der Aufbau von Zählschleifen
mit der DO-Anweisung
61
4.2 Der Aufbau von Zählschleifen mit der DO-Anweisung Bei einer Zählschleife liegt die Anzahl der Schleifendurchläufe bereits vor dem Eintritt in die Schleife f e s t . Als Beispiel b e t r a c h t e n wir die Aufgabe, den Widerstand einer Drosselspule für Frequenzen von 45 Hz bis 55 Hz mit der S c h r i t t w e i t e 1 Hz zu berechnen. Die Formel lautet: Z = YR2 + (2 • Ii • f • L)2 Der Ohmsche Widerstand der Spule und ihre Induktivität seien während der Berechnung konstant. Anstatt wie im Bild 2-11 die Frequenzen einzulesen, wollen wir sie durch das Programm erzeugen lassen. In der Umgangssprache würden wir sagen:
Für Werte von 45 bis 55 mit der Schrittweite 1
berechne
Die DO-Schleife des FORTRAN g e s t a t t e t eine einfache Programmierung von Schleifen, für die die L a u f p a r a m e t e r Anfangswert, Endwert und Schrittweite bekannt sein müssen:
DO Endemarke Laufvariable = anf , end , schritt
DO ist das Kennwort für tue. Die Endemarke ist eine Marke (Anweisungsnummer), die das Ende. Schleifenblocks kennzeichnet. Die Laufvariable ist eine Variable, die innerhalb der Schleife alle Werte vom Anfangswert bis zum Endwert a n n i m m t . anf
ist eine Konstante oder Variable mit dem Anfangswert.
end
ist eine Konstante oder Variable mit dem Endwert.
schritt
ist eine Konstante oder Variable mit der Schrittweite.
An das Ende des Schleifenblocks kann die Anweisung CONTINUE gesetzt w e r den, die in den Spalten 1 bis 5 die Endemarke der DO-Schleife e n t h ä l t . CONTINUE ist eine Anweisung, die lediglich als Sprungmarke' oder Endemarke dient. Sie hat keinen Einfluß auf die Ausführung des Programms.
Marke
CONTINUE
62
4
Programmschleifen
Bild 4 - 2 z e i g t nun a l s B e i s p i e l für e i n e D O - S c h l e i f e mit k o n s t a n t e n L a u f p a r a m e t e r n die B e r e c h n u n g e i n e r D r o s s e l im B e r e i c h von 45 bis 55 Hz m i t d e r S c h r i t t w e i t e 1. Mit R ü c k s i c h t a u f ä l t e r e F O R T R A N - V e r s i o n e n , d i e a l s L a u f v a r i a b l e und L a u f p a r a m e t e r nur I N T E G E R - G r ö ß e n z u l a s s e n , wurde die F r e q u e n z F zu I N T E G E R e r k l ä r t . C BILD 4 - 2 DO-SCHLEIFE MIT KONSTANTEN LAUFPARAMETERN REAL L INTEGER F PI - 3 . 1 4 1 5 3 2 7 U R I T E C * , * ) "R COHM) L C HENRY EINBEBEN' READ ( * , * ) R , L DO 10 F - 4 5 , 5 5 , 1 2 - SQRT( R * * 2 + C 2 . 0 * P I * F L 0 A T ( F ) * L ) * * 2 ) LdRITEC * , * 3 ' F C H Z ) - ' , F , " 2 COHMJ-'.Z 10 CONTINUE STOP END B> TEST R C0HH3 L C HENRY) EINGEBEN 10 0.16 F CH2345 2 C0HM)= 45 2 COHM)F CHZ347 2 COHM)F CHZ) = 2 coHm» F CH2D4B 2 C0HM)= F CH23 = 43 50 2 C0Hn3= F CH2)F CH2351 2 C DHU 5 = F CH2) = 52 2 COHM)2 coHroF CH2) = 53 54 2 COHn3= F CH23F C H2 ) = 55 2 C0HM)= S t o p - Program t e r m i n a t e d .
Bild 4 - 2 :
45 . 3 3 0 9 3 0 0 47 . 3 1 3 1 1 0 0 48 . 2 3 6 1 7 0 0 43 .2B01400 50 . 2 6 4 3 5 0 0 51 . 2 5 0 5 5 0 0 5 2 .. 2 3 6 3 0 0 0 53 . 2 2 3 3 6 0 0 54 . 2 1 1 7 0 0 0 55 . 2 0 0 0 7 0 0 56 .1B30400
P r o g r a m m b e i s p i e l D O - S c h l e i f e für v a r i a b l e
Frequenz
Bild 4 - 3 z e i g t die S t r u k t u r d e r D O - S c h l e i f e . D e r B l o c k A wird nur a u s g e f ü h r t , wenn d i e L a u f b e d i n g u n g e r f ü l l t i s t . Ist s i e n i c h t e r f ü l l t , so wird d i e S c h l e i f e v e r l a s s e n , und e s wird d e r a u f d i e S c h l e i f e f o l g e n d e B l o c k B a u s g e f ü h r t . D e r F O R T R A N - C o m p i l e r muß die S t r u k t u r d e r D O - S c h l e i f e in den M a s c h i n e n c o d e u m s e t z e n . Dazu wird z u n ä c h s t aus den L a u f p a r a m e t e r n ein D u r c h l a u f z ä h l e r n b e r e c h n e t . Ist z . B . der A n f a n g s w e r t g r ö ß e r a l s d e r E n d w e r t , so wird d e r s i c h d a r a u s e r g e b e n d e n e g a t i v e D u r c h l a u f z ä h l e r Null g e s e t z t . Die m e i s t e n C o m p i l e r behandeln die D O - S c h l e i f e als abweisende S c h l e i f e . Die S c h l e i f e n k o n t r o l l e f i n d e t am A n f a n g d e r S c h l e i f e s t a t t . Ist d i e L a u f b e d i n g u n g b e i m E i n t r i t t in d i e S c h l e i f e n i c h t e r f ü l l t , so wird die S c h l e i f e e r s t g a r n i c h t b e g o n n e n . L ä g e d i e A b f r a g e am E n d e d e r S c h l e i f e , so würde die S c h l e i f e m i n d e s t e n s e i n m a l d u r c h laufen werden. Bei ä l t e r e n F O R T R A N - C o m p i l e r n können a b w e i c h e n d e S c h l e i f e n s t r u k t u r e n vorhanden s e i n . U n t e r s u c h e n S i e d a h e r d a s V e r h a l t e n Ihres F O R T R A N - C o m p i l e r s mit d e m T e s t p r o g r a m m Bild 4 - 4 , das d i e L a u f p a r a m e t e r a l s V a r i a b l e von d e r K o n s o l e e i n l i e s t . Bevor S i e d i e S c h r i t t w e i t e Null e i n g e b e n , v e r g e w i s s e r n S i e s i c h , wo d i e N O T - A U S - T a s t e I h r e s R e c h n e r s l i e g t . E i n e r d e r vom A u t o r u n t e r s u c h t e n C o m p i l e r l i e f e r t e in d i e s e m F a l l e i n e u n e n d l i c h e S c h l e i f e .
4.2 Der Aufbau von Zählschleifen
mit der
DO-Anweisung
m n=MAX 1
Bild 4 - 3 :
Die S t r u k t u r der D O - S c h l e i f e
C BILD 4 - 4 TESTFROGRAm FUER DO-SCHLEIFE 10 UJRITE (*, * 3 'IA IE IS EINGEBEN' READ C *,*,END=30) IA , IE , IS DD 20 I - I A , i E , I S UIRI TE C * , * ) ' LAUFENDER UIERT I - ' , 20 CONTINUE WRITEC*,«D 'NACH SCHLEIFENENDE I GOTO 10 30 STOP END B> TEST IA IE IS EINGEBEN 1 3 1 LAUFENDER WERT I LAUFENOER WERT 1= LAUFENDER WERT 1= NACH SCHLEIFENENDE I = , Bild 4 - 4 :
end-anf+sw
1 2 3
I I
4
T e s t p r o g r a m m f ü r die A u s f ü h r u n g d e r D O - S c h l e i f e
,0
'
63
64
4 Programmschleifen
Es folgen nun einige Regeln über den Aufbau von D O - S c h l e i f e n . Die Endemarke steht in den Spalten 1 bis 5 der letzten Anweisung des S c h l e i fenblocks. Diese Anweisung muß ausführbar sein. Sprunganweisungen oder I F Anweisungen sind nicht zulässig. Im Zweifelsfall setze man an das Ende der D O - S c h l e i f e ein CONTINUE. F e h l t die S c h r i t t w e i t e , so wird sie automatisch 1 g e s e t z t . Beispiel einer D O - S c h l e i f e von 1 bis 100 mit der S c h r i t t w e i t e 1: DO 10 I = 1 , 100 10
CONTINUE
Compiler des F O R T R A N 77 lassen Laufvariablen vom Typ I N T E G E R , R E A L und DOUBLE PRECISION zu. Desgleichen können die L a u f p a r a m e t e r beliebige a r i t h metische Ausdrücke vom Typ I N T E G E R , R E A L und DOUBLE PRECISION sein. Beispiele: DO 20 F = FA , FA+10. , FA/10. 20
CONTINUE DO 10 F = 45.5 , 55.5 , 0.5
10
CONTINUE
Bei nichtganzzahligen Laufparametern können durch Umwandlungs- und Rundungsfehler Rechenungenauigkeiten bei der Addition der S c h r i t t w e i t e entstehen. F ü r Compiler, die nur I N T E G E R - G r ö ß e n zulassen, muß die R E A L - G r ö ß e aus der INTEGER-Laufvariablen b e r e c h n e t werden. Beispiel: DO 10 I = 455 , 555 , 5 F = 0.1 * FLOAT(I) 10
CONTINUE
Die Laufvariable und die L a u f p a r a m e t e r dürfen in der Schleife nicht verändert werden. Sprünge aus D O - S c h l e i f e n heraus sind zulässig, Sprünge in D O - S c h l e i f e n hinein sind verboten. D O - S c h l e i f e n können vollständige I F - B l ö c k e enthalten oder selbst innerhalb eines I F - B l o c k e s liegen. D O - S c h l e i f e n lassen sich schachteln. Dabei muß j e d e innere S c h l e i f e vollständig innerhalb einer äußeren S c h l e i f e liegen. Bild 4 - 5 zeigt Beispiele für zulässige Schachtelungen. B e i g e s c h a c h t e l t e n D O - S c h l e i f e n ist die Gesamtzahl der Durchläufe gleich dem Produkt der Durchläufe der ineinander g e s c h a c h t e l t e n S c h l e i f e n . Bedenken Sie bei der Berechnung des Papierverbrauches und der R e c h e n z e i t , daß z.B. die Schachtelung dreier D O - S c h l e i f e n von je 100 Durchläufen 1 Million Durchläufe ergibt. Wird die D O - S c h l e i f e nach dem letzten Durchlauf verlassen, so steht e n t s p r e chend der Struktur Bild 4 - 3 die Laufvariable nicht auf dem Endwert, sondern auf dem um die S c h r i t t w e i t e erhöhten Endwert. T e s t e n Sie Ihren Compiler mit
4.3 Die Programmierung
von Schleifen mit bedingten
Sprungbefehlen
65
40 1= 1,100
i = 1,100
DO 10 J = 1,100
j = 1,100
A A 10
CONTINUE DO 30 K = 1,100
k= 1,100
DO 20 L = 1,100
1 = 1,100
B 20 30
CONTINUE CONTINUE
C 40 Bild 4 - 5 :
Geschachtelte
CONTINUE
DO-Schleifen
d e m P r o g r a m m Bild 4 - 4 . N o t f a l l s m ü s s e n Sie e i n e n Z ä h l e r m i t l a u f e n lassen oder e i n e eigene Z ä h l s c h l e i f e e n t s p r e c h e n d dem folgenden Abschnitt p r o g r a m mieren.
4.3 Die Programmierung von Schleifen mit bedingten Sprungbefehlen
Bild 4 - 6 :
Die S t r u k t u r d e r a b w e i s e n d e n S c h l e i f e ( D O - W H I L E )
66
4
Programmschleifen
Mit Hilfe der b e d i n g t e n S p r u n g b e f e h l e logisches IF mit G O T O , a r i t h m e t i s c h e s IF und B l o c k - I F l a s s e n sich Z ä h l s c h l e i f e n und N ä h e r u n g s s c h l e i f e n a l l e r A r t p r o g r a m m i e r e n . Wir wollen hier die beiden w i c h t i g s t e n S t r u k t u r e n b e t r a c h t e n . Die a b w e i s e n d e S c h l e i f e Bild 4 - 6 p r ü f t d i e L a u f b e d i n g u n g vor d e m E i n t r i t t in die S c h l e i f e . Ist sie n i c h t e r f ü l l t , so wird der S c h l e i f e n b l o c k A nicht b e g o n nen. Die a b w e i s e n d e S c h l e i f e s t e h t u n t e r der Bezeichnung D O - W H I L E - S c h l e i f e in a n d e r e n P r o g r a m m i e r s p r a c h e n als Anweisung zur V e r f ü g u n g Bild 4 - 7 zeigt als Beispiel f ü r die P r o g r a m m i e r u n g in F O R T R A N ein T e s t p r o g r a m m , das d e n D u r c h l a u f z ä h l e r a l s I N T E G E R - Z a h l einliest und sowohl in der S c h l e i f e als a u c h nach ihrem Ende d e n l a u f e n d e n Z ä h l e r s t a n d a u s g i b t .
C BILD 4-7 A B W E I S E N D E SCHLEIFE (DO-UHILE 3 10 UIR I T E ( * , * ) 'N E I N G E B E N ' READC*,»,END-303 N 50 IF C N . G T . 0 5 T H E N W R I T E C * , ' N -' , N N = N - 1 G O T O 20 END IF UJRI T E ( * , * 3 'N N A C H S C H L E I F E , N G O T O 10 30 STOP END B> N 3 N N N N N
0
TEST EINGEBEN 3 = 5 1 NACH SCHLEIFE EINGEBEN
N NACH SCHLEIFE N EINGEBEN -4 N NACH SCHLEIFE = N EINGEBEN "Z Stop - Program terminated.
Bild 4 - 7 :
0 0 -4
T e s t p r o g r a m m f ü r die a b w e i s e n d e S c h l e i f e
Das G e g e n s t ü c k dazu ist die n i c h t a b w e i s e n d e S c h l e i f e mit der in Bild 4 - 8 d a r g e s t e l l t e n S t r u k t u r . Da d i e L a u f b e d i n g u n g e r s t am Ende der S c h l e i f e g e p r ü f t wird, wird der S c h l e i f e n b l o c k A mindestens e i n m a l d u r c h l a u f e n . Die n i c h t a b w e i s e n d e S c h l e i f e s t e h t u n t e r der Bezeichnung R E P E A T - U N T I L S c h l e i f e in a n d e r e n P r o g r a m m i e r s p r a c h e n als Anweisung zur V e r f ü g u n g . Bild 4 - 9 zeigt als Beispiel f ü r die P r o g r a m m i e r u n g in F O R T R A N ein T e s t p r o g r a m m , d a s den D u r c h l a u f z ä h l e r als I N T E G E R - Z a h l einliest und den l a u f e n d e n Z ä h l e r s t a n d sowohl in der S c h l e i f e a l s a u c h nach ihrem Ende a u s g i b t .
4.3 Die Programmierung
von Schleifen mit bedingten
Sprungbefehlen
wiederhole solange Bedingung erfüllt
B Bild 4 - 8 :
Die S t r u k t u r der n i c h t a b w e i s e n d e n S c h l e i f e
(REPEAT-UNTIL)
C BILD 4-9 NICHTABWEISENDE SCHLEIFE C REPEAT-UNTIL 5 10 W R I T E C * , » } 'N E I N G E B E N ' READC*,*,END"30) N 20 CONTINUE UIRITEC* , »5 'N - ' , N N - N - 1 IF CN.GT.03 G O T O 2 0 UJRITEC*,*) 'N N A C H S C H L E I F E - ' , N G O T O 10 30 STOP END B> T E S T N EINGEBEN 3 N 3 N 5 N 1 N NACH SCHLEIFE N EINGEBEN 0 N 0 N NACH SCHLEIFE N EINGEBEN -3 N -3 N NACH SCHLEIFE N EINGEBEN "Z Stop - Program terminated.
Bild 4 - 9 :
Testprogramm
-4
für die nichtabweisende
Schleife
67
68
4
Programmschleifen
4.4 Die Programmierung von Näherungsschleifen (Iteration) Als Näherung oder I t e r a t i o n bezeichnet man ein R e c h e n v e r f a h r e n , das beim E r reichen einer hinreichenden Genauigkeit a b g e b r o c h e n werden kann. Das V e r f a h ren muß konvergieren, das h e i ß t , ein nachfolgender R e c h e n s c h r i t t muß ein b e s s e r e s Ergebnis als der Vorgänger l i e f e r n . Durch Umwandlungs- und Rundungsfehler kann es vorkommen, daß ein m a t h e m a t i s c h konvergierendes V e r f a h r e n bei einem R e c h n e r versagt, wenn nicht mit genügender Genauigkeit ( S t e l l e n zahl) g e r e c h n e t wird. Für k r i t i s c h e V e r f a h r e n steht der Zahlentyp D O U B L E PRECISION zur Verfügung. Als Beispiel b e t r a c h t e n wir das Newtonsche Näherungsverfahren, das die Q u a dratwurzel x aus einer vorgegebenen positiven Zahl a mit der vorgegebenen Genauigkeit d b e r e c h n e t . Es a r b e i t e t in folgenden S c h r i t t e n : 1. Wir geben uns eine b e l i e b i g e Anfangslösung xO vor. 2. Eine b e s s e r e Lösung x e r h a l t e n wir nach der F o r m e l
3. Wir bilden die relative Abweichung D
I
=
x
I
~
x0
x
o
I
4. Ist die relative Abweichung D größer als die vorgegebene Genauigkeit d, so müssen wir im S c h r i t t 2 eine noch b e s s e r e Lösung b e r e c h n e n . Dazu setzen wir als Anfangslösung xO unsere Lösung x e i n . Das folgende Zahlenbeispiel zeigt die Berechnung der Wurzel aus 4 mit der A n fangslösung xO = 1. xO
=
1
X
x 0 = 2 . 5
x
xO
x
= 2.05
^ = 1 ^ 1 ^
2.5 = 2.05
=1(2.05^^2.0006097
Das folgende Programmbeispiel Bild 4 - 1 0 zeigt ein T e s t p r o g r a m m , das nach dem Newtonschen Näherungsverfahren die Quadratwurzel zieht. Radikand, A n fangswert und Genauigkeit (relative Abweichung) sind einzugeben. In einer E i n g a b e s c h l e i f e können m e h r e r e Berechnungen durchgeführt werden. Die Z w i s c h e n e r g e b n i s s e der Näherungsschleife werden a u s g e g e b e n . Das Programm eignet sich nur für einen T e s t im Dialog, da es bei negativem Radikanden oder ü b e r t r i e b e n e n Genauigkeitsforderungen nicht konvergiert und mit Hilfe des B e t r i e b s s y s t e m s a b g e b r o c h e n werden muß. Das Beispiel ist entsprechend Bild 4 - 8 eine nichtabweisende Schleife.
4.4 Die Programmierung
von Näherungsschleifen
(Iteration)
69
C BILD 10
4-10 Q U A D R A T W U R Z E L NACH NEWTON W R I T E C » , ' A XO D EINGEBEN' READ(•,•,END-30)A , XO , D C NICHTABUJE I SENDE I T E R A T I D N S S C H L E I FE 20 CONTINUE X - 0 . 5 • CXO + A / X O ) DIFF ABSCCX-X03/X0J UIRI T E C * , * ) ' X - ' , X , ' D "= ' , D I F F XO - X I F C D I F F . G T . D ) GOTO 5 0 WRITEC»,*) GOTO 1 0 30 STOP END B> A 2 X X X X
TEST XO 1 • " -
D 0
1 1 1 1 1
x •
A 100 X =
XO . 1
D 0
x • X X X X X X X X
EINGEBEN
=
x •
Bild 4 - 1 0 :
,. 5 0 0 0 0 0 0 ,4165570 ,4142160 -, 4 1 4 2 1 4 0 .4142140
=
5 5 1 1 0
. OOOOOOE-OOl ,, 5 5 5 5 5 B E - 0 0 2 ., 7 3 0 0 7 7 E - 0 0 3 .5172B4E-006 ,, OOOOOOE + OOO
D D = D D = D D D D D D = D -
4 4 4 4 4 3 1 1 7 0
4 9 3 9 .50001 .99BO00E-OO1 .99200BE-001 •96B134E-001 •B74145E-001 . 520397E-001 . 404360E-001 .332071E-001 .1BOB44E-002 .142511E-005 .OOOOOOE+OOO
D D D D D
-
EINGEBEN 500 250 125 63 32 17 11 10 10 10 10
.0500000 .1250000 .2624000 .0303600 .30B4500 .7018100 .6754700 .1202200 .0007100 .0000000 .0000000
T e s t p r o g r a m m für das Wurzelziehen nach N e w t o n
Je besser die Anfangslösung, umso schneller konvergiert das V e r f a h r e n . Bei g e gebenem Radikanden a könnte man als Anfangslösung setzen: Für a größer 1 sei xO = a/2 Für a kleiner 1 sei xO = 2*a Für eine w e i t e r e Verbesserung d e s V e r f a h r e n s sollte der Radikand auf negativ und Null g e p r ü f t w e r d e n . Die Zahl der I t e r a t i o n s s c h r i t t e sollte mit einem m i t l a u f e n d e n Zähler kontrolliert w e r d e n . Bild 4 - 1 1 zeigt die Struktur eines verb e s s e r t e n P r o g r a m m s , das in einer E i n g a b e s c h l e i f e nur noch den Radikanden e i n l i e s t , die Konvergenz k o n t r o l l i e r t und das Ergebnis z u s a m m e n mit der Zahl der I t e r a t i o n s s c h r i t t e ausgibt. Bild 4 - 1 2 zeigt das P r o g r a m m b e i s p i e l .
70
4
Programmschleifen
C BILD 4-15 WURZEL MIT KONUERGENZKONTRGLLE UJRI TE C » , * 3 'DMAX UND NMAX EINGEBEN' READ C*,»3 DHAX , NMAX C EINGABESCHLEIFE 10 URITEC»,»3 'RADIKAND EINGEBEN' READ C»,»,END=303 A C FALLUNTERSCHEIDUNG IF CA.LT.0.3 THEN URITEC»,»3'RADIKAND NEGATIU' ELSE IF CA.ED.0.5 THEN URITEC*,»3'ERGEBNIS NULL' ELSE IF CA.LT.l.03 XO - 2.0*A IF CA.EQ.l.0) XO - A IF CA.GT.l.0) XO - A/5.0 N=0 C ITERATIONSSCHLEI FE PO CONTINUE X - 0 . 5 * C XO + A/X03 • IFF - ABS CCX - XO 3/XO3 XO - X N- N+1 IF C DI FF.GT.DMAX .AND. N.LT.NHAX 3 GOTO 50 URITEC»,»3'X = ' , X , ' D - ' , D I FF, ' N - ' , N END IF URITEC»,«3 GOTO 10 30 STOP END Bild 4 - 1 2 :
P r o g r a m m b e i s p i e l Wurzel n a c h N e w t o n mit Konvergenzkontrolle
4.5
Übungen zum Abschnitt
Programmschleifen
71
4.5 Übungen zum Abschnitt Programmschleifen Der Abschnitt 11 enthält für alle Aufgaben Lösungsvorschläge! 1. Aufgabe: Berechnen Sie die Summe der Zahlen von 1 bis 100, also S = 1 + 2 + 3 + 4 + 5 +
.
.
.
. + 9 5 + 9 6 + 9 7 + 9 8 + 9 9 + 1 0 0
2. Aufgabe: Berechnen Sie die F a k u l t ä t e n von 1! bis 100! 1! = 1 2! = 1 - 2 = 2 3! 4! 5! 6i
= = = =
1-2-3 = 6 1 - 2 - 3 - 4 = 24 1 - 2 - 3 - 4 - 5 = 120 1 - 2 - 3 - 4 - 5 -6 = 7 2 0
100!
= 1-2-3 -4-5-6
.
.
.
98-99.100 =
n!
= 1-2-3-4-5-6
.
.
.
(n-l).n
=
Führen Sie die Berechnung und Ausgabe mit INTEGER- und REAL- und wenn Sie wollen auch mit DOUBLE PRECISION-Größen durch. Die Werte werden sehr schnell größer und werden wahrscheinlich den zulässigen Zahlenbereich Ihres Rechners überschreiten. Kontrollieren Sie sehr genau die Ergebnisse. Mit diesem Programm können Sie p r ü f e n , wie Ihr Rechner auf Bereichsüberschreitungen reagiert.
3. Aufgabe: Im Abschnitt 2.8 haben wir in der 4. Aufgabe den Strom nach dem Einschalten eines RC-Kreises in Abhängigkeit von der Zeit b e r e c h n e t . Die Formel lautet: _ i i = yn.-e R C R Lesen Sie in einer Eingabezeile Werte für U, R, C und für den Anfangswert, den Endwert und die S c h r i t t w e i t e der Zeit ein und geben Sie in einer Tabelle den Strom und den entsprechenden Zeitpunkt aus.
4. Aufgabe: Die Zahl e ergibt sich aus e = (1
+
)n f ü r n = 1
, 2 , 3 , 4 . . . .
Man setze für n nacheinander die Werte 1 , 2 , 3 ein und gebe das Ergebnis aus. Die Schleife soll abgebrochen werden, wenn zwei aufeinander folgende Werte auf mehr als drei Stellen hinter dem Komma übereinstimmen.
72
4
Programmschleifen
5. Aufgabe: Die Zahl e, die Basis der natürlichen Logarithmen, läßt sich auch aus einer Reihe berechnen: l j _ 1+ j _ 1+ j - 1 +. j - 1+ a . 1+ x 1 j+. eQ = 1 + TT 2! 3r 4T 5! 6! '-' 1 = 1 + 1 + - L + —J—+ + J + ... 1 1-2 1 - 2 - 3 1 - 2 - 3 - 4 1 - 2 - 3 - 4 - 5
Für eine besonders e l e g a n t e Programmierung kann man die Tatsache ausnutzen, daß sich jedes Glied der Reihe durch Division aus dem vorhergehenden errechnen läßt. e = 1 + g, + g 2 + g 3 + g 4 + . . . 9i = 1; g 2 = gi/2; g 3 = g 2 /3; g n = g n _ , / n Man gebe sich die gleiche Genauigkeit wie in der 4. Aufgabe vor, zähle die Iterationsschritte und vergleiche die beiden V e r f a h r e n . 6. Aufgabe: Schreiben Sie ein Programm zur Berechnung der d r i t t e n Wurzel. Die Näherungsformel lautet:
a ist der Radikand, xO ist eine beliebige Anfangslösung. Überlegen Sie, was bei negativen Radikanden und negativen Anfangslösungen passiert!
5
Indizierte Variablen (Felder)
Bisher haben wir j e d e r zu verarbeitenden Größe einen eigenen Namen gegeben und ihr damit einen einzelnen S p e i c h e r p l a t z zugeordnet. Wenn wir nun z . B . die Aufgabe h ä t t e n , aus 100 Meßwerten den M i t t e l w e r t und die Abweichung jedes W e r t e s vom M i t t e l w e r t zu b e r e c h n e n , so müßten wir jeden Meßwert zweimal zur Verfügung haben. Einmal für die Summation und danach, um die Abweichung des M e ß w e r t e s vom M i t t e l w e r t zu b e r e c h n e n . Dazu gibt e s folgende Möglichkeiten: Wir könnten die M e ß w e r t e zweimal eingeben. Beim e r s t e n Mal b e r e c h n e n wir den M i t t e l w e r t und beim zweiten Mal die Abweichung. Bei langen T a b e l l e n und bei V e r f a h r e n , bei denen wir die Daten noch ö f t e r b e n ö t i g e n , würden wir versuchen, die M e ß w e r t e nur einmal einzugeben und im R e c h n e r zu s p e i c h e r n . Wir könnten die M e ß w e r t e als D a t e i auf einem Magnetband oder einer M a g n e t p l a t t e ablegen und durch das Programm mehrmals lesen und v e r a r b e i t e n lassen. Der A b s c h n i t t 7 zeigt Ihnen die F O R T R A N - B e f e h l e für die Arbeit mit e x t e r nen S p e i c h e r n . Wir könnten aber auch versuchen, die eingegebenen W e r t e im Arbeitsspeicher als V a r i a b l e n abzulegen. Mit unseren bisherigen Kenntnissen würden wir jedem Wert einen eigenen Namen g e b e n . Nur müßten wir dann alle R e c h e n v e r f a h r e n auf einzelne V a r i a b l e n anwenden und könnten keine S c h l e i f e n benutzen, die die Programmierung v e r e i n f a c h e n . Zur Lösung unseres Problems s t e l l t uns F O R T R A N die indizierten V a r i a b l e n oder F e l d e r zur Verfügung. Die M a t h e m a t i k bezeichnet die E l e m e n t e zusammenhängender Größen wie z.B. V e k t o r e n mit einem Index. Die 100 M e ß w e r t e unseres Beispiels heißen dann z.B.:
In F O R T R A N müssen wir zunächst b e k a n n t g e b e n , daß wir eine V a r i a b l e indiziert verwenden wollen. Gleichzeitig müssen wir die Anzahl und die Anordnung ihrer E l e m e n t e f e s t l e g e n . Dies kann in unserem Beispiel durch die F e l d v e r e i n barung
DIMENSION X(100) g e s c h e h e n . Den t i e f g e s t e l l t e n Index der m a t h e m a t i s c h e n S c h r e i b w e i s e schreiben wir in F O R T R A N in K l a m m e r n hinter den F e l d n a m e n
X(1) , X(2) , X(3)
X( 100)
Die E l e m e n t e eines F e l d e s können wir durch K o n s t a n t e n wie z . B . X ( l ) V a r i a b l e n wie z . B . X ( l ) b e s t i m m e n . Die S u m m e n f o r m e l
oder
74
5 Indizierte Variablen (Felder)
too ¡=1 d e r M a t h e m a t i k e r s e t z e n wir in F O R T R A N d u r c h d e n P r o g r a m m b l o c k
10
S = 0. DO 10 I = 1, 100 S = S + X(I) CONTINUE
Diese S c h l e i f e s u m m i e r t alle 100 E l e m e n t e s d e s F e l d e s X, als ob wir g e s c h r i e ben h ä t t e n S = 0 . + X(1) + X(2) + X(3) + . . .
+ X(100)
F ü r d i e Bezeichnung von z w e i d i m e n s i o n a l e n A n o r d n u n g e n v e r w e n d e t d i e M a t h e m a t i k d e n D o p p e l i n d e x . Eine M a t r i x a b e s t e h e a u s vier Zeilen und d r e i Spalten:
a
11
a
12
a
13
a
21
a
22
a
23
a
31
a
32
a
33
a
41
a
42
a
43
In F O R T R A N v e r e i n b a r e n wir d i e als Beispiel g e n a n n t e Matrix als z w e i d i m e n sionales F e l d und a d r e s s i e r e n ihre E l e m e n t e d u r c h einen Doppelindex. Beispiel: DIMENSION A ( 4 , 3 )
10 20
DO 20 I = 1 , 4 DO 10 J = 1 , 3 A(I,J) = 0. CONTINUE CONTINUE
In F O R T R A N können Sie F e l d e r mit m a x i m a l 7 Indizes v e r w e n d e n . Die G r ö ß e eines F e l d e s ist nur b e s c h r ä n k t durch die G r ö ß e d e s zur V e r f ü g u n g s t e h e n d e n A r b e i t s s p e i c h e r s . Mit Hilfe von S c h l e i f e n , i n s b e s o n d e r e D O - S c h l e i f e n , lassen sich d i e E l e m e n t e e i n e s F e l d e s a d r e s s i e r e n und v e r a r b e i t e n . Viele P r o b l e m e der W i s s e n s c h a f t und Technik wie z.B. Lösung von G l e i c h u n g s s y s t e m e n , D a r s t e l l u n g von T a b e l l e n , A u s w e r t u n g von M e ß r e i h e n , n u m e r i s c h e I n t e g r a t i o n und Lösung von D i f f e r e n z i a l g l e i c h u n g e n lassen sich mit Hilfe von indizierten V a r i a b l e n p r o g r a m m i e r e n . F e l d e r können wie e i n f a c h e V a r i a b l e n G r ö ß e n vom Typ INTEGER, REAL, DOUBLE PRECISION, LOGICAL oder CHARACTER e n t h a l t e n .
5.1 Die Arbeit mit eindimensionalen
Feldern
75
5.1 Die Arbeit mit eindimensionalen Feldern Alle V a r i a b l e n , die als i n d i z i e r t e V a r i a b l e n oder F e l d e r v e r w e n d e t w e r d e n , m ü s sen in ihrer G r ö ß e v e r e i n b a r t w e r d e n . Dies g e s c h i e h t z u s a m m e n mit der e x p l i ziten ( a u s d r ü c k l i c h e n ) T y p v e r e i n b a r u n g . Würde d e r N a m e des F e l d e s e n t s p r e chend der N a m e n s r e g e l g e b i l d e t , so kann die Anweisung DIMENSION v e r w e n d e t w e r d e n . Eine Anweisung kann zur V e r e i n b a r u n g m e h r e r e r F e l d e r d i e n e n .
Typ Name ( Größe ) , Name ( Größe ) . .
.
oder DIMENSION Name ( Größe ) , Name ( Größe ) . .
.
Der N a m e e i n e s F e l d e s wird n a c h d e n g l e i c h e n Regeln g e b i l d e t wie d e r N a m e n i c h t i n d i z i e r t e r V a r i a b l e n . Es gilt die N a m e n s r e g e l , n a c h d e r alle F e l d e r , d e r e n N a m e n mit den B u c h s t a b e n I , J , K , L , M oder N b e g i n n e n , vom Typ INTEGER o d e r ganzzahlig sind; alle a n d e r e n sind R E A L . F ü r F e l d e r aller a n d e ren D a t e n t y p e n sind auf j e d e n Fall T y p v e r e i n b a r u n g e n e r f o r d e r l i c h . Ein Feld kann nur D a t e n e i n e s Typs e n t h a l t e n . Die Größe e i n e s e i n d i m e n s i o n a l e n F e l d e s wird in ä l t e r e n F O R T R A N - V e r s i o n e n durch eine I N T E G E R - K o n s t a n t e g r ö ß e r Null a n g e g e b e n , die die Anzahl der F e l d e l e m e n t e f e s t l e g t . Im P r o g r a m m darf d a n n der Index nur von 1 bis zum E n d w e r t l a u f e n . Beispiele: INTEGER ZAHL(100) DIMENSION A(10)
, B(10)
, C(10)
Bei m o d e r n e n F O R T R A N - C o m pilern e n t s p r e c h e n d dem S t a n d a r d F O R T R A N 77 kann man die G r ö ß e des F e l d e s a u c h durch d e n k l e i n s t e n Index " k " und den g r ö ß t e n Index " g " a n g e b e n ; der Compiler b e r e c h n e t d a r a u s d i e Zahl der zu r e s e r v i e r e n d e n S p e i c h e r s t e l l e n . D a m i t sind a u c h ein n e g a t i v e r Index und der Index Null z u g e l a s s e n .
Name ( k : g )
Der Doppelpunkt " : " t r e n n t die beiden I n d e x g r e n z e n . F e h l e n die A n g a b e d e s k l e i n s t e n Index " k " und d e r Doppelpunkt " : " , so wird d i e u n t e r e Grenze 1 g e s e t z t . Beispiele: INTEGER FAKT ( 0 : 1 0 ) DIMENSION A ( - 1 0 : 2 0 )
, ZAHL(100)
76
5 Indizierte Variablen (Felder)
Die Adressierung eines F e l d e l e m e n t e s geschieht durch eine Konstante, eine Variable oder einen a r i t h m e t i s c h e n Ausdruck innerhalb der vereinbarten Grenzen. Bei älteren FORTRAN-Versionen sind mit den Abkürzungen "c" und "k" für INTEGER-Konstanten und "v" für eine einfache INTEGER-Variable folgende Indexbezeichnungen möglich: mathematisch x1 xi xi+1 xi-1 x2i x2i+1 x2 i -1
allgemein
Beispiel
Name(k) Name(v) Name(v+k) Name(v-k) Name(k*v) Name(k*v+c) Name(k*v-c)
X(1) X( I) X(I+1) X(I-1) X(2*I) X(2*I+1) X(2*I-1)
Compiler, die dem Standard FORTRAN 77 entsprechen, lassen für die Indizierung von Feldelementen auch a r i t h m e t i s c h e Ausdrücke vom Typ REAL zu. Da es jedoch nur ganzzahlige Indizes gibt, wird der gebrochene Anteil der REALGröße abgeschnitten. Bei der Adressierung sind negative Indizes und der Index Null zugelassen, wenn sie entsprechend vereinbart wurden. Für die Eingabe und Ausgabe der Elemente eines Feldes kann man zunächst über DO-Schleifen die F e l d e l e m e n t e einzeln ansprechen. Das folgende Beispiel liest die 10 Zahlen eines Feldes von 10 Eingabezeilen. INTEGER Z(10) DO 10 I = 1,10 READ(*,*) Z(I) C0NTINUE
10
C
BILD
5 - 1 n i T T E L U I E R T UND DIMENSION X CIO) N 10
C
FELD
AUS DO
10 C
SO
C
SUMME
ABWEICHUNG
N ELEMENTEN LESEN 10 I = 1,N I,',WERT WRITEC * , * ) READ C * , * ) XCI) C0NTINUE
UND M I T T E L W E R T SUM 0. DO 2 0 I 1,N SUM C0NTINUE
SUM
+
BILDEN
BEI
UND
AUSGEBEN
XCI)
'
,
'
WERT
B E I ' . N , '
WERTEN'
ABWEICHUNG'
DD 30
30 I • 1,N WRITEC»,») CONTINUE STOP END
WERTEN
EINBEBEN'
WM I T T SUM/FL0ATCN) WRITEC*,*) 'MITTELWERT - ' , WMITT M E S S W E R T E UND A B W E I C H U N G E N AUSGEBEN WRITEC»,»)
10
XCI),
A B S C WM I T T
-
XCI))
Bild 5-1: Programmbeispiel Mittelwert und Abweichung bei 10 Meßwerten
5.1 Die Arbeit mit eindimensionalen
Feldern
77
Das Programmbeispiel Bild 5 - 1 liest 10 R E A L - M e ß w e r t e von 10 Eingabezeilen, b e r e c h n e t den M i t t e l w e r t und gibt die e i n g e l e s e n e n Werte zusammen mit der Abweichung vom M i t t e l w e r t aus. Will man alle E l e m e n t e eines F e l d e s auf einer Zeile eingeben oder ausgeben, so gibt man nur den Namen des Feldes in der R E A D - bzw. WRITE-Anweisung an. Das folgende Beispiel liest alle 10 Zahlen eines Feldes von einer Eingabezeile. INTEGER Z(10) READ(*,*) Z Passen nicht alle W e r t e auf eine Zeile, so können sie auf m e h r e r e Zeilen vert e i l t w e r d e n . Erscheint der Name eines F e l d e s in einer Ausgabe-Anweisung, so werden e b e n f a l l s a l l e E l e m e n t e des Feldes ausgegeben. Bei der bisher v e r w e n d e t e n l i s t e n g e s t e u e r t e n Ausgabe erscheinen dabei die Zahlen mit großen Zwis c h e n r ä u m e n . Bei der f o r m a t g e s t e u e r t e n Ausgabe können Sie selbst den Aufbau der Ausgabezeile b e s t i m m e n . Dabei legen Sie die Zahl der Werte pro Zeile, die Zahl der auszugebenden Stellen und die Zahl der Z w i s c h e n r ä u m e in einer F O R M A T - V e r e i n b a r u n g f e s t . Die F O R M A T - V e r e i n b a r u n g e r h ä l t in den Spalten 1 bis 5 eine N u m m e r , die in der dazugehörigen WRITE-Anweisung e r s c h e i n t . Mit dem K e n n b u c h s t a b e n X in der allgemeinen Form wX werden w Leerzeichen a u s g e g e b e n . Die Angabe IX am Anfang einer Zeile bewirkt gleichzeitig den Vorschub des Druckers auf eine neue Zeile. Die Angabe Iw gibt eine INTEGERGröße in w Spalten aus. Mit der Angabe Fw.d wird eine R E A L - G r ö ß e in w Spalten mit d Stellen h i n t e r dem Dezimalpunkt a u s g e g e b e n . R E A L - G r ö ß e n können auch durch das F o r m a t Ew.d in der Exponentendarstellung ausgegeben werden. W e i t e r e I n f o r m a t i o n e n zur f o r m a t g e s t e u e r t e n Eingabe und Ausgabe finden Sie im Abschnitt 7. Das Programmbeispiel Bild 5 - 2 zeigt Ihnen Beispiele f ü r die l i s t e n g e s t e u e r t e Eingabe und die f o r m a t g e s t e u e r t e Ausgabe von F e l d e r n . Auf einer Ausgabezeile e r s c h e i n e n jeweils 10 I N T E G E R - bzw. 5 R E A L - Z a h l e n .
C
BILD
10
100
5-2 LISTEN-EINGABE UND FORMAT-AUSGABE DIMENSION NC105 , XC105 WRITEC»,*5 ' 1 0 GANZE ZAHLEN EINGEBEN' READ C « , * , E N D = 5 0 5 CNC I 5 , I = 1 , 1 0 5 ÜJRITEC»,*5 ' 1 0 REELLE ZAHLEN EINGEBEN' READ C * , « , E N D = 5 0 3 X UJR I T E C * , * 5 UJR I T E C * , 1 0 0 5 N FORMAT CIX , 1 0 1 6 5
500
UJR I T E C * , B 0 0 5 X F0RDAT(1X,5F10.45
20
GOTO STOP END
10
78
5 Indizierte
Variablen
(Felder)
B> T E S T 10 G A N Z E Z A H L E N E I N G E B E N 1 5 3 4 5 8 7 8 3 10 10 R E E L L E Z A H L E N E I N G E B E N 1.1 2.2 3 . 3 4.4 5 . 5 6 . 5 7 . 7 B . B 3 . 9
10.10
5 7 B 4.4000 5.5000 3.3000 10.1000
9
10
-1 -5 -3 -4 -5 -S -7 -8 1000.0000 2000.0000 3000.000040000.000050000.0000 .0000 .0000 .0000 .0000 .0000 10 G A N Z E Z A H L E N E I N G E B E N
-3
-10
1 5 3 4 5 1.1000 5.5000 3.3000 5.5000 7.7000 B.B000 10 G A N Z E Z A H L E N E I N G E B E N -1 - 5 - 3 -4 - 5 - 5 -7 - B - 3 - 1 0 10 R E E L L E Z A H L E N E I N G E B E N 1.E3 5.E3 3.E3 4.E4 5.E4 0 0 0
1 1 1 1 1 1 1 1 1 1
10 R E E L L E Z A H L E N E I N G E B E N 1.E10 0 0 0 0 0 0 0 0 0 0
1 1 **••••••**
1 1 .0000
.0000 .0000 10 G A N Z E Z A H L E N E I N G E B E N
1 1 .0000
.0000
1 .0000
.0000
1
.0000
.0000
Z
Stop - PrDgram
terminated.
Bild 5-2: L i s t e n g e s t e u e r t e Eingabe und f o r m a t g e s t e u e r t e Ausgabe
Für die Eingabe und Ausgabe von Teilen eines Feldes benötigen wir wie bei einer DO-Schleife Angaben für den Anfangs- und den Endindex des Feldes. In der Variablenliste stehen der Name des Feldes und eine Laufvariable, die von einem Anfangswert bis zu einem Endwert l ä u f t . Fehlt die S c h r i t t w e i t e , so wird sie 1 gesetzt. Diese "implizite DO-Schleife" kann um ein Feld oder um m e h r e re Felder gelegt werden. Sie darf nur in der Variablenliste einer READ- oder WRITE-Anweisung erscheinen. Der Wert der Laufvariablen kann wie eine normale Variable ausgegeben werden.
(Feldname(i) (Feldnamel(i)
i ia ie is
ist ist ist ist
die der der die
, i = ia
, ie , is)
, Feldname2(i)
Laufvariable Anfangswert des Index Endwert des Index Schrittweite des Index
, . .
, i = ia , i e , i s )
5.1 Die Arbeit mit eindimensionalen
Feldern
79
Es g e l t e n die gleichen Regeln wie f ü r D O - S c h l e i f e n im P r o g r a m m . Beispiele: DIMENSION A(10)
100
, B(10)
, X{100)
READ(*,*) ( A ( I ) , 1 = 1 , 5 )
,
READ(*,*) (A(K)
, K=1,5)
, B(K)
WRITE(*,100) ( X ( I ) F0RMAT(1X,5F10.4)
(B(J),J=1,5)
, I =1,20)
Das e r s t e Beispiel liest zuerst die e r s t e n 5 E l e m e n t e des F e l d e s A und dann die e r s t e n 5 E l e m e n t e d e s F e l d e s B, also in der R e i h e n f o l g e : READ(*,*) A ( 1 ) , A ( 2 ) , A ( 3 ) , A ( 4 ) , A ( 5 )
,
B(1),B(2),B(3),B(4),B(5)
Das z w e i t e Beispiel liest a b w e c h s e l n d je einen Wert des F e l d e s A und dann einen Wert des F e l d e s B, also in der R e i h e n f o l g e : READ(*,*)
A(1),B(1),A(2),B(2),A(3),B(3),A(4),B(4),A(5)1B(5)
Das d r i t t e Beispiel gibt die e r s t e n 20 W e r t e d e s F e l d e s X a u s . Durch das A u s g a b e f o r m a t e r s c h e i n e n i m m e r 5 Z a h l e n in 10 S p a l t e n mit 4 S t e l l e n h i n t e r dem Punkt auf e i n e r Ausgabezeile. Die G r ö ß e d e s F e l d e s muß bei der P r o g r a m m i e r u n g b e r e i t s b e k a n n t sein, da bei d e r F e l d v e r e i n b a r u n g nur k o n s t a n t e Indexgrenzen zulässig sind. Im G e g e n s a t z dazu ist in d e n P r o g r a m m i e r s p r a c h e n ALGOL und BASIC e i n e variable F e l d d i m e n s i o n i e r u n g möglich. Ist in e i n e m F O R T R A N - P r o g r a m m die Anzahl der F e l d e l e m e n t e bei d e r P r o g r a m m i e r u n g n o c h nicht b e k a n n t , so d i m e n s i o n i e r t man d a s F e l d e n t s p r e c h e n d der m a x i m a l zu e r w a r t e n d e n G r ö ß e und lädt zur S t e u e r u n g von D O - S c h l e i f e n e i n e I N T E G E R - V a r i a b l e mit diesem W e r t . Beispiel:
DIMENSION X(1000) NMAX = 1000 N = 0
10
DO 10 1=1,NMAX READ(*,*,END=20) N = I C0NTINUE
X(I)
In dem Beispiel w e r d e n m a x i m a l 1000 W e r t e f ü r das Feld X e r w a r t e t . Die E i n g a b e s c h l e i f e zählt d i e t a t s ä c h l i c h e Anzahl in der V a r i a b l e n N, die d a n n f ü r die w e i t e r e V e r a r b e i t u n g die t a t s ä c h l i c h e F e l d g r ö ß e e n t h ä l t . Die b e i d e n G r e n z f ä l l e "keine D a t e n ( N = 0 ) " und " zuviel D a t e n " müssen im P r o g r a m m b e s o n d e r s b e r ü c k s i c h t i g t w e r d e n . Das P r o g r a m m b e i s p i e l Bild 5 - 3 l i e s t , s u m m i e r t und zählt in e i n e r E i n g a b e s c h l e i f e m a x i m a l 1000 M e ß w e r t e , b e r e c h n e t den M i t t e l w e r t und gibt die e i n g e l e s e n e n W e r t e z u s a m m e n mit der Abweichung vom M i t t e l w e r t wieder a u s .
80
5 Indizierte
Variablen
(Felder)
C BILD
C
10 C 20 C
30
5-3 M I T T E L W E R T UND ABWEICHUNG B E I B E L ANZAHL DIMENSION X C 1 0 0 0 ) NMAX 1000 WERTE L E S E N ZAEHLEN UND SUMMIEREN WRITEC*,*) ' J E D E N WERT AUF E I N E R Z E I L E E I N G E B E N ' SUM 0. N - 0 DG 1 0 I - 1 , NMAX READ C * , « , E N D - 2 0 3 XCI3 SUM - SUM + X C I ) N - I CONTINUE M I T T E L W E R T BERECHNEN UND AUSGEBEN WM I T T - SUM / FLOATCND WRITEC*,*) ' M I T T E L W E R T = ' , WM I TT , ' BEI'.N,' WERTEN' M E S S W E R T E UND ABWEICHUNGEN AUSGEBEN WRITEC»,»5 ' WERT ABWEICHUNG' DG 3 0 I = 1 , N ABWEI - A B S C W M I T T - X C I 3 5 WRITEC*,*; XCI3, ABWEI CONTINUE STOP END
B> T E S T J E D E N WERT
AUF
1
EINER
ZEILE
EINGEBEN
2 3
MITTELWERT
= WERT
,0000000 ,0000000
0000000
Stop
-
Program
Bild 5-3:
2.0000000 BEI ABWEICHUNG
WERTEN
1.0000000
O.OOOOOOE+OOO
1.0000000
terminated.
Programmbeispiel lesen, speichern und Zählen von Meßwerten
Mit Hilfe der PARAMETER-Anweisung ist es möglich, die Größe von Feldern leicht zu verändern.
PARAMETER ( Name = Wert , Name = Wert . . . )
Die PARAMETER-Vereinbarung weist einem Namen einen Wert zu. Dieser besteht aus einer Konstanten oder einem Ausdruck mit bereits definierten Namen. Erscheint ein Name bei der Übersetzung im Programm, so wird er durch den Wert ersetzt. Der Name ist keine Variable, sondern nur ein Symbol, dem nur in einer PARAMETER-Vereinbarung ein Wert zugewiesen werden darf. Beispiel: PARAMETER (NMAX = 1000) DIMENSION X(NMAX) DO 10 1=1,NMAX
5.1 Die Arbeit mit eindimensionalen
Feldern
81
Das P r o g r a m m b e i s p i e l Bild 5 - 4 zeigt d a s L e s e n von g e n a u 10 ganzen Z a h l e n . Dann w e r d e n der k l e i n s t e und der g r ö ß t e Wert h e r a u s g e s u c h t und a u s g e g e b e n . Dazu wird willkürlich d e r e r s t e Wert sowohl zum g r ö ß t e n (ZMAX) als a u c h zum k l e i n s t e n (ZMIN) Wert e r k l ä r t . In e i n e r D O - S c h l e i f e w e r d e n alle n a c h f o l g e n d e n W e r t e u n t e r s u c h t , ob sie kleiner o d e r g r ö ß e r sind.
C BILD 5 - 4 EXTREMWERTE SUCHEN INTEGER ZMAX,ZMIN,ZAHLC105 N - 10 U)R I TE ( * , * )N , ' GANZE ZAHLEN EINGEBEN' READC * , * ) ZAHL ZMAX - ZAHL(1) ZMIN - ZAHL CID • • 10 I - 2,N IF (ZAHLCI).LT.ZMIN) ZMIN-ZAHLCI) IF C ZAHL C I 3 . GT . 2(1 AX 5 ZMAX = ZAHL C I ) 10 CONTINUE ÜJRI TE C * , * } ZM IN , ' MINIMAL' ,ZMAX, ' MAXIMAL' STOP END B> TEST
10 GANZE ZAHLEN EINGEBEN 2 4 1 - 3 0 5 666 777 BB8 SSS 10000 - 3 0 MINIMAL 10000 MAXIMAL S t o p - Program t e r m i n a t e d . Bild 5 - 4 :
P r o g r a m m b e i s p i e l zum H e r a u s s u c h e n der E x t r e m w e r t e
Zum S o r t i e r e n von Zahlen gibt es eine R e i h e von V e r f a h r e n , von d e n e n an dieser Stelle nur ein r e c h t e i n f a c h e s b e h a n d e l t w e r d e n soll. Bild 5 - 5 zeigt dazu als Beispiel das S o r t i e r e n von vier Z a h l e n . Im e r s t e n Durchlauf wird die e r s t e Zahl mit a l l e n d a r u n t e r l i e g e n d e n v e r g l i c h e n . G i b t e s e i n e k l e i n e r e , so wird sie mit der e r s t e n v e r t a u s c h t und r ü c k t d a m i t an d i e o b e r s t e S t e l l e . Im z w e i t e n D u r c h lauf wird n a c h d e m g l e i c h e n V e r f a h r e n die n ä c h s t k l e i n e r e Zahl an die z w e i t e S t e l l e g e b r a c h t , beim d r i t t e n Durchlauf an die d r i t t e S t e l l e . Dann s t e h t a u t o m a t i s c h die g r ö ß t e Zahl a n der l e t z t e n S t e l l e , und die Z a h l e n sind a u f s t e i g e n d sortiert.
82
5 Indizierte Variablen (Felder)
Wert
alt
1.
4
2.
7
3.
1
4.
3
Bild 5 - 5 :
1.Durchlauf
[4J L7 U 1 0 / X 0 b 3
3
3.Durchlauf
2.Durchlauf
1
1
[3]
neu
1
1
a
3
3
3
4
4
4
0
7
7
7
Z a h l e n b e i s p i e l zum S o r t i e r e n von Z a h l e n
F ü r d i e U m s e t z u n g d e s V e r f a h r e n s in ein P r o g r a m m b e n ö t i g e n wir zwei g e s c h a c h t e l t e D O - S c h l e i f e n . D i e ä u ß e r e S c h l e i f e l ä u f t von d e r e r s t e n bis zur v o r l e t z t e n Z a h l und a d r e s s i e r t d i e S t e l l e , a n die d i e j e w e i l s k l e i n s t e Z a h l zu s e t z e n i s t . D i e i n n e r e S c h l e i f e l ä u f t von d e r f o l g e n d e n bis zur l e t z t e n S t e l l e u n d a d r e s s i e r t a l l e d a r u n t e r l i e g e n d e n Z a h l e n . Bild 5 - 6 z e i g t d a s V e r f a h r e n in e i n e m P r o g r a m m b e i s p i e l , d a s g e n a u 10 Z a h l e n l i e s t , a u f s t e i g e n d s o r t i e r t und d a n n wieder ausgibt. C BILD 5-6 SÜRTIEREN UON ZAHLEN INTEGER 2AHLC10) , ZHILF N - 10 URITEC»,*)N , ' GANZE ZAHLEN EINGEBEN' READ(*,*} ZAHL DD 20 I - 1,N-l MIN - I DO 10 J - I+1,N IFCZAHL(J).LT.ZAHLCMIN)) MIN - J 10 CONTINUE I F C H I N . N E . n THEN ZHILF - ZAHLCI) ZAHL CI) - ZAHL C MIN 3 ZAHL C MI N 5 - ZHILF END IF SO CONTINUE UJR I TE C * , 100 ) ZAHL 100 F0RMATC1X,1016) STOP END B> TEST
10 GANZE ZAHLEN EINGEBEN 2 - 1 0 0 4 2 5 100 0 66 3 10 -100 0 2 2 4 5 Stop - Pragram terminated.
Bild 5 - 6 :
9
10
66
100
P r o g r a m m b e i s p i e l zum S o r t i e r e n von Z a h l e n
Ein w e i t e r e s A n w e n d u n g s b e i s p i e l f ü r e i n d i m e n s i o n a l e F e l d e r ist d a s A u s d r u c k e n von T a b e l l e n . Dazu b e t r a c h t e n wir die F o r m e l
zur B e r e c h n u n g d e r H y p o t h e n u s e c aus d e n b e i d e n K a t h e t e n a und b n a c h d e m S a t z d e s P y t h a g o r a s . Die G r ö ß e A soll die Z e i l e n , und die G r ö ß e B soll d i e S p a l t e n e i n e r T a b e l l e b i l d e n ; im K r e u z u n g s p u n k t s t e h t d i e H y p o t h e n u s e . Bild 5 - 7 z e i g t e i n P r o g r a m m b e i s p i e l . Die Z e i l e n g r ö ß e A l ä u f t von 1 bis 10 mit d e r S c h r i t t w e i t e 1 und e r z e u g t d i e Z e i l e n . Alle S p a l t e n w e r t e e i n e r Z e i l e m ü s s e n
5.1 Die Arbeit mit eindimensionalen
Feldern
83
g e m e i n s a m g e d r u c k t und v o r h e r b e r e c h n e t und in e i n e m e i n d i m e n s i o n a l e n F e l d g e s p e i c h e r t w e r d e n . D e r S p a l t e n i n d e x dazu l ä u f t in e i n e r i n n e r e n D O - S c h l e i f e von 1 bis 5 mit d e r S c h r i t t w e i t e 1. N a c h d e m alle W e r t e e i n e r Z e i l e b e r e c h n e t und g e s p e i c h e r t w u r d e n , w e r d e n a l l e W e r t e e i n e r Z e i l e mit e i n e r W R I T E Anweisung ausgegeben. C BILD 5 - 7 TABELLE DES PYTHAGDRAS DIMENS ION CC53 INTEGER A,B UJRITEC*,«)' A B - l B - 2 B - 3 DD 20 fl - 1 , 1 0 DD 10 B - 1 , 5 C CB3 - SQRTCFLOATCA»«2 + B»«235 10 CONTINUE UJRITEC«, 100) A , C 100 F0RMATC1X,I3,5F10.53 20 CONTINUE STOP END B> TEST A B - 1 B - 2 1 1.41421 2 .23607 2.23607 2 2 . B2843 3 3.16228 3 .60555 4 4.12311 4 .47214 5 5 •3B516 5.03902 G 6.08276 6 .32456 7.07107 7 .2B011 7 B B.06226 8 .24621 9 .21954 9 9.05539 10 IO.049BB 10 .19B04 S t o p - Program t e r m i n a t e d Bild 5 - 7 :
B - 3 3 . 1622B 3 . 60555 4 . 24264 5 . 00000 5 . B3095 5 . 70B20 7 . 61577 B .54400 9 . 4B6B3 10 . 44031
B =• 4 4 .12311 4 .47214 5 .00000 5 .65685 6 .40312 7 .21110 8 .06226 8 .94427 9 .B4BB6 10 . 7 7 0 3 3
B = 4
B - 5 '
B = 5 5 .09902 5.,38516 5 .B3095 6 .40312 7 .07107 7 .B1025 8 .60233 9 . 4339B 10 . 2 9 5 6 3 11 .1B034
Programmbeispiel Tabelle ausgeben
In d e m v o r l i e g e n d e n B e i s p i e l sind d e r I n d e x B und die F o r m e l g r ö ß e B i d e n t i s c h . Wenn wir d i e A u f g a b e h ä t t e n , d i e S p a l t e n w e r t e von B z.B. von 100 bis 500 mit d e r S c h r i t t w e i t e 100 l a u f e n zu l a s s e n , so m ü ß t e n wir d e n F e l d i n d e x und die F o r m e l g r ö ß e t r e n n e n . Dazu gibt e s zwei M ö g l i c h k e i t e n : 1. Man läßt d e n Index e n t s p r e c h e n d d e r Zahl d e r S p a l t e n von 1 bis zum E n d w e r t l a u f e n und l e i t e t d a r a u s d i e F o r m e l g r ö ß e a b .
20
DO 20 I = 1,5 B = 100 * I C ( I ) = SQRT(FLOAT(A*A + B * B ) ) CONTINUE
2. Man l ä ß t d i e F o r m e l g r ö ß e in d e r D O - S c h l e i f e l a u f e n und f ü h r t e i n e n b e s o n deren Indexzähler mit.
20
I = 1 DO 20 B = 100 , 500 , 100 C ( I ) = SQRT(FLOAT(A*A + B * B ) ) 1 = 1 + 1 CONTINUE
84
5 Indizierte
Variablen
(Felder)
E i n d i m e n s i o n a l e F e l d e r k ö n n e n a u c h dazu d i e n e n , Z a h l e n w e r t e zu o r d n e n und zu z ä h l e n . Dazu ist e s n ö t i g , d i e zu v e r a r b e i t e n d e G r ö ß e in d e n Index eines F e l d e s u m z u f o r m e n . Als Beispiel b e t r a c h t e n wir die A u f g a b e , d i e H ä u f i g k e i t f e s t z u s t e l l e n , mit der M e ß w e r t e a u f t r e t e n . Dazu bilden wir 10 G r u p p e n . Die e r s t e G r u p p e r e i c h t von 0.5 bis 1.5, d i e z w e i t e G r u p p e von 1.5 bis 2.5; die z e h n t e G r u p p e r e i c h t von 9.5 bis 10.5. J e d e Gruppe wird in e i n e m E l e m e n t e i n e s F e l d e s aus 10 I N T E G E R - Z a h l e n g e z ä h l t . Dazu wird die e i n g e g e b e n e R E A L - Z a h l mit Hilfe der F L O A T - F u n k t i o n in eine I N T E G E R - Z a h l von 1 bis 10 u m g e f o r m t . Addiert man vorher 0.5, so wird m a t h e m a t i s c h richtig g e r u n d e t . Das d a d u r c h a u s g e w ä h l t e F e l d e l e m e n t wird um 1 e r h ö h t . Bild 5 - 8 zeigt ein P r o g r a m m b e i spiel.
C
C
10 C 20
C 30 40
BILD
5 - B ORDNEN UND Z A E H L E N UON M E S S W E R T E N INTEGER WERTCIO) , UMAX WMAX 10 ZAEHLER L 0 E S C H E N DD 1 0 I l.WMAX WERTCI) = 0 CONTINUE EINGABESCHLEIFE W R I T E C * , * ) ' Z A H L UON 0 . 5 B I S ' , W M A X + 0 . 4 9 , ' E I N G E B E N ' R E A D ( * , * > END = 3 0 ) ZAHL I N D - I F I X CZAHL + 0 . 5 ) IF C I N D . L T . l .DR. I N D . G T . W M A X ) THEN WRITEC*,*)' EINGABEFEHLER' ELSE UERTCIND) - WERTCIND) + 1 END I F GOTO EO A U S G A B E DER Z A E H L E R DO 4 0 I 1,UMAX W R I T E C * , * ) I , ' . G R U P P E KAM' , W E R T C I ) , ' M A L ' CONTINUE STOP END
B> T E S T ZAHL UON
-1
0.5
BIS
EINGABEFEHLER Z A H L UON 0 . 5 BIS 10 . 5 EINGABEFEHLER Z A H L UON 0 . 5 BIS 1 .3 1 . G R U P P E KAM E . G R U P P E KAM 3.GRUPPE KAM
Bild 5 - 8 :
10.4300000
EINGEBEN
10.4300000
EINGEBEN
10.4300000
EINGEBEN
1 1
G MAL MAL MAL
P r o g r a m m b e i s p i e l zum Zählen von M e ß w e r t e n
Die e r s t e D O - S c h l e i f e löscht alle Z ä h l e r . In d e r E i n g a b e s c h l e i f e wird die e i n g e g e b e n e Zahl in d e n Index e i n e s F e l d e l e m e n t e s u m g e f o r m t . Vor der Auswahl und Zählung wird g e p r ü f t , ob der Index i n n e r h a l b d e r v e r e i n b a r t e n Grenzen von 1 bis 10 l i e g t . Z a h l e n a u ß e r h a l b der B e r e i c h e s w e r d e n z u r ü c k g e w i e s e n . N a c h Eingabe der E n d e m a r k e gibt die zweite D O - S c h l e i f e die Z ä h l e r a u s . Mit dem in Bild 5 - 6 d a r g e s t e l l t e n P r o g r a m m könnte die T a b e l l e n a c h s t e i g e n d e r H ä u f i g k e i t sortiert werden.
5.2
Übungen zum Abschnitt
eindimensionale
Felder
85
5.2 Übungen zum Abschnitt eindimensionale Felder Der Abschnitt 11 enthält für alle Aufgaben Lösungsvorschläge! 1. Aufgabe: Es ist eine Tabelle von genau 10 X-Werten und 10 Y-Werten einzulesen und zu speichern. Jedes Wertepaar soll auf einer Zeile eingegeben werden. Berechnen Sie das Integral nach der Formel
F= !
(Yi + Yio) +
.Yk
mit H = •
für den Fall, daß alle X-Werte den gleichen Abstand voneinander haben.
2. Aufgabe: Gegeben sind zwei Vektoren A und B aus je 10 Elementen. Geben Sie auf der e r s t e n Zeile alle 10 Elemente von A und auf der folgenden Zeile alle 10 Elemente von B ein und berechnen Sie das Skalarprodukt nach der Formel
10
S=
¡=1
3i - bi = a, - bj 4- a 2 • b2 + . . . + a I 0 - b 10
3. Aufgabe: Der Widerstand eines Kupferdrahtes berechnet sich aus dem Drahtdurchmesser D und der Länge 1 nach der Formel
R=k-A
mit k = 5 6
Werten Sie die Formel in einer Tabelle aus. Verändern Sie den Drahtdurchmesser von 0.5 bis 1.0 mm mit der S c h r i t t w e i t e 0.1 mm und die Drahtlänge von 1 m bis 100 m mit der Schrittweite 1 m.
4. Aufgabe: Zählen Sie die Häufigkeit, mit der die ganzen Zahlen von 1 bis 49 (Lottozahlen) eingegeben werden. Die Eingabeschleife ist mit einem entsprechenden S t e u e r kommando abzubrechen. Es sind die Zahlen und die Häufigkeit, mit der sie a u f g e t r e t e n sind, in einer Tabelle auszugeben.
86
5 Indizierte
Variablen (Felder)
5.3 Die Arbeit mit mehrdimensionalen Feldern Zur Bezeichnung z w e i d i m e n s i o n a l e r Anordnungen ( M a t r i z e n , T a b e l l e n ) v e r w e n det man Doppelindizes. Beispiel: '11
a
12
a
13
l
21
a
22
a
23
31
a
32
a
33
41
a
42
a
43
In der M a t h e m a t i k b e z e i c h n e t der e r s t e Index d i e Zeile und der z w e i t e Index die S p a l t e . In F O R T R A N b e s t i m m e n wir die Anordnung der E l e m e n t e in e i n e r F e l d v e r e i n b a r u n g . Beispiel: DIMENSION A(4,3)
oder
DIMENSION A(3,4)
Der C o m p i l e r s t e l l t in b e i d e n F ä l l e n 3*4=12 S p e i c h e r p l ä t z e b e r e i t . In der F e l d v e r e i n b a r u n g e r s c h e i n e n h i n t e r dem N a m e n d e s F e l d e s zwei d u r c h ein K o m m a getrennte Größen.
Typ Name ( Größel
, Größe2 ) , . . .
DIMENSION Name ( Größel
, Größe2 ) , . . .
Für d i e V e r g a b e der F e l d n a m e n g e l t e n die g l e i c h e n R e g e l n wie f ü r e i n d i m e n sionale F e l d e r . Die G r ö ß e l b e z e i c h n e t die e r s t e Dimension, die G r ö ß e 2 b e z e i c h net die z w e i t e Dimension. Als Größen sind e n t w e d e r ganze I N T E G E R - K o n s t a n t e n g r ö ß e r Null o d e r , beim S t a n d a r d F O R T R A N 77, die Angabe des k l e i n s t e n und d e s g r ö ß t e n Index zulässig. Beispiele: INTEGER X(— 10:10 , -10:10) DIMENSION B(21,21) Für d i e Adressierung e i n e s zweidimensionalen F e l d e s g e l t e n die g l e i c h e n R e g e l n wie f ü r e i n d i m e n s i o n a l e F e l d e r . Das f o l g e n d e Beispiel löscht alle E l e m e n t e des F e l d e s A mit zwei g e s c h a c h t e l t e n D O - S c h l e i f e n . DIMENSION A(4,3)
10 20
DO 20 I = 1,4 DO 10 J = 1,3 A(I,J) = 0.0 C0NTINUE C0NTINUE
5.3
Die Arbeit
mit mehrdimensionalen
Feldern
87
Im Speicher liegen alle E l e m e n t e eines zweidimensionalen Feldes in f o r t l a u f e n den S p e i c h e r s t e l l e n . Dabei l ä u f t der e r s t e Index schneller als der z w e i t e . Die E l e m e n t e des Feldes A(4,3) haben die R e i h e n f o l g e : A(1,1) A(2,1) A(3,1) A(4,1) A(1,2) A(2,2) A(3,2) A(4,2) A(2,3) A(3,3)
A(1,3)
A(4,3)
Vergleicht man diese R e i h e n f o l g e mit d e r m a t h e m a t i s c h e n Schreibweise (Zeile, S p a l t e ) , so sieht man, daß die E l e m e n t e der Matrix im Rechner spaltenweise a n g e o r d n e t sind. Zuerst kommen die e r s t e S p a l t e , dann die zweite usw. Gibt man nur den N a m e n des F e l d e s in einer Ein/Ausgabeanweisung an, so werden die E l e m e n t e in der R e i h e n f o l g e a d r e s s i e r t , in der sie im Speicher liegen. In Übereinstimmung mit der m a t h e m a t i s c h e n Schreibweise werden wir zweidimensionale Felder in der R e i h e n f o l g e "Zeilenindex,Spaltenindex" d i m e n s i o n i e r e n . Bei der Eingabe und Ausgabe von zweidimensionalen F e l d e r n a r b e i t e n wir wie gewohnt zeilenweise. Dies geschieht mit Hilfe von D O - S c h l e i f e n . Mit einer F O R M A T - V e r e i n b a r u n g legen wir f e s t , wieviel W e r t e auf einer Zeile e r scheinen sollen. Bei der Gingabe und Ausgabe von zweidimensionalen Feldern b e s t i m m e n wir die R e i h e n f o l g e ihrer E l e m e n t e durch D O - S c h l e i f e n . In der Variablenliste der Ein/Ausgabeanweisungen können implizite D O - S c h l e i f e n g e s c h a c h t e l t werden.
((Feldname(i,j)
, i = ia , i e
, is)
, j = ja
, je
((Feldname(i,j)
, j = ja
, js)
, i = ia
, ie , is)
, je
, js)
Wie bei expliziten D O - S c h l e i f e n l ä u f t der innere Index schneller als der ä u ß e re. Das f o l g e n d e Programmbeispiel Bild 5 - 9 zeigt die Ausgabe eines zweidimensionalen Feldes aus 4 Zeilen und 3 S p a l t e n . Der e r s t e Programmblock weist den F e l d e l e m e n t e n einen Z a h l e n w e r t zu, der ihrem Index e n t s p r i c h t . Der z w e i t e Prog r a m m b l o c k gibt die Matrix mit einer expliziten D O - S c h l e i f e (Zeilenindex) und einer impliziten D O - S c h l e i f e (Spaltenindex) aus. Das g e w ä h l t e A u s g a b e f o r m a t 100 F O R M A T ( l X , 3 I 5 ) sorgt d a f ü r , daß i m m e r 3 Zahlen auf einer Zeile e r s c h e i nen. Im d r i t t e n Programmblock e r f o l g t die Ausgabe durch zwei g e s c h a c h t e l t e implizite D O - S c h l e i f e n auf einer Zeile. Der vierte Programmblock verwendet nur den N a m e n des F e l d e s und zeigt die R e i h e n f o l g e , in der die E l e m e n t e des Feldes im Speicher liegen. Als Anwendungsbeispiel für zweidimensionale Felder b e t r a c h t e n wir einen V e r such, bei dem 5 Meßreihen zu je 10 M e ß w e r t e n a u f g e n o m m e n w e r d e n . Es ist der M i t t e l w e r t f ü r jede Meßreihe zu b e s t i m m e n . Bild 5 - 1 0 zeigt ein P r o g r a m m b e i spiel, das d u r c h Ändern der Feldvereinbarung und Feldgrenzen leicht auf andere Verhältnisse u m p r o g r a m m i e r t werden kann. Dies könnte a u c h durch eine P A R A M E T E R - V e r e i n b a r u n g g e s c h e h e n . Der e r s t e Index l ä u f t von 1 bis 5 und gibt die Nummer der Meßreihe (Zeile) an, der z w e i t e Index l ä u f t von 1 bis 10 und gibt die N u m m e r der Messung (Spalte) an.
88
5 Indizierte
Variablen (Felder)
C BILD 5 - 9 A U S G A B E EIMES ZWEI D I M E N S I O N A L E N FELDES INTEGER AC 4,3 3 C FELD MIT WERTEN B E S E T Z E N DD 20 I - 1,4 DD 10 J - 1,3 ACI,J3 - I«10 + J 10 CQNTINUE 50 CQNTINUE C A U S G A B E ZEILENWEISE MIT A U E S S E R E R D O - S C H L E I F E DD 30 I - 1,4 WRITEC*,1003 CACI.J3 , J - 1,35 100 FORMATCIX,3I5 3 30 CONTINUE C A U S G A B E DURCH IMPLIZITE DO-SCHLEIFE WRI TE ( * , * 5 WRITEC*,5003 CCACI,J3,J-1,33,1-1,43 500 FORMAT CIX,15143 C A U S G A B E DURCH FELDNAMEN: REIHENFOLGE WIE IM SPEICHER WRITEC*,»3 WRITE C *,E003 A STOP END B> TEST 11 21 31 41 11
12 55 32 45 15
13 53 33 43 13
51
55
53
31
35
33
41
45
43
11 51 31 41 15 52 35 Stop - Program terminated.
45
13
53
33
43
Bild 5-9: Programmbeispiel Ausgabe eines zweidimensionalen Feldes
C BILD 5 - 1 0 5 M E 5 S R E I H E N MIT JE 10 M E S S W E R T E N D I M E N S I O N UIERT C 5 , 10 3 - NWERT - 10 NREIH - 5 C M E S S W E R T E LESEN DD 10 I - 1,NREIH W R I T E C * , * 3 I , ' . M E S S R E I H E M I T ' , N W E R T , ' WERTEN E I N G E B E N ' READC *,* 3 CWERTCI,J3,J-l,NWERT3 10 CONTINUE C M I T T E L W E R T JEDER M E S S R E I H E BILDEN UND AUSGEBEN DO 30 1-1,NREIH SUM - 0.0 DO 50 J - 1,NWERT SUM - SUM + WERT CI,J3 50 CONTINUE WM I TT - S U M / F L O A T C NWERT 3 WRITEC»,«3 I,'. M E S S R E I H E MITTELWERT - ' , WMITT 30 CONTINUE STOP END
Bild 5-10: Programmbeispiel Mittelwert mehrerer Meßreihen Als Beispiel für eine zweidimensionale Tabelle zeigt Bild 5-11 die Berechnung der Hypothenuse aus den beiden Katheten nach dem Satz des Pythagoras. Dieses Beispiel haben wir bereits im Bild 5-7 mit einem eindimensionalen Feld behan-
5.3 Die Arbeit mit mehrdimensionalen
C BILD 5-11 TABELLE DES PYTHAGORAS ZWEIDIMENSIONAL DIMENSION CCIO.S) INTEGER A,B C TABELLE BERECHNEN DO EO A - 1,10 DO 10 B - 1,5 CCA,B) - 5QRTCFL0ATCA*»2 + B**E33 10 CONTINUE 20 CONTINUE C TABELLE AUSGEBEN UIRITE (*, * 3 ' A B - l B - 2 B = 3 UIRITEC», 100 5 CI , C C C I , J ) , J - l , 5 ) , 1 = 1,10) 100 F0RMATC1X,I3,5F10.5) STOP END B> T E S T A B - l B - 2 1 1.41421 e.,23607 5 2.23607 2 ..B2B43 3 3.1B22B 3 ,,60555 4 4-, 12311 4 ,,47214 5 5.03902 5 ,,3B51B E B.0B276 G ,,32456 7 7.07107 7 ,•2B011 B 8.0B226 Q .24621 9 9 ,.21954 9.05539 10 10.049BB 10 ,19804 Stop - Program terminated
Bild 5-11:
B - 3 3 .1 6 2 2 8 3 .6 0 5 5 5 4 .2 4 2 6 4 5 .0 0 0 0 0 5 .B 3 0 9 5 G. 7 0 8 2 0 7 ,,61577 8 ,,54400 9 ,,4B6B3 10 ,,44031
B - 4 4 .12311 4 .4 7 2 1 4 5 .0 0 0 0 0 5. 6 5 6 8 5 6. 4 0 3 1 2 7 .2 1 1 1 0 B .0 6 2 2 6 B .9 4 4 2 7 9. 8 4 8 8 6 10 .7 7 0 3 3
Feldern
B - 4
B - 5 5 ,,09902 5..3B51G 5 ,.83095 6 ,,40312 7 ,.07107 7 ,.81025 B .60233 S .43398 10 .29563 11 .19034
Programmbeispiel zweidimensionale Tabelle
C B I L D 5 - 1 5 MATR I X E L E M E N T E L E S E N UND M A T R I X A U S G E B E N DIMENSION A(10,5) N Z E I L •= 10 NSPAL - 5 100 F0RMATC1X.5F10.4) C MATRIX LOESCHEN DD 50 I " 1 , N Z E I L DO 10 J - 1 , N S P A L A C I , J ) - 0.0 10 CONTINUE 80 CONTINUE C MATRIXELEMENTE LESEN , PRUEFEN , SPEICHERN U R I T E C * , * ) 'NZEIL=' ,NZEIL, ' N S P A L - ' ,NSPAL 30 CONTINUE U R I T E C * , * ) ' Z E I L E N I N E X S P A L T E N I N D E X UIERT ' R E A D C « , •, E N D - 4 0 ) IZ , IS , W E R T IFCIZ.LT.1.OR.IZ.GT.NZEIL.OR.IS.LT.1.OR.IS.GT.NSPAL)THEN WRITEC*,»)'EINGABEFEHLER' ELSE AC IZ, IS) - UIERT END IF G O T O 30 C MATRIX AUSGEBEN 40 WRITEC»,*) WRITEC«,100) C CACI,J),J=1,NSPAL),1-1,NZEIL) STOP END
Bild 5-12:
Programmbeispiel M a t r i x e l e m e n t e einzeln lesen
89
B - 5 '
90
5 Indizierte
Variablen
(Felder)
d e l t , d a s die W e r t e e i n e r Ausgabezeile a u f n a h m . In d e m vorliegenden Beispiel b e r e c h n e n und s p e i c h e r n wir z u e r s t die g e s a m t e T a b e l l e , bevor wir sie a u s g e b e n . Bei der Behandlung von M a t r i z e n k o m m t es o f t vor, d a ß nur wenige E l e m e n t e der M a t r i x b e s e t z t sind, der g r ö ß t e Teil ist k o n s t a n t , z.B. Null. Dann kann man die Eingabe d a d u r c h v e r e i n f a c h e n , daß man zunächst alle E l e m e n t e durch das P r o g r a m m löscht und d a n n nur noch die E l e m e n t e e i n l i e s t , die nicht Null sind. Dazu gibt man f ü r j e d e s E l e m e n t den Zeilenindex, den S p a l t e n i n d e x und den Wert auf einer Zeile e i n . Vor d e r Ü b e r n a h m e des W e r t e s in d a s Feld ist jedoch zu p r ü f e n , ob die v e r e i n b a r t e n Grenzen e i n g e h a l t e n w e r d e n . Bild 5 - 1 2 zeigt dazu ein P r o g r a m m b e i s p i e l . Die M a t h e m a t i k v e r w e n d e t g e l e g e n t l i c h auch m e h r f a c h e Indizes, in F O R T R A N sind bis zu 7 Indizes m ö g l i c h . Beispiel f ü r ein d r e i d i m e n s i o n a l e s F e l d : DIMENSION A ( 2 , 4 , 3 ) Der e r s t e Index k ö n n t e die S e i t e , der z w e i t e Index die Zeile und der d r i t t e Index d i e S p a l t e e i n e r T a b e l l e d a r s t e l l e n . Die T a b e l l e b e s t e h t dann a u s 2 S e i t e n , 4 Zeilen und 3 S p a l t e n . Bei der Anordnung im Speicher l a u f e n die linken Indizes schneller als d i e r e c h t e n . In dieser R e i h e n f o l g e w e r d e n die E l e m e n t e a d r e s s i e r t , wenn nur d e r N a m e des F e l d e s in einer E i n / A u s g a b e a n w e i s u n g e r s c h e i n t . In dem v o r l i e g e n d e n Beispiel l a u t e t die R e i h e n f o l g e der 24 E l e m e n t e : A( 1 , 1 , 1 ) A ( 2 , 1 , 1 ) A ( 1 , 2 , 1 ) A ( 2 , 2 , 1 ) A ( 1 , 3 , 1 ) A ( 2 , 3 , 1 )
A(1,4,1)
A(2,4,1)
A(1,1,2) A(2,1,2) A(1,2,2) A(2,2,2) A(1,3,2) A(2,3,2) A(1,4,2)
A(2,4,2)
A(1,1,3) A(2,1,3) A(1,2,3) A(2,2,3) A(1,3,3) A(2,3,3)
A(2,4,3)
A(1,4,3)
5.4 Übungen zum Abschnitt mehrdimensionale Felder Der Abschnitt 11 e n t h ä l t f ü r a l l e A u f g a b e n Lösungsvorschläge!
1. A u f g a b e : Bei e i n e r Meßreihe w e r d e n i m m e r 10 Messungen v o r g e n o m m e n , die Zahl der M e ß r e i h e n kann zwischen 1 und 20 s c h w a n k e n . Die e r s t e E i n g a b e z e i l e e n t h ä l t die Zahl der M e ß r e i h e n , d a n n f o l g e n Eingabezeilen mit je 10 M e ß w e r t e n e i n e r M e ß r e i h e . Man s p e i c h e r e d i e D a t e n in einem z w e i d i m e n s i o n a l e n F e l d , b e r e c h n e den M i t t e l w e r t aller M e ß w e r t e und gebe die T a b e l l e w i e d e r a u s .
2. A u f g a b e : Man lese zwei M a t r i z e n A und B aus je vier Zeilen und fünf S p a l t e n ein und b e r e c h n e die S u m m e n m a t r i x C, indem man die e n t s p r e c h e n d e n E l e m e n t e a d d i e r t . C(I,J)
= A(I,J) + B (I,J)
Dann b e r e c h n e man f ü r j e d e Matrix die S u m m e aller E l e m e n t e und gebe sie z u s a m m e n mit den M a t r i z e n a u s . Man löse die A u f g a b e so, d a ß die Größe der M a t r i z e n leicht g e ä n d e r t w e r d e n kann.
5 . 5 Die häufigsten Fehler bei der Verwendung
von Feldern
91
3. A u f g a b e : In den Übungen zum A b s c h n i t t e i n d i m e n s i o n a l e F e l d e r h a b e n wir in d e r 3. A u f gabe d e n Widerstand e i n e s K u p f e r d r a h t e s f ü r die D r a h t d u r c h m e s s e r von 0.5 bis 1.0 mm ( S c h r i t t w e i t e 0.1 m m ) und f ü r die D r a h t l ä n g e n von 1 b i s 100 m ( S c h r i t t w e i t e 1 m) a u s g e g e b e n . Lösen Sie die g l e i c h e A u f g a b e mit e i n e m zweid i m e n s i o n a l e n F e l d . Wenn Sie f ü r d e n T e s t Papier s p a r e n wollen, so lesen Sie die m a x i m a l e D r a h t l ä n g e e i n .
5.5 Die häufigsten Fehler bei der Verwendung von Feldern F e l d e r müssen vor i h r e r V e r w e n d u n g d u r c h e i n e DIMENSION-Anweisung oder in e i n e r expliziten ( a u s d r ü c k l i c h e n ) Typvereinbarung d e f i n i e r t w e r d e n . Schlagen Sie in den U n t e r l a g e n zu Ihrem R e c h n e r n a c h , ob Ihr F O R T R A N - C o m p i l e r auch n e g a t i v e Indizes und d e n Index Null und R E A L - G r ö ß e n zur Indizierung zuläßt. Wenn Sie die D i m e n s i o n i e r u n g vergessen und d e n n o c h e i n e n N a m e n g e f o l g t von einem K l a m m e r a u s d r u c k v e r w e n d e n , so sind die F o l g e n sehr s t a r k vom Compiler und vom B e t r i e b s s y s t e m Ihrer R e c h e n a n l a g e a b h ä n g i g . Der Ausdruck SUM = X ( I ) z.B. k ö n n t e a u c h als A u f r u f des F U N C T I O N - U n t e r p r o g r a m m s X mit dem A r g u ment I a n g e s e h e n w e r d e n , w e n n eine F e l d v e r e i n b a r u n g f ü r X f e h l t . Bei einigen R e c h e n a n l a g e n e r h a l t e n Sie eine F e h l e r m e l d u n g vom C o m p i l e r , bei a n d e r e n vom Binder (Linker oder M a p p e r ) , der das U n t e r p r o g r a m m n i c h t finden kann. T e s t e n Sie doch Ihren R e c h n e r , w i e der mit dem Problem f e r t i g wird, wenn Sie die F e l d v e r e i n b a r u n g e i n f a c h mal v e r g e s s e n . Der s c h w e r w i e g e n d s t e F e h l e r bei d e r Verwendung von F e l d e r n t r i t t a u f , wenn Sie d i e v e r e i n b a r t e n G r e n z e n e i n e s F e l d e s ü b e r s c h r e i t e n . Dies g e s c h i e h t leicht, wenn Sie e i n e V a r i a b l e als Index v e r w e n d e n . Das F e l d j a liegt z u s a m m e n mit a n d e r e n V a r i a b l e n und dem P r o g r a m m und dem B e t r i e b s s y s t e m im A r b e i t s s p e i c h e r . Ü b e r s c h r e i t e n Sie die o b e r e G r e n z e oder u n t e r s c h r e i t e n Sie die u n t e r e Grenze eines F e l d e s , so s p r e c h e n Sie d a m i t a n d e r e V a r i a b l e n Ihres P r o g r a m m s oder sogar die B e f e h l e Ihres P r o g r a m m s a n . Die F o l g e n sind wieder von der Art Ihres R e c h n e r s a b h ä n g i g . Bei e i n f a c h e n A r b e i t s p l a t z r e c h n e r n ( S i n g l e - U s e r - oder E i n - B e n u t z e r - B e t r i e b ) können Sie d u r c h d a s Ü b e r s c h r e i t e n der F e l d g r e n z e n Ihre e i g e n e n D a t e n oder Ihr e i g e n e s P r o g r a m m o d e r sogar das B e t r i e b s s y s t e m z e r s t ö r e n . S c h l i m m s t e n f a l l s können Sie den R e c h n e r nur durch den N e t z s c h a l t e r wieder u n t e r Ihre K o n t r o l le b e k o m m e n . Bei A r b e i t s p l a t z r e c h n e r n , bei d e n e n m e h r e r e B e n u t z e r gleichzeitig a r b e i t e n können ( M u l t i - U s e r - B e t r i e b ) , und bei G r o ß r e c h n e r n wird Ihnen nur ein Teil des A r b e i t s s p e i c h e r s zur V e r f ü g u n g g e s t e l l t . Das B e t r i e b s s y s t e m k o n t r o l l i e r t diesen B e r e i c h während der A u s f ü h r u n g Ihres P r o g r a m m s und b r i c h t Ihr P r o g r a m m mit e i n e r F e h l e r m e l d u n g a b , wenn Sie v e r s u c h e n , d i e s e n B e r e i c h zu v e r l a s s e n . Sie können also nur Ihre e i g e n e n D a t e n und eventuell Ihr e i g e n e s P r o g r a m m z e r s t ö ren. Es d ü r f t e Ihnen n o r m a l e r w e i s e nicht gelingen, d a s B e t r i e b s s y s t e m und d a mit d e n R e c h n e r " a b s t ü r z e n " zu lassen.
92
Im
5 Indizierte
Bild
Variablen (Felder)
5-13 finden Sie ein
Testprogramm,
W e r t e n v o n 1 b i s 10 und d a n n d a s F e l d Y
das F e l d X
setzt.
Dann
Index
für die Adressierung der beiden Felder dient. Mit diesem
ist
wird
das z u n ä c h s t
es leicht
versuchen,
in e i n e r L e s e s c h l e i f e e i n e I N T E G E R - Z a h l
möglich,
nach
der
im
Dialog
gleichen
"fremde"
Methode
mit
den
m i t d e n W e r t e n v o n 10 bis 100 v o r b e -
Speicherstellen
auch
"fremde"
schreiben, so bedenken Sie b i t t e die m ö g l i c h e n
eingelesen, die
als
Testprogramm
zu l e s e n . W e n n S i e
Speicherstellen
zu
be-
Folgen!
C BILD 5 - 1 3 TE5T AUF SPEICHERGRENZEN DIMENSION XCIO) , MCIO) DO 5 I - 1 , 1 0 XCI3 - F L 0 A T C I 5 nc n - i 5 CONTINUE 10 WRITEC*,*)'INDEX EINBEBEN' READC *,*, E N D - 2 0 3 I uiritec*,*) x c n , ntn G O T O 10 20 STOP END
B> T E S T INDEX E I N G E B E N 1 1.0000000 INDEX E I N G E B E N 2 2.0000000 INDEX E I N G E B E N 10 10.0000000 INDEX E I N G E B E N 11 1.401290E-045 INDEX EINGEBEN 12 2.802597E-045 INDEX E I N G E B E N 13 4.203895E-045 INDEX E I N G E B E N 14 5.6051S4E-045
Bild 5-13:
INDEX E I N G E B E N 15 7.00B432E-045 INDEX E I N G E B E N 16 B.407791E-045 INDEX E I N G E B E N 17 9.8090S9E-04S INDEX E I N G E B E N 0 4.5205B9E-042 INDEX E I N G E B E N -1 3.30B07BE-03B INDEX E I N G E B E N
10
11
2233B
B0031B71
B3374255
E697B784
1092615192
1091567616
- 2
57273317
Testprogramm
1090519040
1.001503E-032 INDEX E I N G E B E N -3 -1 .6B3504E+030
54525753
zur U n t e r s u c h u n g von
108B42188B
Speichergrenzen
Einen Index, d e r e i n g e l e s e n w i r d , s o l l t e man auf j e d e m F a l l durch das P r o g r a m m auf
Zulässigkeit
Fällen
prüfen. Einen
p r ü f e n , da sonst
der
Programms stark ansteigen
berechneten
Index
Programmieraufwand
s o l l t e m a n nur in k r i t i s c h e n und d i e A u s f ü h r u n g s z e i t
E i n e v a r i a b l e D i m e n s i o n i e r u n g g i b t e s n i c h t in F O R T R A N . D u r c h Vereinbarungen Schleifen
können
verändern.
Sie
des
können.
leicht
die Feldgrenzen
und d i e
PARAMETER-
Bereiche
von
DO-
6 Unterprogrammtechnik Im Abschnitt 2.5 (Bild 2-3) haben Sie einige Standardfunktionen wie z.B. ABS und SQRT kennengelernt. In den Beispielen und Übungen haben wir sie verwend e t , um Teilaufgaben wie z.B. die Berechnung des Absolutwertes oder das Wurzelziehen zu lösen. Diese Programmteile, die durch Nennung ihres Namens Berechnungen durchführen, nennt man Unterprogramme. Sie machen ein Programm übersichtlicher, weil man mit ihrer Hilfe Teilaufgaben getrennt vom Hauptproblem behandeln kann. Im Beispiel der Wurzelfunktion brauchen wir noch nicht einmal zu wissen, nach welchem Verfahren die SQRT-Funktion a r b e i t e t . In diesem Abschnitt lernen Sie, wie man eigene Unterprogramme schreibt und a u f r u f t . Dabei unterscheidet man interne und externe Unterprogramme. Interne Unterprogramme werden zusammen mit dem aufrufenden Hauptprogramm übersetzt. Bei externen Unterprogrammen werden Haupt- und Unterprogramm getrennt in verschiedenen Compilerläufen übersetzt. Dann muß ein Bindeprogramm (Linker oder Mapper) des Betriebssystems die beiden Programme miteinander verbinden.
6.1
Standard-Unterprogramme
Die Standard-Unterprogramme wie z.B. ABS oder SQRT stellt Ihnen der Rechner zur Verfügung, ohne daß Sie sich um die Programmierung dieser Funktionen kümmern müssen. Dabei unterscheidet man Einbaufunktionen und Bibliotheksfunktionen. Beim Aufruf einer Einbaufunktion baut der Compiler die zu ihrer Ausführung erforderlichen Maschinenbefehle an der Stelle in das Maschinenprogramm ein, an der die Funktion im Programm aufgerufen wird. Ein Beispiel ist die ABSFunktion, die den Absolutwert berechnet. Zu ihrer Ausführung sind nur wenige Maschinenbefehle erforderlich. Bild 6 - 1 zeigt ein Beispiel. FORTRAN
Maschinenprogramm
94
6
Unterprogrammtechnik
U m f a n g r e i c h e r e Berechnungsverfahren wie z.B. das Wurzelziehen (SQRT) b e h a n delt der Compiler als Bibliotheksfunktion. An der Stelle des Aufrufs erzeugt er einen Sprungbefehl, der in das Unterprogramm f ü h r t . Am Ende des U n t e r p r o g r a m m s steht ein Rücksprungbefehl, der d a f ü r sorgt, daß das a u f r u f e n d e Hauptprogramm an der Stelle f o r t g e f ü h r t wird, an der das Unterprogramm a u f g e r u fen wurde. Bild 6 - 2 zeigt die Wirkung einer Bibliotheksfunktion. Im Gegensatz zu einer Einbaufunktion ist die Bibliotheksfunktion nur einmal vorhanden und kann von verschiedenen Stellen aus angesprungen werden.
Hauptprogramm FORTRAN X = SQRT( A )
Maschinenprogramm Sprung zum Unterprogramm SQRT - —
Y = SQRT( B )
Z = SQRT( C )
Bild 6-2: Wirkung einer Bibliotheksfunktion Der Maschinencode einer Bibliotheksfunktion wird nicht vom Compiler erzeugt, sondern einer Unterprogrammbibliothek des Betriebssystems e n t n o m m e n . Das gleiche gilt für die Ausführung von Ein/Ausgabeanweisungen wie READ und WRITE, für die der Compiler ebenfalls S y s t e m u n t e r p r o g r a m m e a u f r u f t . Aus diesem Grund ist nach der Übersetzung eines FORTRAN-Programms ein Aufruf des Binders (LINK oder MAP) erforderlich, der die benötigten S y s t e m u n t e r p r o gramme einer Bibliothek entnimmt und mit dem Hauptprogramm zu einem ladbaren und ausführbaren Programm verbindet. Beim Aufruf einer Standardfunktion gibt es keinen Unterschied zwischen einer Einbaufunktion und einer Bibliotheksfunktion. Sie unterscheiden sich nur in der Art der Ausführung. Die Funktionen können Sie auf folgende Größen anwenden:
6.2 Die
Funktionsanweisung
SQRT(3.5)
Konstanten
SQRT(X)
Variablen
SQRT(A**2 + B**2)
Ausdrücke
SQRT(X(I))
Feldelemente
SQRT(ABS(X))
weitere Funktionen
95
F u n k t i o n s a u f r u f e können auch B e s t a n d t e i l eines a r i t h m e t i s c h e n Ausdrucks sein. Z = H*SIN(ALFA*PI/180.) + 13.4 Zunächst wird der Mit dem Ergebnis F u n k t i o n s w e r t wird Ergebnis g e l a n g t in
in K l a m m e r n s t e h e n d e a r i t h m e t i s c h e Ausdruck b e r e c h n e t . wird die S i n u s - F u n k t i o n a u f g e r u f e n . Der z u r ü c k g e l i e f e r t e mit H multipliziert und zur K o n s t a n t e n 13.4 a d d i e r t . Das die S p e i c h e r s t e l l e Z.
6.2 Die Funktionsanweisung E i n f a c h e F o r m e l n , die nur aus einer Programmzeile b e s t e h e n , können als F u n k tions-Anweisung d e f i n i e r t w e r d e n . Sie wird auch Anweisungsfunktion oder F o r m e l f u n k t i o n g e n a n n t . Als Beispiel b e t r a c h t e n wir die F o r m e l zur B e r e c h nung des G e s a m t w i d e r s t a n d e s aus zwei parallel g e s c h a l t e t e n T e i l w i d e r s t ä n d e n :
Diese F o r m e l können wir d i r e k t als Funktionsanweisung schreiben: RPAR (RP1.RP2) = RP1 * RP2 / (RP1 + RP2) Wenn Sie nun im Programm diese F o r m e l anwenden wollen, so geben Sie ihren N a m e n und die Größen an, mit denen sie d u r c h g e r e c h n e t w e r d e n soll. R = RPAR (1000. , 2000.) + RPAR (A , B) In dem Beispiel wird die F o r m e l zunächst f ü r die K o n s t a n t e n 1000 und 2000 und dann f ü r die Variablen A und B d u r c h g e r e c h n e t , beide Ergebnisse w e r d e n addiert und in d e r Variablen R a b g e s p e i c h e r t . E l e k t r o t e c h n i s c h gesehen wurde der G e s a m t w i d e r s t a n d einer Parallelschaltung von 1000 Ohm und 2000 Ohm in Reihe g e s c h a l t e t mit einer P a r a l l e l s c h a l t u n g d e r Widerstände A und B b e r e c h net. Funktionsanweisungen müssen im Programm n a c h den Vereinbarungen und vor der e r s t e n a u s f ü h r b a r e n Anweisung d e f i n i e r t w e r d e n . Sie haben die a l l g e m e i n e Form:
96
6 Unterprogrammtechnik
Name ( Liste ) =
Ausdruck
Der Name wird nach den Regeln für frei wählbare Namen gebildet. Er darf aus höchstens sechs Buchstaben oder Ziffern bestehen, das e r s t e Zeichen muß ein Buchstabe sein. Die L i s t e enthält durch Kommas getrennt die Namen der f o r m a l e n Argumente oder P a r a m e t e r , die in dem Ausdruck auf der rechten S e i t e erscheinen. Der Ausdruck auf der r e c h t e n S e i t e enthält eine F o r m e l . Sie kann aus a l l g e meinen Bezeichnungen ( F o r m e l s y m b o l e n ) , Konstanten, Standardfunktionen oder Namen b e r e i t s definierter Funktionsanweisungen b e s t e h e n . Bei der Definition einer Funktionsanweisung werden weder Maschinenbefehle erzeugt noch Speicherstellen für die formalen Argumente angelegt. Diese wirken lediglich als Platzhalter (Dummy) für die beim Aufruf genannten Größen. Einige Compiler lassen es zu, bei der Definition das Kennwort DEFINE vor den Namen der Funktionsanweisung zu setzen. DEFINE RPAR(RP1,RP2) = RP1*RP2/(RP1+RP2) Der Aufruf der Funktionsanweisung erfolgt in der allgemeinen Form
Name ( Liste der tatsächlichen Werte )
als Bestandteil einer Anweisung. Die t a t s ä c h l i c h e n oder aktuellen Werte e r s e t zen die formalen Argumente der Definition und zwar in der R e i h e n f o l g e , in der sie in der Argumentenliste der Definition erscheinen. Der e r s t e Wert des A u f rufs t r i t t an die Stelle des e r s t e n formalen Argumentes in der Definition. Im Aufruf sind Konstanten, Variablen, Ausdrücke und der Aufruf w e i t e r e r Funktionen zulässig. Beispiele für den Aufruf der eingangs definierten Funktionsanweisung: R12 = RPAR (1000. + R4 , R34+R35+R36) RMESS = RPAR (1000. , RPAR (1000. , RTEIL+ RA)) Funktionsanweisungen wirken wie Einbaufunktionen. An den S t e l l e n , an denen sie aufgerufen werden, baut der Compiler die zu ihrer Ausführung notwendigen B e f e h l e ein. In einem Beispiel soll die in Bild 6 - 3 d a r g e s t e l l t e Schaltung aus drei ohmschen Widerständen untersucht werden. Für gegebene f e s t e Widerstände R1 und R2 ist die Ausgangsspannung UA für die Eingangsspannung UE und den Widerstand R V zu b e r e c h n e n .
97
6.2 Die Funktionsanweisung
R
ges
Bild 6 - 3 :
R
R
1
*
1
+ R
v
+ R, 2
v
I
U
ges
a
=
R
2 *
*ges
ges
Schaltung aus ohmschen Widerständen
Das in Bild 6 - 4 d a r g e s t e l l t e Programmbeispiel d e f i n i e r t die F o r m e l für die Parallelschaltung in einer Funktionsanweisung und liest W e r t e für die konstanten Widerstände R1 und R2 ein. Die E i n g a b e s c h l e i f e liest W e r t e für die Eingangsspannung UE und den Widerstand R V , b e r e c h n e t daraus den Strom und die Ausgangsspannung U A und gibt U A aus.
C BILD 6-4 PROGRAMtlBEISPIEL S C H A L T U N G S B E R E C H N U N G REAL IGES RPARCRP1,RP53 - RP1*RP2/CRP1+RP2) C W I D E R S T A E N D E R1 UND R2 LESEN UIRITEC*, ' R1 UND R2 IN OHtl E I N G E B E N ' READC*,*) R1,R2 C U E U N D RU E I N G E B E N 10 UIRITEC»,»:>'RU IN OHtt UND U E IN UDLT E I N G E B E N ' READC*,«,END-SO) RU,UE R G E S - RPARCRI.RU:) + R5 IGES - U E / R G E S UA - IGES*R2 URITEC * , * )'UA-',UA, ' U D L T ' GDTD 10 20 STOP END B> TEST R1 UND R2 IN OHH E I N G E B E N 1000 5 0 0 RU IN O H M UND U E IN UOLT E I N G E B E N 1000 100 UA= 5 0 . 0 0 0 0 0 0 0 UOLT Bild 6 - 4 :
Programmbeispiel
Schaltungsberechnung
Funktionsanweisungen können f ü r Größen aller Datentypen I N T E G E R , R E A L , D O U B L E P R E C I S I O N , C O M P L E X , L O G I C A L und C H A R A C T E R d e f i n i e r t werden.
98
6 Unterprogrammtechnik
6.3 FUNCTION-Unterprogramme Wenn Sie e i n e F u n k t i o n p r o g r a m m i e r e n w o l l e n , d i e n i c h t m e h r a u s e i n e r e i n z i g e n F o r m e l b e s t e h t o d e r zu d e r e n B e r e c h n u n g e i n R e c h e n v e r f a h r e n e r f o r d e r l i c h i s t , so m ü s s e n Sie e i n U n t e r p r o g r a m m vom T y p F U N C T I O N s c h r e i b e n . E s a r b e i t e t wie e i n e B i b l i o t h e k s f u n k t i o n . Als B e i s p i e l d i e n e e i n U n t e r p r o g r a m m zur B e r e c h n u n g d e r d r i t t e n W u r z e l . Wir g e b e n ihm d e n N a m e n D W U R Z u n d r u f e n es in e i n e m H a u p t p r o g r a m m d u r c h N e n n u n g d e s N a m e n s und d e s zu b e r e c h n e n den Radikanden auf:
C HAUPTPROGRAMM 10 WRITE(*,*) 'X EINGEBEN 1 READ (*,*,END=20) X Z = DWURZ(X) WRITE(*,*) X , Z GOTO 10 20 STOP
Da d e r C o m p i l e r k e i n e S t a n d a r d f u n k t i o n m i t d e m N a m e n D W U R Z k e n n t , m ü s s e n wir d a s U n t e r p r o g r a m m n a c h d e m N e w t o n s c h e n N ä h e r u n g s v e r f a h r e n ( Ü b u n g e n zum A b s c h n i t t 4 . 5 A u f g a b e 6) s e l b s t s c h r e i b e n . Aus e i n e r A n f a n g s l ö s u n g XO ergibt sich eine bessere Lösung XI nach der F o r m e l
Das folgende Beispiel zeigt die Programmierung F U N C T I O N - U n t e r p r o g r a m m DWURZ
des
Verfahrens
in
einem
C UNTERPROGRAMM FUNCTION DWURZ(A) D = 1.0E-6 XO = 1 . 0 C NAEHERUNGSSCHLEIFE 10 C0NTINUE X = (2.0 * X0 + A/(X0*X0)) / 3.0 DIFF = ABS((X0-X)/X0) X0 = X IF (DIFF.GT.D) GOTO 10 C GEFORDERTE GENAUIGKEIT ERREICHT DWURZ = X RETURN
D a s U n t e r p r o g r a m m b e g i n n t m i t d e m K e n n w o r t F U N C T I O N g e f o l g t vom N a m e n D W U R Z und d e m f o r m a l e n P a r a m e t e r A , d e r f ü r d e n R a d i k a n d e n s t e h t . D a n n f o l g t d a s L ö s u n g s v e r f a h r e n . A m Ende d e s U n t e r p r o g r a m m s w i r d d e m N a m e n D W U R Z d a s E r g e b n i s z u g e w i e s e n . Mit R E T U R N k e h r t e s in d a s H a u p t p r o g r a m m z u r ü c k . Ein F U N C T I O N - U n t e r p r o g r a m m h a t d i e a l l g e m e i n e F o r m :
6.3 FUNCTION-Unterprogramme
99
Typ FUNCTION Name ( Liste ) Vereinbarungen und Anweisungen Name = Wert RETURN
Ein FUNCTION-Unterprogramm liefert einen Wert an das Hauptprogramm zurück. Der Name des Unterprogramms ist daher wie eine Variable mit einem der Datentypen INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL und CHARACTER verknüpft. Der Name darf aus maximal sechs Buchstaben oder Z i f f e r n bestehen; das erste Zeichen muß ein Buchstabe sein. Es gilt die Namensregel wie bei Variablennamen. Die Anfangsbuchstaben I, J, K, L , M und N kennzeichnen Funktionen vom Typ INTEGER, alle anderen sind R E A L . Bei Abweichungen von der Namensregel wird der Typ vor das Kennwort FUNCTION gesetzt. Man beachte, daß im Hauptprogramm die gleiche Typvereinbarung e r forderlich ist. Beispiel:
C HAUPTPROGRAMM REAL NWURZ Z = NWURZ(X) C UNTERPROGRAMM REAL FUNCTION NWURZ(A) NWURZ = RETURN
In der Liste stehen die im Unterprogramm verwendeten allgemeinen Bezeichnungen (formale Argumente oder Parameter), die beim Aufruf durch die tatsächlichen Werte (aktuelle Argumente oder Parameter) ersetzt werden. Das Unterprogramm selbst enthält beliebige Vereinbarungen und Anweisungen und kann weitere Unterprogramme aufrufen. Ein rekursiver Aufruf ist verboten; ein Unterprogramm darf nicht sich selbst aufrufen. Weist man dem Namen des Unterprogramms einen Wert zu, so wird dieser mit dem Rücksprungbefehl RETURN in das aufrufende Programm als Ergebnis zurückgeliefert. Am Ende mehrerer Programmzweige dürfen durchaus mehrere Wertzuweisungen und RETURN-Befehle stehen. Wirksam sind immer nur die Befehle, die tatsächlich ausgeführt werden. Der Aufruf eines FUNCTION-Unterprogramms erfolgt in einer Anweisung in der allgemeinen Form
100
6
Unterprogrammtechnik
Name ( Liste der tatsächlichen Werte )
Die tatsächlichen (aktuellen) Werte im Aufruf nehmen den Platz der allgemeinen (formalen) Bezeichnungen der Definition ein. Sie müssen in der Art, in der Anzahl und im Typ mit diesen übereinstimmen. Als tatsächliche Werte können Sie verwenden: DWURZ(27.0)
Konstanten
DWURZ(X)
Variablen
DWURZ(X + Y)
Ausdrücke
DWURZ(Z(I))
Feldelemente
DWURZ(ABS(X))
weitere Funktionen
DIMENSION A(5) XM = WMITT(A,5)
Namen von Feldern
Wie bei den Standardfunktionen kann mit dem Ergebnis eines FUNCTIONUnterprogramms in einem Ausdruck weitergerechnet werden. Z = SQRT(X) + 3.0 * DWURZ(X)
Beim Aufruf eines FUNCTION-Unterprogramms erzeugt der Compiler wie beim Aufruf einer Bibliotheksfunktion einen Sprungbefehl, der in das aufgerufene Unterprogramm führt. Am Ende des Unterprogramms steht ein Rücksprungfehl (RETURN), der an die Stelle des Aufrufs zurückkehrt. Wird ein FUNCTION-Unterprogramm zusammen mit dem aufrufenden Hauptprogramm in einem Compileraufruf übersetzt, so spricht man von einem internen Unterprogramm. Üblicherweise verwendet man jedoch externe Unterprogramme, die in einem besonderen Compilerlauf übersetzt werden. Der Abschnitt 6.7 zeigt die Verbindung zwischen den getrennt übersetzten Programmen durch den Linker (Binder). Bild 6-5 zeigt ein Hauptprogramm mit einem externen FUNCTION-Unterprogramm zur Berechnung der dritten Wurzel nach dem Newtonschen Näherungsverfahren. Das Hauptprogramm liest in einer Eingabeschleife den Radikanden, ruft das Unterprogramm DWURZ auf und gibt das Ergebnis aus. Die Schleife wird durch die Eingabe einer Endemarke mit dem Befehl STOP abgebrochen. Dahinter liegt das FUNCTION-Unterprogramm DWURZ, das mit dem Befehl RETURN in das Hauptprogramm zurückkehrt. Hinter jedem der beiden Programme steht die END-Anweisung als Endemarke für die Programmzeilen. Durch die getrennte Übersetzung kann man in beiden Programmen die gleichen Variablennamen und Anweisungsnummern verwenden, ohne daß dies eine Wertübertragung oder einen Sprung zwischen den Programmen bewirkt.
6.4 SUBROUTINE-Unterprogramme
101
C BILD 6 - 5 HAUPTPROGRAtlM 10 UJRITEC*, 'X EINGEBEN' READ(*,•,END-BO) X Z - DWURZCX) UIRITE ( * , * ) X,Z GOTD 10 BO STOP END C BILD 6 - 5 FUNCTION-UNTERPROGRAMM FUNCTION DUURZCA) D - 1.OE-6 XO - 1 . 0 C NAEHERUNGSSCHLEI FE 10 CONTINUE X - CB.O«XO + A/CX0*X0))/3.0 DIFF - ABSC CX-XOD/XO) XO - X IF C DI FF.GT.D 5 GOTO 10 C GEFORDERTE GENAUIGKEIT ERREICHT DUJURZ - X RETURN END B> TEST X EINGEBEN B B.0000000
B.0000000
Bild 6-5: Programmbeispiel FUNCTION-Unterprogramm
6.4 SUBROUTINE-Unterprogramme Die bisher behandelten Unterprogramme l i e f e r t e n nur einen Zahlenwert an das Hauptprogramm zurück. Für die Übergabe mehrerer Ergebnisse ist ein U n t e r programm vom Typ SUBROUTINE e r f o r d e r l i c h . Als Beispiel b e t r a c h t e n wir ein U n t e r p r o g r a m m , das bei gegebenem Durchmesser D den Flächeninhalt A und den Umfang U eines Kreises b e r e c h n e t . Wir geben dem Unterprogramm den Namen KREIS und rufen es im Hauptprogramm mit dem CALL-Befehl auf: C HAUPTPROGRAMM 10 WRITE(*,*) 'DURCHMESSER EINGEBEN' READ(*,*,END=20) X CALL KREIS(X,Y,Z) WRITE(*,*)X,Y,Z GOTO 10 20 STOP Hinter dem Namen des Unterprogramms KREIS stehen sowohl der Name des Eingangswertes X als auch die Namen der beiden Ergebnisse Y und Z. Das Unterprogramm KREIS beginnt mit dem Kennwort SUBROUTINE.
102
6
Unterprogrammtechnik
C UNTERPROGRAMM SUBROUTINE KREIS(D,A,U) PI = 3.1415927 A = PI * D * D / 4.0 U = PI * D RETURN Das U n t e r p r o g r a m m verwendet anstelle der Variablen X, Y und Z des H a u p t p r o g r a m m s die a l l g e m e i n e n Bezeichnungen D, A und U. Das Ergebnis wird nicht mit dem U n t e r p r o g r a m m n a m e n , sondern über die A r g u m e n t e A und U an das H a u p t p r o g r a m m z u r ü c k g e l i e f e r t . Die Definition eines S U B R O U T I N E - U n t e r p r o g r a m m s h a t die a l l g e m e i n e F o r m :
SUBROUTINE Name ( Liste ) Vereinbarungen und Anweisungen Argument = Wert RETURN
Hinter dem Kennwort SUBROUTINE folgen der Name des U n t e r p r o g r a m m s und in einer Liste die allgemeinen Bezeichnungen. Sie werden auch f o r m a l e Argum e n t e oder P a r a m e t e r g e n a n n t . Der Name des U n t e r p r o g r a m m s b e s t e h t wieder aus höchstens sechs Buchstaben oder Z i f f e r n mit einem Buchstaben als e r s t e m Z e i c h e n . Da mit dp;m N a m e n keine Werte ü b e r t r a g e n werden, gibt es für ihn keine N a m e n s r e g e l oder Typvereinbarung. Die A r g u m e n t e n l i s t e e n t h ä l t sowohl die Namen der E i n g a b e w e r t e als auch der Ergebnisse. Alle A r g u m e n t e , d e n e n im U n t e r p r o g r a m m ein neuer Wert z u g e w i e sen wird, ü b e r t r a g e n diesen an das H a u p t p r o g r a m m . Mit dem Befehl RETURN k e h r t d a s U n t e r p r o g r a m m an die Stelle des A u f r u f s in das H a u p t p r o g r a m m z u rück. Der Aufruf e r f o l g t mit einer besonderen Anweisung
CALL Name ( Liste )
In der L i s t e des C A L L - B e f e h l s e r s c h e i n e n sowohl die N a m e n der a k t u e l l e n Eing a b e w e r t e als auch die N a m e n d e r Ergebnisse, die das U n t e r p r o g r a m m an das H a u p t p r o g r a m m z u r ü c k l i e f e r t . Die A r g u m e n t e n l i s t e n im Aufruf und in der D e finition müssen in der Anzahl und im Typ ü b e r e i n s t i m m e n . Als E i n g a b e p a r a m e t e r können Sie K o n s t a n t e n , Variablen, Ausdrücke, F e l d e l e m e n t e oder N a m e n von Feldern verwenden. Als A u s g a b e p a r a m e t e r sind nur Variablen oder Felder zulässig.
6.5 Die Verwendung von Feldern in Unterprogrammen
103
Wird ein S U B R O U T I N E - U n t e r p r o g r a m m z u s a m m e n mit dem a u f r u f e n d e n H a u p t p r o g r a m m in e i n e m Compilerlauf ü b e r s e t z t , so s p r i c h t man von einem i n t e r n e n U n t e r p r o g r a m m . Ü b l i c h e r w e i s e v e r w e n d e t man j e d o c h externe U n t e r p r o g r a m m e , 4 i e g e t r e n n t vom H a u p t p r o g r a m m ü b e r s e t z t w e r d e n . Der A b s c h n i t t 6.7 zeigt ihre Verbindung d u r c h d e n Linker ( B i n d e r ) . Bild 6 - 6 zeigt a l s Beispiel ein S U B R O U T I N E - U n t e r p r o g r a m m KREIS, d a s aus d e m D u r c h m e s s e r D die F l ä c h e A und den U m f a n g U eines K r e i s e s b e r e c h n e t . C BILD B-B HAUPTPROGRAMM 10 WRITEC*,*5'DURCHMESSER EINGEBEN' READC*,*,END-20) X CALL KREISCX,Y,2) WRI TEC * , * ) X , Y , Z GOTO 10 50 STOP END C BILD B-B SUBROUTINE-UNTERPROGRAMM SUBROUTINE KREISCD,A,U5 PI - 3 . 1 4 1 5 9 2 7 A - PI»D*D/4.0 U - PI*• RETURN END B> TEST DURCHMESSER EINGEBEN 1 1.00CT0000 7 .BS3SB2E-001 Bild 6 - 6 :
Programmbeispiel
3.1415930
SUBROUTINE-Unterprogramm
Das H a u p t p r o g r a m m liest in e i n e r E i n g a b e s c h l e i f e den K r e i s d u r c h m e s s e r , r u f t mit dem B e f e h l CALL d a s U n t e r p r o g r a m m zur B e r e c h n u n g der K r e i s f l ä c h e und des K r e i s u m f a n g s auf und gibt die Ergebnisse a u s . Durch die Eingabe einer S t e u e r a n w e i s u n g wird das P r o g r a m m mit dem S T O P - B e f e h l b e e n d e t . Das U n t e r p r o g r a m m a r b e i t e t mit d e n a l l g e m e i n e n Bezeichnungen D, A und A a n s t e l l e der a k t u e l l e n A r g u m e n t e X, Y und Z. Die für A und U im U n t e r p r o g r a m m b e r e c h n e t e n W e r t e w e r d e n an die V a r i a b l e n Y und Z des H a u p t p r o g r a m m s ü b e r g e b e n . Hinter j e d e m d e r beiden P r o g r a m m e s t e h t die Anweisung END als l e t z t e Programmzeile.
6.5 Die Verwendung von Feldern in Unterprogrammen U n t e r p r o g r a m m e vom Typ FUNCTION und SUBROUTINE g e s t a t t e n wie H a u p t p r o g r a m m e d i e V e r w e n d u n g von e i n - und m e h r d i m e n s i o n a l e n F e l d e r n . Die f o l g e n d e n A u s f ü h r u n g e n g e l t e n f ü r b e i d e U n t e r p r o g r a m m t y p e n . F e l d e r , die a u s schließlich im U n t e r p r o g r a m m v e r e i n b a r t und v e r w e n d e t w e r d e n , h e i ß e n lokale F e l d e r . F ü r sie g e l t e n die gleichen R e g e l n wie f ü r F e l d e r im H a u p t p r o g r a m m : Die G r ö ß e j e d e r F e l d d i m e n s i o n ist d u r c h e i n e I N T E G E R - K o n s t a n t e f e s t z u l e g e n . Mit H i l f e d e r P A R A M E T E R - A n w e i s u n g k ö n n e n die F e l d g r e n z e n und die L a u f p a r a m e t e r von D O - S c h l e i f e n leicht v e r ä n d e r t w e r d e n . Beispiel f ü r ein lokales Feld:
104
C
6
Unterprogrammtechnik
UNTERPROGRAMM SUBROUTINE PARAMETER DIMENSION READ(*,*)
SUM (A,B,C) (NMAX=10) X(NMAX) (X(I),1=1,NMAX)
D a s F e l d X ist l o k a l , w e i l e s im U n t e r p r o g r a m m n i c h t in d e r A r g u m e n t e n l i s t e e r s c h e i n t .
f e s t d i m e n s i o n i e r t wird und
B e i s e h r v i e l e n A n w e n d u n g e n w i r d j e d o c h e i n F e l d im H a u p t p r o g r a m m g e l e s e n und s o l l in e i n e m U n t e r p r o g r a m m v e r a r b e i t e t w e r d e n . Ein B e i s p i e l ist d i e A u f g a b e , a u s e i n e r b e l i e b i g e n A n z a h l von M e ß w e r t e n d e n M i t t e l w e r t zu b i l d e n . D i e M e ß w e r t e w e r d e n d e m F U N C T I O N - U n t e r p r o g r a m m A M I T T in e i n e m e i n d i m e n sionalen Feld z u s a m m e n mit der Anzahl der M e ß w e r t e ü b e r g e b e n .
C
HAUPTPROGRAMM DIMENSION X(20) READ(*,*) X X M = A M I T T ( X , 20)
F ü r f o r m a l e A r g u m e n t e , d i e in d e r A r g u m e n t e n l i s t e e i n e s U n t e r p r o g r a m m s e r scheinen, legt der Compiler keine neuen Speicherplätze an, sondern a r b e i t e t m i t d e n S p e i c h e r p l ä t z e n d e r a k t u e l l e n A r g u m e n t e im H a u p t p r o g r a m m . D i e s g i l t a u c h für F e l d e r . Mit der Ü b e r g a b e des F e l d n a m e n s X wird d e m U n t e r p r o g r a m m l e d i g l i c h d i e A n f a n g s a d r e s s e d e s F e l d e s m i t g e t e i l t . D a d a s F e l d im U n t e r p r o g r a m m nicht neu a n g e l e g t w i r d , kann es v a r i a b e l d i m e n s i o n i e r t w e r d e n . Es darf im U n t e r p r o g r a m m j e d o c h nur b i s zu d e r im H a u p t p r o g r a m m v e r e i n b a r t e n maximalen Größe verwendet werden.
C
UNTERPROGRAMM FUNCTION AMITT (WERT , NWERT) DIMENSION WERT(NWERT) SUM = 0. DO 10 I = 1 , N W E R T SUM = SUM + WERT(I) 10 CONTINUE AMITT = SUM/FL0AT(NWERT) RETURN
D i e s e variable Felddimensionierung ist nur in U n t e r p r o g r a m m e n v o m T y p F U N C T I O N und S U B R O U T I N E z u l ä s s i g , w e n n d a s F e l d und d i e G r ö ß e d e s F e l d e s über die A r g u m e n t e n l i s t e ü b e r g e b e n werden. Das F e l d kann a u c h beliebig dimensioniert werden. C
UNTERPROGRAMM FUNCTION AMITT(WERT DIMENSION WERT(1)
groß
, NWERT)
Wird d i e F e l d g r ö ß e d u r c h e i n e n " * " a n g e g e b e n , s o s p r i c h t m a n von e i n e r o f f e n e n (assumed) Größe des
Feldes.
6.5 Die Verwendung
von Feldern in
Unterprogrammen
105
C UNTERPROGRAMM FUNCTION AMITT(WERT , NWERT) DIMENSION WERT(*) Bei e i n d i m e n s i o n a l e n F e l d e r n gibt e s k e i n e S c h w i e r i g k e i t e n , wenn nur T e i l e des F e l d e s im U n t e r p r o g r a m m v e r a r b e i t e t w e r d e n . Bild 6 - 7 zeigt ein P r o g r a m m beispiel, d a s im H a u p t p r o g r a m m das F e l d X mit der Größe 100 d i m e n s i o n i e r t , die t a t s ä c h l i c h e Anzahl der W e r t e a b e r in einer E i n g a b e s c h l e i f e z ä h l t . Im U n t e r p r o g r a m m ist das f o r m a l e Feld WERT variabel d i m e n s i o n i e r t . Durch die Ü b e r g a b e der t a t s ä c h l i c h e n Anzahl der W e r t e in der Variablen N bzw. NWERT wird im U n t e r p r o g r a m m nur der e i n g e l e s e n e Bereich des F e l d e s a d r e s s i e r t . C
BILD
6 - 7 HAUPTPROGRAMM E I N D I M E N S I O N A L E S F E L D DIMENSION XCIOO) DO 1 0 1-1,100 U ) R I T E C * , * ) I , ' . MESSWERT E I N G E B E N ' READC* , * , E N D - 2 0 ) XCH N - I CONTINUE XM - AM I T T C X , N ) . U I R I T E C * , * ) ' M I T T E L W E R T = ' , XM STOP END
BILD
6-7
10 50
C
UNTERPROGRAMM
EINDIMENSIONALES
FELD
DIMENSION WERTCNUERT) SUM = 0 . 0 DO 1 0 I 1,NWERT SUM - SUM + WERT CI ) CONTINUE AMITT SUM/FL0ATCNWERT3 RETURN END
10
B> T E S T 1.
MESSWERT
EINGEBEN
2.
MESSWERT
EINGEBEN
3.
MESSWERT
EINGEBEN
4. "Z MITTELWERT Stop - Program
MESSWERT
EINGEBEN
1 5 3
Bild 6 - 7 :
2.0000000 terminated.
P r o g r a m m b e i s p i e l e i n d i m e n s i o n a l e s Feld im U n t e r p r o g r a m m
Bei m e h r d i m e n s i o n a l e n F e l d e r n kann es bei der Adressierung der F e l d e l e m e n t e zu S c h w i e r i g k e i t e n k o m m e n , wenn nur T e i l e des im H a u p t p r o g r a m m d i m e n s i o n i e r t e n F e l d e s im U n t e r p r o g r a m m v e r a r b e i t e t w e r d e n sollen. Mehrdimensionale F e l d e r müssen im Speicher linear a n g e o r d n e t w e r d e n . Wie b e r e i t s g e z e i g t , l ä u f t d e r linke Index dabei s c h n e l l e r als der r e c h t e . Als Beispiel diene ein zweid i m e n s i o n a l e s F e l d A mit der F e l d v e r e i n b a r u n g : DIMENSION A(3,4) Die R e i h e n f o l g e der F e l d e l e m e n t e im Speicher ist:
106
6 Unterprogrammtechnik
Inhalt A(1,1 ) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2) A(1,3) A(2,3) A(3,3) A(1,4) A(2,4) A(3,4)
Adresse 1 2 3 4 5 6 7 8 9 10 11 12
Bei der A d r e s s i e r u n g d e r F e l d e l e m e n t e b e r e c h n e t d e r C o m p i l e r die A d r e s s e d e s E l e m e n t e s a u s d e n G r e n z e n d e s F e l d e s in d e r D i m e n s i o n i e r u n g und d e m a k t u e l len I n d e x . F ü r z w e i d i m e n s i o n a l e F e l d e r d e r G r ö ß e A ( K M A X , L M A X ) e r g i b t s i c h die A d r e s s e d e s I n d e x A ( K , L ) a u s d e r F o r m e l A d r e s s e = K + ( L - l ) * KMAX In d e r F o r m e l e r s c h e i n t n u r d i e G r ö ß e d e r e r s t e n D i m e n s i o n , d i e G r ö ß e d e r z w e i t e n D i m e n s i o n wird n i c h t b e n ö t i g t . Sie d i e n t nur d a z u , g e n ü g e n d S p e i c h e r p l a t z zu r e s e r v i e r e n . Z a h l e n b e i s p i e l : Feldgröße: A(3,4)
Element: A(2,3)
Adresse = 2 + ( 3 - l ) * 3 = 8
Auch bei der Übergabe zweidimensionaler Felder an ein U n t e r p r o g r a m m kann d a s F e l d im U n t e r p r o g r a m m v a r i a b e l d i m e n s i o n i e r t w e r d e n . Das f o l g e n d e B e i spiel v e r e i n b a r t im H a u p t p r o g r a m m ein F e l d A in d e r G r ö ß e (3,4) und r u f t ein U n t e r p r o g r a m m SUM a u f , d a s die E l e m e n t e e i n e s z w e i d i m e n s i o n a l e n F e l d e s summiert.
C HAUPTPROGRAMM DIMENSION A(3,4) READ(*,*) A CALL SUM(A,3,4,SUMME) WRITE(*,*) SUMME STOP C UNTERPROGRAMM SUBROUTINE SUM(X,M,N,XSUM) DIMENSION X(M,N) XSUM = 0. DO 20 I = 1,M DO 10 J = 1,N XSUM = XSUM + X(I,J) 10 CONTINUE 20 CONTINUE RETURN
6.5 Die Verwendung von Feldern in Unterprogrammen
107
Da die an das Unterprogramm übergebenen Feldgrenzen mit den im Hauptprogramm vereinbarten Feldgrenzen ü b e r e i n s t i m m e n , kann das Unterprogramm die Adresse der F e l d e l e m e n t e richtig b e r e c h n e n . Wie wir in der A d r e ß f o r m e l g e sehen haben, ist j e d o c h die l e t z t e Dimension für die Adreßrechnung nicht e r f o r d e r l i c h , sie kann im Unterprogramm also auch o f f e n dimensioniert werden. Für die Adreßrechnung zweidimensionaler F e l d e r ist es allein wichtig, daß die e r s t e Dimension in der Größe übergeben wird, in der sie im Hauptprogramm vereinbart wurde. C UNTERPROGRAMM SUBROUTINE SUM(X,M,N,XSUM) DIMENSION X(M,*) Sollen nur T e i l e eines zweidimensionalen F e l d e s in einem Unterprogramm b e a r b e i t e t werden, so sind die Größe des F e l d e s in der Feldvereinbarung und die Größe des t a t s ä c h l i c h verwendeten B e r e i c h e s g e t r e n n t zu ü b e r g e b e n . Dies gilt streng genommen nur für den F a l l , daß die e r s t e Dimension nicht voll verwendet wird. Das folgende Programmbeispiel Bild 6 - 8 vereinbart ein zweidimensionales Feld der Größe ( 1 0 , 1 0 ) , davon wird aber nur der B e r e i c h von ( 1 , 1 ) bis ( 3 , 4 ) t a t s ä c h l i c h verwendet. In der L i s t e des C A L L - B e f e h l s erscheinen in dem B e i spiel K o n s t a n t e n als a k t u e l l e A r g u m e n t e . C BILD B-B HAUPTPROGRAMM ZWEIDIMENSIONALES FELD DIMENSION ACIO,105 DO 20 1 - 1 , 3 DO 10 J - 1 , 4 A C I , J 3 -= 1 . 0 10 CONTINUE 20 CONTINUE CALL SUMCA,10,10,3,4,ASUM5 WRITEC*,*3ASUn,' SUMME' STOP END C BILD B-B UNTERPROGRAMM ZWEIDIMENSIONALES FELD SUBROUTINE SUMC X,MMAX,NMAX,M,N,XSUM) DIMENSION XCMMAX,NMAX) XSUM = 0 . 0 DO 20 I - 1,M DO 10 J = 1,N XSUM - XSUM + XC I , J ) 10 CONTINUE 20 CONTINUE RETURN END B> TEST
1 2 . 0 0 0 0 0 0 0 SUMME S t o p - Program t e r m i n a t e d . Bild 6 - 8 :
Programmbeispiel zweidimensionales F e l d im Unterprogramm
Das Unterprogramm benutzt die Größen MMAX und NMAX des im Hauptprogramm vereinbarten F e l d e s zur variablen Dimensionierung und damit zur B e r e c h nung der E l e m e n t a d r e s s e n . Die Größen M und N des t a t s ä c h l i c h verwendeten B e r e i c h e s steuern die beiden D O - S c h l e i f e n zur Auswahl der E l e m e n t e .
108
6
Unterprogrammtechnik
Für die Übergabe drei- und mehrdimensionaler Felder von einem Hauptprogramm an ein Unterprogramm gelten die gleichen Regeln: Die variable Dimensionierung eines Feldes im Unterprogramm dient nicht der Reservierung von Speicherplätzen, sondern der Berechnung der Adresse eines Feldelementes. Die letzte Index wird dabei nicht benötigt und kann durch Angabe des Zeichens * offen dimensioniert werden. Wird das Feld in der im Hauptprogramm vereinbarten Größe auch im Unterprogramm verwendet, so genügt es, den Feldnamen und die Feldgrenzen zu übergeben. Werden im Unterprogramm nur Teile des im Hauptprogramm vereinbarten F e l des verwendet, so müssen die vereinbarten Feldgrenzen und die Grenzen des tatsächlich verwendeten Bereiches getrennt übergeben werden, sonst kommt es zu einer Adressierung falscher Feldelemente ohne Fehlermeldung.
6.6 Übungen zum Abschnitt Unterprogrammtechnik Der Abschnitt 11 enthält für alle Aufgaben Lösungsvorschläge! Für alle geforderten Unterprogramme entwerfe man Hauptprogramme, die T e s t w e r t e einlesen und Ergebnisse ausgeben. 1. Aufgabe: Die Standardfunktion SIN zur Berechnung des trigonometrischen Sinus muß in FORTRAN im Bogenmaß aufgerufen werden. Schreiben Sie eine Funktionsanweisung, die die Eingabe im Winkelmaß g e s t a t t e t . Dazu ist der gegebene Winkel mit PI zu multiplizieren und durch 180 zu dividieren. 2. Aufgabe: Ein Lehrer berechnet die Noten von Klausuren aus den erreichten Punkten nach folgendem Verfahren: P = erreichte Punktzahl X = gesuchte Note für P>35: fürPs;35:
X="I00~P + 1 15 X=6
Für die Notenberechnung schreibe man ein FUNCTION-Unterprogramm und rufe es in einer Eingabeschleife auf, die Punkte einliest und Noten ausgibt. 3. Aufgabe: Man schreibe ein FUNCTION-Unterprogramm, das aus einem eindimensionalen Feld von INTEGER-Zahlen den größten Wert heraussucht. Im Hauptprogramm werde das Feld f e s t , im Unterprogramm variabel dimensioniert.
6.7 Die Arbeit mit externen
Unterprogrammen
109
4. A u f g a b e : S c h r e i b e n Sie ein F U N C T I O N - U n t e r p r o g r a m m zur B e r e c h u n g d e r F a k u l t ä t e i n e r v o r g e g e b e n e n I N T E G E R - Z a h l N. Das Ergebnis sei vom Typ REAL. n! = 1 - 2 - 3 - 4
.
.
. • ri
5. A u f g a b e : S c h r e i b e n Sie ein S U B R O U T I N E - U n t e r p r o g r a m m , d a s f ü r die Höhe h und d e n D u r c h m e s s e r d eines K e g e l s die M a n t e l f l ä c h e M, die L ä n g e der Seitenlinie s und das V o l u m e n V b e r e c h n e t . Die F o r m e l n l a u t e n :
y _ jt • d 2 • h 12 6. A u f g a b e : Man e n t w e r f e ein S U B R O U T I N E - U n t e r p r o g r a m m zur Lösung d e r q u a d r a t i s c h e n Gleichung x2 + p - x + q = 0 n a c h der F o r m e l
N e b e n den beiden Lösungen XI und X2 w e r d e eine I N T E G E R - K e n n z a h l z u r ü c k g e g e b e n und im H a u p t p r o g r a m m a u s g e w e r t e t . Ist die Kennzahl Null, so ist der Ausdruck u n t e r d e r Wurzel n e g a t i v und d i e Lösung k o m p l e x .
7. A u f g a b e : Man e n t w e r f e ein S U B R O U T I N E - U n t e r p r o g r a m m , das aus einem beliebig großen F e l d von R E A L - Z a h l e n den g r ö ß t e n und den k l e i n s t e n Wert h e r a u s s u c h t . Das Feld w e r d e im U n t e r p r o g r a m m variabel d i m e n s i o n i e r t .
6.7 Die Arbeit mit externen Unterprogrammen U n t e r p r o g r a m m e von Typ FUNCTION und SUBROUTINE w e r d e n n o r m a l e r w e i s e g e t r e n n t vom H a u p t p r o g r a m m ü b e r s e t z t . Dann w e r d e n sie e x t e r n e U n t e r p r o g r a m m e g e n a n n t . Nur in d e r T e s t p h a s e ü b e r s e t z t man sie g e l e g e n t l i c h als i n t e r ne U n t e r p r o g r a m m e z u s a m m e n mit einem kurzen H a u p t p r o g r a m m , das T e s t w e r t e e i n l i e s t , an das U n t e r p r o g r a m m ü b e r g i b t und E r g e b n i s s e zur Kontrolle a u s d r u c k t . Die Regeln f ü r d e n Umgang mit i n t e r n e n U n t e r p r o g r a m m e n sind a b hängig vom v e r w e n d e t e n F O R T R A N - C o m p i l e r .
110
6
Unterprogrammtechnik
Für die Behandlung e x t e r n e r U n t e r p r o g r a m m e b e n ö t i g e n wir die Hilfe des B e t r i e b s s y s t e m s in s t ä r k e r e m Maße als bei e i n f a c h e n F O R T R A N - P r o g r a m m e n . Als Programmbeispiel dient das b e r e i t s in Bild 6 - 6 g e t e s t e t e SUBROUTINEU n t e r p r o g r a m m KREIS, das aus dem Durchmesser D die F l ä c h e A und den U m f a n g U eines Kreises b e r e c h n e t . Eine Reihenfolge f ü r die Eingabe und Ü b e r setzung von H a u p t - und U n t e r p r o g r a m m ist bei den m e i s t e n R e c h e n a n l a g e n nicht vorgeschrieben. 1. S c h r i t t : H a u p t p r o g r a m m e i n g e b e n Das Hauptprogramm wird mit Hilfe des Editors e i n g e g e b e n und in einer Datei u n t e r einem b e s t i m m t e n N a m e n a b g e l e g t . Der Name wird e n t w e d e r f e s t g e l e g t in der Steueranweisung, mit der der Editor a u f g e r u f e n wird, oder mit einer b e s o n d e r e n P R O G R A M - A n w e i s u n g , die die e r s t e Anweisung eines H a u p t p r o g r a m m s sein muß.
PROGRAM
Hauptprogrammname
P r o g r a m m e , die in einer P r o g r a m m i e r s p r a c h e geschrieben sind, nennt man auch Q u e l l p r o g r a m m e (englisch s o u r c e p r o g r a m ) . 2. S c h r i t t : H a u p t p r o g r a m m ü b e r s e t z e n Das Hauptprogramm wird nun durch die Eingabe von S t e u e r a n w e i u n g e n ü b e r s e t z t . Das dabei e n t s t e h e n d e Maschinenprogramm nennt man O b j e k t p r o g r a m m (englich o b j e c t ptogram oder o b j e c t code). In den m e i s t e n Fällen e r h ä l t es den gleichen Namen wie das ursprüngliche F O R T R A N - Q u e l l p r o g r a m m und wird mit e i n e r b e s t i m m t e n Zusatzbezeichnung ebenfalls als Datei a b g e s p e i c h e r t . 3. S c h r i t t : U n t e r p r o g r a m m e i n g e b e n Das U n t e r p r o g r a m m wird mit Hilfe des Editors e i n g e g e b e n und in einer Datei u n t e r einem b e s t i m m t e n N a m e n a b g e l e g t . Der Name wird e n t w e d e r f e s t g e l e g t in der Steueranweisung, mit der der Editor a u f g e r u f e n wird, oder es wird der U n t e r p r o g r a m m n a m e v e r w e n d e t , der im F O R T R A N - P r o g r a m m h i n t e r dem Kennwort FUNCTION bzw. SUBROUTINE s t e h t . Es e n t s t e h t ein w e i t e r e s Quellprogramm. 4. S c h r i t t : U n t e r p r o g r a m m ü b e r s e t z e n Das U n t e r p r o g r a m m wird nun durch die Eingabe von S t e u e r a n w e i s u n g e n ü b e r s e t z t und wie das H a u p t p r o g r a m m als O b j e k t p r o g r a m m in einer D a t e i a b g e l e g t . 5. S c h r i t t : H a u p t - und U n t e r p r o g r a m m verbinden Durch den Aufruf eines Binders (Linker oder Mapper) werden die beiden Maschinenprogramme ( O b j e k t p r o g r a m m e ) des H a u p t - und des U n t e r p r o g r a m m s miteinander und mit U n t e r p r o g r a m m e n des B e t r i e b s s y s t e m s verbunden. Dabei sind die Namen der zu verbindenden P r o g r a m m e ( D a t e i e n ) einzugeben. Das dabei e n t s t e h e n d e G e s a m t p r o g r a m m wird wieder in einer Datei als ladbares ( a u s f ü h r b a r e s ) Maschinenprogramm a b g e l e g t .
6.7 Die Arbeit mit externen Unterprogrammen
111
6. S c h r i t t : A u s f ü h r b a r e s G e s a m t p r o g r a m m laden und s t a r t e n Durch den Aufruf des L a d e r s wird das gebundene Maschinenprogramm bestehend aus Hauptprogramm, Unterprogramm und den S y s t e m p r o g r a m m e n in den A r b e i t s speicher geladen und g e s t a r t e t . Enthält es L e s e a n w e i s u n g e n ( R E A D ) , so sind nun die Daten einzugeben. Auf der Ausgabe erscheinen die E r g e b n i s s e . Erreicht das Programm den S T O P - B e f e h l oder tritt ein F e h l e r bei der Programmausführung a u f , so wird es a b g e b r o c h e n , und das B e t r i e b s s y s t e m übernimmt die Kontrolle über den R e c h n e r . Das f o l g e n d e Beispiel Bild 6 - 9 zeigt den soeben geschilderten Ablauf an einem Arbeitsplatzrechner mit dem B e t r i e b s s y s t e m M S - D O S . Das Hauptprogramm erhält den Dateinamen T E S T H , das Unterprogramm den Dateinamen T E S T U . Das gebundene Maschinenprogramm heißt T E S T . Alle Eingaben des Benutzers wurden in der L i s t e nachträglich unterstrichen.
B>EOLIN TESTH.FOR New F i l e •I 1 :*C BILD 6 - 9 HAUPTPROGRAm 2: »10 UJRI TE C » , » ) 'DURCHMESSER EINGEBEN' 3:» READC« , » , END-503 X 4 : *_ CALL KRE I SC X , Y , Z 3 5.-* ÜJRI TE C * , * 3 X , Y , 2 B: • GOTD 10 7 : *50 STOP B:* END 9: »~Z *E B>F0R1 TESTH, , , ; IBM P e r s o n a l Computer FORTRAN Compiler Uersion 5.00 CC3Copyright IBM Carp 1 9 B 5 , 19B4 C O C o p y r i g h t MicrosoFt Corp 1 9 B 5 , 19B4 P a s s One
No E r r o r s D e t e c t e d B Source L i n e s
B> FDR5 Code Area S i z e - #00BF Cons Area S i z e = #0050 Data Area S i z e = #000E P a s s Two
No E r r o r s
C C C
1913 353 143
Detected.
B>EDLIN TESTU.FDR New F i l e •I 1 : *C BILDB-9 EXTERNES UNTERPRDGRAHtl 5: * SUBROUTINE KREISCD,A,U3 3:* PI - 3 . 1 4 1 5 9 5 7 4:* A - PI«n*D/4.5 5:* U = P I *D 6:» RETURN 7: * END B: *"Z
112
6
Unterprogrammtechnik
B> FORI TE5TU, , , ; IBM Personal Computer FÜRTRAN Compiler Uersian S.00 C O C o p y r i g h t IBM Corp 1985, 19B4 CCJCopyright Microsoft Corp 1985, 19B4 Pass One
No Errors Detected 7 Source Lines
B> F0R2 Code Area Size = #0073 Cons Area Size = #0014 Data Area Size = #0006 Pass Two
C C C
115) 203 E)
No Errors Detected.
B> LINK TESTH+TESTU,TEST,TEST ; IBM Personal Computer Linker Uersion 2.20 C C I) Copy r lght IBM Corp 13B1 , 19B2, 19B3, B> TEST DURCHMESSER
13B4
EINGEBEN
1.0000000 7.B53982E-001 DURCHMESSER EINGEBEN 2_ 2.0000000 3.1415930 DURCHMESSER EINGEBEN 3 3.0000000 7.06B5B30 DURCHMESSER EINGEBEN Z Stop - Program
3.1415930 6.2831850 S.4247780
terminated.
B>
Bild 6 - 9 :
E x t e r n e s U n t e r p r o g r a m m u n t e r dem B e t r i e b s s y s t e m
B> REM BILD 6 - 1 0 DATE I-1NHALTSUERZEICHNIS B>DIR
TESTH TESTH TESTU TEST TESTU TEST TESTU TESTH
TEST?.«
• BJ LST • BJ MAP LST EXE FOR FOR
790 938 59B 2302 897 33576 IBI 153
19 IS 19 19 19 19 19 19
.05 .85 .05 . B5 .05 .85 .05 . B5 .05 .85 .05 .85 .05 .BS .05 .85
B>
Bild 6 - 1 0 :
Datei-Inhaltsverzeichnis
19 19 19 19 19 19 19 19
.53 , .53 .56 , .58 .56 . 5B .55 .52
MS-DOS
6.8 Weitere Möglichkeiten der
Unterprogrammtechnik
113
Das B e t r i e b s s y s t e m k o m m a n d o EDLIN TESTH.FOR r u f t den Editor a u f , um das H a u p t p r o g r a m m u n t e r dem D a t e i n a m e n TESTH einzugeben. Der F O R T R A N Compiler a r b e i t e t in den beiden D u r c h l ä u f e n F O R I und FOR2 und erzeugt ein Maschinenprogramm. Das gleiche V e r f a h r e n wird f ü r das U n t e r p r o g r a m m KREIS d u r c h g e f ü h r t , das den B e t r i e b s s y s t e m n a m e n TESTU e r h ä l t . Das B e t r i e b s s y s t e m k o m m a n d o LINK ruft den Binder a u f , der beide Maschinenp r o g r a m m e und B e t r i e b s s y s t e m u n t e r p r o g r a m m e zusammenbindet. Das g e b u n d e ne ladbare Programm erhält den D a t e i n a m e n TEST; es wird anschließend g e l a den und a u s g e f ü h r t . Bild 6 - 1 0 zeigt einen Auszug aus dem Inhaltsverzeichnis der D i s k e t t e mit den Namen der b e t e i l i g t e n Dateien. F O R T R A N - P r o g r a m m e haben den Zusatz F O R , ü b e r s e t z t e Maschinenprogramme haben den Zusatz OBJ und D a t e i e n mit Ü b e r setzungslisten haben den Zusatz LST. Das gebundene und a u s f ü h r b a r e Maschinenprogramm h a t den Zusatz EXE, die Datei mit dem Zusatz MAP e n t h ä l t Bindeinformationen.
6.8 Weitere Möglichkeiten der Unterprogrammtechnik Die in diesem Abschnitt beschriebenen F O R T R A N - A n w e i s u n g e n werden nicht o f t verwendet. Sie können, besonders bei ä l t e r e n F O R T R A N - C o m p i l e r n , eine a n d e r e Funktionsweise als hier beschrieben haben oder sogar gänzlich fehlen. Bitte ziehen Sie das Handbuch Ihres Compilers zu R a t e . Bisher haben wir Daten zwischen H a u p t - und U n t e r p r o g r a m m über die Argum e n t e n l i s t e n bzw. mit dem Namen des F U N C T I O N - U n t e r p r o g r a m m s übergeben. In der Regel legt der Compiler im U n t e r p r o g r a m m f ü r die in der Liste e r s c h e i nenden f o r m a l e n A r g u m e n t e keine neuen Speicherplätze an, sondern a r b e i t e t mit den Speicherplätzen der a k t u e l l e n A r g u m e n t e des H a u p t p r o g r a m m s . Mit Hilfe der COMMON-Vereinbaning können wir einen Speicherbereich d e f i n i e r e n , der sowohl vom H a u p t p r o g r a m m als auch vom U n t e r p r o g r a m m direkt a d r e s s i e r t werden kann. Auf diese Weise lassen sich Daten zwischen den beiden Programmen ü b e r t r a g e n , ohne daß sie in den Argumentenlisten e r s c h e i n e n . Bild 6 11 zeigt ein Beispiel. Im C O M M O N - D a t e n b e r e i c h liegen drei Speicherstellen. Im Hauptprogramm haben sie die Namen A, B und C. Das U n t e r p r o g r a m m verwendet die Namen X, Y und Z. Lesen wir für die Variablen A und B im Hauptprogramm Werte ein, so können wir sie unter den Namen X und Y im U n t e r p r o g r a m m verwenden. Das U n t e r p r o g r a m m b e r e c h n e t d a r a u s einen Wert für Z, der im Hauptprogramm unter der symbolischen Adresse C ausgegeben wird. Die COMMON-Vereinbarung hat die allgemeine F o r m :
COmON L i s t e von Variablen und Feldern
114
6
Unterprogrammtechnik
C
HAUPROGRAMM B E I S P I E L COMMON COMMON A,B,C 10 URITE C * , * ) ' A UND B E I N G E B E N ' READ ( * , * , E N D " 2 0 ) CALL PYTHAG WRITEC*,») A , B GOTO 10 STOP
50
A,B ,
C
END
C
UNTERPROGRAMM B E I S P I E L COMMON SUBROUTINE PYTHAG COMMON X,Y,2 2 - SÜRTCX*»2 + Y*»2) RETURN END
B> T E S T A UND B
EINGEBEN
1 1 1.0000000
Bild 6-11:
1.0000000
1.4142140
Programmbeispiel für einen C O M M O N - B e r e i c h
Die COMMON-Vereinbarung erscheint in den Teilprogrammen ( H a u p t - bzw. U n t e r p r o g r a m m e n ) , die auf den gemeinsamen Speicherbereich zugreifen. Sie kann anstelle der DIMENSION-Vereinbarung oder expliziten Typvereinbarung zur Dimensionierung von Feldern dienen, die dann im C O M M O N - B e r e i c h liegen. Die Variablen und Felder der Listen müssen wie bei Argumentenlisten in A n zahl und T y p übereinstimmen. Der C O M M O N - B e r e i c h läßt sich durch die V e r gabe von Namen in mehrere Blöcke unterteilen. Beispiel: C
HAUPTPROGRAMM C O M M O N /MAX/A,B,C
/MORITZ/I,J,K
C
I.UNTERPROGRAMM S U B R O U T I N E UP1 C O M M O N /MAX/X,Y,Z
C
2.UNTERPROGRAMM S U B R O U T I N E UP2 COMMON /MORITZ/L,M,N
Das Hauptprogramm arbeitet mit den beiden C O M M O N - B l ö c k e n M A X und M O R I T Z . Das Unterprogramm UPI verwendet nur den C O M M O N - B l o c k M A X , das Unterprogramm UP2 nur den C O M M O N - B l o c k M O R I T Z . Die unterteilte C O M M O N - V e r e i n b a r u n g hat die allgemeine Form:
COWON
/Name/Liste / N a m e / L i s t e
. . .
6.8 Weitere Möglichkeiten
der
Unterprogrammtechnik
115
A l l e Variablen, die rechts von einem in // eingeschlossenen Namen in einer Liste erscheinen, liegen in einem benannten C O M M O N - B l o c k . Fehlt der Name zwischen den den Zeichen "//, so liegen die Variablen in einem unbenannten (Blank) C O M M O N - B l o c k . Den Variablen und Feldern eines C O M M O N - B l o c k s können zur Übersetzungszeit A n f a n g s w e r t e zugewiesen werden. Dies geschieht mit einer BLOCK D A T A Vereinbarung, für die ein eigener Compilerlauf erforderlich ist. Beispiel:
C ZUWEISUNG VON ANFANGSWERTEN BLOCK DATA COMMON A,B,C DATA A , B , C /1.0 , 2.0 , 3.0/ END Den in einem unbenannten C O M M O N - B l o c k liegenden Variablen A , B und C werden die A n f a n g s w e r t e 1.0, 2.0 und 3.0 zugewiesen. Die BLOCK D A T A - V e r einbarung hat die allgemeine Form:
BLOCK DATA name
Vereinbarungen END
BLOCK D A T A - U n t e r p r o g r a m m e dienen nur dazu, Variablen und Feldern A n fangswerte zuzuweisen. Sie dürfen nur COMMON-Vereinbarungen, Typvereinbarungen, Feldvereinbarungen und D A T A - V e r e i n b a r u n g e n enthalten; arithmetische und sonstige Anweisungen sind nicht zulässig. Gibt es nur eine BLOCK D A T A Vereinbarung, so kann der Name entfallen. Bei einigen Compilern kann es vorkommen, daß lokale Variablen und C O M M O N Blöcke in Unterprogrammen nicht fest im Speicher angelegt werden. Die im Unterprogramm berechneten Werte müssen dann mit einer SA VE-Anweisung " g e r e t t e t " werden, wenn sie für den nächsten Aufruf des Unterprogramms verfügbar sein sollen.
SAVE Liste von Namen
Beim Aufruf eines Unterprogramms vom T y p F U N C T I O N und SUBROUTINE e r schienen bisher Namen von Variablen und Feldern und Konstanten in der Liste der aktuellen Argumente. Beispiel:
116
6
Unterprogrammtechnik
C HAUPTPROGRAMM DIMENSION X(10),Y(10) CALL WERT(X,Y,10) W e i t e r haben wir g e s e h e n , daß e i n U n t e r p r o g r a m m w e i t e r e U n t e r p r o g r a m m e a u f r u f e n kann. Dabei kann e s sich sowohl um S t a n d a r d f u n k t i o n e n ( z . B . S Q R T ) als auch um e i g e n e U n t e r p r o g r a m m e des Benutzers handeln. B e i s p i e l :
C UNTERPROGRAMM SUBROUTINE WERT(A,B,N) A(I) = SQRT(FL0AT(I)} B(I) = QUAD(FL0AT(I)) Das U n t e r p r o g r a m m W E R T Q U A D d e s Benutzers a u f .
ruft d i e Standardfunktion S Q R T und d i e F U N C T I O N
C UNTERPROGRAMM FUNCTION QUAD(X) QUAD = X**2 Sowohl in e i n e m H a u p t p r o g r a m m als auch in einem U n t e r p r o g r a m m können b e l i e b i g v i e l e U n t e r p r o g r a m m e a u f g e r u f e n w e r d e n . Ein U n t e r p r o g r a m m d a r f nicht sich selbst a u f r u f e n . Ebenso d ü r f e n U n t e r p r o g r a m m e sich nicht g e g e n s e i t i g a u f r u f e n . Bild 6 - 1 2 z e i g t e i n H a u p t p r o g r a m m und z w e i U n t e r p r o g r a m m e s o w i e den A u f r u f d e r S t a n d a r d f u n k t i o n S Q R T . C BILD 6 - 1 2 HAUPTPROGRAMM DIMENSION XC103.YC103 CALL WERT C X , Y ,103 URI TEC * , * D C X C I ) , Y C I 3, 1 - 1 , 1 0 3 STOP END C BILD 6 - 1 2 UNTERPROGRAMM WERT SUBROUTINE WERTCA,B,N3 DIMENSION ACN3, BCN3 DO 10 I - 1 , N AC 13 - SQRT CFLOAT CI3 3 BCI3 = QUAD C FLOAT CI3 3 CONTINUE 10 RETURN END C BILD 6 - 1 2 UNTERPROGRAMM QUAD FUNCTION QUAD C X 3 QUAD - X * » 2 RETURN END B> TEST 1.0000000 1.7320510 2.2360E80 2.6457510 3.0000000 Bild 6 - 1 2 :
1.0000000 S.0000000 25.0000000 49.0000000 81.0000000
1.4142140 2.0000000 2.4494900 2.B20427O 3.16227B0
A u f r u f von U n t e r p r o g r a m m e n in e i n e m
4.0000000 IB.0000000 36.0000000 64.0000000 100.0000000
Unterprogramm
6.8
Weitere Möglichkeiten
der
Unterprogrammtechnik
117
Im Z u s a m m e n h a n g mit F u n k t i o n s b e r e c h n u n g e n und n u m e r i s c h e r I n t e g r a t i o n von beliebigen F u n k t i o n e n muß man zuweilen einem U n t e r p r o g r a m m d e n N a m e n eines a n d e r e n U n t e r p r o g r a m m s ü b e r g e b e n . Dieser U n t e r p r o g r a m m n a m e muß in der A r g u m e n t e n l i s t e sowohl im H a u p t p r o g r a m m a l s a u c h im U n t e r p r o g r a m m e r s c h e i n e n . In u n s e r e m Beispiel soll das U n t e r p r o g r a m m WERT a n s t e l l e von SQRT und QUAD b e l i e b i g e F u n k t i o n e n a u f r u f e n können, d e r e n a k t u e l l e N a m e n vom H a u p t p r o g r a m m ü b e r g e b e n w e r d e n . Im U n t e r p r o g r a m m und in d e r L i s t e der f o r m a l e n A r g u m e n t e m ü s s e n also a l l g e m e i n e B e z e i c h n u n g e n e r s c h e i n e n . In dem f o l g e n d e n Beispiel h e i ß e n sie FUNC1 und F U N C 2 . C UNTERPROGRAMM SUBROUTINE WERT(A,B,N,FUNC1,FUNC2) A(I) = FUNC1(FL0AT(I)) B(I) = FUNC2(FL0AT(I)) Das H a u p t p r o g r a m m ü b e r g i b t in der L i s t e der a k t u e l l e n A r g u m e n t e die N a m e n der t a t s ä c h l i c h a u f z u r u f e n d e n U n t e r p r o g r a m m e . Dabei müssen e i g e n e U n t e r p r o g r a m m e des Benutzers vom Typ SUBROUTINE oder FUNCTION in einer E X T E R N A L - V e r e i n b a r u n g und S t a n d a r d f u n k t i o n e n in e i n e r I N T R I N S I C - V e r e i n b a r u n g als U n t e r p r o g r a m m n a m e n v e r e i n b a r t w e r d e n . Beispiel: C HAUPTPROGRAMM EXTERNAL QUAD INTRINSIC SQRT CALL WERT(A,B,10,SQRT,QUAD) Die b e i d e n V e r e i n b a r u n g e n EXTERNAL und INTRINSIC h a b e n die a l l g e m e i n e Form:
EXTERNAL Liste von Benutzerunterprogrammen INTRINSIC Liste von Standardfunktionen
Bild 6-13 zeigt d a s P r o g r a m m b e i s p i e l Bild 6 - 1 2 j e d o c h U n t e r p r o g r a m m n a m e n über die A r g u m e n t e n l i s t e .
C BILD 6 - 1 3 HAUPTPROGRAMH DIMENSION XC103,YC103 EXTERNAL QUAD INTRINSIC SQRT CALL WERTCX.Y,10,SQRT,QUAD 3 UIRI TEC * , * 3 C XCI 3,YCI 3, 1 = 1,103 STOP END
mit Ü b e r g a b e
der
118
6
Unterprogrammtechnik
C BILD 6 - 1 3 UNTERPROGRAMM WERT SUBROUTINE WERTCA,B,N,FUNC1,FUNC2) DIMENSION ACN), BCN) DD 1 0 I - l . N ACI5 - FUNC1CFLOATC15) B C I ) - FUNC2CFL0ATCI3) 10 CONTINUE RETURN END C BILD 6 - 1 3 UNTERPROGRAMM QUAD FUNCTION DUADC X} QUAD - X»*2 RETURN END B> TEST
Stop
1.0000000 1 .0000000 3.0000000 1.7320510 25.0000000 2.23606B0 49.0000000 S.6457510 81.0000000 3.0000000 Program t e r m i n a t e d .
Bild 6 - 1 3 :
1.4142140 2.0000000 2.44S4S00 2.B2B4270 3.16227B0
Ü b e r g a b e von U n t e r p r o g r a m m n a m e n ü b e r d i e
4.0000000 IB.0000000 36.0000000 64.0000000 100.0000000
Argumentenliste
M i t H i l f e d e s K e n n w o r t e s E N T R Y ist e s m ö g l i c h , in e i n e m U n t e r p r o g r a m m
vom
T y p F U N C T I O N o d e r S U B R O U T I N E e i n e n z u s ä t z l i c h e n E i n s p r u n g p u n k t zu d e f i nieren.
ENTRY Name ( Liste )
H i n t e r d e m K e n n w o r t E N T R Y s t e h t d e r N a m e d e s E i n s p r u n g p u n k t e s und e i n e L i s t e der f o r m a l e n A r g u m e n t e , die nicht mit der L i s t e hinter d e m N a m e n des U n t e r p r o g r a m m s ü b e r e i n s t i m m e n muß. Beispiel:
C UNTERPROGRAMM SUBROUTINE ZWURZ(A,B) C EINSPRUNGPUNKT ENTRY DWURZ(X,Y,Z) RETURN Das Unterprogramm k a n n nun w a h l w e i s e ü b e r d e n Unterprogrammnamen Z W U R Z oder über den Einsprungpunkt D W U R Z a u f g e r u f e n w e r d e n . Beispiel:
C HAUPTPROGRAMM CALL ZWURZ(WERT,3.0)
6.8 Weitere Möglichkeiten
der Unterprogrammtechnik
119
CALL DWURZ(XM,YM,ZM) Das U n t e r p r o g r a m m kehrt mit dem Befehl RETURN an die Stelle zurück, an der es a u f g e r u f e n wurde und zwar unabhängig davon, ob es über den U n t e r p r o g r a m m n a m e n oder über den Einsprungpunkt a u f g e r u f e n wurde. Bei Compilern, die die ENTRY-Anweisung nicht kennen, übergibt man dem U n t e r p r o g r a m m beim Aufruf eine Kontrollgröße, die durch Programmverzweigungen im U n t e r p r o g r a m m a u s g e w e r t e t wird. Durch eine E r w e i t e r u n g der Rücksprunganweisung RETURN ist es möglich, nicht an die Stelle des A u f r u f s , sondern zu beliebigen Sprungzielen in das H a u p t p r o g r a m m zurückzukehren. Von dieser a l t e r n a t i v e n Rücksprungmöglichkeit macht man z.B. dann G e b r a u c h , wenn das U n t e r p r o g r a m m F e h l e r e n t d e c k t , die im H a u p t p r o g r a m m a u s g e w e r t e t werden sollen. Dazu wird die R E T U R N - A n w e i s u n g um eine I N T E G E R - K e n n g r ö ß e ( K o n s t a n t e oder Variable) erweitert.
RETURN Kenngröße
Beim Aufruf des U n t e r p r o g r a m m s werden dem U n t e r p r o g r a m m in der Liste der a k t u e l l e n A r g u m e n t e Sprungziele des H a u p t p r o g r a m m s ü b e r g e b e n . In der Liste der f o r m a l e n A r g u m e n t e des U n t e r p r o g r a m m s s t e h t an diesen Stellen das Sond e r z e i c h e n *. Die Kenngröße h i n t e r dem R E T U R N - B e f e h l wählt das Argument aus, über das zurückgesprungen wird. Das folgende Beispiel r u f t ein U n t e r p r o g r a m m WÜRZ a u f , das vor dem Wurzelziehen den Radikanden p r ü f t . Ist der Radikand positiv oder Null, so wird die Wurzel gezogen, und das U n t e r p r o g r a m m kehrt an die Stelle des A u f r u f s zurück. Ist der Radikand negativ, so soll das U n t e r p r o g r a m m nicht an die Stelle des A u f r u f s , sondern zur Anweisungsnummer 20 z u r ü c k k e h r e n . Diese mögliche Rücksprungadresse wird dem U n t e r p r o g r a m m in d e r L i s t e der f o r m a l e n A r g u m e n t e übergeben. Sie wird mit einem * g e k e n n z e i c h n e t , da es sich nicht um eine I N T E G E R - K o n s t a n t e , sondern um eine S p r u n g m a r k e h a n d e l t .
C HAUPTPROGRAMM 10 READ(*,*,END=30) X CALL WURZ(X,W,*20) WRITE(*,*) X.W GOTO 10 20 WRITE(*,*)'IMAGINAER 1 GOTO 10 30 STOP END In der A r g u m e n t e n l i s t e des U n t e r p r o g r a m m s s t e h t an der S t e l l e , an der eine Sprungmarke ü b e r g e b e n wird, ein Zeichen *. In dem Beispiel ist es das 3. Argument.
120
6
Unterprogrammtechnik
C UNTERPROGRAMM SUBROUTINE WURZ(A,B,*) IF (A.LT.0.0) RETURN 3 B = SQRT(A) RETURN END Der B e f e h l R E T U R N 3 springt also über d a s 3. A r g u m e n t , das eine S p r u n g m a r ke sein muß, zu der S p r u n g m a r k e des H a u p t p r o g r a m m , die an der 3. Stelle d e r A r g u m e n t e n l i s t e s t e h t , also zum Sprungziel 20 d e s H a u p t p r o g r a m m s . Der R E T U R N - B e f e h l o h n e Zusatz k e h r t an die S t e l l e des A u f r u f s in d a s H a u p t p r o gramm z u r ü c k . Bei C o m p i l e r n , die die b e r e c h n e t e R E T U R N - A n w e i s u n g nicht k e n n e n , l i e f e r t das U n t e r p r o g r a m m e i n e K o n t r o l l g r ö ß e , die im H a u p t p r o g r a m m durch P r o g r a m m verzweigungen a u s g e w e r t e t wird. Zur Verbindung mit dem B e t r i e b s s y s t e m und zur Lösung b e s o n d e r e r A u f g a b e n gibt e s in j e d e r R e c h e n a n l a g e S y s t e m u n t e r p r o g r a m m e , die nicht B e s t a n d t e i l des F O R T R A N 77 sind. Dazu gehören z.B. U n t e r p r o g r a m m e zur S t e u e r u n g e i n e s P l o t t e r s oder zur Ausgabe von g r a f i s c h e n D a r s t e l l u n g e n auf dem Bildschirm.
6.9 Die grafische Darstellung von Unterprogrammen Als Beispiel w ä h l e n wir das Programm Bild 6 - 1 2 . Es b e s t e h t aus e i n e m H a u p t p r o g r a m m , d a s zwei eindimensionale F e l d e r X und Y aus je 10 E l e m e n t e n d i m e n s i o n i e r t . Das S U B R O U T I N E - U n t e r p r o g r a m m WERT s p e i c h e r t in dem F e l d X die Wurzeln der Z a h l e n von 1 bis 10, in dem Feld Y die Q u a d r a t e der Z a h l e n von 1 bis 10. Es r u f t dazu die S t a n d a r d f u n k t i o n SQRT zur Berechnung d e r Q u a d r a t w u r z e l n und ein vom Benutzer a u f g e s t e l l t e s F U N C T I O N - U n t e r p r o g r a m m QUAD a u f , d a s die Q u a d r a t e b e r e c h n e t . Die b e i d e n T a b e l l e n w e r d e n im H a u p t p r o g r a m m a u s g e g e b e n . Bei der Beschreibung der A u f g a b e im S t r u k t o g r a m m Bild 6 - 1 4 e r s c h e i n e n nur d i e beiden T ä t i g k e i t e n " T a b e l l e n w e r t e b e r e c h n e n und s p e i c h e r n " und " T a b e l l e n w e r t e a u s g e b e n " . Ob sie im H a u p t p r o g r a m m o d e r mit U n t e r p r o g r a m m e n a u s g e f ü h r t w e r d e n , ist im S t r u k t o g r a m m von u n t e r g e ordneter Bedeutung.
für I = 1 bis 10 Wurzel und Quadrat berechnen und in Tabelle speichern Tabelle
Bild 6 - 1 4 :
ausgeben
B e s c h r e i b u n g der A u f g a b e n s t e l l u n g im S t r u k t o g r a m m
6.9 Die grafische Darstellung von Unterprogrammen
121
Im P r o g r a m m a b l a u f p l a n k e n n z e i c h n e t man den Aufruf von U n t e r p r o g r a m m e n durch ein R e c h t e c k mit s e n k r e c h t e m Balken. J e d e s T e i l p r o g r a m m e r s c h e i n t als e i g e n e Programmeinheit,. Der Ablauf von S t a n d a r d f u n k t i o n e n wird n o r m a l e r weise nicht b e s o n d e r s d a r g e s t e l l t . Bild 6 - 1 5 zeigt d a s P r o g r a m m b e i s p i e l im Programmablaufplan.
Bild 6 - 1 5 :
U n t e r p r o g r a m m e im P r o g r a m m a b l a u f p l a n
V e r w e n d e t man in einem P r o g r a m m sehr viele U n t e r p r o g r a m m e , d i e w e i t e r e U n t e r p r o g r a m m e a u f r u f e n , so kann man d i e s e P r o g r a m m s t r u k t u r in der Moduld a r s t e l l u n g e n t s p r e c h e n d Bild 6 - 1 6 besser als im S t r u k t o g r a m m oder P r o g r a m m ablaufplan übersehen.
Bild 6 - 1 6 :
U n t e r p r o g r a m m e in der Moduldarstellung
Das H a u p t p r o g r a m m r u f t das U n t e r p r o g r a m m WERT a u f , das nun s e i n e r s e i t s die U n t e r p r o g r a m m e QUAD und SQRT a u f r u f t . Diese Art der Darstellung s t a m m t a u s der B a u m d i a g r a m m t e c h n i k n a c h Jackson und dient dort als H i l f s m i t t e l f ü r die " S t r u k t u r i e r t e P r o g r a m m i e r u n g " . Dabei u n t e r s c h e i d e t man e n t -
122
6
Unterprogrammtechnik
sprechend Bild 6-17 die Folge von Moduln (Unterprogrammen), die nacheinander ausgeführt werden, und die Alternative von Moduln (Unterprogrammen), von denen nur eins ausgeführt wird.
F o l g e von Moduln
Bild 6-17:
A l t e r n a t i v e von Moduln
Moduldarstellung in der Baumdiagrammtechnik
6.10 Fehler bei der Verwendung von Unterprogrammen Unterprogramme vom Typ FUNCTION und SUBROUTINE werden normalerweise als e x t e r n e Unterprogramme getrennt vom Hauptprogramm übersetzt. Daher gibt es eine Reihe von Fehlern, die der Compiler nicht entdecken kann und die sich erst bei der Ausführung des Programms durch f e h l e r h a f t e Ergebnisse b e merkbar machen. FUNCTION-Unterprogramme liefern über ihren Namen einen Wert an das Hauptprogramm zurück. Beachten Sie daher die Namensregel. Gegebenenfalls müssen Sie im Hauptprogramm eine explizite Typvereinbarung verwenden. Beispiel: C HAUPTPROGRAMM REAL MAX X = MAX(X1,X2,X3) C UNTERPROGRAMM REAL FUNCTION M A X ( A , B , C ) MAX = RETURN
Die Zahl der aktuellen Argumente beim Aufruf muß mit der Zahl der f o r m a l e n Argumente in der Definition übereinstimmen. Beispiel: C HAUPTPROGRAMM CALL U P R 0 ( A , B , C ) C UNTERPROGRAMM SUBROUTINE
UPR0(X,Y,Z)
6.10 Fehler bei der Verwendung von
Unterprogrammen
123
D i e E i g e n s c h a f t e n der a k t u e l l e n A r g u m e n t e müssen m i t den E i g e n s c h a f t e n der f o r m a l e n A r g u m e n t e ü b e r e i n s t i m m e n . A l s Ausnahme g i l t d i e R e g e l , daß einer K o n s t a n t e n in der L i s t e der a k t u e l l e n A r g u m e n t e in der L i s t e der f o r m a l e n A r g u m e n t e eine V a r i a b l e g e g e n ü b e r s t e h e n muß. Bei e i n e r v a r i a b l e n D i m e n s i o nierung in e i n e m U n t e r p r o g r a m m muß das F e l d im H a u p t p r o g r a m m f e s t d i m e n s i o n i e r t sein. B e i s p i e l :
C HAUPTPROGRAMM DIMENSION A(10) CALL WERT(A,10,XM,I) C UNTERGROGRAMM SUBROUTINE WERT(X,N,AMITT,IND) DIMENSION X(N) A l l e f o r m a l e n A r g u m e n t e , d e r e n W e r t sich im U n t e r p r o g r a m m ä n d e r t , ü b e r t r a g e n d i e s e Änderung auf die a k t u e l l e n A r g u m e n t e des H a u p t p r o g r a m m s . Dies ist b e i S U B R O U T I N E - U n t e r p r o g r a m m e n die e i n z i g e M ö g l i c h k e i t , Ergebnisse an das H a u p t p r o g r a m m zu ü b e r g e b e n . Bei e i n i g e n C o m p i l e r f i n d e t d i e s e Ü b e r t r a g u n g auch b e i U n t e r p r o g r a m m e n vom T y p F U N C T I O N s t a t t . T e s t e n Sie Ihren C o m p i ler mit f o l g e n d e m P r o g r a m m : C HAUPTPROGRAMM Pi = 1.0 B - 5 .0 C - SUSI ( A , B ) U1RITEC*,*) A , B , C STOP END C UNTERPROGRAMM FUNCTION SUSICX.Y) SUSI - X + Y X - 10 . Y - 20. RETURN END B> TEST 10.0000000
20.0000000
3.0000000
Bei d e m dem V e r f a s s e r zur V e r f ü g u n g stehenden C o m p i l e r ( V e r s i o n 2.0 IBM P C ) wurden f ü r A und B d i e W e r t e 10.0 und 20.0 des U n t e r p r o g r a m m s und nicht 1.0 und 2.0 des H a u p t p r o g r a m m s a u s g e g e b e n . Dies ist ein Z e i c h e n d a f ü r , daß auch FUNCTION-Unterprogramme Ergebnisse über die A r g u m e n t e n l i s t e an das Hauptprogramm
ü b e r g e b e n können. W e g e n unerwünschter
s o l l t e man für d i e Ü b e r g a b e Unterprogramm verwenden.
mehrerer
Nebenerscheinungen
Ergebnisse besser ein
SUBROUTINE-
7 Die Eingabe und Ausgabe von Daten In unseren Beispielen und Ü b u n g e n haben wir die D a t e n ( Z a h l e n ) im g e w o h n t e n d e z i m a l e n Z a h l e n s y s t e m e i n g e g e b e n ; die Ergebnisse e r s c h i e n e n e b e n f a l l s dezimal auf dem Bildschirm bzw. D r u c k e r . In der E i n f ü h r u n g h a b e n wir jedoch g e s e h e n , d a ß der R e c h n e r a l l e D a t e n binär speichert und v e r a r b e i t e t . Die D a t e n müssen a l s o sowohl bei d e r E i n g a b e als auch bei der A u s g a b e u m g e w a n d e l t w e r d e n . Die in d i e s e m A b s c h n i t t v o r g e s t e l l t e n M ö g l i c h k e i t e n d e s D a t e n z u g r i f f s und der D a t e n u m w a n d l u n g sind zum Teil abhängig vom v e r w e n d e t e n Compiler bzw. Betriebssystem.
7.1 Die listengesteuerte Ein/Ausgabe über die Konsole Bei e i n f a c h e n Ü b u n g s - und T e s t p r o g r a m m e n gibt m a n die D a t e n während des P r o g r a m m l a u f e s ü b e r d i e B e d i e n u n g s t a s t a t u r e i n . Die E r g e b n i s s e e r s c h e i n e n auf d e m Bildschirm bzw. auf d e m a n g e s c h l o s s e n e n D r u c k e r . Dies b e z e i c h n e t man a l s Ein/Ausgabe im Dialog ü b e r die Konsole. Beispiel: R E A D ( * , * ) A, B X = SQRT(A**2 + B**2) WRITE(*,*) A , B , X
Bei einigen R e c h n e r n bzw. Compilern sind noch e i n f a c h e r e F o r m e n der E i n / A u s g a b e - A n w e i s u n g e n zulässig wie z.B. READ * PRINT *
, A , B , A
, B
, X
Die S t e r n e h i n t e r d e n K e n n w ö r t e r n READ und WRITE bzw. PRINT zeigen an, d a ß die E i n / A u s g a b e ü b e r d i e Konsole ( T a s t a t u r und Bildschirm) e r f o l g e n soll und daß keine b e s o n d e r e n V e r e i n b a r u n g e n über die Anordnung der D a t e n g e t r o f f e n werden. Auf der E i n g a b e z e i l e t r e n n e n wir die D a t e n d u r c h ein T r e n n z e i c h e n ( K o m m a oder L e e r z e i c h e n ) ; auf der A u s g a b e z e i l e wird die Anordnung der D a t e n von ihrem Typ und ihrer Größe b e s t i m m t . In der E i n g a b e l i s t e h i n t e r d e m Kennwort READ e r s c h e i n e n nur die N a m e n der zu l e s e n d e n V a r i a b l e n . Bei d e r Ausgabe mit WRITE bzw. PRINT sind a u c h A u s d r ü c k e und T e x t k o n s t a n t e n in der A u s g a b e l i s t e zulässig. E n t h a l t e n die E i n / A u s g a b e a n w e i s u n g e n nur L i s t e n mit den N a m e n d e r S p e i c h e r s t e l l e n , so b e z e i c h n e t man dies als l i s t e n g e s t e u e r t e E i n / A u s g a b e ; auf die in d e n E i n / A u s g a b e l i s t e n g e n a n n t e n G r ö ß e n w e r d e n s t a n d a r d m ä ß e U m w a n d l u n g s - und D a r s t e l l u n g s v e r f a h r e n a n g e w e n d e t .
7.2 Die formatgesteuerte (formatierte) Ein/Ausgabe über die Konsole Bei der l i s t e n g e s t e u e r t e n A u s g a b e von Z a h l e n in e i n e r T a b e l l e s t ö r t d i e f e s t g e l e g t e Anordnung d e r Z a h l e n auf der Zeile; m a n m ö c h t e die Anzahl der W e r t e , d i e Zahl der S t e l l e n und L e e r s t e l l e n zwischen d e n W e r t e n n a c h e i g e n e n W ü n -
7.2 Die formatgesteuerte
(formatierte)
Ein/Ausgabe über die Konsole
125
C BILD 7-1 TESTPROGRAMM FORMAT IERTE EIN/AUSGABE 10 WRITEC*,1003 100 FORtlATC ' ANFANGS- UND ENDWERT IM FORMAT 13 EINGEBEN > ' \ 3 READC*,200,ERR-303 IA , IE 200 FORMATC2I33 URITEC»,3005 IA , IE 300 FGRMATC//11X, 'QUADRAT UND WURZEL UON ' , 1 3 , ' BIS ' , 1 3 3 WRITEC*,4003 400 FGRMATC/10X,3GC'•'3/ 1 10X, ' , I X , 'ZAHL ' , 1 X , ' * ' , 3 X , 'QUADRAT',3X, ' * ' , 4 X , 'WURZEL' ,3X, ' • ' / 2 10X,36C ' * ' 3 3 DG 20 I - I A , I E QUAD - FLOAT C1**2 3 WÜRZ - SQRTCFLOATCI33 WRITEC*,5003 I , QUAD , WÜRZ 500 FORMAT C10X, ' » ' , 1 X , I 4 , 1 X , ' « ' , E 1 2 . G , 1 X , ' * ' , F 1 2 . B , 1 X , ' * ' 3 50 CONTINUE WRITEC*,600 3 600 FGRMATC10X,36C'*'33 STOP 30 WRITEC*,7003 700 FORMATC' EINGABEFEHLER ! H ' 3 GOTO 10 END B> TEST ANFANGS- UND ENDWERT IM FORMAT 13 EINGEBEN > IRGENDWAS EINGABEFEHLER ! ! ! ANFANGS- UND ENDWERT IM FORMAT 13 EINGEBEN > 1 10 QUADRAT UND WURZEL UON ZAHL 1 2 3 4 5 6
7 8 9 10 Stop - Program
Bild 7-1:
QUADRAT .100000E+01 .400000E+01 .900000E+01 .160000E+02 •250000E+02 .360000E+02 .490000E+02 .640000E+02 .B10000E+02 .100000E+03
1 BIS
10
WURZEL 1.000000 1.414214 1.732051 000000 236060 449490 645751 B2B427 000000 152278
terminated.
T e s t p r o g r a m m für die f o r m a t i e r t e Ein/Ausgabe
sehen f e s t l e g e n . Dies geschieht bei der formatgesteuerten Ein/Ausgabe durch eine zusätzliche L i s t e von Formatbeschreibungen. Bei der Eingabe von Zahlen legen wir durch eine Formatbeschreibung f e s t , in welchen Spalten sich die W e r t e befinden. Bei der Ausgabe geben w i r die Zahl der S t e l l e n vor und hinter dem Dezimalpunkt, L e e r z e i c h e n und zusätzliche T e x t e an. Bild 7 - 1 z e i g t ein Beispiel für die f o r m a t g e s t e u e r t e oder f o r m a t i e r t e Ein/Ausgabe. Die R E A D - und W R I T E - A n w e i s u n g e n enthalten bei der f o r m a t i e r t e n Ein/Ausgabe die Nummer einer F o r m a t - V e r e i n b a r u n g , in denen sich Angaben über den Aufbau der Eingabezeile bzw. A u s g a b e z e i l e befinden.
126
7 Die Eingabe und Ausgabe von Daten
Die F O R M A T - V e r e i n b a r u n g 100 e n t h ä l t e i n e n a u s z u g e b e n d e n Text zwischen H o c h k o m m a s und d a s Z e i c h e n ( R ü c k w ä r t s - S c h r ä g s t r i c h oder BACKSLASH). Mit Hilfe d i e s e s S t e u e r z e i c h e n s ist es m ö g l i c h , auf der gleichen Zeile mit der Eingabe f o r t z u f a h r e n . Die F O R M A T - V e r e i n b a r u n g 200 e n t h ä l t die I - A n g a b e , die hier f ü r die Eingabe von I N T E G E R - Z a h l e n v e r w e n d e t wird. Die F O R M A T - V e r e i n b a r u n g 300 e n t h ä l t S c h r ä g s t r i c h e als Zeilenvorschub, die X - A n g a b e zur A u s g a b e von L e e r z e i c h e n , einen T e x t und wieder die I - A n g a b e zur Ausgabe von I N T E G E R - Z a h l e n . Die F O R M A T - V e r e i n b a r u n g 400 b e s c h r e i b t d e n Tabellenkopf und e r s t r e c k t sich über drei F O R T R A N - Z e i l e n (zwei F o r t s e t z u n g s z e i l e n ) . Innerhalb der F O R M A T K l a m m e r s t e h t e i n e w e i t e r e K l a m m e r mit dem W i e d e r h o l u n g s f a k t o r 36; es werden 36 S t e r n e auf e i n e r Zeile a u s g e g e b e n . Die F O R M A T - V e r e i n b a r u n g 500 e n t h ä l t d i e I - A n g a b e zur A u s g a b e e i n e r I N T E G E R - Z a h l , die E - A n g a b e f ü r die A u s g a b e e i n e r R E A L - Z a h l in d e r Expon e n t e n s c h r e i b w e i s e und die F - A n g a b e f ü r die Ausgabe e i n e r R E A L - G r ö ß e in der G l e i t p u n k t - D a r s t e l l u n g ( F l o a t i n g Point). Die F O R M A T - V e r e i n b a r u n g 600 gibt 10 L e e r z e i c h e n und 36 S t e r n e a u s . Die F O R M A T - V e r e i n b a r u n g 700 m e l d e t einen E i n g a b e f e h l e r . Für die f o r m a t i e r t e Eingabe kann die R E A D - A n w e i s u n g e r w e i t e r t w e r d e n um ein F o r m a t , die E N D - B e d i n g u n g und die E R R - B e d i n g u n g . Sie hat dann die a l l gemeine Form:
READ( Einheit,
Format
, END= Z i e l , ERR= Ziel ) Liste
Die Einheit ist e i n e I N T E G E R - G r ö ß e und k e n n z e i c h n e t d a s G e r ä t , von dem g e lesen w e r d e n soll. Bei den m e i s t e n R e c h e n a n l a g e n b e z e i c h n e t ein * die Konsole, bei einigen Anlagen wird die Konsole mit der N u m m e r 0 oder 5 a n g e s p r o c h e n . Wird bei der D a t e n e i n g a b e eine E n d e - M a r k e e r k a n n t , so f i n d e t ein Sprung zu dem Sprungziel s t a t t , d e s s e n Marke h i n t e r dem Kennwort END= s t e h t . Die E N D - B e d i n g u n g kann a u c h e n t f a l l e n . Wird bei der D a t e n e i n g a b e ein F e h l e r e r k a n n t , so wird d a s Programm n o r m a l e r weise mit e i n e r F e h l e r m e l d u n g a b g e b r o c h e n . V e r w e n d e t man jedoch die E R R Bedingung, so wird zu der Anweisung im P r o g r a m m g e s p r u n g e n , d e r e n S p r u n g m a r k e h i n t e r d e m K e n n w o r t ERR= s t e h t . Das F o r m a t b e s t e h t a u s e i n e r L i s t e von S t e u e r z e i c h e n und Angaben zur A n o r d nung der D a t e n auf der E i n g a b e z e i l e . Das F o r m a t wird n o r m a l e r w e i s e in e i n e r b e s o n d e r e n F O R M A T - V e r e i n b a r u n g b e s c h r i e b e n . Es kann aber auch in e i n e r C H A R A C T E R - V a r i a b l e n oder bei einigen Compilern a u c h in e i n e r C H A R A C T E R -
7.2 Die formatgesteuerte
(formatierte)
Ein/Ausgabe
über die
Konsole
127
K o n s t a n t e n e n t h a l t e n sein. Beispiele:
READ(*,100) I , X F0RMAT(I3.F10.4)
100
Marke
FORMAT( Liste von Angaben )
CHARACTER F0RM*80 FORM = ' (13,F10.4)1 R E A D ( * , F O R M ) I, X
READ(*,1(I3.F10.4)1) I , X L i e g t das F o r m a t in e i n e r C H A R A C T E R - V a r i a b l e n , so kann es während der L a u f z e i t d e s P r o g r a m m s g e l e s e n w e r d e n . Bild 7 - 7 zeigt dazu ein Beispiel. Im F o r m a t e r s c h e i n e n jeweils durch ein K o m m a g e t r e n n t A n g a b e n f ü r D a t e n und S t e u e r z e i c h e n , die zum Teil bei der Eingabe eine a n d e r e Wirkung als bei der A u s g a b e h a b e n . Bild 7 - 2 f a ß t die F o r m a t e f ü r die Eingabe von D a t e n z u s a m m e n . J e d e V a r i a b l e der E i n g a b e l i s t e muß mit e i n e r D a t e n - A n g a b e der Formatliste beschrieben werden. Angabe
Datentyp
I w
INTEGER
Anordnung der Daten auf der Eingabezeile ganze Zahl rechtsbündig in w Spalten
F w.d
REAL
alle drei Angaben wirken bei der Eingabe gleich
E w.d
REAL
fehlt der Dezimalpunkt, so gibt d die Stellung
reel le Zahl
in w Spalten
des Dezimalpunktes der Mantisse an G w.d
REAL
der Exponent wird durch ein E oder ein Vorzei-
D w.d
DOUBLE
wie E-Angabe
chen eingeleitet PRECISION L w
LOGICAL
jedoch wird der Exponent mit D eingeleitet w Spalten der Eingabe werden von links beginnend auf T für .TRUE. und F
für .FALSE. untersucht
A w
CHARACTER" Eingabe von Texten in w Spalten
A
CHARACTER
Bild 7 - 2 :
Länge der Variablen bestimmt Zahl der Spalten
F o r m a t e f ü r d i e Eingabe von D a t e n
Angabe
Wirkung bei der Eingabe
w X
es werden w Spalten der Eingabezeile überlesen
/
Ende der Eingabezeile; Beginn einer neuen Zeile
T w
Tabulator zur w. Stelle der Eingabezeile
TL w
Tabulator rückt w Stellen nach links
TR w k P
Tabulator rückt w Stellen nach rechts Skalenfaktor für REAL- und DOUBLE PRECISION-Zahlen vor der F-, E,- G- oder D-Angabe, bei der Eingabe ohne Exponent wird die Zahl durch 10*
BN
dividiert
Leerzeichen werden bei der Eingabe von Zahlen übergangen
BZ
Leerzeichen werden bei der Eingabe von Zahlen als Nullen angesehen Eingabe beendet, wenn Liste abgearbeitet
Bild 7 - 3 :
S t e u e r z e i c h e n f ü r die Eingabe
128
7 Die Eingabe und Ausgabe von Daten
Die f ü r d i e E i n g a b e von R E A L - G r ö ß e n v o r g e s e h e n e n F o r m a t a n g a b e n F , E und G h a b e n bei d e r Eingabe die g l e i c h e Wirkung; e n t s c h e i d e n d ist, was auf d e r Z e i l e e i n g e g e b e n wird. E n t h ä l t d i e Zahl bzw. e n t h ä l t d i e M a n t i s s e e i n e n D e z i m a l p u n k t , so i s t d i e A n g a b e d w i r k u n g s l o s ; d i e Z a h l k a n n b e l i e b i g in d e m F e l d von w S p a l t e n a n g e o r d n e t w e r d e n . F e h l t j e d o c h d e r D e z i m a l p u n k t , so w i r d e r vor d i e S t e l l e d von r e c h t s g e s e t z t . D a m i t ist d e r Z a h l e n w e r t a b h ä n g i g von d e r Anordnung der Z i f f e r n f o l g e innerhalb des F e l d e s . Deshalb sei dringend e m p f o h l e n , bei d e r E i n g a b e von R E A L - G r ö ß e n d e n D e z i m a l p u n k t s o w o h l in d e r F e s t p u n k t - a l s a u c h in d e r E x p o n e n t e n s c h r e i b w e i s e m i t e i n z u g e b e n . Bild 7 - 3 z e i g t die bei d e r Eingabe w i r k s a m e n Steuerzeichen. Die f o r m a t i e r t e E i n g a b e v e r l a n g t , d a ß d i e D a t e n s p a l t e n g e r e c h t auf d e r E i n gabezeile angeordnet werden. Dies geschieht durch Abzählen der Spalten oder m i t H i l f e d e s T a b u l a t o r s d e s E i n g a b e g e r ä t e s . Da j e d e V e r s c h i e b u n g a u f d e r Z e i l e den Z a h l e n w e r t v e r ä n d e r t , sollte man die e i n g e g e b e n e n W e r t e zur K o n t r o l l e w i e d e r a u s g e b e n . B e q u e m e r ist j e d o c h d i e l i s t e n g e s t e u e r t e E i n g a b e , b e i der die Z a h l e n e i n f a c h d u r c h L e e r z e i c h e n oder K o m m a s g e t r e n n t w e r d e n . D a g e g e n b i e t e t die f o r m a t i e r t e Ausgabe e r h e b l i c h e V o r t e i l e , weil das Z a h l e n f o r m a t d e r G r ö ß e d e r a u s z u g e b e n d e n Z a h l e n a n g e p a ß t w e r d e n k a n n . Die W R I T E Anweisung hat die a l l g e m e i n e F o r m :
WRITE( E i n h e i t ,
Format
, ERR= Z i e l
)
Liste
Es g e l t e n d i e g l e i c h e n R e g e l n w i e f ü r d i e R E A D - A n w e i s u n g . Die E i n h e i t ist e i n e I N T E G E R - G r ö ß e und k e n n z e i c h n e t d a s G e r ä t , auf d e m a u s g e g e b e n w e r d e n s o l l . Ein * s t e h t f ü r d i e K o n s o l e ( B i l d s c h i r m ) . Bei e i n i g e n A n l a g e n w i r d d i e Konsole a u c h mit der N u m m e r 0 oder 6 b e z e i c h n e t . Das F o r m a t e n t h ä l t A n g a b e n ü b e r d i e A n o r d n u n g d e r a u s z u g e b e n d e n D a t e n s o w i e S t e u e r g r ö ß e n . Wird b e i d e r U m w a n d l u n g u n d A u s g a b e ein F e h l e r e r k a n n t , so wird d a s P r o g r a m m a n d e m h i n t e r E R R = a n g e g e b e n e n S p r u n g z i e l f o r t g e s e t z t . Die L i s t e e n t h ä l t V a r i a b l e n n a m e n , K o n s t a n t e n oder Ausdrücke, die auszugeben sind. Bild 7 - 4 z e i g t d i e F o r m a t e f ü r die A u s g a b e von D a t e n . J e d e a u s z u g e b e n d e Größe ( V a r i a b l e , K o n s t a n t e oder Ausdruck) muß mit einem D a t e n f o r m a t b e schrieben werden. Bei d e r A u s g a b e von D a t e n k a n n e s v o r k o m m e n , d a ß d i e im F o r m a t v o r g e s e h e n e A n z a h l von S p a l t e n n i c h t a u s r e i c h t , a l l e S t e l l e n d e r Z a h l a u s z u g e b e n . In d i e s e m F a l l e r s c h e i n e n S t e r n e a l s F e h l e r m e l d u n g . Bei d e r A u s g a b e von F e s t punktzahlen ( F - A n g a b e ) müssen zusätzliche Spalten für ein negatives Vorzeic h e n u n d d e n D e z i m a l p u n k t b e r ü c k s i c h t i g t w e r d e n . Bei d e r A u s g a b e in d e r E x p o n e n t e n s c h r e i b w e i s e ( E - und D - A n g a b e ) k o m m e n n o c h d e r E x p o n e n t , d a s V o r z e i c h e n d e s E x p o n e n t e n und d e r K e n n b u c h s t a b e E b z w . D d a z u . Bild 7 - 5 zeigt die Steuerzeichen für die Ausgabe.
7.2 Die formatgesteuerte
(formatierte)
Ein/Ausgabe
über die Konsole
Angabe
Oatentyp
Anordnung der Daten auf der Ausgabezeile
I w
INTEGER
ganze Zahl rechtsbündig in w Spalten
F w.d
REAL
relle Zahl rechtsbündig in w Spalten mit d Stellen hinter dem Dezimalpunkt
E w.d
REAL
reelle Zahl rechtsbündig in w Spalten Mantisse mit d Stellen hinter dem Punkt Exponent zweistellig mit Vorzeichen
G w.d
REAL
Ausgabe in w Spalten mit d Stellen hinter dem Dezimalpunkt. Ausgabe wie F- oder EAngabe je nach Größe der Zahl
D w.d
DOUBLE PRECISION
Ausgabe in w Spalten mit d Stellen hinter dem Punkt wie E-Angabe, Exponent dreistellig
L w
LOGICAL
A w
CHARACTER
.TRUE. und F für .FALSE. Ausgabe von Texten in w Spalten
A
CHARACTER
Länge der Variablen bestimmt Zahl der Spalten
Bild 7 - 4 :
Ausgabe in w Spalten mit dem Buchstaben T für
Formate für die Ausgabe von Daten
Angabe
Wirkung bei der Ausgabe
w X
es werden w Leerzeichen ausgegeben
'Text'
der zwischen den Hochkommas stehende Text wird ausgegeben
/
Ende der Ausgabezeile; Beginn einer neuen Zeile
\
die folgende Eingabe beginnt auf der gleichen Zeile
T w
Tabulator zur w. Stelle der Ausgabezeile
TL w
Tabulator rückt w Stellen nach links
TR w
Tabulator rückt w Stellen nach rechts
k P
Skalenfaktor für REAL- und DOUBLE PRECISION-Zahlen b bei der Ausgabe ohne Exponenten: Zahl mal 10 bei der Ausgabe mit
Exponenten: Mantisse mal
S SP
positive und negative Zahlen erhalten Vorzeichen nur negative Zahlen erhalten Vorzeichen
SS
Ausgabe beendet, wenn Liste abgearbeitet
Bild 7 - 5 :
Steuerzeichen für die Ausgabe
1 .Zeichen der Zeile Leerzeichen
Bild 7 - 6 :
lO^
Exponent - k Vorzeichenbehandlung je nach Rechenanlage
Wirkung Vorschub um eine Zeile
0
(Null)
1
(Eins)
Vorschub auf eine neue Seite
+
(Plus)
kein Vorschub, alte Zeile überschrieben
Vorschub um zwei Zeilen
Steuerzeichen für den Druckervorschub
129
130
7 Die Eingabe und Ausgabe
von Daten
Bei der Ausgabe auf dem Drucker s t e u e r t das 1. Zeichen einer Zeile den V o r schub des Druckers; d a h e r wird das 1. Zeichen nicht a u s g e g e b e n . Dies gilt bei einigen Anlagen a u c h f ü r die Konsole ( B i l d s c h i r m g e r ä t ) . Dabei ist es g l e i c h gültig, ob das Zeichen mit Hilfe eines D a t e n f o r m a t e s oder als T e x t k o n s t a n t e im F o r m a t e n t s t a n d e n ist. Bild 7 - 6 zeigt die Vorschubzeichen f ü r den D r u c k e r . Das 1. Zeichen e i n e r Zeile wird nicht ausgegeben, sondern s t e u e r t den D r u c k e r vorschub. Bei dem Aufbau eines A u s g a b e f o r m a t e s ist also am Beginn einer Ausgabezeile ein Vorschubzeichen f ü r den Drucker anzugeben, selbst wenn die Ausgabe nur auf der Konsole e r s c h e i n e n soll. Beispiele: xxxxx
FORMAT(1X,
neue Z e i l e
xxxxx
FORMAT('0 1 ,
Leerzeile
xxxxx
F0RMAT( 1 1'
neue S e i t e
Leerzeilen lassen sich a u c h durch Schrägstriche erzeugen. Nach dem letzten S c h r ä g s t r i c h muß auch hier ein Vorschubsteuerzeichen s t e h e n . Beispiel: xxxxx
FORMAT(///1X,
3 Leerzeilen
Für die Untersuchung ein E i n g a b e - und A u s g a b e f o r m a t e n zeigt Bild 7 - 7 ein T e s t p r o g r a m m , das zunächst die Eingabe eines F o r m a t e s v e r l a n g t , bevor eine INTEGER- und e i n e R E A L - Z a h l einzugeben sind. Die Ausgabe e r f o l g t einmal l i s t e n g e s t e u e r t , also ohne F o r m a t , und dann mit einem vorher einzugebenden F o r m a t . Mit diesem T e s t p r o g r a m m kann der Aufbau von E i n g a b e - und A u s g a b e f o r m a t e n f ü r I N T E G E R - und REAL-Zahlen sowie die Wirkung von S t e u e r z e i chen untersucht werden. C BILD 7 - 7 FQRMAT LESEN FUER EINGABE UND AUSGABE CHARACTER FORME'BO,F0RMA»80 10 WRITEC»,100) 100 FORtlAT C / / ' INTEGER-2AHL UND REAL-ZAHL'/) UIRITEC», 200) 200 FORMAT(' EINGABE-FORMAT > ' \ ) READC»,300,END-20.ERR-30) FORME 300 FORMATCABO) UIRITEC», 400) 400 FORMATC ' DATEN EINBEBEN AB SPALTE 1'/IX,43C ' - ' )) READC»,FORME,END-20,ERR=30) I,X WRITEC*,») WRITEC», » ) ' FORMATFREIE AUSGABE: I - ' , 1 , ' X =',X UIRITEC», *) WRITEC»,500) 500 FORMATC' AUSGABE-FORMAT > ' \ ) READC»,300,END=20,ERR=30) FORMA WRITEC»,B00) EOO F0RMATC1X.49C'-')) WRITEC»,FORMA,ERR-30) I , X GOTO 10 20 WRITEC»,700) 700 FORMATCIX,'ENDE') STOP 30 WRITEC»,BOO) BOO FORMATC' EINGABEFEHLER') GOTO 10 END
7.2 Die formatgesteuerte
(formatierte)
Ein)Ausgabe
über die
Konsole
131
B> TEST INTEGER-ZAHL UND REAL-ZAHL EINEABE-FORMAT >CI2,F10.4) DATEN EINGEBEN AB SPALTE 1 151234567830 FORMATFREIE AUSGABE: I AUSGABE-FÜRMAT 15
12 X -
123456.BOOOOOO
123 X -
15000.0000000
>C1X,13,EIS.43
.1235E+06
INTEGER-ZAHL UND REAL-ZAHL EINGABE-FORMAT > ( I 3 , E 1 2 . 4 5 DATEN EINGEBEN AB SPALTE 1 123
1.5E4
FORMATFREIE AUSGABE: I AUSGABE-FORMAT
>C/IX,I3,1PE12.43
Bild 7 - 7 : T e s t p r o g r a m m f ü r die f o r m a t i e r t e Ein/Ausgabe
Die w i c h t i g s t e n Regeln f ü r den A u f b a u von F o r m a t e n lauten: Folgen m e h r e r e gleiche Angaben a u f e i n a n d e r , so können sie mit einem Wiederholungsfaktor z u s a m m e n g e f a ß t w e r d e n . Beispiel: 1 3 , 1 3 , 1 3 , 1 3 w i r k t wie 413 Folgen m e h r e r e Gruppen von Angaben a u f e i n a n d e r , so können sie durch eine K l a m m e r und einen Wiederholungsfaktor z u s a m m e n g e f a ß t w e r d e n . Wiederholungsf a k t o r e n vor T e x t k o n s t a n t e n sind ebenfalls zu k l a m m e r n . Beispiel: I 3 , 1 X , I 3 , 1 X , I 3 , 1 X w i r k t wie 3 ( 1 3 , 1 X ) 49('-')
g i b t 49 S t r i c h e aus
Die Angaben der F o r m a t l i s t e w e r d e n in d e r gleichen R e i h e n f o l g e a u s g e f ü h r t wie die Größen der E i n / A u s g a b e l i s t e . Ist die F o r m a t l i s t e kleiner, so wird sie so o f t a u s g e f ü h r t , bis alle Größen der Ein/Ausgabeliste ü b e r t r a g e n wurden. Ist die F o r m a t l i s t e g r ö ß e r , so werden nur die Größen der E i n / A u s g a b e l i s t e ü b e r t r a g e n ; der Rest der F o r m a t l i s t e wird nicht a u s g e f ü h r t . In dem folgenden Beispiel wird das F o r m a t d r e i m a l a u s g e f ü h r t .
100
READ(*,100) A , B , C F0RMAT(F10.3)
132
7 Die Eingabe und Ausgabe von Daten
Die Zahl der Schachtelungen von Klammern innerhalb des Formates ist abhängig von der verwendeten Rechenanlage. Das 1. Zeichen einer Ausgabezeile ist das Vorschubzeichen für den Drucker und wird nicht ausgegeben. Für einen einfachen Zeilenvorschub können Sie ein Leerzeichen ( I X ) verwenden. Mehrere Zeilenvorschübe lassen sich durch Schrägstriche " / " erzielen. Bei der f o r m a t i e r t e n Eingabe ist die Spalteneinteilung zu beachten. R E A L Größen sollten immer mit einem Dezimalpunkt eingegeben werden. Bei der Eingabe von Testdaten über die Konsole sollte nach Möglichkeit die f o r m a t f r e i e ( l i s t e n g e s t e u e r t e ) Eingabe verwendet werden, bei der die Daten ohne Rücksicht auf eine Spalteneinteilung nur durch ein Leerzeichen bzw. ein Komma getrennt werden.
7.3 Die Arbeit mit Datendateien Die Programmiersprache F O R T R A N entstand zu einer Z e i t , in der fast ausschließlich Lochkarten als Datenträger verwendet wurden. Damals hätten Sie als Programmierer die Steueranweisungen an das Betriebssystem, das F O R T R A N - P r o g r a m m und die Eingabedaten an einem Schreiblocher auf 80spaltige Lochkarten abgelocht. Dieses Kartenpaket wäre im Rechenzentrum mit Hilfe eines Lochkartenlesers in den Rechner eingegeben worden. Die Ausgabedaten wurden ausgedruckt oder über einen Stanzer auf Lochkarten ausgestanzt. Für eine längerfristige Aufbewahrung von Programmen (Programmdateien) und Daten ( D a t e n d a t e i e n ) standen Magnetbandgeräte sowie Magnettrommeln und Magnetplattengeräte zur Verfügung. Heutzutage werden die Programme fast ausschließlich am Bildschirmgerät e i n gegeben und g e t e s t e t und dann in einer Programmdatei aufbewahrt. Für die Eingabe der Daten unterscheidet man im Wesentlichen zwei V e r f a h r e n . Einmal werden sie im Dialog am Bildschirm eingegeben; zum anderen werden sie g e trennt von dem verarbeitenden Programm mit H i l f e von Eingabeprogrammen (z.B. dem Editor) eingegeben, eventuell geprüft und in einer Datendatei a u f bewahrt. Ausgabedaten (Ergebnisse) werden gedruckt oder zur w e i t e r e n V e r a r beitung in eine Datendatei geschrieben. Programm- und Datendateien werden bei Großrechnern auf Magnetplatten, bei Arbeitsplatzrechnern auf Disketten gespeichert. Magnetbandgeräte werden nur zur Datensicherung verwendet. Die Verwaltung der Dateien übernimmt das Betriebssystem. Eine Datei enthält ein Programm ( P r o g r a m m d a t e i ) oder Daten ( D a t e n d a t e i ) , die von einem Programm verarbeitet werden. Im Folgenden werden wir nur Datendateien betrachten. Bei der Eingabe und Ausgabe von Daten über die Konsole arbeiten wir mit f e s t zugeordneten Dateien. Eine Datei besteht normalerweise aus Datensätzen gleicher Länge. Beispiele für einen Datensatz sind eine Eingabezeile mit Meßwerten, eine Ausgabezeile mit Ergebnissen oder die Daten eines Einwohners in einer Einwohnerdatei. Beim fortlaufenden (sequentiellen) Zugriff müssen die Datensätze in der R e i henfolge verarbeitet werden, in der sie auf dem Speicher angeordnet sind. Dies
7.3 Die Arbeit 'mit Datendateien
133
t r i f f t z.B. für Daten zu, die von der Konsole e i n g e g e b e n werden. Wie beim Lesen von L o c h k a r t e n ist es nicht möglich, bereits vorher e i n g e g e b e n e D a t e n sätze nochmals zu v e r a r b e i t e n . Im G e g e n s a t z dazu gibt es bei Banddateien die M ö g l i c h k e i t , das Band zurückzuspulen. Beim direkten ( r a n d o m ) Z u g r i f f wird ein Datensatz durch die Angabe einer Satznummer (Satzadresse) g e l e s e n oder beschrieben. Diese Z u g r i f f s a r t v e r w e n det man bei P l a t t e n - und D i s k e t t e n d a t e i e n , bei denen sich der Schreib/Lesekopf auf j e d e Stelle der O b e r f l ä c h e einstellen läßt. Eine formatierte Datei (z.B. B i l d s c h i r m z e i l e ) enthält Daten in einer vom M e n schen lesbaren Form; im Arbeitsspeicher des Rechners werden die Daten binär d a r g e s t e l l t . Eingabezeilen und Ausgabezeilen müssen daher i m m e r mit H i l f e eines F o r m a t e s umgewandelt werden; bei der listengesteuerten f o r m a t f r e i e n Ein/Ausgabe werden S t a n d a r d f o r m a t e v e r w e n d e t . Eine unformatierte oder binäre Datei enthält die Daten in der maschineninternen binären Darstellung des Arbeitsspeichers. Die Übertragung e r f o l g t ohne Angabe eines F o r m a t e s und ist daher schneller als bei der f o r m a t i e r t e n Ein/ Ausgabe. Eine externe Datei ist auf einem e x t e r n e n Speichermedium (Band oder P l a t t e bzw. D i s k e t t e ) angeordnet. Eine interne D a t e i b e f i n d e t sich im Arbeitsspeicher und wird nur zur L a u f z e i t des Programms a n g e l e g t . Sie erhält keine Dateinummer. Die f o l g e n d e n F O R T R A N - A n w e i s u n g e n dienen zur Behandlung von Datendateien. Sie sind z.T. abhängig vom v e r w e n d e t e n Compiler und Betriebssystem. Die OPEN-Anweisung ordnet dem Dateinamen des Betriebssystems eine D a t e i nummer des F O R T R A N zu und legt die E i g e n s c h a f t e n der zu bearbeitenden Datei f e s t .
0PEN( Parameterliste )
Die P a r a m e t e r l i s t e kann mehrere Angaben in b e l i e b i g e r R e i h e n f o l g e enthalten. A l l e Angaben sind mit Ausnahme der Dateinummer und der Satzlänge Größen vom T y p C H A R A C T E R . Sie bestehen im einfachsten Fall aus Z e i c h e n , die z w i schen Apostrophs zu setzen sind. Bei fehlenden Angaben werden Standardwerte angenommen. Der P a r a m e t e r UNIT= Dateinummer enthält eine I N T E G E R - G r ö ß e als Dateinummer, unter der die Datei in R E A D und W R I T E - A n w e i s u n g e n angesprochen wird. Steht der P a r a m e t e r am A n f a n g der L i s t e , so kann das Kennwort U N I T e n t f a l l e n . Der P a r a m e t e r FILE= D a t e i n a m e enthält den Dateinamen des Betriebssystems, der nicht nach den F O R T R A N R e g e l n , sondern nach den V o r s c h r i f t e n des Betriebssystems gebildet w i r d .
134
7 Die Eingabe und Ausgabe von Daten
Der P a r a m e t e r STATUS= S t a t u s e n t h ä l t die Art der D a t e i . Eine b e r e i t s b e s t e h e n d e D a t e i wird m i t ' O L D ' g e k e n n z e i c h n e t . Bei ' N E W ' w i r d e i n e n e u e D a t e i a n g e l e g t . ' S C R A T C H ' k e n n z e i c h n e t eine A r b e i t s d a t e i , die nur während des P r o g r a m m a b l a u f e s zur V e r f ü g u n g s t e h t . Bei ' U N K N O W N ' w i r d d e r S t a t u s vom B e t r i e b s s y s t e m b e s t i m m t . F e h l t d i e A n g a b e , so w i r d ' O L D ' a n g e n o m m e n . D e r P a r a m e t e r ACCESS= Z u g r i f f s a r t g i b t d i e Z u g r i f f s a r t a n . ' S E Q U E N T I A L ' s t e h t f ü r f o r t l a u f e n d e n Z u g r i f f bei B a n d d a t e i e n oder lochkartenähnlichen D a t e n d a t e i e n . 'DIRECT' steht bei P l a t t e n - o d e r D i s k e t t e n d a t e i e n im d i r e k t e n ( r a n d o m ) Z u g r i f f . F e h l t d e r P a r a m e t e r , so w i r d ' S E Q U E N T I A L ' a n g e n o m m e n . Der P a r a m e t e r FORM= F o r m a t l e g t d i e A r t d e r D a t e n ü b e r t r a g u n g f e s t . Bei ' F O R M A T T E D ' w e r d e n d i e D a t e n mit Hilfe eines F o r m a t e s u m g e w a n d e l t ; bei ' U N F O R M A T T E D ' werden die D a t e n b i n ä r o h n e U m w a n d l u n g ü b e r t r a g e n . F e h l t d e r P a r a m e t e r , so w e r d e n d i e D a t e n b e i d e r Z u g r i f f s a r t ' S E Q U E N T I A L ' f o r m a t i e r t ( ' F O R M A T T E T ' ) ; bei d e r Z u g r i f f s a r t 'DIRECT' w e r d e n sie u n f o r m a t i e r t ( ' U N F O R M A T T E D ' ) ü b e r t r a g e n . D e r P a r a m e t e r RECL= S a t z l ä n g e w i r d n u r f ü r D a t e i e n im d i r e k t e n D a t e n z u g r i f f a n g e g e b e n u n d e n t h ä l t d i e S a t z l ä n g e in d e r E i n h e i t B y t e s . D i e f o l g e n d e n P a r a m e t e r s i n d n i c h t bei a l l e n C o m p i l e r n v e r f ü g b a r : Der P a r a m e t e r IOSTAT= V a r i a b l e ü b e r g i b t in e i n e r I N T E G E R - V a r i a b l e n e i n e K e n n z a h l . W u r d e d i e O P E N - A n w e i sung f e h l e r f r e i a u s g e f ü h r t , so e n t h ä l t die V a r i a b l e den Wert Null. A n d e r e n f a l l s k a n n a u s d e m W e r t d i e A r t d e s F e h l e r s b e s t i m m t w e r d e n . D i e Z u o r d n u n g ist a b h ä n g i g vom B e t r i e b s s y s t e m . Der P a r a m e t e r ERR= Anweisungsnummer ü b e r g i b t ein Sprungziel f ü r d e n F a l l , daß bei der E r ö f f n u n g d e r Datei ein F e h ler a u f t r i t t . Das P r o g r a m m kann dann d e n P a r a m e t e r IOSTAT a u s w e r t e n . Der gibt Bei den
P a r a m e t e r BLANK= Kennwert a n , wie L e e r z e i c h e n (Blank) bei Z a h l e n a n g a b e n a u s g e w e r t e t w e r d e n sollen. der Angabe ' N U L L ' w e r d e n L e e r z e i c h e n nicht b e a c h t e t ; bei ' Z E R O ' w e r L e e r z e i c h e n als Z i f f e r Null a n g e s e h e n .
D a s f o l g e n d e B e i s p i e l e r ö f f n e t u n t e r d e r N u m m e r 10 e i n e a l t e D a t e i m i t d e m N a m e n D A T E N . D A T mit s e q u e n t i e l l e m Zugriff und f o r m a t i e r t e r Ü b e r t r a g u n g .
0 P E N ( 1 0 , F I L E = 1 DATEN.DAT 1 ,STATUS='OLD',ACCESS='SEQUENTIAL' , 1 F0RM=1 FORMATTED')
D i e C L O S E - A n w e i s u n g löst d i e V e r b i n d u n g z w i s c h e n d e r D a t e i n u m m e r und d e m D a t e i n a m e n ; die N u m m e r kann anschließend einer a n d e r e n Datei zugeordnet werden.
7.3 Die Arbeit mit Datendateien
135
CLOSE( Parameter!iste )
Der P a r a m e t e r UNIT= Dateinummer enthält eine I N T E G E R - G r ö ß e mit der Nummer der freizugebenden D a t e i . Steht der P a r a m e t e r am Anfang der L i s t e , so kann das Kennwort UNIT e n t f a l l e n . Der P a r a m e t e r STATUS= S t a t u s gibt an, ob die Datei mit ' K E E P ' erhalten bleiben oder mit ' D E L E T E ' gelöscht werden soll. F e h l t der P a r a m e t e r , so werden S C R A T C H - D a t e i e n gelöscht, alle anderen Dateien bleiben e r h a l t e n . Fehlt die CLOSE-Anweisung, so wird die Datei nach Beendigung des Programms automatisch freigegeben. Das folgende Beispiel schließt die unter der Nummer 10 vereinbarte D a t e i , die ohne Angabe eines S t a t u s e r h a l t e n bleibt.
CL0SE(10) Mit Hilfe der INQUIRE-Anweisung ist e s möglich, vom Betriebssystem die P a r a m e t e r einer b e r e i t s bestehenden Datei zu e r f r a g e n . Dabei muß entweder die Dateinummer oder der D a t e i n a m e als bekannt eingegeben werden. An die S t e l l e der Konstanten hinter den Parametern t r e t e n Variablen, die nach der Ausführung der INQUIRE-Anweisung die gewünschten Informationen enthalten. Beim Zugriff auf Dateien haben die b e r e i t s bekannten Anweisungen READ und WRITE die allgemeine F o r m :
READ( Parameterliste ) Eingabeliste WRITE( Parameterliste ) Ausgabeliste
Der P a r a m e t e r UNIT= Dateinummer enthält eine I N T E G E R - G r ö ß e als Dateinummer. Das Zeichen * bezeichnet die Konsole. Steht der P a r a m e t e r an e r s t e r S t e l l e der L i s t e , so kann das Kennwort UNIT e n t f a l l e n . Der P a r a m e t e r FMT= F o r m a t kennzeichnet das F o r m a t , das bei der Übertragung der Daten zwischen dem Arbeitsspeicher und der Datei verwendet werden soll. Ein * kennzeichnet die l i s t e n g e s t e u e r t e Ein/Ausgabe mit Standardformaten. Der P a r a m e t e r F o r m a t kann sein die Nummer einer F O R M A T - V e r e i n b a r u n g oder eine C H A R A C T E R Größe mit den F o r m a t a n g a b e n . S t e h t der P a r a m e t e r an zweiter S t e l l e in der L i s t e , so kann das Kennwort F M T e n t f a l l e n .
136
7 Die Eingabe und Ausgabe von Daten
D e r P a r a m e t e r REC= S a t z n u m m e r m u ß und darf n u r b e i bei D a t e i e n m i t d i r e k t e m ( r a n d o m ) D a t e n z u g r i f f a n g e g e b e n w e r d e n . Die I N T E G E R - G r ö ß e e n t h ä l t d i e N u m m e r d e s zu ü b e r t r a g e n d e n Satzes. D e r P a r a m e t e r END= A n w e i s u n g s n u m m e r e n t h ä l t e i n S p r u n g z i e l , zu d e m d a s P r o g r a m m v e r z w e i g t , w e n n d a s Ende Datei erkannt wird. D e r P a r a m e t e r ERR= A n w e i s u n g s n u m m e r e n t h ä l t e i n S p r u n g z i e l , zu d e m d a s P r o g r a m m v e r z w e i g t , w e n n bei d e r ü b e r t r a g u n g o d e r D a t e n u m w a n d l u n g ein F e h l e r a u f t r i t t .
der
Daten-
D e r P a r a m e t e r IOSTAT= V a r i a b l e ü b e r g i b t in e i n e r I N T E G E R - V a r i a b l e n e i n e K e n n z a h l . Bei f e h l e r f r e i e r Ü b e r t r a gung h a t sie d e n W e r t Null; s o n s t e i n e n Wert u n g l e i c h Null, d e s s e n B e d e u t u n g vom B e t r i e b s s y s t e m a b h ä n g i g i s t .
7.4 Die Arbeit mit zeilenorientierten Dateien D i e E i n g a b e ü b e r d i e K o n s o l e h a t z u w e i l e n den N a c h t e i l , d a ß d i e D a t e n b e i j e d e m T e s t l a u f d e s P r o g r a m m s e r n e u t e i n g e g e b e n w e r d e n m ü s s e n . Zu d e r Z e i t , als die Daten noch mit L o c h k a r t e n eingegeben wurden, konnte das K a r t e n p a k e t mit T e s t d a t e n bei jedem Programmlauf wiederverwendet werden. Desgleichen w a r es m ö g l i c h , die T e s t d a t e n d u r c h ein P r o g r a m m zu e r s t e l l e n und auf L o c h k a r t e n a u s s t a n z e n zu l a s s e n , die d a n n zur D a t e n e i n g a b e v e r w e n d e t w u r d e n . A u c h bei d e r D a t e n a u s g a b e k a n n e s z u w e i l e n n ü t z l i c h s e i n , d i e E r g e b n i s s e in e i n e r D a t e i zu s p e i c h e r n , die z . B . m e h r m a l s a u s g e d r u c k t w e r d e n k a n n . E i n e z e i l e n o r i e n t i e r t e E i n g a b e d a t e i wird m i t H i l f e d e s E d i t o r s e r s t e l l t . Sie e n t h ä l t d i e D a t e n in d e r A n o r d n u n g , in d e r s i e s o n s t ü b e r d i e K o n s o l e e i n g e g e ben wurden. Eine A u s g a b e d a t e i e n t h ä l t Ausgabezeilen mit Ergebnissen, die s o n s t auf d e m B i l d s c h i r m a u s g e g e b e n w u r d e n . Sie k a n n m i t H i l f e d e s E d i t o r s o d e r e i n e r a n d e r e n B e t r i e b s s y s t e m f u n k t i o n auf d e m B i l d s c h i r m o d e r D r u c k e r a u s g e g e b e n w e r d e n . Bild 7 - 8 z e i g t ein T e s t p r o g r a m m , d a s m i t z e i l e n o r i e n t i e r t e n D a t e n d a t e i e n a n s t e l l e d e r Konsole a r b e i t e t . Die E i n g a b e d a t e n k o m m e n a u s d e r D a t e i n a m e n s E I N . D A T , d i e in der R E A D A n w e i s u n g u n t e r d e r N u m m e r 10 a n g e s p r o c h e n w i r d . D i e A u s g a b e d a t e n w e r d e n in d i e D a t e i A U S . D A T g e s c h r i e b e n , die mit d e r O P E N - A n w e i s u n g die N u m m e r 20 e r h ä l t . Sowohl d i e E i n g a b e als a u c h die A u s g a b e w e r d e n mit H i l f e von F o r m a t e n d u r c h g e f ü h r t . Auf d e r K o n s o l e e r s c h e i n e n N a c h r i c h t e n , w e n n d a s P r o g r a m m g e s t a r t e t und b e e n d e t w i r d . Die E i n g a b e d a t e i E I N . D A T w u r d e m i t d e m E d i t o r a u f g e b a u t und zur K o n t r o l l e m i t d e m T Y P E - K o m m a n d o d e s B e t r i e b s s y s t e m s a u s g e g e b e n . Die A u s g a b e d a t e i A U S . D A T w u r d e e b e n f a l l s a u s g e d r u c k t . A n s t e l l e d e r im B e i s p i e l g e w ä h l t e n f o r m a t g e s t e u e r t e n E i n / A u s g a b e k a n n a u c h die l i s t e n g e s t e u e r t e Ein/Ausgabe ohne F o r m a t e verwendet w e r d e n . Unter dem B e t r i e b s s y s t e m M S - D O S ist e s s o g a r m ö g l i c h , im P r o g r a m m mit e i n e m * d i e K o n s o l e a l s E i n / A u s g a b e g e r ä t a n z u g e b e n ; b e i m S t a r t d e s P r o g r a m m s j e d o c h von d e r K o n s o l e auf D a t e n d a t e i e n u m z u s t e u e r n .
7.4 Die Arbeit mit zeilenorientierten
Dateien
137
C BILD 7-B TESTPROGRAMM ZEILENORIENTIERTE DATENDATEI ÜPENC10,FILE-'EIN.DAT ' ) OPENC20,FILE-'AUS.DAT'3 UJRITEC»,*V START DES PROGRAMMS ' 10 READC10,100,END-203 X , Y , Z 100 FORMATC 3 F 1 0 . 3 ) SUM - X + Y + Z UIR ITE C 20 , 200 3 X , Y , 2 , SUM 200 FORMAT C1X,4F10.4) GOTO 10 20 CLOSE C10 5 CLOSE(20) WRITEC*,«)' ENDE DES PROGRAMMS' STOP END B>TYPE E IN.DAT 1 .0 2.0 2 0 .0 200 .
1 0 .0 100 . 1000 .
2000
3.0 30.0 300 . 3000
B>TEST START DES PROGRAMMS ENDE DES PROGRAMMS St Dp - Program t e r m i n a t e d . B>TYPE AUS.DAT 1.0000 2.0000 3.0000 5.0000 10.0000 20.0000 30.0000 GO.0000 100.0000 2 0 0 . 0 0 0 0 3 0 0 . 0 0 0 0 BOO.0000 1000.0000 2 0 0 0 . 0 0 0 0 3 0 0 0 . 0 0 0 0 6 0 0 0 . 0 0 0 0 Bild 7 - 8 :
Programmbeispiel für zeilenorientierte
Programmname
Ausgabedatei
Die f o l g e n d e n Beispiele s t a r t e n ein P r o g r a m m n a m e n s TEST und o r d n e n a n s t e l l e der im P r o g r a m m mit einem * v e r e i n b a r t e n Konsole D a t e n d a t e i e n zu. TEST < TEST > TEST »
EIN.DAT AUS.DAT AUS.DAT
Eingabedatei ist EIN.DAT Ausgabe auf neuer Datei AUS.DAT Ausgabe wird an Datei AUS.DAT angehängt
Je n a c h B e t r i e b s s y s t e m gibt e s w e i t e r e M ö g l i c h k e i t e n , die Eingabe bzw. A u s g a be auf b e s t i m m t e G e r ä t e wie z.B. D r u c k e r , P l o t t e r ( Z e i c h e n g e r ä t e ) oder s e r i e l le S c h n i t t s t e l l e n u m z u s t e u e r n . Die in d i e s e m Abschnitt b e s c h r i e b e n e n z e i l e n o r i e n t i e r t e n D a t e n d a t e i e n werden s e q u e n t i e l l ( f o r t l a u f e n d ) v e r a r b e i t e t . E i n g a b e d a t e n k ö n n e n nur g e l e s e n , Ausg a b e d a t e n können nur g e s c h r i e b e n w e r d e n ; ein Zugriff auf b e r e i t s v e r a r b e i t e t e D a t e n s ä t z e ist n i c h t v o r g e s e h e n . Diese B e t r i e b s a r t e n t s p r i c h t der Eingabe von L o c h k a r t e n bzw. der Ausgabe auf d e m D r u c k e r o d e r L o c h k a r t e n s t a n z e r .
138
7 Die Eingabe und Ausgabe von Daten
7.5 Die Arbeit mit sequentiellen Datendateien (Banddateien) Für die V e r a r b e i t u n g großer D a t e n m e n g e n wie z.B. einer E i n w o h n e r d a t e i w u r den f r ü h e r M a g n e t b a n d g e r ä t e verwendet. Wie bei einem K a s s e t t e n r e c o r d e r l ä u f t ein Magnetband an einem f e s t s t e h e n d e n Schreib/Lesekopf vorbei. Anstelle von Tonschwingungen w e r d e n jedoch binäre D a t e n g e s p e i c h e r t . Tie D a t e n s ä t z e l i e gen h i n t e r e i n a n d e r auf dem Band. DateiAnfang
1. Satz Daten
2. Satz Daten
3. Satz Daten
n. Satz Daten
EndeMarke
Am Anfang einer Banddatei b e f i n d e t sich ein D a t e i - A n f a n g s - S a t z , der z.B. den N a m e n der D a t e i e n t h ä l t . Dann folgen beliebig viele D a t e n s ä t z e . Am Ende der Datei s t e h t eine E n d e - M a r k e . Ein Magnetband kann m e h r e r e D a t e i e n e n t h a l t e n . Im G e g e n s a t z zu L o c h k a r t e n d a t e i e n lassen sich Bänder vor- und z u r ü c k spulen und sowohl lesen als auch b e s c h r e i b e n . M a g n e t b a n d g e r ä t e werden h e u t e nur noch zur D a t e n s i c h e r u n g verwendet; die Organisationsform einer Banddatei wird bei M a g n e t p l a t t e n und D i s k e t t e n als s e q u e n t i e l l e r Datenzugriff b e z e i c h n e t . Entsprechend der A r b e i t s w e i s e eines B a n d g e r ä t e s gibt es die F O R T R A N - A n w e i sungen:
REWIND Dateinummer
BACK SPACE Dateinummer END FILE Dateinummer
Die REWIND-Anweisung s e t z t die sequentielle Datei auf den Anfang zurück. Damit kann der e r s t e D a t e n s a t z gelesen oder g e s c h r i e b e n w e r d e n . N a c h der E r ö f f n u n g einer D a t e i mit OPEN s t e h t die Datei a u t o m a t i s c h am A n f a n g . Jeder R E A D - B e f e h l liest den g e r a d e am Lesekopf anliegenden D a t e n s a t z und ü b e r t r ä g t ihn in den A r b e i t s s p e i c h e r . Dabei rückt die Datei um einen Satz w e i t e r . Jeder W R I T E - B e f e h l schreibt die D a t e n eines D a t e n s a t z e s vom A r b e i t s speicher auf die D a t e i . Dabei rückt die Datei um einen Satz w e i t e r . Die A n weisung BACK SPACE s e t z t die Datei um einen Satz zurück, so daß der zuletzt v e r a r b e i t e t e Satz e r n e u t zur Verfügung s t e h t . Mit der Anweisung END FILE wird eine E n d e m a r k e auf die Datei g e s c h r i e b e n . Die R E A D - und WRITE-Anweisungen e n t h a l t e n im P a r a m e t e r END= e i n e A n w e i s u n g s n u m m e r , zu der beim Erkennen der E n d - F i l e - M a r k e verzweigt wird. Will man die Datei am Ende durch neue D a t e n s ä t z e e r w e i t e r n , so kann die sequentielle D a t e i durch die Anweisung BACK SPACE vor die E n d e m a r k e positioniert werden; der n a c h f o l g e n d e WRITE-Befehl ü b e r s c h r e i b t dann die E n d e marke d u r c h einen n e u e n D a t e n s a t z .
7.5 Die Arbeit mit sequentiellen Datendateien
(Banddateien)
139
Das f o l g e n d e Beispiel liest W e r t e von der K o n s o l e und bringt sie in aufeinander f o l g e n d e n Sätzen auf eine s e q u e n t i e l l e D a t e i . N a c h dem Ende der Eingabe wird die s e q u e n t i e l l e D a t e i auf den A n f a n g g e s e t z t , gelesen und auf der Konsole wieder ausgegeben. C SEQUENT IELLE DATE I B7-SEQU 0PENC10,FILE-'TEST',STATUS-'NEW', 1 ACCESS='SEQUENTIAL',FORM"'UNFORMATTED'3 10 READ(*,»,END-503 WERT UIRITECIO) WERT GOTO 10 80 END FILE 10 REWIND 10 30 READ(10,END=403 WERT W R I T E C " , * ) WERT GOTO 30 40 CLOSE C10,STATUS-'DELETE'D STOP END B> TEST 1 2 3 4 5 6
7 BS ~2
1.0000000 E.0000000 3.0000000 4.0000000 5.0000000 G.0000000 7.0000000 B9.0000000 Stop - Program t e r m i n a t e d .
Als Anwendungsbeispiel einer D a t e n d a t e i mit s e q u e n t i e l l e m Z u g r i f f b e t r a c h t e n wir ein L i t e r a t u r v e r z e i c h n i s . Ein D a t e n s a t z besteht aus einem K e n n w o r t (12 B y t e s ) und einem T e x t mit L i t e r a t u r a n g a b e n (79 B y t e s ) . Ein Beispiel für einen Datensatz ist das K e n n w o r t " F O R T R A N " mit dem T e x t " S C H M I T T , F O R T R A N - K U R S , O L D E N B O U R G " , der dieses Buch als L i t e r a t u r s t e l l e b e s c h r e i b t . Die D a t e i enthält beliebig viele D a t e n s ä t z e ; am Ende steht e i n e E n d e marke ( E N D F I L E ) .
140
7 Die Eingabe und Ausgabe von Daten
C BILD 7 - 9 AUFBAU EINER SEQUENTIELLEN DATEI CHARACTER KENN*12,TEXT»79 OPEN CIO,FILE-'LITUER.DAT'.STATUS-'NEW', 1 ACCESS-'SEQUENTIAL',FORM-'UNFORMATTED'3 REWIND 10 NSATZ - 0 WRITEC»,»3' LITERATUR-UERZEICHNIS' 10 UJRITE C * , 100 3 100 F0RMATC/1X,'KENNWORT > ' \ 3 READ C * , 200 , END=20 3 KENN 200 FORMAT CA) UIRITEC»,300) 300 FORMATC' TEXT > ' \ 3 READC * , 200 , END-203 TEXT WRITE C10 3 KENN,TEXT NSATZ - NSATZ + 1 GOTO 10 20 END FILE 10 CLOSE CIO} WRITEC» , 4003 NSATZ 400 F0RMATC/1X,14,' SAETZE AUFGEBAUT'3 STOP END B> B7-S LITERATUR-UERZEICHNIS KENNWORT >FORTRAN TEXT »SCHMITT, FDRTRAN-KURS, OLDENBGURG KENNUORT > FORTRAN TEXT >IBM, FORTRAN COMPILER UERSION 2 . 0 0 KENNUORT > FORTRAN TEXT >SPERRY UNIUAC, FORTRANLBGEMEI NE BESCHREIBUNG KENNWORT > FORTRAN TEXT >SPERRY UNIUAC, FORTRAN CASCII3 LEUEL 10R1 KENNWORT >ASSEMBLER TEXT »SCHMITT, MASCHINENORIENTIERTE PROGRAMMIERUNG, OLDENBOURG KENNWORT > Z S SAETZE AUFGEBAUT Stop Bild -7 -Program 9 : A u f b aterminated. u einer sequentiellen D a t e i
Das in Bild 7 - 9 d a r g e s t e l l t e Programm baut die Datei a u f . Die O P E N - A n w e i sung e r r i c h t e t die Datei (NEW) mit dem B e t r i e b s s y s t e m n a m e n LITVER.DAT. Sie wird fortlaufend (SEQUENTIAL) adressiert und ist unformatiert ( U N F O R M A T T E D ) . In einer L e s e s c h l e i f e w e r d e n K e n n w ö r t e r und L i t e r a t u r s t e l len von der Konsole gelesen und auf die D a t e i ü b e r t r a g e n . Das Ende der D a t e i erhält eine END-FILE-Marke.
7.5 Die Arbeit
mit sequentiellen
Datendateien
(Banddateien)
141
C BILD
100
10 200
20
7 - 1 0 AUSGABE E I N E R S E Q U E N T I E L L E N D A T E I CHARACTER K E N N « 1 2 , T E X T * 7 9 •PEN C10,FILE-'LITUER.DAT',STATUS-'OLD', 1 ACCESS-'SEQUENTIAL',FORM-'UNFORMATTED'3 WRITEC«,100) FORMATC ' AUSGABE DER D A T E I L I T U E R . D A T ' ) REU IND 10 NS - 1 R E A D C 1 0 , E N D - 2 0 ) KENN , TEXT W R I T E C » , 2 0 0 ) NS , KENN , TEXT FORMATC/IX, 13, ' .SATZ: ' / 1 X , A / 1 X , A ) NS - NS + 1 GOTO 1 0 CLOSE £ 1 0 ) STOP END
B>B7-10 AUSGABE
DER
DATEI
LITUER.DAT
1.SATZ: FORTRAN SCHMITT, FORTRAN-KURS, 2.SATZ: FORTRAN IBM, FORTRAN
COMPILER
OLDENBOURG
UERSION
2.00
3. SATZ: FORTRAN SPERRY U N I U A C ,
FORTRAN
ALLGEMEINE
4.SATZ: FORTRAN SPERRY U N I U A C ,
FORTRAN
CASCII)
5.SATZ: ASSEMBLER SCHMITT, MASCHINENORIENTIERTE Stop - Program terminated.
Bild 7-10:
BESCHREIBUNG
LEUEL
10R1
PROGRAMMIERUNG,
OLDENBOURG
Ausgabe einer sequentiellen Datei
Die Datei wird binär ( U M F O R M A T T E D ) gespeichert. Das in Bild 7-10 dargestellte Programm gibt alle Sätze für Kontrollzwecke auf der Konsole aus. Damit ist es möglich, sich z.B. nach Änderungen einen Überblick über den Inhalt der Datei zu verschaffen. Die Leseschleife liest Satz für Satz und überträgt ihn auf die Konsole. Sie wird beim Erreichen der END-FILE-Marke der Datei beendet.
142
C
7 Die Eingabe und Ausgabe von Daten
BILD
1
7 - 1 1 DURCHSUCHEN E I N E R S E Q U E N T I E L L E N DATEI CHARACTER KENN»IE,TEXT»7S,SUCH»IE OPEN C10,FILE-'LITUER.DAT'.STATUS-'OLD', ACCESS-'SEQUENT IAL' ,FORM-'UNFORMATTED') WRITEC»,»)' L I T U E R . D A T NACH K E N N W O E R T E R N D U R C H S U C H E N ' UJRITEC», 1 0 0 5 FGRMATC/1X,'KENNWORT > ' \ ) READC»,SOO,END-40) SUCH FORMATCA) REWIND 1 0 R E A D C 1 0 , E N D - 3 0 ) KENN , T E X T I F C K E N N . N E . S U C H ) GOTO S O U J R I T E C » , 3 0 0 ) KENN , T E X T FORMAT(/IX,A/1X,A) GOTO SO UJRITEC»,400) F O R M A T C / I X , ' » » » * • * E N D E DER D A T E I »»»*»»'/) GOTO 1 0 CLOSE CIO) STOP END
10 100 EOO SO
300 30 400 40
B> B 7 - 1 1 LITUER.DAT KENNUJORT
NACH
KENNWOERTERN
DURCHSUCHEN
> ASSEMBLER
ASSEMBLER SCHMITT, »»»*»»
MASCHINENQRIENTIERTE ENDE
KENNWORT
DER
DATEI
PROGRAMMIERUNG,
OLDENBDURG
*»»**»
> FORTRAN
FORTRAN SCHMITT,
FORTRAN-KURS,
OLDENBOURG
FORTRAN IBM,
FORTRAN
COMPILER
UERSION
5.00
FORTRAN SPERRY
UNIUAC,
FDRTRAN
ALLGEMEINE
UNIUAC,
FORTRAN
(ASCII)
BESCHREIBUNG
FORTRAN SPERRY . . . . . .
E N D E
Bild 7 - 1 1 :
D E R
D A T E I
. . . . . .
LEUEL
10R1
Durchsuchen einer sequentiellen
Datei
D a s in Bild 7 - 1 1 d a r g e s t e l l t e P r o g r a m m w e r t e t d i e D a t e i a u s . Die e r s t e n 12 B y t e s e i n e s D a t e n s a t z e s b e s t e h e n aus e i n e m K e n n w o r t ; in d e m B e i s p i e l sind e s N a m e n von P r o g r a m m i e r s p r a c h e n . D e r B e n u t z e r g i b t ü b e r d i e K o n s o l e e i n K e n n w o r t ein, nach dem alle D a t e n s ä t z e der Datei d u r c h s u c h t und bei Ü b e r e i n s t i m m u n g a u s g e g e b e n w e r d e n . Ist d a s K e n n w o r t n i c h t v o r h a n d e n , so e r s c h e i n t n u r die M e l d u n g " E n d e d e r D a t e i " . Bei j e d e m K e n n w o r t w i r d d i e D a t e i von Anfang bis Ende durchsucht.
7.5 Die Arbeit mit sequentiellen Datendateien (Banddateien)
143
C BILD
7-12 ERWEITERUNG E I N E R S E Q U E N T I E L L E N D A T E I CHARACTER K E N N * 1 2 , T E X T * 7 9 OPEN ClO.FILE-'LITUER.DAT',STATUS-'OLD', 1 A C C E S S - ' SEQUENT I A L ' , F O R M - ' UNFORMATTED ' ) WRITEC»,*) ' LITUER.DAT ERWEITERN' C P O S I T I O N I E R E N AUF DAS ENDE DER D A T E I NS - 0 10 R E A D C 1 0 . E N D - 2 0 ) KENN , T E X T NS - NS + 1 GOTO 1 0 20 BACKSPACE 10 C NEUE S A E T Z E L E S E N UND ANHAENGEN NEU - 0 U l R I T E C * , » D N S , ' S A E T Z E UORHANDEN NEUE E I N G E B E N : ' 30 WRITEC*,100) 100 FORMATC/IX,'KENNWORT >'\) R E A D C * , 2 0 0 , E N D - 4 0 ) KENN 200 FORMAT C A ) WRI TEC * , 3 0 0 ) 300 FORMATC' TEXT >'\) READC*,200,END-40) TEXT WRITEC10) KENN,TEXT NEU - NEU + 1 GOTO 3 0 40 END F I L E 1 0 CLOSE C I O ) WRITEC*,*)NEU,' STOP END B>B7—12 LITUER.DAT
KENNWORT TEXT
TEXT
TEXT
EINGEBEN:
PASCAL-PROGRAMMIERUNG,
OLDENBOURG
>BASIC DAS
GROSSE
BASIC-BUCH,
HEIM
>ASSEMBLER
»SCHMITT,
KENNWORT
DAS
GROSSE
ASSEMBLER-BUCH,
HEIM
>'Z 3
SBt iolpd
NEUE
>PASCAL
> BOLLOW,
KENNWORT
SAETZE'
ERWEITERN 5 S A E T Z E UORHANDEN
>HERSCHEL,
KENNWORT
NEUE
NEUE
SAETZE
7- - 1P2r :o g rE r w e it teerrm u innga teei dn.e r s e q u e n t i e l l e n am
Datei
Das in B i l d 7 - 1 2 d a r g e s t e l l t e P r o g r a m m e r w e i t e r t d i e b e s t e h e n d e D a t e i um neue D a t e n s ä t z e , d i e h i n t e n a n g e h ä n g t w e r d e n . D a b e i wird d i e D a t e i zunächst auf das Ende p o s i t i o n i e r t . Dann w i r d d i e D a t e i m i t e i n e r A n w e i s u n g B A C K SPACE
um
einen
Satz
zurückgesetzt.
Daher
wird
die alte
END-FILE-Marke
durch d i e e r s t e W R I T E - A n w e i s u n g ü b e r s c h r i e b e n . N a c h d e m Ende d e r Eingabe w i r d e i n e neue E N D - F I L E - M a r k e g e s e t z t . D i e Änderung e i n e r s e q u e n t i e l l e n D a t e i b e r e i t e t g e w i s s e S c h w i e r i g k e i t e n . N e u e S ä t z e lassen sich nur an das Ende a n h ä n g e n , nicht a b e r innerhalb d e r D a t e i e i n f ü g e n . N i c h t mehr b e n ö t i g t e S ä t z e lassen sich nicht e n t f e r n e n , sondern w e r d e n m e i s t durch e i n e b e s o n d e r e M a r k e f ü r ungültig e r k l ä r t . B i l d 7 - 1 3 z e i g t e i n B e i s p i e l f ü r die N e u o r g a n i s a t i o n e i n e r s e q u e n t i e l l e n
Datei.
144
7 Die Eingabe und Ausgabe von Daten
C BILD 7 - 1 3 AENDERUNG EINER SEQUENTIELLEN DATEI CHARACTER KENN*12,TEXT*79,ANT*1 •PEN ClO.FILE-'LITUER.DAT',STATUS-'OLD', 1 ACCESS"'SEQUENTIAL',FORM-'UNFORMATTED') OPEN C 50,FILE"'HILF',STATUS-'NEW', 1 ACCESS- 'SEQUENTIAL ' , FORM- ' UNFORMATTED ' ) C KOPIEREN DER ALTEN DATEI NACH HILFSDATEI 10 READC10,END-20) KENN , TEXT UIRITEC50 3 KENN , TEXT NS - NS + 1 GOTO 10 50 REU IND 10 END FILE 20 REWIND 20 WRITEC * , 100) NS 100 F0RMATC1X, 'LITUER.DAT AENDERN ' , 14 , ' SAET2E VORHANDEN'/) NS - 0 C DATEI MIT AENDERUNGEN NEU BESCHREIBEN 30 READC SO,END-50 3 KENN , TEXT NS - NS + 1 WRITEC*,500) NS , KENN , TEXT 500 FDRMATC/1X,14,'.SATZ KENNWORT:',A/IX,A// 1 I X , ' LOESCHEN/AENDERN/KOPIEREN L/A/K > ' \ ) READC*,300) ANT 300 FORMAT CA) IF CANT.EQ.'L') GOTO 30 IF CANT.NE. ' A ' ) GOTO 40 C AENDERUNGEN UON DER KONSOLE EINLESEN WRITE C * , 4 0 0 ) 400 F0RMATC/1X,'NEUES KENNWORT > ' \ ) READC*,300) KENN WRI TEC * , 5 0 0 ) 500 F0RMATC1X,'TEXT > ' \ ) READC*,300) TEXT C SATZ AUF DIE DATEI SCHREIBEN 40 WRITE CIO) KENN , TEXT GOTO 30 C DATEIEN 5CHLIESSEN 50 END FILE 10 CLOSEC10,STATUS-'KEEP') CLOSEC20,STATUS-'DELETE') WRITEC*,*) ' ENDE DER AENDERUNG' STOP END B> B7-13 LITUER.DAT AENDERN
8 SAETZE UORHANDEN
1.SATZ KENNWORT:FORTRAN SCHMITT, FDRTRAN-KURS, OLDENBOURG LOESCHEN/AENDERN/KOPIEREN
L/A/K >A
NEUES KENNWORT > FORTRAN TEXT > SCHMITT, FORTRANSKURS, OLDENBOURG 4.AUFLAGE 5.SATZ KENNWORT:FORTRAN IBM, FORTRAN COMPILER UERSION 5 . 0 0 LOESCHEN/AENDERN/KOPIEREN
L/A/K >
3.SATZ KENNWORT:FORTRAN SPERRY UNIUAC, FORTRAN ALLGEMEINE BESCHREIBUNG
Bild 7 - 1 3 :
Änderung e i n e r s e q u e n t i e l l e n D a t e i
7.6 Die Arbeit mit Datendateien
im direkten
Zugriff
145
Die b e s t e h e n d e Datei wird zunächst in e i n e Hilfsdatei (SCRATCH) kopiert und dann neu b e s c h r i e b e n . Der Benutzer e n t s c h e i d e t für j e d e n Satz im Dialog am Bildschirm, ob der Satz g e l ö s c h t , also nicht ü b e r t r a g e n , g e ä n d e r t oder unverändert kopiert werden soll. Bei großen D a t e i e n wird eine Änderungsdatei a u f g e b a u t , mit d e r e n Hilfe die b e s t e h e n d e Datei ( S t a m m d a t e i ) geändert wird.
7.6 Die Arbeit mit Datendateien im direkten Zugriff M a g n e t p l a t t e n s p e i c h e r und D i s k e t t e n l a u f w e r k e ( F l o p p y - D i s k - L a u f w e r k e i b e s t e hen aus einer r o t i e r e n d e n Scheibe mit einer m a g n e t i s i e r b a r e n O b e r f l ä c h e und einem beweglichen S c h r e i b / L e s e k o p f , der sich auf j e d e Stelle der O b e r f l ä c h e positionieren l ä ß t . Jeder D a t e n s a t z e r h ä l t eine N u m m e r , unter der er gelesen und b e s c h r i e b e n wird. Die Positionierung des Kopfes ü b e r n i m m t das B e t r i e b s s y s t e m . Bild 7 - 1 4 zeigt den Aufbau eines P l a t t e n - bzw. D i s k e t t e n s p e i c h e r s .
Bild 7 - 1 4 :
Aufbau eines P l a t t e n - oder D i s k e t t e n s p e i c h e r s
Der Zugriff zu den D a t e n s ä t z e n einer D i r e k t z u g r i f f s d a t e i e r f o l g t durch die Angabe einer S a t z n u m m e r von 1 bis zu einem b e s t i m m t e n E n d w e r t . Beim A u f bau einer neuen D a t e i sollten zuerst alle D a t e n s ä t z e beschrieben werden, um die Größe der D a t e i f e s t z u l e g e n . Bei der n a c h f o l g e n d e n Adressierung der D a t e n s ä t z e ist darauf zu a c h t e n , daß die S a t z n u m m e r innerhalb dieses Bereiches bleibt.
146
7 Die Eingabe und Ausgabe von Daten
C DI REKT-ZLJGRI FFS-DATE I B7-DIRE •PEN C I O , F I L E ™ ' T E S T ' , S T A T U S - ' N E U ' , 1 ACCESS-'DIRECT', FORM-'UNFORMATTED',RECL-43 ISEK - 0 10 READC * , * 3 WERT IF CUERT.EO.0.03 GOTO 20 ISEK - ISEK + 1 URITEC10,REC-ISEK 3 WERT GOTO 10 EO UJRITEC«,*:)' S A T Z - N R : ' READC»,«,END=303 NSAT I F C N S A T . L T . l .OR. NSAT.GT.I SEK 3 GOTO 20 READ C10,REC=NSAT3 WERT UJRITEC», » 3 ' SATZ: ' , N S A T , ' UERT : ' , UERT GOTO EO 30 CLOSE CIO,STATUS-'DELETE ' 3 STOP END B> TEST 10
EO 30 40 50 60 70 BO 30 100 0 SATZ-NR: 6 SATZ: SATZ-NR: 8 SATZ: SATZ-NR: 1 SATZ: SATZ-NR: 0 SATZ-NR: 3 SATZ: SATZ-NR: "Z S t o p - Program
S UERT:
60.0000000
8 UERT:
80.0000000
1 UERT:
10.0000000
3 UERT:
30.0000000
terminated.
Das f o l g e n d e Beispiel z e i g t d i e A r b e i t mit einer D a t e i im d i r e k t e n Z u g r i f f . Es w e r d e n nacheinander W e r t e g e l e s e n und auf d i e D a t e i ü b e r t r a g e n . D i e Z ä h l v a r i a b l e ISEK enthält d a b e i die S a t z n u m m e r . D i e D a t e i wird f o r t l a u f e n d w i e e i n e s e q u e n t i e l l e D a t e i b e s c h r i e b e n . D e r W e r t Null b r i c h t d i e E i n g a b e s c h l e i f e a b . In d e r d a r a u f f o l g e n d e n S c h l e i f e w e r d e n S a t z - N u m m e r n g e l e s e n und zur A d r e s s i e r u n g der D a t e n s ä t z e v e r w e n d e t . D i e Sätze können in b e l i e b i g e r R e i h e n f o l g e g e l e s e n und a u s g e g e b e n w e r d e n . D i e D a t e i wird im d i r e k t e n D a t e n z u g r i f f g e l e s e n . Dabei muß s i c h e r g e s t e l l t w e r d e n , daß nur S ä t z e g e l e s e n w e r d e n , die vorher auch b e s c h r i e b e n w u r d e n .
7.6 Die Arbeit mit Datendateien
im direkten
Zugriff
147
C BILD 7-15 AUFBAU EINER •IREKT-ZUGRIFFS-DATEI CHARACTER TYP*B NS = 1000 OPEN ClO.FILE-'LAGER.DAT',STATUS»'NEU', 1 ACCESS ='DIRECT',FORM-'UNFORMATTED',RECL"12) LBEST=0 TYP-' •D 10 I - 1,NS URITEC10,REC=I) TYP , LBEST 10 CONTINUE URITEC*,100) 100 FQRMATC/1X, 'SATZNUMHER TYP UND BESTAND EINGEBEN') 20 URITEC*,200) 200 FORffATC/lX, ' SATZNUtlMER > ' \ ) READC*,*,END-30) NR IFCNR.LT.l .OR. NR.GT.NS) GOTO 20 URITEC*,300) 300 FDRMATCIX,'TYP > ' \ ) READC *,400, END-30) TYP 400 FORflAT CA) URITEC*,500) 500 F0RMATC1X,'BESTAND > ' \ ) READC*,*,END-30) LBEST URITEC10,REC=NR) TYP , LBEST GOTO 20 30 CLOSE CIO) STOP END B> B7-15 SATZNUmER
TYP
UND BESTAND EINGEBEN
SATZNUMMER >1 TYP >7401 BESTAND >1 SATZNUnMER >10 TYP >7410 BESTAND >10 SATZNUMMER >100 TYP >74100 BESTAND >100 Bild 7-15:
Aufbau einer Direktzugriffsdatei
Als Anwendungsbeispiel für eine Direktzugriffsdatei b e t r a c h t e n wir eine Lagerliste bestehend aus 1000 Datensätzen mit den Satznummern von 1 bis 1000. Jeder Datensatz enthält in 8 Bytes den Typ eines Bauteils und in 4 Bytes den Lagerbestand. Das Programmbeispiel Bild 7 - 1 5 e r ö f f n e t die Datei LAGER.DAT als u n f o r m a t i e r t e Direktzugriffsdatei mit der Satzlänge von 12 Bytes. In einer Schleife werden zunächst alle 1000 Datensätze mit Leerzeichen für den Typ und dem Wert Null für den Lagerbestand beschrieben. Durch die DOSchleife werden wie bei einer sequentiellen Datei alle Sätze nacheinander adressiert. Dann werden im Dialog über die Konsole b e s t i m m t e Datensätze, deren Satznummer einzugeben ist, mit einem Bauteiltyp und einem L a g e r b e stand beschrieben. Dabei wird nicht g e p r ü f t , ob der Satz b e r e i t s belegt ist. Die Auswahl (Adressierung) der Sätze geschieht durch die Satznummer. Das
148
7 Die Eingabe
und Ausgabe
von
Daten
C BILD
7-16 AUSGABE E I N E R D I R E K T Z U G R I F F S D A T E I CHARACTER T Y P * 8 NS 1000 OPEN C I O , F I L E - ' L A G E R . D A T ' . S T A T U S -'OLD', 1 ACCESS-'DIRECT',FORM-'UNFORMATTED'.RECL-123 URITEC*, 100) F 0 R M A T C / 1 X , ' D A T E I LAGER.DAT AUSGABE N I C H T L E E R E R S A E T 2 E ' / 3 NSATZ = 0 DO 1 0 I - 1 , N S R E A D C 1 0 , R E C - I 3 TYP , LBEST IF CTYP.NE.' 'J THEN U R I T E C * , 2 0 0 3 I , TYP , L B E S T T Y P : ' , A , ' BESTAND: ' , I B 3 FORMATCIX, 'NR : ' , 1 4 , ' NSATZ - NSATZ + 1 END I F CONTINUE U R I T E C » , 3 0 0 3 NSATZ F D R Ì 1 A T C / 1 X , 1 4 , ' N I C H T L E E R E SAETZE ' / 3 CLOSE C 1 0 3 STOP END
100
200
10 300
B>B7-16 DATEI
LAGER.DAT
AUSGABE NICHTLEERER
NR 1 TYP:7401 NR 10 T Y P : 7 4 1 0 NR 100 TYP:74100 NR 1 0 0 0 T Y P : 7 4 1 0 0 0 4 NICHTLEERE Stop
-
Program
Bild 7 - 1 6 :
BESTAND BESTAND BESTAND BESTAND
SAETZE
1 10 100 1000
SAETZE terminated.
Ausgabe e i n e r D i t e k t z u g r i f f s d a t e i
P r o g r a m m b e i s p i e l Bild 7 - 1 6 gibt zur K o n t r o l l e alle nicht l e e r e n S ä t z e auf der Konsole a u s . Diese L i s t e zeigt den Z u s a m m e n h a n g zwischen der S a t z a d r e s s e und d e m B a u s t e i n t y p und gibt an, welche S a t z n u m m e r n b e l e g t sind. Für d i e A d r e s s i e r u n g der D a t e n s ä t z e gibt e s zwei V e r f a h r e n . Ist die S a t z n u m m e r b e k a n n t , so kann m a n ohne zu suchen d i r e k t auf den D a t e n s a t z z u g r e i f e n . Ist nur d e r Typ d e s B a u t e i l s b e k a n n t , so muß die D a t e i wie e i n e s e q u e n t i e l l e D a t e i von A n f a n g a n d u r c h s u c h t w e r d e n . Bild 7 - 1 7 zeigt d e n Direktzugriff über d i e S a t z n u m m e r . Das P r o g r a m m d i e n t d a z u , d e n L a g e r b e s t a n d auf den n e u e s t e n Stand zu b r i n g e n . L e e r e Sätze können n i c h t v e r ä n d e r t w e r d e n . Das P r o g r a m m e r l a u b t d i e Eingabe eines n e u e n W e r t e s (=) sowie die Erhöhung (+) und die V e r m i n d e r u n g ( - ) des b e s t e h e n d e n W e r t e s . Wird keines der d r e i Z e i c h e n e i n g e g e b e n , so bleibt der B e s t a n d e r h a l t e n . Bild 7 - 1 8 zeigt das D u r c h s u c h e n der D a t e i , wenn nur der Bauteiltyp bekannt ist.
7.6 Die Arbeit mit Datendateien im direkten Zugriff
C BILD 7 - 1 7 AENDERUNG EINER DIREKTZUGRIFFSDATEI CHARACTER TYP*B, ANT*1 NS - 1000 • PEN ClO.FILE-'LAGER.DAT',STATUS- ' OLD ' , 1 ACCESS- 'DIRECT ' , FORM = ' UNFORMATTED ' , RECL-12) UIRITEC», 100) NS 100 F0RMATC/1X, 'LAGER.DAT SATZNUMMER UON 1 BIS' , 145 C LESEN DER SATZNUMMERN UON OER KONSOLE 10 URITEC*,200) 200 F0RMATC/1X,'SATZNUMMER > ' \) READC»,«,END-20) NR IFCNR.LT.l .OR. NR.GT.NS) THEN WRITEC»,»)' NUMMER AUSSERHALB DES BEREICHES' ELSE READC10,REC-NR) TYP , LBEST IF C TYP.ED. ' ' ) THEN UIRITE C * , * ) ' SATZ LEER' ELSE UJRITEC*, 300) NR , TYP , LBEST 300 F0RMATC1X,'NR:',14,' T Y P : ' , A , ' BESTAND:',IB/ 1 IX,'NEUC/ZUGANGC+)/ABGANGC-) -/+/- >'\) READC * , 4 0 0 ) ANT,NBEST 400 FORMAT CA, IB 3 IFCANT.EQ.'-') LBEST - NBEST IFCANT.EO.'+') LBEST - LBEST + NBEST IFCANT.EQ.'-') LBEST - LBEST - NBEST URITEC10,REC-NR) TYP , LBEST WRITEC*,») ' NEUER BESTAND:', LBEST END IF END IF GOTO 10 20 CLOSE CIO) STOP END B> B7-17 LAGER.DAT SATZNUMMER UON 1 BIS1000 SATZNUMMER >1 NR: 1 TYP:7401 BESTAND: NEUC=)/ZUGANGC+)/ABGANGC-3 -/+/NEUER BESTAND: 2
1 >+1
SATZNUMMER >2 SATZ LEER SATZNUMMER >10 NR: 10 TYP:7410 BESTAND: NEUC-)/ZUGANGC+)/ABGANGC-) -/+/NEUER BESTAND: 11
10 >-11
SATZNUMMER >1000 NR:1000 TYP:741000 BESTAND: 1000 NEUC =0 /ZUGANGC -O/ABGANGC-) - / + / - > - 1 0 0 NEUER BESTAND: 300 SATZNUMMER >~Z Stop - Program t e r m i n a t e d .
Bild 7 - 1 7 :
Ä n d e r u n g im d i r e k t e n Z u g r i f f
149
150
7 Die Eingabe und Ausgabe von Daten
C BILD 7—1B DURCHSUCHEN EINER DIREKTZUGRIFFSDATEI CHARACTER TYP*8,TYPNEU*B,ANT*1 NS - 1000 OPENC 10,FILE-' LAGER . DAT ' , STATUS- ' OLD ' , 1 ACCESS-'DIRECT',FORM-'UNFORMATTED',RECL-15 3 WRITEC *,1003 100 F0RMATC/1X,'LAGER.DAT NACH BAUTEILEN DURCHSUCHEN'3 10 URITEC»,BOO) 500 F0RMATC/1X,'TYP > ' \ 3 READC*,300,END-503 TYPNEU 300 FORMATCA3 NTYP - 0 DO 50 I - 1,NS READ CIO,REC-I3 TYP,LBEST IF C TYP.EQ.TYPNEU3 THEN URITEC»,4003 I , TYP , LBEST 400 F0RMATC/1X, 'NR-' , 15, ' TYP:',A,' BESTAND-', 1103 NTYP - NTYP + 1 LIRITEC* , 5003 500 F0RMATC/1X,'TYP AENDERN ? J/N > ' \ 3 READC*,3003 ANT IF CANT.EQ.'J'3 THEN URITEC*,5003 READC*,3003 TYPNEU URITEC*,6003 500 FDRMATC1X,'BESTAND > ' \ 3 READC*,*3 LBEST URITEC10,REC=I3 TYPNEU,LBEST END IF END IF 2£> CONTINUE IF C NTYP . ED.0 3 THEN URITEC*,7003 700 F0RMATC1X,'TYP NEU AUFNEHMEN ? J/N > ' \ 3 READC*,3003 ANT IF CANT.EQ.'J'3 THEN 30 URITEC*,8003 BOO FORMATCIX,'SATZ-NR >'Ü3 READC*,*3 NR IF CNR.LT.1 .OR. NR.GT.NS3 GOTO 30 URITEC*,5003 READC*,*3 LBEST URITEC10,REC-NR3 TYPNEU , LBEST END IF END IF GOTO 10 50 CLOSE C10 3 STDP END B> B7-1B LAGER.DAT NACH BAUTEILEN DURCHSUCHEN TYP >7410 NR-
10 TYP: 7410
BESTAND-
TYP AENDERN ? J/N >N TYP >7416
Bild 7 - 1 8 :
Änderung durch Suchen
11
7. 7 Die Arbeit mit internen Dateien im
Arbeitsspeicher
151
Nach Eingabe des Typs wird die Datei beginnend mit dem ersten Satz f o r t laufend durchsucht. Für den Fall, daß ein Bauteil mehrfach in der Datei enthalten ist, wird die Suche auch nach dem A u f f i n d e n des Typs bis zum Ende der Datei f o r t g e s e t z t . Wird das Bauteil gefunden, so können sowohl der T y p als auch der Bestand verändert werden. Wird es nicht gefunden, so kann es in die Datei aufgenommen werden. Dabei prüft das Programm nicht, ob der Satz bereits belegt ist. Die beiden Programme Bild 7-17 und Bild 7-18 zeigten bei Testläufen an einem Arbeitsplatzrechner deutliche Unterschiede in der Z u g r i f f s z e i t besonders auf Datensätze am Ende der Datei. Bei einigen Betriebssystemen besteht die M ö g lichkeit, T e i l e des Arbeitsspeichers als Diskette zu benutzen ( R A M - D i s k oder virtuelle D i s k e t t e ) . Mit H i l f e des Betriebssystems wird die Datendatei in einen besonders definierten Speicherbereich kopiert und dort mit den gleichen B e f e h len wie für echte externe Dateien im sequentiellen oder direkten Z u g r i f f b e a r b e i t e t . Da die mechanischen Einstellzeiten für den Schreib/Lesekopf und die Wartezeiten für die Bewegung der Magnetscheibe entfallen, laufen die Prog r a m m e wesentlich schneller ab. Bild 7-20 zeigt die Möglichkeit, die Datei in ein Feld zu kopieren und damit ebenfalls im Arbeitsspeicher zu verarbeiten.
7.7 Die Arbeit mit internen Dateien im Arbeitsspeicher C BILD 7-19 PROGRAMMBEISPIEL INTERNE DATEI in ARBEITSSPEICHER CHARACTER ZEILE*B0 10 UIR I TE ( * , * 3 'ZEILE MIT CI3.F10.3) EINGEBEN' READC *,100,END = 20 3 ZEILE 100 FORMAT C A 3 READCZEILE,200)1,X 200 FORMATC13,F10.33 WRITEC»,«) I , X GOTO 10 20 STOP END B> TEST ZEILE MIT CI3.F10.33 1 1.0 100 ZEILE MIT CI3.F10.33 1 2.0 10 ZEILE MIT CI3.F10.33 1 1.5 1 ZEILE MIT CI3.F10.3)
EINGEBEN 1.0000000 EINGEBEN 2.0000000 EINGEBEN 1.5000000 EINGEBEN
Stop - Program terminated. Bild 7-19:
Programmbeispiel für eine " i n t e r n e " Datei
Für besondere Aufgaben der Textverarbeitung ist es möglich, die Daten nicht von einer D a t e i , sondern aus einer Zeichenvariablen ( T y p C H A R A C T E R ) des Arbeitsspeichers zu lesen bzw. nicht in eine Datei, sondern in eine Zeichenvariable zu schreiben. Die R E A D - bzw. WRITE-Anweisung erhält anstelle einer Dateinummer den Namen einer Text variablen. Diese "internen" Dateien können
152
7 Die Eingabe und Ausgabe von Daten
nur sequentiell und f o r m a t i e r t wie z.B. die Konsole oder eine zeilenorientierte Datei behandelt werden. Bild 7-19 zeigt als Beispiel die " i n t e r n e " Datei Z E I L E , die aus 80 Zeichen besteht. Sie wird zunächst als Textvariable über die Konsole eingegeben. In der folgenden R E A D - A n w e i s u n g erscheint sie anstelle einer Dateinummer als " i n t e r n e " Datei und wird im Format (I3,F10.3) in Zahlen umgewandelt. Auf diese Art und Weise ist es möglich, Eingaben von der K o n sole mit verschiedenen F o r m a t e n auszuwerten oder vor der Umwandlung besondere Kontrollen durchzuführen. Die Programmbeispiele Bild 7-17 und Bild 7-18 haben g e z e i g t , daß besonders bei sequentiellem Zugriff erhebliche Verarbeitungszeiten a u f t r e t e n können. Bild 7-20 zeigt die Möglichkeit, eine Datei zunächst in ein Feld zu lesen und dann im Arbeitsspeicher zu durchsuchen. Da in F O R T R A N ein Feld nur aus Größen eines Typs bestehen d a r f , mußte je ein Feld für die Bauteilbezeichnungen und für die Lagermengen dimensioniert werden. Im Gegensatz zum Suchprogramm Bild 7-18 werden nur Bauteile gesucht. Sollten auch Änderungen durchgeführt werden, so müßten die Felder anschließend wieder auf die D i r e k t z u g r i f f s d a t e i zurückgeschrieben werden. Bei einem Testlauf mit einem A r b e i t s platzrechner traten keine merkbaren Verarbeitungszeiten mehr auf.
C BILD 7-20 DATEI in ARBEITSSPEICHER DURCHSUCHEN CHARACTER TYP»B CHARACTER'S DATE IC1000) DIMENS! ON LBESTC 1000) NS - 1000 OPENC10,FILE-'LAGER.DAT',STATUS-'OLD', 1 ACCESS-'DIRECT',FORM-'UNFORMATTED',RECL=12) URITEC*,100) 100 F0RMATC/1X,'DATEI LAGER.DAT SUCHEN UON BAUTEILEN') C DATEI IN DEN ARBEITSSPEICHER KOPIEREN DG 10 I - 1,NS READ CIO,REC-I) DATE I C I ) , LBESTCI) 10 CONTINUE C DATEI IM ARBEITSSPEICHER DURCHSUCHEN 20 URITEC»,200) 200 F0RMATC/1X,'TYP > ' \ ) READC *,300,END=50) TYP 300 FORMAT CA) DO 30 I = 1,NS IF CTYP.ED.DATEICI)) THEN URITEC»,400) I , TYP , LBESTCI) 400 FGRMATC/1X,'NR-',15,' T Y P : ' , A , ' BESTAND-',I10) END IF 30 CONTINUE GOTO 20 50 CLOSE CIO) STOP END B> TEST DATEI LAGER.DAT SUCHEN UQN BAUTEILEN TYP >7416 NR-
IB TYP:741B
Bild 7-20:
BESTAND-
IB
Durchsuchen einer " D a t e i " im Arbeitsspeicher
7.8 Übungen zum Abschnitt
Ein/Ausgabe
von Daten
153
7.8 Übungen zum Abschnitt Ein/Ausgabe von Daten Der A b s c h n i t t 11 e n t h ä l t f ü r a l l e A u f g a b e n L ö s u n g s v o r s c h l ä g e ! 1. A u f g a b e : Es ist das f o l g e n d e Schaltbild auf d e r Konsole auszugeben:
* * * ] * * * * * * * *
* * *
* * * * * * *
* * * * * * * *
*
*
*
*
* * * * * * * * * * * * * *
2. A u f g a b e : Es ist f o l g e n d e W u r z e l t a b e l l e auf der Konsole auszugeben:
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
1
** * * *X* * *! * *5.WURZEL ********* * * * * * * * * * *
1 2 3 4 5 6 -7 B 9 10
1 1 X 1 2 2 2 2 2 3 3
OOOO 4142 7321 0000 2361 4495 645B 82B4 0000 1623
3 .WURZEL 1 1 1 1 1 1 1 2 2 2
OOOO 2599 4422 5874 7100 8171 9129 0000 0801 1544
! 4 . WURZEL ! 1 1 1 1 1 1 1 1 1 1
0000 1B92 3161 4142 4953 5651 6266 6B1B 7321 77B3
5 . WURZEL * 1 1 1 1 1 1 1 1 1 1
OOOO 14B7 2457 3195 .3797 4310 475B 5157 551B 5B49
* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
3. A u f g a b e : Man s p e i c h e r e die Zahlen von 1 bis 100 in e i n e r s e q u e n t i e l l e n D a t e i und bilde ihre S u m m e d u r c h L e s e n d e r D a t e n s ä t z e .
4. A u f g a b e : Man s p e i c h e r e die Zahlen von 1 bis 100 in e i n e r D i r e k t z u g r i f f s d a t e i und bilde ihre S u m m e d u r c h L e s e n d e r D a t e n s ä t z e .
8 Datentypen Entsprechend dem Standard FORTRAN 77 gibt es die folgenden Datentypen: INTEGER für ganze Zahlen, REAL für reelle Zahlen normaler Genauigkeit, DOUBLE PRECISION für reelle Zahlen erhöhter Genauigkeit, COMPLEX für komplexe reelle Zahlen normaler Genauigkeit, LOGICAL für logische Größen und CHARACTER für Zeichen (Buchstaben, Ziffern und Sonderzeichen). Für die Größen (Konstanten und Variablen) jedes Datentyps wird eine b e s t i m m te Anzahl von Bytes im Arbeitsspeicher frei gehalten; sie ist abhängig vom Rechenwerk der b e t r e f f e n d e n Anlage. Änderungen der standardmäßigen Werte mit Hilfe der Typvereinbarungen sind nur beschränkt möglich. Näheres erfahren Sie aus den Handbüchern Ihrer Rechenanlage.
8.1 Allgemeines In einigen mathematisch orientierten Programmiersprachen (ALGOL, PASCAL) ist es notwendig, für alle Variablen einen Typ festzulegen. Im Gegensatz dazu kennt FORTRAN die Namensregel, die jeder Variablen anhand des ersten Buchstabens automatisch (implizit) den Typ REAL oder INTEGER zuweist.
INTEGER: Anfangsbuchstaben I , J , K , L , M und N REAL: Anfangsbuchstaben A bis H oder
0 bis Z
Mit der Typvereinbarung IMPLICIT ist es möglich, entgegen der Namensregel bestimmte Buchstaben oder Buchstabenbereiche einem der sechs Datentypen zuzuordnen.
IMPLICIT Typ*s ( Buchstaben liste ) ,
Die Listen enthalten Buchstaben oder Bereiche von Buchstaben. Als Typ ist einer der sechs Datentypen zu verwenden. Zusätzlich kann die Speicherlänge s in der Einheit Bytes festgelegt werden. Die IMPLICIT-Vereinbarung hebt die Namensregel auf. Beispiele: IMPLICIT INTEGER (A-C) , REAL (I) , LOGICAL (L) IMPLICIT CHARACTER*80 (Z)
8.1
Allgemeines
155
Alle V a r i a b l e n , die mit den B u c h s t a b e n A, B und C beginnen, sollen vom Typ INTEGER sein. Alle V a r i a b l e n mit dem A n f a n g s b u c h s t a b e n I seien REAL, alle mit dem A n f a n g s b u c h s t a b e n L seien vom Typ LOGICAL. Da keine besondere Speicherlänge f e s t g e l e g t wurde, g e l t e n die s t a n d a r d m ä ß i g e n W e r t e der b e t r e f f e n d e n R e c h e n a n l a g e . Alle V a r i a b l e n mit dem A n f a n g s b u c h s t a b e n Z e n t h a l t e n Z e i c h e n k e t t e n (Strings) der Länge 80 Bytes (80 Z e i c h e n ) . Wird der Name einer V a r i a b l e n in einer expliziten (ausdrücklichen) Typvereinbarung g e n a n n t , so werden sowohl die N a m e n s r e g e l als a u c h eine IMPLICITVereinbarung für den A n f a n g s b u c h s t a b e n a u f g e h o b e n .
Typ*s Variablenliste
Als Typ ist einer der sechs D a t e n t y p e n zu verwenden. Zusätzlich kann die Speic h e r l ä n g e s in der Einheit Bytes f e s t g e l e g t w e r d e n . Beispiele: REAL I , KAPPA , LAENGE INTEGER*4 ZA , ZE , ZS CHARACTER*80 ZEILE Die Variablen I, KAPPA und LAENGE sollen e n t g e g e n der N a m e n s r e g e l REAL sein mit der s t a n d a r d m ä ß i g e n Länge. Die I N T E G E R - V a r i a b l e n ZA, ZE und ZS sollen in der Länge von 4 Bytes a n g e l e g t werden. Die Zeichenvariable ZEILE soll aus 80 Zeichen b e s t e h e n . Die explizite Typvereinbarung kann gleichzeitig dazu d i e n e n , a n s t e l l e einer DIMENSION-Vereinbarung ein Feld zu d i m e n s i o n i e ren und Variablen einen k o n s t a n t e n A n f a n g s w e r t zuzuweisen. Dies kann auch mit Hilfe der DATA-Vereinbarung g e s c h e h e n .
DATA
Variablenliste / Konstanten liste /
, ...
In den Listen werden die Variablen bzw. Konstanten durch ein Komma g e t r e n n t . Die E l e m e n t e müssen in Anzahl und Typ ü b e r e i n s t i m m e n . Die folgenden Beispiele zeigen die Zuweisung von A n f a n g s w e r t e n zur Übersetzungszeit durch eine Typvereinbarung bzw. e i n e D A T A - V e r e i n b a r u n g . DATA PI/3.1415927/ DATA A,B,C/1.0,2.0,3.0/ REAL KAPPA /56.0/ Bei F e l d e r n wird nur der N a m e des F e l d e s angegeben. Die K o n s t a n t e n l i s t e e n t hält A n f a n g s w e r t e . DIMENSION A(4) DATA A/0. , 0. , 0. , 0./
156
8
Datentypen
Sind alle K o n s t a n t e n gleich, so können sie mit einem Wiederholungsfaktor z u sammengefaßt werden. DIMENSION A(4) DATA A/4*0.0/ Die folgenden Beispiele zeigen die Feldvereinbarung und Zuweisung von A n f a n g s w e r t e n durch e i n e explizite Typvereinbarung. INTEGER EVA(100) REAL K(10)/10*1.5/ Mit Hilfe d e r EQUIVALENCE-Vereinbarung ist es möglich, einen Speicherplatz u n t e r verschiedenen N a m e n anzusprechen oder a n d e r s a u s g e d r ü c k t , m e h r e r e Variablen auf einem S p e i c h e r p l a t z anzuordnen.
EQUIVALENCE ( Variablenliste ) , ...
Alle in der V a r i a b l e n l i s t e g e n a n n t e n Variablen liegen auf d e m s e l b e n S p e i c h e r p l a t z . Wird nur eine V a r i a b l e g e ä n d e r t , so ändern sich auch alle a n d e r e n . Beispiel: EQUIVALENCE (ADAM.BERTA,CESAR) Wird ein E l e m e n t e i n e s F e l d e s in der V a r i a b l e n l i s t e e i n e r EQUIVALENCEVereinbarung g e n a n n t , so wird das ganze Feld e n t s p r e c h e n d a n g e o r d n e t .
8.2 Größen vom Typ DOUBLE PRECISION Wenn die Genauigkeit und der Zahlenumfang von R E A L - G r ö ß e n (z.B. sechs Dezimalstellen und 1 0 - 5 8 ) nicht ausreichen, so müssen DOUBLE PRECISIONGrößen v e r w e n d e t w e r d e n , die z.B. mit 15 Dezimalstellen in einem Z a h l e n b e reich von 10 - 3 0 8 a r b e i t e n . Jedoch steigen dabei der Speicherbedarf und die Rechenzeit an. Für d i e s e Größen sind Typvereinbarungen e r f o r d e r l i c h . Beispiele: IMPLIC IT DOUBLE PRECISION (D) DOUBLE PRECISION PI, ERG K o n s t a n t e n vom Typ DOUBLE PRECISION sind mit einem Z e h n e r e x p o n e n t e n anzugeben; der Exponent muß mit dem K e n n b u c h s t a b e n D beginnen. Beispiel: PI = 3.141592653589793D0 ERG = 1.5D40 Gibt man die K o n s t a n t e in der REAL-Schreibweise a n , so können Umwandlungsf e h l e r e n t s t e h e n . In dem folgenden Beispiel wurde die K o n s t a n t e 0.1 einmal als R E A L - und dann als DOUBLE PRECISION-Konstante a n g e g e b e n .
8.2 Größen von Typ DOUBLE
100
DOUBLE PRECISION A , B A = 0.1 B = 0.1 DO WRITE(*,100) A , B F0RMAT(1X, 1 A=',D22.5,' STOP END
PRECISION
157
B=1 ,022.5)
Bei einen Testlauf auf einem A r b e i t s p l a t z r e c h n e r e r s c h i e n : A= .100000001490116D+00
B= .1000000000000000D+00
Der endliche Dezimalbruch 0.1 ergibt bei der Umwandlung in eine Dualzahl einen unendlichen Dualbruch, der e n t s p r e c h e n d der Stellenzahl des D a t e n t y p s a b g e b r o c h e n werden muß. Bei dem u n t e r s u c h t e n Rechner wurde wahrscheinlich die Zahl 0.1 zunächst in eine Dualzahl vom Typ REAL u m g e f o r m t und dann anschließend auf die doppelt genaue Darstellung e r w e i t e r t . Die K o n s t a n t e 0.1D0 d a g e g e n wurde s o f o r t in eine doppelt genaue Größe u m g e w a n d e l t . Für die Eingabe und Ausgabe von DOUBLE PRECISION-Zahlen dient der Kennb u c h s t a b e D im F o r m a t . Die a l l g e m e i n e Form l a u t e t Dw.d . Dabei ist w die Anzahl der Spalten, und d gibt die Zahl der Stellen hinter dem Dezimalpunkt an. Die Ausgabe e r f o l g t wie beim E - F o r m a t in der M a n t i s s e - E x p o n e n t - D a r s t e l l u n g , jedoch ist der Exponent d r e i s t e l l i g . Beispiel einer Ausgabe in 22 Stellen mit 15 Stellen h i n t e r dem Dezimalpunkt:
100
WRITE(*,100) PI F0RMAT(1X,D22.15)
V e r w e n d e t man a n s t e l l e des F o r m a t e s Dw.d die F o r m a t e Fw.d oder Ew.d , so e r f o l g t die Umwandlung nur mit der f ü r R E A L - G r ö ß e n üblichen Genauigkeit. Die Umwandlungsfunktion DBLE verwandelt eine R E A L - G r ö ß e in eine Größe vom Typ DOUBLE PRECISION; u m g e k e h r t m a c h t die Funktion SNGL aus einer G r ö ß e vom Typ DOUBLE PRECISION eine R E A L - G r ö ß e . Beispiel: DOUBLE PRECISION X A = 1.0 X = DBLE (A) + 1.5D0 B = SNGL (X) Sollen S t a n d a r d f u n k t i o n e n (z.B. SQRT, SIN) für Größen vom Typ DOUBLE PRECISION verwendet werden, so ist der K e n n b u c h s t a b e D vor den Namen der S t a n d a r d f u n k t i o n zu s e t z e n . Beispiel: DOUBLE PRECISION X , Y , Z X = DSQRT(2.D0) Y = DSIN(X) Das in Bild 8 - 1 d a r g e s t e l l t e Beispiel zeigt die Berechnung der F a k u l t ä t e n von 1! bis 100! und der Zahl PI mit 15 Stellen G e n a u i g k e i t . Durch den S k a l e n f a k t o r 1P e r s c h e i n t i m m e r eine Stelle vor dem Dezimalpunkt.
8
158
Datentypen
C BILD B - l PROGRAMtlBEI SP I EL DOUBLE PRECI5I0N DOUBLE PRECISION DFAKT , PI DFAKT = 1.ODO DO 10 I - 1 , 1 0 0 DFAKT - DFAKT * DBLE CFLOAT CI)) WRITEC*,100) I , DFAKT 100 FORMATCIX,13,'! - ' , 1 P D 2 2 . 1 5 ) 10 CONTINUE PI - DAS I N ( 1 .ODO ) » E.ODO WRITEC*,200) PI 200 FORMATC//1X, ' PI ~ ' , 1 P D 2 2 . 1 5 ) STOP END B> TEST 1! 2! 3! 4! 5! B! 7! B! = 9! 10! 11! " 71 !
72! 73! 74! 75! 7B! 77! 7B! 79! BO! Bl! B2! B3! 84! B5! BB! B7! BB! 83! 90! 91! 92! 93' 94! 95! 96! 97! 98! 99! 100!
=
= = = = = = = = = = = = = = = = =
1.OOOOOOOOOOOOOOOD+OO 2.OOOOOOOOOOOOOOOD+OO 6.OOOOOOOOOOOOOOOD+OO 2.400000000000000D+01 1.200000000000000D+02 7.200000000000000D+02 5.040000000000000D+03 4.032000000000000D+04 3.52B800000000000D+05 3.62BBOOO0O0OO00OD+O6 3.99I6BOOOOOOOOOOD+O7 4.790016000000000D+08 ^"'n20BOOOOOOOOD + OS ^^n00000D + 10 6.123li— -nn+12 4 .470115461Si[_w 3.307BB5441519386+1U, 2.4B0914081139539+109 1.BB5494701555050+111 1.451B309202B2B58+113 1.13242B117B20B29+115 B.94B1B21307B2973+11B 7.155945704526378+118 5.7971250207473SG+120 4.753543337012840+122 3.945523969720557+124 3.314240134565352+126 2.817104114380549+128 2.42270953B367272+130 2.10775729B379527+132 1.B54B264225739B4+134 1.650795516090845+136 1.4B57159644B1761+13B 1.352001527678402+140 1.243841405464130+142 1.1567725070B1541+144 1.087366156656742+146 1.032997B4B823905+14B 9.916779348709491+149 9.619275958248206+151 9.426B9044BB83242+153 9.332621544394410+155 9.332621544394410+157
PI = 3.141592653589793D+00 St Dp - Program terminated. Bild 8 - 1 :
Programmbeispiel für doppelt genaue Rechnung
8.3 Größen vom Typ
COMPLEX
159
8.3 Größen vom Typ COMPLEX Die Größen vom Typ COMPLEX d i e s e s A b s c h n i t t s sind in der Compiler Version 2.0 nicht v e r f ü g b a r . Bild 8 - 4 zeigt ein U n t e r p r o g r a m m , das die komplexe R e c h nung auf R E A L - G r ö ß e n z u r ü c k f ü h r t . Es wird in den H a u p t p r o g r a m m e n Bild 8 - 5 und 8 - 6 a u f g e r u f e n und kann zur Lösung der Ü b u n g s a u f g a b e n 8.6 A u f g a b e 1 und 9.4 A u f g a b e 12 v e r w e n d e t w e r d e n .
Exponentialdarstellung
Komponentendarstellung
Im
36.9°
Re i
1
2
3
-1
-2
Z=a+j b
Bild 8 - 2 :
a = r cosi| b = r • sinq
Z = r e>'
T E S T
F
F
F
T
F
T
F
F
T
T
S t o p
F
T -
P r o g r a m
t e r m i n a t e d .
8.4 Größen vom Typ LOGICAL
169
L o g i s c h e G r ö ß e n können a u c h zur B e r e c h n u n g von logischen S c h a l t u n g e n d i e n e n , j e d o c h zeigen sich bei d e r p r a k t i s c h e n Anwendung einige N a c h t e i l e : die Ein/ A u s g a b e mit d e n B u c h s t a b e n T und F sowie die Bezeichnung d e r K o n s t a n t e n mit . T R U E . und .FALSE. sind f ü r d e n D i g i t a l e l e k t r o n i k e r u n g e w o h n t , es sind nur d i e logischen G r u n d f u n k t i o n e n vorhanden und die P r o g r a m m i e r u n g von S c h l e i f e n zum A u f b a u von " W a h r h e i t s t a b e l l e n " ist sehr u m s t ä n d l i c h . A r b e i t e t m a n j e d o c h s t a t t mit logischen G r ö ß e n mit den I N T E G E R - Z a h l e n 0 und 1, so können die g e w o h n t e n B e z e i c h n u n g e n b e i b e h a l t e n w e r d e n . Es g e l t e n d a n n f o l g e n d e Regeln: Alle V a r i a b l e n müssen vom Typ INTEGER sein und d ü r f e n nur d i e Z a h l e n 0 und 1 e n t h a l t e n . Als K o n s t a n t e n sind nur die Zahlen 0 und 1 z u g e l a s s e n . Die O p e r a t i o n e n w e r d e n d u r c h F u n k t i o n s a n w e i s u n g e n oder F U N C T I O N - U n t e r p r o g r a m m e g e b i l d e t , die die logischen F u n k t i o n e n d u r c h R e c h e n b e f e h l e e r s e t z e n . A n s t e l l e der e n g l i s c h e n Bezeichnungen k ö n n t e n d e u t s c h e N a m e n v e r w e n d e t werden. NOT(X) = 1 - X AND(X,Y) = X*Y 0R(X,Y) = X+Y - X*Y X0R(X,Y) = IABS(X—Y) NAND(X,Y) = 1 - X*Y N0R(X,Y) = 1 - (X+Y - X*Y) EQU(X,Y) = 1 - lABS(X-Y) N a c h dem gleichen V e r f a h r e n ist e s m ö g l i c h , b e n ö t i g t e B a u s t e i n e der T T L F a m i l i e durch F u n k t i o n s a n w e i s u n g e n zu b e s c h r e i b e n . Beispiel f ü r ein V i e r f a c h NAND: NAND4(A.B.C,D) = 1 - A*B*C*D Ausdrücke w e r d e n d u r c h g e s c h a c h t e l t e F u n k t i o n s a u f r u f e g e b i l d e t . Dabei beginnt man am Ausgang der S c h a l t u n g . Beispiel:
Z = AND( OR(X,Y)
. N0T(AND(X,Y)) )
Die E i n / A u s g a b e von D a t e n e r f o l g t im I - F o r m a t mit den Bezeichnungen 0 und 1. Sollen f ü r den A u f b a u e i n e r W a h r h e i t s t a b e l l e alle möglichen b i n ä r e n K o m b i n a t i o n e n e r z e u g t w e r d e n , so v e r w e n d e t m a n D O - S c h l e i f e n , die von 0 bis 1 l a u f e n . Bei C o m p i l e r n , die d e n A n f a n g s w e r t 0 nicht zulassen, läßt m a n die V a r i able von 1 bis 2 l a u f e n und e r z e u g t die W e r t e 0 und 1 ü b e r e i n e Hilfsgröße. Beispiel:
170
8 Datentypen
DO 20 X = 0 , 1 DO 10 Y = 0 , 1 10 20
CONTINUE CONTINUE
Das folgende Beispiel Bild 8 - 9 zeigt den Aufbau der W a h r h e i t s t a b e l l e für einen Halbaddierer, der zwei e i n s t e l l i g e Dualzahlen zu einer Summe und einem Ü b e r trag auf die n ä c h s t e S t e l l e addiert. Das Beispiel benötigt nur einen Teil der Funktionsanweisungen, mit denen die logischen Operationen d e f i n i e r t wurden. C BILD 8 - 9 WAHRHEITSTABELLE EINES HALBADDIERERS inPLICIT INTEGER ( A-Z 3 C FUNKT I ONSANUE ISUNGEN FUER LOGISCHE OPERATIONEN NOT C X 3 - 1 - X ANDCX.Y3 - X*Y ORCX.Y3 - X + Y - X*Y XORCX.Y3 - I ABS C X-Y 3 EQUCX.Y3 - 1 - IAB5CX-Y3 NANDCX.Y3 - 1 - X*Y NORC X , Y 3 - 1 - CX+Y - X«Y3 C BERECHNUNG DER WAHRHEITSTABELLE ÜJRITEC* , 1 0 0 ) 100 FORMATCIX,' X Y U S ' 3 DO 50 X = O,1 DD 10 Y - 0 , 1 U = AND( X , Y 3 S - ANDC ORC X,Y) , NOTCANDCX,Y333 URITEC*,EOO) X , Y , U , S EOO F0RMATC1X,2IE,1X.EIS3 10 CONTINUE 80 CONTINUE STOP END B> TEST X Y US 0 0 0 0 01 Ol 10 Ol 11 10 S t o p - Program
Bild 8 - 9 :
terminated,
W a h r h e i t s t a b e l l e e i n e s Halbaddierers
8.5 Textverarbeitung mit Größen vom Typ
CHARACTER
171
8.5 Textverarbeitung mit Größen vom Typ CHARACTER F O R T R A N wurde ursprünglich nur f ü r die V e r a r b e i t u n g von Zahlen v e r w e n d e t , erst s p ä t e r w u r d e mit d e r Norm F O R T R A N 77 der D a t e n t y p CHARACTER g e s c h a f f e n , mit dem Zeichen ( B u c h s t a b e n , Z i f f e r n und Sonderzeichen) b e h a n delt w e r d e n können. N u m e r i s c h e und logische D a t e n werden in S p e i c h e r s t e l l e n b e s t i m m t e r Länge g e s p e i c h e r t . F ü r Z e i c h e n k e t t e n (Strings) ist die Länge, d.h. die Zahl d e r Z e i c h e n , in der Typvereinbarung anzugeben. CHARACTER-Variablen w e r d e n durch das Kennwort CHARACTER in einer impliziten oder expliziten Typvereinbarung vereinbart:
CHARACTERS Liste von Namen CHARACTER
Name*s, Name*s, ..
S t e h t die Zeichenlänge s h i n t e r dem Kennwort CHARACTER, so gilt sie f ü r alle N a m e n der L i s t e . S t e h t die Z e i c h e n l ä n g e s hinter dem N a m e n , so gilt sie nur f ü r die e i n e V a r i a b l e . F e h l t die Angabe, so wird die Zeichenlänge 1 a n g e n o m m e n . Die maximale Länge hängt ab vom Compiler und von der R e c h e n a n lage. Beispiele: IMPL IC IT CHARACTER*12 (A-H) CHARACTER*20 TEXT1 . TEXT2 , TEXT3*30 CHARACTER ZEILE*80 In dem Beispiel sind alle Variablen, die mit den Buchstaben A bis H beginnen, vom Typ CHARACTER und n e h m e n Z e i c h e n k e t t e n ( T e x t e ) a u f , die aus 12 Z e i chen b e s t e h e n . Die Variablen TEXT1 und TEXT2 b e s t e h e n aus 20 Zeichen, die Variable TEXT3 e n t h ä l t 30 Z e i c h e n . Die Variable ZEILE e n t h ä l t 80 Zeichen. Für die Speicherung längerer T e x t e können F e l d e r dimensioniert w e r d e n . CHARACTER*80 TEXT(100) CHARACTER BIBEL(10,10)*80 Das Feld TEXT b e s t e h t aus 100 E l e m e n t e n der Länge 80 Zeichen, also aus i n s g e s a m t 100 * 80 = 8000 Z e i c h e n . Das Feld BIBEL b e s t e h t aus 10 Zeilen und 10 Spalten zu je 80 Z e i c h e n . CHARACTER-Konstanten b e s t e h e n aus Z e i c h e n k e t t e n , die zwischen Apostrophe ( H o c h k o m m a s ) zu s e t z e n sind, die nicht B e standteil des T e x t e s sind. Beispiele: 'DAS IST EIN BEISPIEL' ' AUSGABE: ' ' Das ist ein Apostroph ' ' 1 Das Apostrophzeichen selbst wird durch zwei a u f e i n a n d e r f o l g e n d e A p o s t r o p h zeichen d a r g e s t e l l t . Die maximale Länge einer T e x t k o n s t a n t e n ist wieder a b hängig von der v e r w e n d e t e n R e c h e n a n l a g e .
172
8
Datentypen
Wird nur der N a m e der C H A R A C T E R - V a r i a b l e n genannt, so wird die Z e i c h e n k e t t e in der vereinbarten L ä n g e v e r a r b e i t e t . Soll nur ein T e i l angesprochen w e r d e n , so sind A n f a n g s - und Endposition anzugeben. Dies nennt man eine Teilkette .
Name ( anf
: end
)
Die I N T E G E R - G r ö ß e " a n f " ist die Anfangsposition, die I N T E G E R - G r ö ß e " e n d " ist die Endposition der T e i l k e t t e innerhalb der ursprünglichen Z e i c h e n k e t t e . F e h l t die Angabe der A n f a n g s p o s i t i o n " a n f " , so wird " 1 " angenommen ( 1 . Z e i chen); f e h l t die Angabe der Endposition " e n d " , so wird die L ä n g e der Z e i c h e n k e t t e angenommen ( l e t z t e s Z e i c h e n ) . Beispiel: CHARACTER TEXT*10 , TEIL*3 TEXT = ' 1 2 3 4 5 6 7 8 9 0 ! TEIL = T E X T ( 1 : 3 ) D i e Z e i c h e n k e t t e T E X T besteht aus den zehn Z i f f e r n von 1 bis 0. Die T e i l k e t t e von der 1. bis zur 3. Position besteht aus den Z i f f e r n 123. Für die Eingabe und Ausgabe von Z e i c h e n k e t t e n g e l t e n f o l g e n d e R e g e l n : Bei der f o r m a t f r e i e n l i s t e n g e s t e u e r t e n Eingabe sind die D a t e n durch Apostrophe vor und hinter dem T e x t zu begrenzen, die nicht Bestandteil des T e x t e s sind. Bei der listengesteuerten Ausgabe wird nur der T e x t ausgegeben. Beispiel: CHARACTER TEXT*10 R E A D ( * , * ) TEXT W R I T E ( * , * ) TEXT Eingabe:101234567891 Ausgabe:0123456789 Man b e a c h t e , daß es bei der l i s t e n g e s t e u e r t e n Ausgabe keine V o r s c h u b s t e u e r zeichen g i b t ; das erste Z e i c h e n einer Z e i l e wird i m m e r ausgegeben. Bei der f o r m a t g e s t e u e r t e n Ein/Ausgabe werden C H A R A C T E R - G r ö ß e n durch das A F o r m a t in der a l l g e m e i n e n Form A w beschrieben. F e h l t die Anzahl der Spalten w , so wird die C H A R A C T E R - G r ö ß e in der vereinbarten L ä n g e ü b e r t r a g e n . Beispiel:
100 200
CHARACTER TEXT*10 R E A D ( M O O ) TEXT FORMAT(A) WRITE(*,200) F0RMAT(1X,A)
Eingabe:0123456789 Ausgabe:
0123456789
8.5 Textverarbeitung mit Größen vom Typ CHARACTER
173
Man b e a c h t e , daß b e i der f o r m a t i e r t e n A u s g a b e das e r s t e Z e i c h e n e i n e r Z e i l e als V o r s c h u b s t e u e r z e i c h e n a n g e s e h e n und nicht a u s g e g e b e n w i r d . Es g i l t f o l g e n d e Zuordnung:
Leerzeichen: Ziffer 0 : Ziffer 1 : Zeichen + :
Vorschub auf die nächste Z e i l e V o r s c h u b um z w e i Z e i l e n Vorschub auf eine neue S e i t e ü b e r s c h r e i b e n der a l t e n Z e i l e (kein
Vorschub)
Bei der E i n g a b e b e s t i m m t d i e L ä n g e d e r C H A R A C T E R - V a r i a b l e n b z w . die L ä n g e der T e i l k e t t e die Anzahl d e r zu lesenden Z e i c h e n . Ist der E i n g a b e t e x t l ä n g e r , so w e r d e n ü b e r f l ü s s i g e Z e i c h e n nicht b e a c h t e t ; ist d e r E i n g a b e t e x t kürzer, so wird der R e s t der V a r i a b l e n mit L e e r z e i c h e n a u f g e f ü l l t . Für e i n e Wertzuweisung
an e i n e links vom G l e i c h h e i t s z e i c h e n s t e h e n d e
a b l e vom T y p C H A R A C T E R b z w . an eine T e i l k e t t e g e l t e n f o l g e n d e
Vari-
Regeln:
Ist d i e L ä n g e der e m p f a n g e n d e n K e t t e k l e i n e r als d i e L ä n g e des rechts s t e h e n den Ausdrucks, so wird nur in d e r L ä n g e der e m p f a n g e n d e n V a r i a b l e n ü b e r t r a g e n , ü b e r f l ü s s i g e Z e i c h e n des r e c h t s s t e h e n d e n Ausdrucks w e r d e n nicht b e achtet. Beispiel: CHARACTER V A R * 5 VAR = ' 1 2 3 4 5 6 7 8 9 0 ' D i e C H A R A C T E R - V a r i a b l e V A R e n t h ä l t d i e Z e i c h e n 12345. Ist die e m p f a n g e n de V a r i a b l e l ä n g e r als der r e c h t s s t e h e n d e A u s d r u c k , so w i r d der Ausdruck linksbündig ü b e r t r a g e n , der R e s t w i r d mit L e e r z e i c h e n a u f g e f ü l l t . B e i s p i e l : CHARACTER V A R * 5 VAR = 1 1 2 3 ' D i e K e t t e V A R e n t h ä l t d i e Z e i c h e n 123 und z w e i L e e r z e i c h e n . Bei einer W e r t zuweisung an e i n e T e i l k e t t e w e r d e n nur d i e P o s i t i o n e n der T e i l k e t t e v e r ä n d e r t , der R e s t d e r K e t t e b l e i b t e r h a l t e n . B e i s p i e l : CHARACTER V A R * 5 VAR = ' 1 2 3 4 5 ' VAR ( 1 : 3 ) = ' A B C ' Die
Kette
V A R e n t h ä l t d i e Z e i c h e n A B C 4 5 . Im G e g e n s a t z zu n u m e r i s c h e n und
logischen W e r t z u w e i s u n g e n darf e i n e C H A R A C T E R - V a r i a b l e nicht auf b e i d e n S e i t e n e i n e r W e r t z u w e i s u n g e r s c h e i n e n .
oder
Teilkette
C H A R A C T E R - G r ö ß e n können mit d e m Verknüpfungsoperator // b z w . & a n e i n andergekettet werden. Beispiel: CHARACTER V A R * 5 , T E X T * 1 0 VAR = ' 1 2 3 4 5 ' TEXT = V A R / / : 6 7 8 9 0 '
174
8
Datentypen
Die Z e i c h e n k e t t e T E X T w i r d g e b i l d e t a u s d e r V a r i a b l e n V A R und e i n e r K o n s t a n t e n . Sie e n t h ä l t d i e Z e i c h e n 1234567890. Einige C o m p i l e r v e r w e n d e n a n s t e l le d e r b e i d e n V e r k n ü p f u n g s z e i c h e n / / d a s V e r k n ü p f u n g s z e i c h e n &. Mit H i l f e von T e i l k e t t e n ist es m ö g l i c h , e i n e Z e i c h e n k e t t e zu z e r l e g e n . B e i s p i e l : CHARACTER VAR*5 . TEXT*10 TEXT = 1 1 2 3 4 5 6 7 8 9 0 ' VAR = T E X T ( 1 : 5 ) Die Z e i c h e n k e t t e V A R e n t h ä l t d i e e r s t e n f ü n f Z e i c h e n d e r K e t t e T E X T , a l s o d i e Z e i c h e n 12345. F ü r e i n e n V e r g l e i c h von C H A R A C T E R - G r ö ß e n k ö n n e n die b e r e i t s bei n u m e r i s c h e n G r ö ß e n v e r w e n d e t e n O p e r a t i o n e n . E Q . , . N E . , . G T . , . G E . , .LT. und . L E . h e r a n g e z o g e n w e r d e n . Sind d i e O p e r a n d e n u n t e r s c h i e d l i c h l a n g , so wird d e r k ü r z e r e O p e r a n d r e c h t s mit L e e r z e i c h e n a u f g e f ü l l t . Beispiel:
100
CHARACTER ANT*1 R E A D ( * , 1 0 0 ) ANT FORMAT(A) 1F ( A N T . E Q . ' J ' ) THEN
Z u m a l p h a b e t i s c h e n S o r t i e r e n von T e x t e n mit H i l f e d e r n u m e r i s c h e n V e r gleichsoperationen müssen die internen Codierungen der Zeichen berücksichtigt w e r d e n , die von d e r v e r w e n d e t e n R e c h e n a n l a g e a b h ä n g i g sind. M a s c h i n e n u n a b h ä n g i g a r b e i t e n d i e f o l g e n d e n lexigrafischen V e r g l e i c h s f u n k t i o n e n , die wie die n u m e r i s c h e n V e r g l e i c h s o p e r a t i o n e n . T R U E . o d e r . F A L S E . e r g e b e n und mit d e m l o g i s c h e n IF a u s g e w e r t e t w e r d e n k ö n n e n .
LGE( LGT( LLE( LLT(
op1 op 1 op 1 op1
, , , ,
op2 op2 op2 op2
) ) ) )
bedeutet bedeutet bedeutet bedeutet
l e x i g r a f i s c h g r ö ß e r oder g l e i c h l e x i g r a f i s c h größer l e x i g r a f i s c h k l e i n e r oder g l e i c h lexigrafisch kleiner
D i e b e i d e n O p e r a n d e n o p l und o p 2 sind C H A R A C T E R - G r ö ß e n . Das f o l g e n d e B e i s p i e l v e r g l e i c h t d i e b e i d e n C H A R A C T E R - G r ö ß e n T E X T 1 und T E X T 2 , ob sie a l f a b e t i s c h s o r t i e r t sind: CHARACTER*5 TEXT1 . TEXT2 R E A D ( * . * ) TEXT1 , TEXT2 I F ( L L T ( T E X T 1 , T E X T 2 ) ) THEN Neben den lexigrafischen Vergleichsfunktionen G r ö ß e n die f o l g e n d e n S t a n d a r d f u n k t i o n e n :
gibt
es
für
CHARACTER-
Die F u n k t i o n CHAR (op) wird mit e i n e m I N T E G E R - A r g u m e n t a u f g e r u f e n und w a n d e l t es in e i n Z e i c h e n u m . B e i s p i e l : CHARACTER Z E I C H * 1 ZEICH = CHAR(65)
8.5 Textverarbeitung mit Größen vom Typ CHARACTER
175
Die Zahl 65 e r g i b t z . B . den B u c h s t a b e n A. Die F u n k t i o n ICHAR ( o p ) v e r w a n delt ein Z e i c h e n in die e n t s p r e c h e n d e I N T E G E R - Z a h l . B e i s p i e l : CHARACTER ZEICH*1 ZEICH = 'A1 I = ICHAR(ZEICH) Die Z e i c h e n v a r i a b l e ZEICH e n t h ä l t den B u c h s t a b e n A. Die I C H A R - F u n k t i o n l i e f e r t z . B . den W e r t 6 5 . Die Zuordnung d e r C H A R - und I C H A R - F u n k t i o n e n ist abhängig von d e r Z e i c h e n c o d i e r u n g d e r R e c h e n a n l a g e . Das B e i s p i e l " B u c h s t a b e A = Zahl 6 5 " e n t s p r i c h t dem häufig v e r w e n d e t e n A S C I I - C o d e . Mit dem in Bild 8 - 1 0 d a r g e s t e l l t e n T e s t p r o g r a m m können S i e die Z e i c h e n c o d e s Ihres R e c h n e r s ermitteln. Die F u n k t i o n L E N (op) l i e f e r t die L ä n g e , d.h. die Zahl der Z e i c h e n eines C H A R A C T E R - A u s d r u c k s . D i e F u n k t i o n I N D E X ( o p l , o p 2 ) p r ü f t , ob e i n e Z e i c h e n k e t t e op2 in e i n e r Z e i c h e n k e t t e o p l e n t h a l t e n ist und l i e f e r t e i n e I N T E G E R Zahl als E r g e b n i s . Ist die K e t t e op2 nicht in der K e t t e o p l e n t h a l t e n , so ist das E r g e b n i s Null, sonst wird die N u m m e r d e r P o s i t i o n g e l i e f e r t , bei der die Übereinstimmung beginnt. Beispiele: CHARACTER Z E I C H * 5 ZEICH = '12345 ! L = LEN(ZEICH) N = INDEX{ZEICH.123' ) Die L E N - F u n k t i o n l i e f e r t den Wert 5, da die C H A R A C T E R - V a r i a b l e ZEICH aus fünf Z e i c h e n b e s t e h t . Die I N D E X - F u n k t i o n l i e f e r t den W e r t 2 , da die K o n s t a n t e ' 2 3 ' ab der Position 2 mit dem Inhalt der V a r i a b l e n ZEICH ü b e r e i n s t i m m t . Das in Bild 8 - 1 0 d a r g e s t e l l t e T e s t p r o g r a m m kann dazu d i e n e n , den Z e i c h e n c o d e e i n e r R e c h e n a n l a g e zu e r m i t t e l n . Mit Hilfe d e r C H A R - F u n k t i o n wird e i n e e i n g e g e b e n e I N T E G E R - Z a h l in ein Z e i c h e n u m g e w a n d e l t und a u s g e g e b e n .
C
BILD
B-10
TESTPROGRAMM
Z E I C H E N C O D I ERLING
CHARACTER A«1 ÜJRITEC*,1003
10 100
F0RMATC/1X,'ZAHL
200
READC*,*,END-203 I A = CHAR C I 3 WRITEC»,200) I , A FORdATClX,'ZAHL:',14,'
EINGEBEN
20
GOTO STOP
>'\)
ZEICHEN:' , A )
10
END B> T E 5 T ZAHL E I N G E B E N >4B ZAHL: 4 B Z E I CHEN : 0 ZAHL ZAHL:
EINGEBEN 43
Bild 8 - 1 0 :
>43
ZEICHEN:1
Testprogramm
Zeichencodierung
176
8 Datentypen
A l s B e i s p i e l f ü r d i e V e r a r b e i t u n g eines T e x t e s z e i g t Bild 8 - 1 1 e i n P r o g r a m m , das m a x i m a l 100 Z e i l e n T e x t zu j e 75 Z e i c h e n l i e s t und in e i n e m F e l d s p e i c h e r t . Wird als E n d e m a r k e e i n " * " e i n g e b e n , so kann der g e s p e i c h e r t e T e x t b e l i e b i g o f t a u s g e g e b e n w e r d e n . Durch das V o r s c h u b s t e u e r z e i c h e n " 1 " beginnt j e d e r T e x t auf e i n e r neuen S e i t e .
C BILD B-ll P R G G R A M M B E I SP I E L T E X T U E R A R B E I T U N G CKARACTER TEXTC100)»75 NZEI - 100 W R I T E C * , 1 0 0 ) NZEI 100 F Q R M A T C 1 X , 15, ' Z E I L E N E N D E M I T » ' / 5 X , 7 5 C ' + ')) NTEX - 0 DD 10 I - l . N Z E I WRITEC»,200) I 500 F0RMATC1X,13,'>'01 READC *,300) TEXT C I ) 300 F Q R M A T CA) IF C T E X T C I ) . E Q . " ) GOTG 50 NTEX - I 10 CDNTINUE 20 WRITEC»,400) 400 F O R M A T C / 1X , ' Iii I E OFT A U S G E B E N ? > ' \ ) READ C * , * ) NSEIT DG 4 0 I - 1 , N S E I T LJRITEC»,500) 500 F O R M A T C '1 ' ) DO 30 J = 1,NTEX UJRITEC* , B O O ) T E X T C J ) 500 F O R M A T CIX,A) 30 CONTINUE 40 CONTINUE WRITEC»,500) STOP END B> t e x t 100 Z E I L E N
ENDE MIT *
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1>
Bedienungsanleitung
des
Textsystems
2>
3>1 . 4> 5>2. 6> 7>3. B> 9>4. 10>»
Es k o e n n e n m a x i m a l Aenderungen H i n t e r der
100 Z e i l e n e i n g e g e b e n
s i n d nur auf der
laufenden Zeile
letzten Zeile muss ein
*
Der T e x t k a n n b e l i e b i g o f t a u s g e g e b e n
W I E O F T A U S G E B E N ? >2
Bild 8 - 1 1 :
Programmbeispiel
werden
Textverarbeitung
moeglich
eingegeben werden
werden
8.5 Textverarbeitung mit Größen vom Typ CHARACTER
177
C BILD B-12 PROGRAriilBEI SPIEL SINUSKURUE CHARACTER Z C 51 3 •D 10 I = 1 , 5 1 ZC I 3 = 10 CONTINUE WRITEC*,1003 Z 100 F0RMAT(1X,51A1) • 0 20 I = 1,51 ZCI 3 = ' ' 20 CONTINUE DO 30 I - 0, 180, 10 ZC13 BOG - FLOATC13*3.1415927/1 BO. IND •= IFIXCSIN(B0G3*50. + 1.53 ZCIN03 - '*' WRITEC«,1003 Z ZCIND3 = " ' 30 CONTINUE STOP END B> TEST
Stop - Program terminated.
Bild 8 - 1 2 :
Programmbeispiel f ü r die Ausgabe einer Sinuskurve
Das in Bild 8 - 1 2 d a r g e s t e l l t e Programm gibt den Verlauf d e r Sinusfunktion zwischen 0 und 180 Grad g r a f i s c h auf dem Bildschirm bzw. Drucker aus. Eine Ausgabezeile b e s t e h t aus 51 Zeichen; sie wird in der e r s t e n D O - S c h l e i f e mit Punkten g e f ü l l t und als Y - A c h s e a u s g e g e b e n . Die f o l g e n d e D O - S c h l e i f e löscht das F e l d . Die d r i t t e D O - S c h l e i f e m a r k i e r t die X - A c h s e durch einen Punkt, b e r e c h n e t den Wert der Sinusfunktion f ü r einen vorgegebenen Winkel und e r m i t t e l t mit dem S k a l e n f a k t o r 50 und dem Rundungssummanden 1.5 die Position, in die ein " * " als F u n k t i o n s w e r t zu s e t z e n ist. Nach d e r Ausgabe der Zeile wird d e r " * " wieder e n t f e r n t .
178
8
Datentypen
8.6 Übungen zum Abschnitt Datentypen Der A b s c h n i t t 11 e n t h ä l t f ü r alle A u f g a b e n Lösungsvorschläge!
1. A u f g a b e : Für die f o l g e n d e S c h a l t u n g sind die komplexen G r ö ß e n U, Z I , Z2, Z3 und ZB von e i n e r Eingabezeile zu l e s e n . Man b e r e c h n e den Strom in der K o m p o n e n t e n - und in d e r E x p o n e n t i a l d a r s t e l l u n g . Der Lösungsvorschlag S e i t e 206 v e r w e n d e t G r ö s sen vom T y p COMPLEX, die in der Compiler Version 2.0 nicht v e r f ü g b a r sind.
-G
_ Z 2 (Z 3 + ZB) Z 2 + Zj + ZB
—B
- z,+zG 2. A u f g a b e : Für die f o l g e n d e d i g i t a l e S c h a l t u n g ist d i e W a h r h e i t s t a b e l l e f ü r a l l e a c h t m ö g lichen K o m b i n a t i o n e n d e r Eingangsgrößen A, B und C und der A u s g a n g s g r ö ß e Z auszugeben.
A B
C
3. A u f g a b e : Man lese d e n T e x t e i n e r Z e i l e von der Konsole ein und gebe ihn 25 mal wieder auf der Konsole a u s .
9 Aufgabensammlung Der Abschnitt 11 e n t h ä l t f ü r alle A u f g a b e n Lösungsvorschläge!
9.1 Numerische Integration Das e i n f a c h s t e und e i n s i c h t i g s t e a b e r gleichzeitig a u c h l a n g s a m s t e und u n g e n a u e s t e V e r f a h r e n zur n u m e r i s c h e n I n t e g r a t i o n ist die T r a p e z r e g e l . Die I n t e g r a t i o n wird auf eine F l ä c h e n b e r e c h n u n g z u r ü c k g e f ü h r t . Die zu s u m m i e r e n d e n T e i l f l ä c h e n sind T r a p e z e . Sie e n t s t e h e n , indem man die F u n k t i o n a n m e h r e r e n S t ü t z s t e l l e n durch G e r a d e n a n n ä h e r t . Die G e s a m t f l ä c h e und d a m i t d a s Integral ist d i e S u m m e aus n T e i l f l ä c h e n ( T r a p e z e n ) . Die F u n k t i o n wird d u r c h n+1 S t ü t z s t e l l e n a n g e n ä h e r t . Bild 9 - 1 zeigt die F l ä c h e n b e r e c h n u n g und die d a r a u s a b g e leiteten Formeln.
F
- F1 + F2 +F3 + Fa +F5 + Fg +F, +Fa
2
2
2
=f [ v
fix)
V2£yk]
k=2 l_l _ X(j~Xi _ X e ~ X q
8
8
H 7- H -7Yi
Y2
Y3
H Y4
Y5
Y5
Y7
Ye
Y9
p
Fl [ 21 F31 h I Fs | Fe | F 7 | F 8
Gegeben
sind
n Stützstellen
der
Funktion
n-1
Die
Gesamtfläche
wird
in
n
Teilflächen
unterteilt
n-1 H =
Bild 9 - 1 :
X
' R E A L - R E C H N U N G ' FAX = 1 . DO 2 0 1 = 1 , 1 0 0 F A X = FAX * F L O A T C I D UIRITEC* , * ) I , ' ! = ' , FAX CONTINUE ELSE IFCHARX.EQ.3) THEN lüRITEC*,*) 'DOUBLE PREC I S I ON-RECHNUNG ' DFAX = 1 . D O DO 3 0 I = 1,100 D F A X - D F A X * D B L E C F L O A T C I I> D W R I T E C * , *.1 I , ' ! = ' , D F A X CONTINUE END IF GOTO 5 STOP END
2. Aufgabe: Fakultäten von 1! bis 100! C
10
LOESUNG UEBUNG 4 . 5 AUFGABE 3 RC-SCHALTUNG REAL I INTEGER T,TA,TE,TS EINGEBEN' UIRITEC*,*) ' U O C U O L T ) R COHM) C C F A R A D ) R E A D C * , * ) UO , R , C UIRITEC*, * ) UJR I T E C * * ) ' S T R O M D U R C H RC A L S F U N X T I O N D E R ZEIT' UIRITEC* * ) ' U O UO CUOLT)' UJRITEC* * ) 'R = R COHM)' • UIRITEC* * ) ' C CFARAD)' UIRITEC* * ) UIRITEC* * ) IN u S EINGEBEN' 'TA TE TS READC*,*) TA TE TS DG 1 0 T - T A TE TS I = U 0 * E X P C - F L 0 A T C T ) * 1 . E - B / CR*C) ) / R UIRITEC*,*) 'T CuSEK) ' , T , ' I CA)',I CONTINUE STOP END
3. Aufgabe: Tabelle des Einschaltstromes
196
11 Lösungen der Übungsaufgaben
C LOESUNG UEBUNG 4 . 5 AUFGABE 4 ZAHL e D - O.OOOl EA = 0 . N - 1 10 CONTINUE E = C l . + 1 . /FLOATCN))**N D I F F - ABSCE - EA) UIRITEC*,*) 'N - ' , N , * e - ' , E EA = E N - N + 1 I F C D I F F . G T . D ) GOTO 1 0 STOP END 4. A u f g a b e : B e r e c h n u n g der Zahl e
C LOESUNG UEBUNG 4 . 5 AUFGABE 5 D 0.0001 EA = 1 . G - 1 . N - 1 10 CONTINUE E = EA + G D I F F - ABS ( E - E A ) UJRITEC* , * J ' N = ' , N , ' N - N + 1 EA = E G = G / FLOAT C N) I F C D I F F . G T . D ) GOTO 1 0 STOP END
e-REIHE
e
,E
5. A u f g a b e : R e i h e n e n t w i c k l u n g für e
C L O E S U N G UEBUNG 4.5 AUFGABE B 3. WURZEL D - 1.E-3 10 ÜJRITE C * , * ) 'RADIKAND A UND XO EINGEBEN' R E A D C » , * , E N D - 3 0 J A,XO N = 0 20 CONTINUE
x - c s . o * x o + A/CXO»XO:O / 3.0
30
D I F F = ABS CC X-XO-J/XOJ XO = X N = N + 1 UIRI TEC *, * ) ' N = ' , N , ' IF (DIFF.GT.DJ GOTO 20 GOTO 10 STOP END
6. A u f g a b e : B e r e c h n u n g der 3. Wurzel
X =',X,'
D =',DIFF
11 Lösungen der Übungsaufgaben
5 . 2 Übungen zum Abschnitt eindimensionale F e l d e r
C
LOESUNG UEBUNG 5 . 2 AUFGABE 1 I N T E G R A T I O N DIMENSION XC10J , YC105 N = 10 C LÜERTE L E S E N DO 1 0 1 = 1 , N UIRITEC * , * ) I , ' .WERTEPAAR E I N G E B E N ' READC * , * ) X C I J , Y C I j 10 CONTINUE C SUMMENFORMEL SUM = 0 . DD 5 0 K = E . N - l SUM = SUM + Y C K ) SO CONTINUE C I N T E G R A T I O N S F O R M E L UND E R G E B N I S A U S G E B E N H = ( X ( N ) - X ( l ) ) / FLOATCN-i;i F = 0 . 5 * C YC1) + YCN) + 5 . 0 * S U M ) UJRITE C * , * j ' I N T E G E R A L F , ' FUER STOP END
N =',
1. A u f g a b e : N u m e r i s c h e I n t e g r a t i o n n a c h der T r a p e z r e g e l
C
LOESUNG UEBUNG 5 . 2 AUFGABE 2 SKALARPRDDUKT D I M E N S I O N AClO'J, BClOj NMAX = 10 U R I T E C * , * ) NMAX , ' K O M P O N E N T E N U E K T O R READ C * , * ) A W R I T E C * , * ) NMAX , ' K O M P O N E N T E N U E K T O R READC*,*) B PROD = 0 . DO 1 0 I 1,NMAX PROD - PROD + A(n*BCI) 10 CONTINUE U R I T E C * , ' SKLARPRODUKT PROD STOP END
2. Aufgabe: Skalarprodukt
A' B'
N
197
198
11 Lösungen der Übungsaufgaben
C LOESUNG UEBUNG 5 . 5 AUFGABE 3 DRAHTTABELLE DIMENSION RC63 U I R I T E C * , * 3 'DRAHTLAENGE IN M E I N G E B E N ' R E A D C * , * 3 LMAX U R I T E C * , * 3 ' WIDERSTAND E I N E S KUPFERDRAHTES IN ÜHtl' UIRITEC*, * 3 UIRITEC*, * 3 'LCM3 D=0.5MM D ~ 0 . SMM D - 0 . 7 M M D - O . B M f l DD 5 0 L - 1,LMAX DO 1 0 I - 5 , 1 0 , 1 D - FLOATCn / 10. A - 3.1415357*D*D/4.0 R C I - 4 3 = FL0ATCL3 / C 5 S . 0 * A3 10 CONTINUE UIRITEC*, 1 0 0 3 L , R 100 F0RI1AT C I X , 1 4 , S F B . 3 3 50 CONTINUE STOP END
3. A u f g a b e : D r a h t t a b e l l e
C LOESUNG UEBUNG 5 . 5 AUFGABE 4 INTEGER UIERTC493 , lüMAX UIMAX - 4 9 C ZAEHLER LOESCHEN DO 1 0 I - 1 , UIMAX UJERTCI3 = 0 10 CGNTINUE C EINGABESCHLEIFE 50 U I R I T E C » , » 3 ' ZAHL UON 1 B I S ' , UMAX , ' E I N G E B E N ' R E A D C « , * , E N D - 3 0 3 IND I F C I N D . L T . l . Q R . IND .GT .UIMAX3 THEN U I R I T E C * , * 3 ' EINGABEFEHLER' ELSE UIERTC IND3 = UIERTC IND3 + 1 END I F GOTO 5 0 C AUSGABE DER ZAEHLER 30 DO 4 0 I = 1 , UIMAX UJRITE C * , * 3 ' D I E Z A H L ' , I , ' K A M U I E R T C I 3 , ' MAL' 40 CONTINUE STOP END
4. A u f g a b e : H ä u f i g k e i t d e r L o t t o z a h l e n
11 Lösungen der Übungsaufgaben
5.4 Übungen zum Abschnitt mehrdimensionale Felder C LOESUNG UEBUNG 5 . 4 AUFGABE 1 WERTETABELLE REAL MESSC20,10) NZ - SO NS = 10 100 FORMATCIX,10F7.3) C ZAHL DER MESSREIHEN UND WERTE LESEN 10 UIRITEC*, * ) ' N Z EINGEBEN MAXIMAL' ,NZ READC*,*) NMESS IFCNMESS.LT.1 .OR. NMESS.GT.N2) GOTÜ 10 •0 50 I = 1,NMESS W R I T E C * , * ) I , ' .ZEILE M I T ' . N S , ' WERTEN: READC*,*)CMESSCI,J),J=1,NS) 20 CGNTINUE C SUMMIEREN UND MITTELWERT BERECHNEN SUM - 0 . 0 DD 40 I = 1,NMESS DO 30 J = 1,NS SUM - SUM + MESSCI , J ) 30 CONTINUE 40 CONTINUE WMITT = SUM/FLOAT C NMESS*NS ) C MITTELWERT UND MESSWERTE AUSGEBEN WRITEC*,*) WRITEC* *)WMITT, ' MITTELWERT' WRITEC* * ) WRITEC* *)'MESSWERTE' WRITEC* 1003 C CMESSCI,J),J=1,NS),1=1,NMESS) STDP END 1. A u f g a b e : Speicherung einer W e r t e t a b e l l e
C LOESUNG UEBUNG 5 . 4 AUFGABE 2 MATRIZENADDITION DIMENSION AC 4 , 5 ) , B C 4 , 5 ) , C C 4 , 5 ) NZ = 4 NS = 5 100 FORMATCIX,5F10.3) C MATRIZEN EINLESEN DD 10 1= 1,NZ WRITEC * , * ) I , ' .ZEILE MATRIX A ' , N S , ' WERTE' READC*,*) C A C I , J ) , J = 1 , N S ) 10 CONTINUE DO 20 I - 1,NZ WRITEC*,*)I .ZEILE MATRIX B ' , N S , ' WERTE' READC*,*) C B C I , J ) , J - l , N S ) 20 CONTINUE C SUMMENMATRIX BILDEN UND ELEMENTE SUMMIEREN SUMA = 0 . 0 SUMB = 0 . 0 SUMC = 0 . 0 DO 40 I - 1,NZ
199
200
¡1 Lösungen der
Übungsaufgaben
DO 3 0 J = 1 , N S C C I , J ) - A C I , J ) + BC I J ) SUMA = SUMA + A C I . J ) SUMB = SUMB + B C I , J ) SUMC = SUMC + C C I . J ) 30 CONTINUE 40 CONTINUE C SUMMEN UND MATRIZEN AUSGEBEN WRITEC* * ) W R I T E C * * ) ' M A T R I X A SUMME = ' , S U M A WRITEC* 1 0 0 J C C A C I , J ) , J = 1 , N S ) , 1 = 1 , N Z ) WRITEC* * - ) SUMME = ' , S U M B WRITEC* * ) ' M A T R I X B W R I T E C * 1 0 0 ) C CBC I , J ) , J = 1 , N S ) , 1 = 1 , NZ) WRITEC* * ) W R I T E C * * ) 'MATRIX C SUMME = ' , S U M C CCCCI,J),J=1,NS),1=1,NZ) WRITEC* 1 0 0 3 STOP END 2. Aufgabe: Matrizenaddition
C LOESUNG UEBUNG 5 . 4 AUFGABE 3 DRAHTTABELLE DIMENSION R C 1 0 0 , 6 ) NZ = 1 0 0 NS = 6 100 F0RMATC1X,I4,6FB.3) C DRAHTLAENGE L E S E N UND PRUEFEN 10 WRITEC*,*) 'DRAHTLAENGE IN M E I N G E B E N ' READC * , * ) LMAX IFCLMAX.LT.l . O R . L M A X . G T . N Z ) GOTO 1 0 C TABELLE BERECHNEN DO 3 0 L = 1 , L M A X DO 2 0 J - 1 , N S D = FLOAT C J + 4 ) / 1 0 . A = 3.1415927*D*D/4.0 R C L , J ) = FLOATCL)/C 5 G . 0 * A ) 20 CONTINUE 30 CONTINUE C TABELLE AUSGEBEN W R I T E C * , * ) ' WIDERSTAND E I N E S KUPFERDRAHTES IN OHM' WRITEC*,*) W R I T E C * , * ) ' L C M ) D=0.5MM D=0.GMM D = 0 . 7 M M D=0.BMM DO 4 0 L = 1 , L M A X WRITEC*,100DL,CRCL,J),J=1,NS) 40 CONTINUE STOP END
3. Aufgabe: D r a h t t a b e l l e
11 Lösungen der Übungsaufgaben
201
6.6 Obungen zum Abschnitt Unterprogrammtechnik C
LOESUNG
C
FUNKT 10NSANU1EISUNG
UEBUNG
C
HAUPTPROGRAMM
WSINCX) 10
6.6 =
AUFGABE
WINKELMASS
S I N C X * 3 . 1 4 1 5 9 2 7 / 1B0 . 0 )
EINGABESCHLEIFE
WRITEC*,*)'WINKEL READC*,*,END-20) FUNK
1
-
EINGEBEN' ALFA
WSINCALFA)
WRITEC*,*)FUNK GOTO 20
10
STÜP END
1. A u f g a b e : S i n u s f u n k t i o n i m
C
LOESUNG
C
HAUPTPROGRAMM
UEBUNG
INTEGER 10
6.6
Winkelmaß
AUFGABE
NDTEN
P,FORMEL
WRITEC*,*)'PUNKTE READC*,*,END=20) NDTE
2
=
EINGEBEN' P
FDRPIELCP)
WRITEC*,*)'NOTE:',NOTE GOTO 20
10
STOP END
B>TYPE C
L66A2U,FOR
FUNCTION
-
UNTERPROGRAMM
INTEGER
FUNCTION
INTEGER
P
FORMELCP)
IF
CP.GT . 3 5 )
X= C100.O-FLOAT C P ) ) / 1 5 . 0
IF
CP.LE.35)
X
FORMEL
=
IFIXCX
=
+
1.0
6.0 +
0.5)
RETURN END 2. A u f g a b e :
Notenformel
C
LOESUNG
C
HAUPTPROGRAMM
UEBUNG
INTEGER N2
=
DO
20
6.6
AUFGABE
ZAHLC1000)
I
=
1,NZ
=
I
20
CONTINUE
30
MAZAHL
=
MAXCZAHL,N)
WRITEC*,*)'MAXIMUM END
EINGEBEN ZAHLCI)
READC*,*,END=30)
STOP
MAXIMALWERT
1000
WRITEC*,*)I,'.ZAHL N
3
=',MAZAHL
ENDE
MIT
TASTE
F6'
202
11 Lösungen der
Übungsaufgaben
C FUNCTION - UNTERPROGRAMM FUNCTION MAXCX.N) INTE6ER XCN) MAX - XC13 DO 10 I - 2 , N I F CXC I ) .GT .MAXD MAX 10 CONTINUE RETURN END
XCID
3. A u f g a b e : S u c h e n d e s M a x i m a l w e r t e s C LOESUNG UEBUNG G.B AUFGABE 4 FAKULTAET C HAUPTPROGRAMM 10 W R I T E C * , * ) 'GANZE ZAHL EINGEBEN' READ C * , * , E N D ^ E O ) N X = FAKCN} URITEC*, * ) N , ' ! , X GOTO 10 20 STOP END
C FUNCTION - UNTERPROGRAMM FUNCTION FAKCN3 FAK - 1 . 0 DO 10 I = 1 , N FAK « FAK * FLOATCI) 10 CONTINUE RETURN END 4. A u f g a b e : B e r e c h n u n g von n ! C LOESUNG UEBUNG 6 . 6 AUFGABE 5 KEGEL C HAUPTPROGRAMM 10 W R I T E C * , * ) ' HOEHE UND DURCHMESSER READC*,*,END=20) H,D CALL K E G E L C H , D , A M , S , U ) URITEC*,*:i AM , S , U GOTO 10 20 STOP END
EINGEBEN'
C SUBROUTINE - UNTERPROGRAMM SUBROUTINE K E G E L C H , D , A M , S , U J PI = 3.1415327 S = S Q R T C C D / 2 . 0 ) * * 2 + H**2'J AM = P I * D * S / 2 . 0 U = PI*D*D*H/12.0 RETURN END 5. A u f g a b e : M a n t e l f l ä c h e , S e i t e n l i n i e und V o l u m e n e i n e s K e g e l s
11 Lösungen der
C LOESUNG UEBUNG B . B AUFGABE B QUADRATISCHE C HAUPTPROGRAHM 10 WRITEC* , * V P UND Q EINGEBEN ' READC*,*,END=20) P , D CALL QUAGLC P , Q , X I , X 2 , H A R K E ) I F CMARKE.EQ.0 3 THEN U J R I T E C * , * ) ' LOESUNG KOMPLEX' ELSE UIRITEC*, * ) X 1 , X2 END I F GOTO 1 0 20 STOP END
Übungsaufgaben
GLEICHUNG
C SUBROUTINE - UNTERPROGRAMM SUBROUTINE Q U A G L C P , Q , X 1 , X 2 , M A R K E ) RAD - P * * 2 / 4 . 0 - Q I F C R A D . L T . 0 . 0 ) THEN MARKE - 0 ELSE MARKE - 1 XI = - P / 2 . 0 + SQRTCRAD) X2 - - P / 2 . 0 - SQRTCRAD) END I F RETURN END 6. A u f g a b e : Lösung d e r q u a d r a t i s c h e n Gleichung C LOESUNG UEBUNG 6 . B AUFGABE 7 EXTREMWERTE C HAUPTPROGRAMM DIMENSION X C 1 0 0 0 ) N2 - 1 0 0 0 UIRITEC*,*)'ZAHLEN ZEILENWEISE EINGEBEN' READC*,*,END-10) CXCI),1=1,NZ) 10 N - I - 1 CALL EXTREMC X , N , X M A X , X M I N ) UIRITEC*, * ) N , XMAX, XMIN STOP END
C SUBROUTINE - UNTERPROGRAMM SUBROUTINE EXTREMCA,N,AMAX,AMIN) DIMENSION ACN) AMAX = A C I ) AMIN - A C I ) DO 1 0 I - 1 , N I F C A C I ) . G T . A M A X ) AMAX = A C I ) I F C A C I ) . L T . A M I N ) AMIN - A C I ) 10 CONTINUE RETURN END 7. A u f g a b e : E x t r e m w e r t e b e s t i m m e n
203
204
11 Lösungen der Übungsaufgaben
7.8 Übungen zum Abschnitt Ein/Ausgabe von Daten
C LOESUNG UEBUNG 7 . B
1 2 3 4 5 G
UIRITEC*, 1 0 0 ) FORMAT(/10X, /10X, /10X, /10X, /10X, /10X, /10X , STDP END
AUFGABE
1 SCHALTBILD
*
* ******* * Q****** ******* ******* * * *
* ' * ' * ' *******Q > * ' * ' *
' / / )
1. A u f g a b e : Zeichnen eines Schaltbildes
C LDESUNG UEBUNG 7 . B AUFGABE 2 TABELLE DIMENSIQN X C 4 ) URITEC*,1003 100 FORMAT C10X,51C ' * ' ) ) U)R ITE C * , 200 ) C I , 1 = 2 , 5 ) 200 FORMAT C10X, ' * X ',4C'! ' , 1 1 , ' . WURZEL ' ) , ' * ' ) URITEC*,100) DO 20 I - 1 , 1 0 DO 10 J = 2 , 5 X C J - l ) = F L O A T C I ) * * C1 . O / F L Q A T C J ) ) 10 CONTINUE WRITE(*, 300) I , X 300 FORMAT C10X, ' * ' , 1 3 , E X , 4 C ' ! ' , F S . 4 , I X ) , ' * ' ) 20 CONTINUE lüRITEC * , 1 0 0 ) STOP END
2. A u f g a b e : Ausgabe einer Wurzeltabelle
11 Lösungen der
Übungsaufgaben
C
L O E S U N G UEBUNG 7 . 8 AUFGABE 3 S E Q U E N T I E L L E DATEI OPEN C I O , F I L E = ' T E S T . D A T ' , S T A T U S = ' N E W , 1 A C C E S S = ' S E Q U E N T I A L ' ,FDRM ='UNFORMATTED ' J C DATEI BESCHREIBEN DD 1 0 I 1,100 WRITEC10:> I 10 CONTINUE END F I L E 10 REWIND 10 C D A T E I L E S E N UND S U M M I E R E N I SUM = 0 20 READC10,END-301 I ISUM = ISUM + I GOTO 2 0 C SUMME A U S G E B E N 30 UJRITEC*,*V SUMME = ' . ISUM CLOSE C I O , S T A T U S = ' D E L E T E ' ) STOP END
3. A u f g a b e : A u f b a u e i n e r s e q u e n t i e l l e n
Datei
C
L O E S U N G UEBUNG 7 . 8 AUFGABE 4 DIREKT-ZUGRIFFS-DATEI • P E N C I O , F I L E = ' T E S T . DAT ' , S T A T U S = 'NEU) ' , A C C E S S = ' D I R E C T ' , FORM= ' U N F 0 R I 1 A T T E D ' , R E C L = LtJ 1 C DATEI BESCHREIBEN DO 1 0 I = 1,100 UIRITEC10, REC=I j I 10 CDNTINUE C D A T E I L E S E N UND S U M M I E R E N ISUM = 0 DD 2 0 I = 1,100 READC 1 0 , R E C = I ) IUJERT ISUM = ISUM + IUERT 20 CDNTINUE C SUMME A U S G E B E N U J R I T E C * , * } ' SUMME ISUM CLOSE C I O , S T A T U S = ' D E L E T E ' ) STOP END
4. A u f g a b e : A u f b a u e i n e r
Direkt-Zugriffs-Datei
205
206
11 Lösungen der Übungsaufgaben
8.6 Übungen zum Abschnitt Datentypen C LOESUNG UEBUNG B . B AUFGABE 1 KOMPLEXE SCHALTUNG I M P L I C I T COMPLEX C U , I , Z ) UJRITEC»,*) ' U Z I Z 5 Z 3 ZB KOMPLEX E I N G E B E N ' R E A D C * , * ) U , Z I , Z2 , Z 3 , ZB ZG = C Z 2 * C Z 3 + Z B ) ) / C Z 2 + Z 3 + Z B ) I = U/CZ1 + ZB) ABSI - CABSCI) UJINK ATAN2CAIMAGCI),REALCI))*1B0./3.1415927 W R I T E C * , 1 0 0 ) I , A B S I , WINK 100 F 0 R M A T C / 1 X , F 1 0 . 4 , ' + J ' , F 1 0 . 4 , S X , F 1 0 . 4 , ' EHÜCH J ' , F S . 1 ) STOP END 1. A u f g a b e : B e r e c h n u n g e i n e r k o m p l e x e n S c h a l t u n g
C LOESUNG UEBUNG B . 6 AUFGABE 2 D I G I T A L S C H A L T U N G I M P L I C I T INTEGER CA-Z) C LOGIKFUNKTIONEN D E F I N I E R E N UNDCX.Y) = X*Y ODERCX.Y) = X + Y - X*Y NI CHT( X ) = 1 - X C UAHRHEITSTAFEL WRITEC* , 1 0 0 ) 100 F0RMATC1X,' A B C Z ' ) DO 3 0 A = 0 , 1 DO 2 0 B = 0 , 1 DD 1 0 C = 0 , 1 Z = ODERC UND C A , B ) , NI CHT C DDER C B , C ) ) ) UJRITEC*,200) A , B , C , Z 200 FORMAT C I X , 4 1 2 5 10 CONTINUE 20 CONTINUE 30 CONTINUE STOP END 2. A u f g a b e : B e r e c h n u n g e i n e r d i g i t a l e n S c h a l t u n g C LOESUNG UEBUNG B . 6 AUFGABE 3 ZEILE CHARACTER Z E I L E * 7 9 WRITEC * , * ) ' T E X T E I N G E B E N ' READC * , 1 0 0 ) ZEILE 100 FORMAT CA) DO 1 0 I = 1,25 UJRITEC*, 2 0 0 ) ZEILE 200 FORMATCIX,A) 10 CONTINUE STOP END 3. A u f g a b e : M e h r f a c h e A u s g a b e e i n e r T e x t z e i l e
MEHRFACH
AUSGEBEN
11 Lösungen der
Übungsaufgaben
207
9 Aufgabensammlung
C AUFGAB ENS AIMLUNG 1 . AUFGABE T R A P E Z R E G E L S T U E T Z S T E L L E N DITTENSION YCIOOO;' MI1AX = 1 0 0 0 U I R I T E C * , * J ' X A UND XE E I N G E B E N ' READC * , * ) XA , XE URITEC*, *) 'STUETZUERTE EINGEBEN ' DD 10 I - 1,NMAX READC* , * , END = 20:« Y C I ) N5 = I 10 CONTINUE 20 H - CXE - X A ; I / F L D A T C N S - I : I sun = o. DO 30 I - 2 . N 5 - 1 sun = sun + Y e n 30 CONTINUE F = H*CYC1 ) + YCNS) + E*SUM5 / 2 . UJR I TEC * , 1 0 0 ' ) XA , XE , F , NS 100 F O R n A T C / I X , ' I N T E G R A L UON F8.3, ' B I S ' , F B . 3 , ' IST',FB.3 1 , ' BEI ' , 1 3 , ' STUETZSTELLEN'J STOP END
1. A u f g a b e : T r a p e z r e g e l mit
Stützstellen
C AUFGABENSAnnLUNG 2 . A U F G A B E T R A P E Z R E G E L F U N K T I O N C FUNKT IONSANUEISUNG B E I S P I E L P A R A B E L Y - X * * 2 FUNCC X 'J = X * * 2 URITEC»,*)'FUNKTION Y = X**2' URITEC*,*) 'XA XE ZAHL DER T E I L F L A E C H E N READC*,*) XA,XE,NF H - CXE - X A ) / F L 0 A T C N F )
EINGEBEN'
sun - 0.
10
100 1
DG 10 K = 1 , N F - 1 s u n - s u n + FUNCCXA + F L O A T C K ) * H ) CONTINUE F - H*CFUNCCXA) + FUNCCXE) + S * S U n ) / 2 . 0 U R I T E C * , 1 0 0 ) XA , XE , F , NF FORnATC/lX,'INTEGRAL U O N ' , F 9 . 3 , ' B I S ' , F 9 . 3 , ' BEI ' , 1 5 , ' T E I L F L A E C H E N ' ) STOP END
2. A u f g a b e : T r a p e z r e g e l F u n k t i o n m i t f e s t e r Zahl von T e i l f l ä c h e n
IST',FS.3
208
11 Lösungen der
Übungsaufgaben
C AUFGABENSAMMLUNG 3.AUFGABE TRAPEZREGEL NAEHRUNGSUERFAHREN C FUNKTIONSANUEISUNG BEISPIEL PARABEL Y - X**2 FUNCCX) - X**2 UIRITEC*,*) 'FUNKTION Y = X**2 ' WRITEC*,*) 'XA XE DIFF NMAX EINGEBEN' READ C * , * ) XA,XE,DIFF,NMAX C AUSGANGSWERTE FUER ZWEI TEILFLAECHEN N = 2 H - C XE - XA) / FLOATCN) SUM = FUNCCXA) + E . »FUNCCXA+H) + FUNCCXE) FA = H*SUM/2 . 0 C HALBIERUNG DER TEILFLAECHEN DO 20 N = 1,NMAX H = H/2.0 KEND = 2**CN+1) - 1 DO 10 K - 1,KEND,2 SUM = SUM + 2 . 0*FUNC C XA + FLOAT C K)*H) 10 CONTINUE FN = H*SUM/2.0 DELT = ABSCCFA-FN)/FN)*100 NS = N IF CDELT .LT.DI FF) GOTO 30 FA = FN 20 CONTINUE C AUSGABE DER ERGEBNISSE 30 WRITEC*,100) XA, XE, FN, DELT, NS 100 F0RMATC/1X, 'INTEGRAL UON ' ,F9.3, ' BIS',F9.3,' IST',FB.2 1 ,' AUF ' ,FB . 4, '% GENAU', 15,' DURCHL ' ) STOP END 3. Aufgabe: Trapezregel Funktion als Näherungsverfahren
C AUFGABENSAMMLUNG 4.AUFGABE SIMPSON NAEHERUNGSUERFAHREN C FUNKT IONSANWEI SUNG BEISPIEL SINUSFUNKTION FUNCC X ) = SINCX) WRITEC*,*) 'FUNKTION Y = SINCX)' UIRITEC*, 'XA XE DIFF NMAX EINGEBEN' READ C * , * ) XA,XE,DIFF,NMAX C AUSGANGSWERTE FUER UIER INTERUALLE N = 4 H = C XE - XA) / FLOATCN) SUME = FUNCCXA + 2.0*H) SUM4 = FUNCCXA+1.0*H) + FUNCCXA+3.0*H) ECKUJ = FUNCCXA) + FUNCCXE) FA = H* C ECKlü + 2 . 0*SUM2 + 4 . 0*SUM4 )/3 . 0 C HALBIERUNG DER TEILFLAECHEN DO 20 N = 1,NMAX H = H/2.0 KEND = 2**CN+2) - 1 SUM2 = SUM2 + SUM4 SUM4 = 0.
11 Lösungen der
Übungsaufgaben
DD 1 0 K = 1 , K E N D , 2 SUM4 - SUM4 + FUNCCXA + FLOATOO*H} 10 CONTINUE FN - H* C ECKliI + 2 . 0 * S U M 2 + 4 . 0 * S U M 4 ) / 3 . 0 DELT - ABSC C F A - F N 3 / F N ) * 1 0 0 NS = N I F C D E L T . L T . D I F F ) GOTO 3 0 FA = FN 20 CONTINUE C AUSGABE DER ERGEBNISSE 30 WRITEC*, 1 0 0 ) XA , XE , FN , DELT , NS 100 FORMATC/IX,'INTEGRAL UON ' , F S . 3 , ' B I S ' , F S . 3 , ' 1 AUF ' , F B . 4 , ' > . GENAU', 1 5 , ' DURCHL' 3 STOP END
209
IST',G10.3
4. Aufgabe: Simpsonregel Funktion als Näherungsverfahren C AUFGABESAMMLUNG 5 . AUFGABE FOURIERANALYSE TABELLE DIMENSION T A B C 2 , 1 0 0 3 , A C 5 0 3 , B C 5 0 3 NMAX = 1 0 0 WRITEC», »3 'TABELLENLÜERT X UND Y EINGEBEN' C LESEN DER TABELLENUIERTE DO 10 1=1,NMAX READC*,*,END=20 3 T A B C 1 , I 3 , T A B C 2 , I ) NUER - I 10 CONTINUE C ZAEHLER UND FAKTOREN 20 N = NUIER - 1 M - N/2 - 1 T = 6.2831854/FL0ATCNj SUM = 0 . C SUMMEN BERECHNEN DO 3 0 I = 1 , N SUM - SUM + TABC2,13 30 CONTINUE AO = SUM/FL0ATCN3 DO 5 0 K - 1 , M SUMA = 0 . SUMB - 0 . DO 4 0 I - 1 , N SUMA = SUMA + T A B C 2 , I 3 * C 0 S C T * F L 0 A T C C I - 1 3 * K 3 3 SUMB - SUMB + TABC2, I 3*SIN(T*FLOATC C I - 1 3 * K 3 3 40 CONTINUE ACJO = 2.0*SUMA/FL0ATCN3 BCK3 - 2.0*SUMB/FL0ATCN3 SO CONTINUE C ERGEBNISSE AUSGEBEN W R I T E C * , 1 0 0 ) AO 100 F0RMATC/1X, ' A0= ' , 1 P E 1 2 . 5 3 DO 6 0 I « 1,M UIRITEC* , 2 0 0 5 I , AC I 3 , I , BC I 3 200 FORMATC1X, ' A C ' , 1 2 , ' 3~ ' , F 1 2 . 5 , ' BC',12, '3-',F12.53 60 CONTINUE STOP END 5. Aufgabe: Fourieranalyse einer Funktion als Tabelle
210
11 Lösungen der Übungsaufgaben
r*i
X *
-
r*i * *
* * m «w»