A Fortran programozási nyelv

Vezérlési szerkezetek

Az ASSIGN utasítás

A vezérlő utasítások szerepe - mint minden programozási nyelvben - az, hogy a felírási sorrendtől eltérő megfelelő végrehajtási sorrendet írjanak elő. Ezt a FORTRAN nyelvben címkékre való hivatkozással lehet megadni. Címkével sorokat lehet ellátni, erre való a sor első öt karaktere. Speciális esetben a címkét vezérlésátadó utasításban egy INTEGER típusú változó azonosító helyettesítheti. Ha az I azonosítót címke helyett szeretnénk használni, értéket az ASSIGN utasítással állíthatjuk be. Például ASSIGN 118 TO I. Ilyen esetben az ASSIGN utasítást nem helyettesíthetjük egyszerű értékadással.

Feltétel nélküli vezérlésátadás

A FORTRAN nyelv korai verzióiban nehéz elkerülni a GOTO használatát. A GOTO argumentuma egy címke, vagy egy címkét értékül kapott INTEGER változó lehet. Direkt vezérlés átadáskor használható a CONTINUE utasítás, ami nem csinál semmit, de viselhet címkét. A számított GOTO többirányú elágazás írását is lehetővé teszi.

GOTO (10,20,30) , K 10 ... GOTO 40 20 ... GOTO 40 30 ... 40 CONTINUE

A fenti példában hibát okoz, ha K értéke nem esik 1 és 3 közé. K INTEGER típusú. Másfajta GOTO utasítás:

ASSIGN 20 TO I GOTO I (10,20,30) 20 ...

Itt szintén hibát jelentene az, ha a 20-as címkét nem soroltuk volna fel a GOTO mögött.

Az IF utasítás

A nyelvben aritmetikai és logikai IF használható. Az aritmetikai IF egy kifejezés előjele szerinti három irányú elágazást valósít meg.

IF (I-J) 9,10,11

Az aritmetikai IF aszerint folytatja a programot a 9,10,11-es címkén, hogy I-J<0, I-J=0, I-J>0 teljesül-e. Természetesen az I-J helyére bármilyen aritmetikai kifejezés írható, értékük lehet bármilyen szám típus.

A logikai IF egy logikai kifejezés igaz értéke esetén hajtja végre az utána álló utasítást. Nem írható az IF után sem újabb IF, sem DO utasítás.

IF (A.GT.B) B=A

Ha több utasítást akarunk végrehajtani egy IF mögött, akkor a következő szerkezetet használhatjuk:

IF (logikai kif) THEN utasítások ELSEIF (logikai kif) THEN utasítások ELSE utasítások ENDIF

A SELECT CASE struktúra

Ez a struktúra többszörös elágazást tesz lehetővé, amivel kikerülhető az Assembly-szerű kesze-kusza GOTO-kkal megvalósított korábban már tárgyalt struktúra. A következő példa angol nyelvű sorszámnevek generálását teszi lehetővé.

SELECT CASE(day_number) CASE(1, 21, 31) suffix = ’st’ CASE(2, 22) suffix = ’nd’ CASE(3, 23) suffix = ’rd’ CASE(4:20, 24:30) suffix = ’th’ CASE DEFAULT suffix = ’??’ WRITE(*,*)’invalid date: ’, day_number END SELECT WRITE(*, "(I4,A2)") day_number, suffix

A DO, EXIT és CYCLE utasítások

A DO utasítással írhatunk ciklust. Ennek szintaktikája DO l I=M1, M2, M3. Itt l egy olyan címke, ami egy későbbi sor elején szerepel, az l-ig tartó utasítások képezik a ciklusmagot. Az I a ciklusváltozó, ennek M1 a kezdőértéke, M2 a felső határa és M3 a növekménye. M3 elhagyható, ilyenkor a növekmény default értéke 1. A ciklusváltozó értékét a ciklusmagon belül nem lehet változatni, csak felhasználni. A DO ciklussal ekvivalens az alábbi program:

I=M1 l2 ... ciklusmag l ... I=I+M3 IF (I.LE.M2) GOTO l2 ...

A ciklusok természetesen egymásba ágyazhatóak, még a címkéjük is lehet azonos. A ciklusmagon belül az utasítások felsorolási sorrendben hajtódnak végre. Minden ilyen utasítás a ciklus hatókörébe tartozik. A ciklus hatásköre kiterjeszthető: GOTO-val kiugorhatunk a cikluson kívüli címkére is, az ezt követő utasításokat ilyenkor egy olyan vezérlésátadó utasítás kell kövesse, amely visszavisz a ciklus közönséges értelemben vett hatáskörébe. Egymásba ágyazott ciklusok esetén csak a legbelső ciklus hatásköre terjeszthető ki. Ilyen módon nem ugorhatunk olyan utasításra, amely bármilyen másik ciklus hatáskörébe tartozik. A kiterjesztett hatáskörben sem változtathatjuk direkt módon a ciklusváltozót.

Az END DO utasítás végre a standard nyelv részévé vált, tehát nem kell minden DO utasításban címkéket használni. A CYCLE arra alkalmas, hogy a ciklus belsejében kikényszerítsük az új iteráció megkezdését, míg az EXIT-tel a ciklus befejezését. A következő példa beolvassa a FITS fájl headereit:

CHARACTER(LEN=80) :: header DO line = 1,36 READ(unit, "(a80)") header IF( header(1:8) == "COMMENT") THEN CYCLE ELSE IF( header(1:8) == "END") THEN EXIT ELSE ... END DO

Létezik a definiálatlan DO, de ebben az esetben az EXIT elhagyhatatlan, hiszen végtelen ciklust hoznánk létre:

sum = 0.0 DO READ(*, IOSTAT=status) value IF(status /= 0) EXIT sum = sum + value END DO

A DO WHILE struktúra

Ez a struktúra egy elöl tesztelős ciklust valósít meg, ami addig fut, amíg az adott feltétel teljesül. Ennek működése szimulálható definiálatlan DO - EXIT struktúrával is. Egy egyszerű példa:

DO WHILE( ABS(x - xmin) > 1.0e-5) CALL iterate(x, xmin) END DO

Leállítás

A PAUSE n utasítás hatására a program megáll és kiírja az n számot, majd újraindítható, szintén a PAUSE utasítással. Továbbindítás esetén a program ott folytatódik, ahol abbamaradt. A STOP úgy állítja le a programot, hogy a memóriából is törli.