FORTRAN 77 Allgemeines Nicht mehr als 70 Zeichen pro Zeile Mindestens die ersten 7 Zeichen müssen leer bleiben Komentare mit vorgestelltem C Die erste Zeile Allgemeine Deffinition implicit double precision (ah,o-z) - wenig schreibarbeit man kann keine Deffinitionen vergessen man kann nicht alle Variablennamen verwenden (z.B. mü, nü,...) Spezielle Deffinition integer a, b real c, d double precision e, f character g, h Variablennamen beliebig wählbar - man muß die Definition ändern, wenn man im Programm was ändert Zwei Variablen dürfen nie den gleichen Namen haben! Die Grundrechnungsarten Addition, Subtraktion, Multiplikation, Division: sonstige Funktionen: a=b+c a=b–c a=b*c a=b/c Potenzen und Wurzeln a = b**c a = sqrt(b) = b c a = b**(1/c) = b cos, sin,... Achtung Fortran rechnet in Radians also: z.B. sin(45) schreibt man in Fortran: sin(45*/180) Logarithmus inverse Funktionen Informationen im Web: http://www.fortran.com/fortran/F77 _std/rjcnf0001.html Ein-, Ausgeben & Die letzte Zeile read*, a, b, c print*, a, b, c stop end muß immer am Ende stehen! und schon kanns los gehen! Fortran Compiler für Windows: z.B. Force 8 http://myweb.lmu.edu/dmsmith/Math282.html für Linux: g77 –o programm –O programm.f Beispiel Das Programm soll mit zwei angegebene Zahlen alle Grundrechnungsarten durchführen... Einlesen aus einem File Aus einem Textfile Zahlen einlesen: open(unit=11, file='zahlen.txt', status='old') read(11,*) b, c close(11) Das File zahlen.txt muß zuerst angelegt werden Leerzeichen trennen die Einträge Schreiben in ein File Ergebnisse in ein Textfile schreiben: open(unit=12, file='ergebnis.txt', status='unknown') write(12,*) a, a1, a2 close(12) mehrere Zeilen lesen bzw. schreiben open(unit=11, file='zahlen.txt', status='old') open(unit=12, file=‚ergebnis.txt', status=‚unknown') read(11,*) b, c read(11,*) b1, c1 read(11,*) b2, c2 Usw... write(12,*) a, a1, a2 write(12,*) aa, aa1, aa2 Usw... close(11) close(12) Und jetzt das gleiche Bsp... Diesesmal wollen wir mehrere Zahlen eingeben, mit denen die gleichen bzw. verschiedene Rechenoperationen durchgeführt werden sollen... Do - Schleifen implicit double precision (a-h,o-z) open(unit=11, file='zahlen.txt', status='old') open(unit=12, file=‘ergebnis.txt', status=‘unknown') do 100 n=1, 4 read(11,*) b, c a=b+c write(12,*) a 100 continue close(11) close(12) stop end nur einlesen dimension b(10), c(10) 100 200 do 100 n=1,7 read(11,*,end=200) b(n), c(n) continue stop end damit lassen sich beliebig viele Zahlen einlesen und z.B. in do – Schleifen verwenden end=200 ..... beendet die do – schleife wenn die letzte Zeile eingelesen ist Die Marken (z.B. 100, 200) müssen gleich am Anfang einer Zeile stehen nocheinmal das gleiche Bsp. Diesmal wollen wir die Zahlen mit Hilfe einer do – Schleife einlesen bzw. auch rausschreiben... If - Abfrage z.B. if(a.gt.0) write(12,*) a bei mehreren Befehlen: if(a.gt.0) then write... b=c+d usw. endif mögliche if – Abfragen (a.eq.0) ... ist gleich (a.gt.0) ... größer als (a.lt.0) ... kleiner als (a.ge.0) ... größer oder gleich (a.le.0) ... kleiner oder gleich Kombinationen von if - Abfragen Bedingung: a<b und c>d if(a.lt.b.and.c.gt.d) then.... Bedingung: a<b oder c<d if(a.lt.b.or.c.lt.d) then... if - else z.B. else if(a.gt.0) then write(12,*) a else write(12,*) b end if z.B. else if if(a.gt.0) then write(12,*) a else if(a.lt.-5) write(12,*) b end if ein letztes Mal das gleiche Beispiel Wir wollen jetzt nur die Zahlen > 0 in das ergebnis – file geschrieben haben... der goto - Befehl nicht gerne gesehen, aber trotzdem recht nützlich: Anwendung: goto Referenz z.B.: goto 300 das Programm springt dann sofort zu der Marke 300 bei grösseren Programmen kann es sehr sinnvoll sein Unterprogramme zu verwenden: ein Beispiel aus einem LIE – Integrator Programm: Unterprogramme – Bsp. 1 CALL PARAM C....EINLESEN DER PARAMETER SUBROUTINE PARAM TINV = 1 / T READ(11,*) STP,PRT read(11,*) xlim READ(11,*) INI READ(11,*) N READ(11,*) NM,NML READ(11,*) LOGEPS READ(11,*) SWMINI READ(11,*) SWSUM,NSTEP RETURN END Unterprogramme – Bsp. 2 call TRUAN C MEAN ANOMALY ---> TRUE ANOMALY SUBROUTINE TRUAN(EKAR,T) IMPLICIT REAL(A-H,O-Z) IMPLICIT INTEGER (I-N) Q=(1.-EKAR)/(1.+EKAR) SQ=SQRT(Q) RSQ=1./SQ T=T*PI/180 RETURN END