Fortran-Kurs technisch orientiert: Einführung in die Programmierung mit Fortran 77 [8., Auflage. Reprint 2018] 9783486783940, 9783486222104


194 99 15MB

German Pages 231 [232] Year 1992

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Inhaltsverzeichnis
Vorwort zur 8. Auflage
Vorwort zur 6. Auflage
Vorwort zur 4. Auflage
1.Einführung
2.Grundlagen des FORTRAN
3.Programmverzweigungen
4.Programmschleifen
5.Indizierte Variablen (Felder)
6.Unterprogrammtechnik
7.Die Eingabe und Ausgabe von Daten
8.Datentypen
9.Aufgabensammlung
10.Ergänzende und weiterführende Literatur
11.Lösungen der Übungsaufgaben
12.Anhang
13. Stichwortverzeichnis
Recommend Papers

Fortran-Kurs technisch orientiert: Einführung in die Programmierung mit Fortran 77 [8., Auflage. Reprint 2018]
 9783486783940, 9783486222104

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

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»