Strucny neautorizovany uvod k FORTRANu.
------------------------------------
FORTRAN - jeden z prvych (ak nie vobec prvy) vyssich programovacich jazykov
vyvinuty firmou DIGITAL v 60tych rokoch (minuleho storocia).
------------------------------------------------------------------------------
0; FORTRAN nerozlisuje velke a male pismena.
Mnozstvo vlastnosti FORTRANu Moze Zavisiet Od Implementacie, na tuto
skutocnost bude upozornene takto: (MZOI)
------------------------------------------------------------------------------
1; programovy riadok vo FORTRANe je rozdeleny na oblasti:
1 stlpec: - ak obsahuje C - riadok sa interpretuje ako komentar (t.j.
ignoruje)
- inak - normalny prog. riadok
1-5 stlpec: navestia - vo FORTRANe je navestim lubovolne cele cislo
6 stlpec: sluzi na zapis pokracovacieho znaku (konvencia vravi: +) - t.j.
riadok sa interpretuje ako pokracovanie predchadzajuceho
ak je prazdny, je to normalny prog. riadok
7-72: zapis prikazu (pozor, len jeden v riadku)
73-80: oznacenia, co znaci - ignoruje sa (pozor teda na dlzku riadka !)
Vyssie uvedene delenie vzniklo z odbobia ked FORTRANovsky program bol
zapisany dierkami na diernych stitkoch.
Co z toho vyplyva pre prax - prikaz treba pisat minimalne do 7 riadku, t.j.
napr. pouzit klaves TAB, ktory spolahlivo preskoci minimalne 7 pozicii a pri
dlhych riadkoch radsej pouzit pokracovaci.
------------------------------------------------------------------------------
2; znaky FORTRANom poznane:
- velke pismena (male su automaticky chapane ako velke):
ABCDEFGHIJKLMNOPRSTUVWXYZ
- cislice
0123456789
- specialne symboly
/+-*.,='()$ a medzera
(pozor hlavne na lomitko a apostrof - smerujuce dolava !)
- viacznakove symboly:
- operatory vo formate .XX. alebo .XXX.
kde XX je z mnoziny ( LT, GT, LE, GE, NE, EQ, AND, OR, NOT)
vyznam: < > <= >= <> = --obvykly--
- logicke hodnoty:
.TRUE. .FALSE.
- vyhradene slova:
REAL, INTEGER, DOUBLE PRECISION, LOGICAL, COMPLEX, DIMENSION, EXTERNAL,
DATA, COMMON, EQUIVALENCE, FORMAT, DO, IF, GO TO, READ, WRITE, PAUSE, STOP,
SUBROUTINE, FUNCTION, CONTINUE, BLOCK DATA, REWIND, BACKSPACE, ENDFILE, END
------------------------------------------------------------------------------
3; Program vo FORTRANe ma nasledovnu strukturu.
PROGRAM meno_programu
opisy
prikazy
END
meno_programu je Vami definovany retazec nekolidujuci s nazvom ineho
podprogramu alebo funkcie
opisy - deklaracie premenych, dimenzovanie, common bloky, data,
jednoprikazove funkcie
------------------------------------------------------------------------------
4; podprogram ma nasl. formalnu strukturu:
SUBROUTINE meno(parametre)
opisy
prikazy
RETURN
END
-----------------------------------------------------
funkcia ma formalnu strukturu:
typ FUNCTION meno(parametre)
opisy
prikazy
RETURN
END
podrobnosti v dalsom...
------------------------------------------------------------------------------
5; Premenne.
Nazov premennej je postupnost znakov a cisel zacinajuca znakom, relevantnych
je prvych 8 znakov (MZOI) - t.j. premenne ABRAKADABRAKA1 a ABRAKADABRAKA2
budu s velkou pravdepodobnostou interpretovane ako ta ista premenna.
typy, deklaracie:
INTEGER - cele cisla
REAL - realne cisla (presnost 6-8 des. miest (MZOI))
DOUBLE PRECISION- dvojnasobna presnost (oproti REAL) (MZOI)
CHARACTER*N - znakova premenna dlzky N
COMPLEX - komplexne
LOGICAL - logicke hodnoty
V casti "opisy" kazdeho programu je potrebne deklarovat typy premennych, ak
nesplnaju implicitnu konvenciu, ktora vravi, ze ak nie je povedane inak,
premenne zacinajuce pismenami IJKLMN su INTEGER, ostatne REAL.
Napr. IPOCET je integer, POCET je real.
CHARACTER*10 znak - deklaruje 10-znakovu premennu znak
LOGICAL AKO_JE_TO - deklaruje log. premennu, ktora moze mat
hodnoty .TRUE. alebo .FALSE.
INTEGER AB,CD,EF - celociselne budu premenne AB, CD, EF
REAL IJ,KL,MN - realne budu od teraz IJ, KL, MN - teda
napriek implicitnej konvencii
------------------------------------------------------------------------------
6; Indexovane premenne - polia.
Tieto premenne musia byt zadimenzovane - t.j. oznacena ich max. mozna dlzka,
a to nasledovne:
DIMENSION A(10),B(100,100)
oznacuje ze premenna A je jednorozmerna s 10 "chlievikmi", B je 2 rozmerne
pole so 100x100 "polickami".
Dimenzovanie je mozne priamo pri deklaracii, a to napr.:
REAL A(100),B(100,100)
CHARACTER*10 ZNAK(123,321)
kde posledny riadok deklaruje znakove pole 123x321 okienok, kde v kazdom
moze byt 10 znakov.
------------------------------------------------------------------------------
7; Jednoduche prikazy.
- priradenie: =
A=B znaci ze do premennej A bola priradena hodnota premennej B
(ktora zostala nedotknuta)
A=3 - do Acka sa priradi celociselna 3
A=3. - takto sa priradi realna trojka
- skok: GO TO navestie
navestie je cislo, vyskytujuce sa niekde v programe
(v stlpcoch 1-5)
- tvorba vyrazov - z premennych, konstant a operatorov:
+-*/ a **, co je umocnovanie
napr. T=A*(C+D/E)+G**Q
- niektore zabudovane funkcie:
SIN(x), COS(x), TAN(x) je snad jasne
SQRT(x) - odmocnina
EXP(a) - e umocnene na a
ABS(x) - absolutna hodnota
INT(X) - cela cast
RAN(X) - nahodne cislo z <0,1), X je inicializacia generatora
(INTEGER, napr. 3465)
------------------------------------------------------------------------------
8; Podmieneny prikaz.
IF (log. vyraz) prikaz - pozor, len jeden prikaz !
napr.: IF(A .GT. B) GO TO 10
uplny tvar je naledovny:
IF(log. vyraz) THEN
prikazy1
ELSE
prikazy2
ENDIF
pricom prikazy1 sa vykonaju ak je log. vyraz pravdivy, prikazy2 ak je
nepravdivy; cast ELSE je samozrejme nepovinna, ENDIF naopak ano.
------------------------------------------------------------------------------
9; Cyklus.
DO nav premenna=N1,N2,N3
prikazy
nav posledny_prikaz
nav - navestie
posledny prikaz moze byt aj specialny prazdny prikaz CONTINUE
Zmysel je nasledovny - premenna nadobuda (celociselne) hodnoty od N1 do N2 s krokom N3 (ak
je N3 neuvedene, implicitne je 1), tolkokrat sa vykonaju prikazy.
napr.:
DO 666 I=1,10
J=J*J
666 CONTINUE
------------------------------------------------------------------------------
10; Podprogram. /formalna struktura bola vyssie/
Z hlavneho prog., ci ineho podprog. ho volame:
CALL meno(parametre)
napr.: CALL VYPOCET(A,B,CHAR)
------------------------------------------------------------------------------
11; Funkcia. /formalna struktura bola vyssie/
Sluzi na vypocet zvacsa jednej hodnoty, napr. v programe mam volanie takto:
A=MOJ_SINUS(X)
kde funkcia je definovana takto:
REAL FUNCTION MOJ_SINUS(A)
MOJ_SINUS=SIN(A)*SQRT(A)
RETURN
END
Retazec oznacujuci nazov funkcie je pouzity ako premenna a nadobudne hondotu
pravej strany a pouzije sa v prog. module odkial bola funkcia volana.
------------------------------------------------------------------------------
11; Priklad FORTRANovskeho programu - z neho sa clovek nauci najlepsie:
PROGRAM MY_FIRST
C******************************************************************************
C --- PROGRAM ROBI NASLEDOVNE:
C NACITA TEXT - A VYPISE HO ZVOLENY POCET KRAT /POCET OPAKOVANI/
C A TOTO VSETKO NIE RAZ ALE TOLKO KRAT KOLKO MU NA ZACIATKU ZADAME /POCET
C CYKLOV/
C ZADANE VELICINY SI PAMATA, VYUZIVA PODPROGRAMY A FUNKCIE
C******************************************************************************
C --- NAJPRV OPISY ---
CHARACTER*10 CHAR(100)
INTEGER COUNT(100)
COMMON/ALL/CHAR,COUNT,N
C --- KONIEC OPISOV ---
C --- SAMOTNY PROGRAM ---
WRITE(*,*)'ZADAJ POCET CYKLOV'
READ(*,*)N
CALL NACITAJ
CALL VYPIS
STOP
END
C --- NACITAVACI PODPROGRAM ---
SUBROUTINE NACITAJ
CHARACTER*10 CHAR(100)
INTEGER COUNT(100)
COMMON/ALL/CHAR,COUNT,N
DO 10 I=1,N
10 READ(*,100)CHAR(I)
100 FORMAT(1A10)
RETURN
END
C --- V TOMTO PODPROGRAME SA VSETKO VYPISE ---
SUBROUTINE VYPIS
CHARACTER*10 CHAR(100)
INTEGER COUNT(100)
C --- TENTO OPIS DEKLARUJE PREMENNU-FUNKCIU AKO ZNAKOVU ---
CHARACTER*10 DODAJ_TEXT
COMMON/ALL/CHAR,COUNT,N
C--- A TENTO JU DEFINUJE AKO EXTERNU - CIZE NACHADZAJUCU SA MIMO
C TOHTO PROGRAMOVEHO MODULU
EXTERNAL DODAJ_TEXT
DO 10 I=1,N
DO 11 J=1,COUNT(I)
WRITE(*,*)DAJ_TEXT(I)
11 CONTINUE
10 CONTINUE
RETURN
END
C --- FUNKCIA DOAVAJUCA TEN SPRAVNY TEXT ---
CHARACTER*10 FUNCTION DODAJ_TEXT(INDEX)
CHARACTER*10 CHAR(100)
INTEGER COUNT(100)
COMMON/ALL/CHAR,COUNT,N
C --- TU SA UDEJE SAMOTNE NAJDENIE TEXTU ---
DODAJ_TEXT=CHAR(INDEX)
RETURN
END