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