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