Sunteți pe pagina 1din 145

INIIERE N

PROGRAMARE I
N LIMBAJULFORTRAN
Zsongor F. GOBESZ Ciprian BACOIU
U.T.PRES
I
N
I

I
E
R
E

N
P
R
O
G
R
A
M
A
R
E

N
L
I
M
B
A
J
U
L
F
O
R
T
R
A
N

Zsongor F. GOBESZ Ciprian BACOIU












I
I
I
N
N
N
I
I
I

I
I
I
E
E
E
R
R
R
E
E
E

N
N
N


P
P
P
R
R
R
O
O
O
G
G
G
R
R
R
A
A
A
M
M
M
A
A
A
R
R
R
E
E
E

I
I
I

N
N
N


L
L
L
I
I
I
M
M
M
B
B
B
A
A
A
J
J
J
U
U
U
L
L
L


F
F
F
O
O
O
R
R
R
T
T
T
R
R
R
A
A
A
N
N
N





















Editura U.T. PRES
Cluj-Napoca, 2003






Aceast carte se adreseaz n primul rnd studenilor Colegiilor de Construcii i Instalaii
din cadrul Universitii Tehnice din Cluj-Napoca. Ea poate fi util ns n egal msur
tuturor celor care doresc s se iniieze n limbajul de programare Fortran.

Coninutul crii a fost selectat judicios, astfel nct pe lng caracterul didactic specific s
prezinte i un pronunat caracter practic aplicativ i s nu necesite cunotine iniiale
speciale din partea cititorului, n domeniul utilizrii calculatoarelor personale. La elaborarea
lucrrii s-a avut n vedere accesibilitatea unor instrumente informatice cu licen gratuit i
perspectiva utilizrii limbajului Fortran la rezolvarea problemelor tehnico-tiinifice din
domenii diverse. Exemplele sunt numeroase i sugestive, din cele mai diferite domenii, n
general simple, spre a fi accesibile studenilor din anii mici de studiu i vizeaz, pe lng
fixarea i adncirea treptat a cunotinelor necesare programrii, formarea unei gndiri
analitice, de alegere i formulare adecvat a algoritmilor de calcul. Spre deosebire de alte
lucrri similare, s-a urmrit ca n cadrul acestui volum s fie prezentate unitar majoritatea
aspectelor principale legate de realizarea programelor n limbajul Fortran. Prezentarea
teoretic succint mpreun cu exemplele tratate ajut dup prerea noastr la fixarea
temeinic a cunotinelor i fac ca aceast carte s fie util i acelora care prin autoinstruire
doresc s se iniieze n programarea calculatoarelor.

Cele 6 capitole ale crii trateaz urmtoarele aspecte:
n capitolul 1 cititorul este iniiat n evoluia sistemelor automate de calcul, a nivelelor de
comunicare om-calculator.
Capitolul 2 este consacrat prezentrii rolului i modului de alctuire a algoritmilor precum
i a ctorva dintre instrumentele utilizate pentru descrierea acestora.
n capitolul 3 se prezint sintaxa i semantica limbajului Fortran 77 ntr-o form sintetic,
considerat util pentru realizarea aplicaiilor de tip consol.
Capitolul 4 trateaz diferenele specifice ale limbajului Fortran 90 fa de Fortran 77,
punctnd facilitile i avantajele aprute prin evoluia limbajului, ns fr pretenia de a
constitui o referin complet. Multe dintre aceste noi caracteristici sunt ilustrate prin
exemple simple i sugestive, din considerente practice.
Capitolul 5 este destinat prezentrii sumare a compilatorului GNU Fortran 77 (g77), cel
mai cunoscut i mai accesibil compilator la ora actual.
Capitolul 6 conine exerciii (exemple complete i comentate) de dificulti gradate.
Soluiile propuse au fost testate cu ajutorul compilatorului g77, din acest motiv conin i
cteva faciliti noi ntlnite n Fortran 90 i acceptate de acest compilator.

n ncheiere, dorim s mulumim att membrilor de familie ct i prietenilor, colegilor de la
Facultatea de Construcii care ne-au susinut i sprijinit n elaborarea acestei lucrri.

Aprilie 2003,
Cluj-Napoca Autorii
PREFA


CAPITOLUL 1: INTRODUCERE
1.1

NOIUNI DESPRE CALCULATOARE I PRELUCRAREA
DATELOR
7
1.2 EVOLUIA LIMBAJ ELOR DE PROGRAMARE 11
1.3 NOIUNI REFERITOARE LA REPREZENTAREA DATELOR 14
1.4 NOIUNI REFERITOARE LA PROGRAME 16

CAPITOLUL 2: ALGORITMI
2.1 NOIUNI DESPRE ALGORITMI 21
2.2 TEHNICI I INSTRUMENTE DE REPREZENTARE 22
2.2.1 Limbajul natural structurat 22
2.2.2 Pseudocodul 24
2.2.3 Tabele de decizie 24
2.2.4 Arbori de decizie 26
2.2.5 Scheme logice 26
2.2.6 Diagrame de structur (de tip J ackson) 29
2.2.7 Alte instrumente 30
2.2.8 Structurile de control primitive (de tip Dijkstra) 31

CAPITOLUL 3: FORTRAN 77
3.1 SCRIEREA PROGRAMELOR N LIMBAJ UL FORTRAN 33
3.2 EXPRESII N FORTRAN 34
3.3 INSTRUCIUNILE LIMBAJ ULUI DE PROGRAMARE FORTRAN 77 38
3.4 DESCRIPTORII DE INTRARE/IEIRE 64
3.5 FUNCIILE INTRINSECI DIN FORTRAN 77 66

CAPITOLUL 4: FORTRAN 90
4.1 TRECEREA DE LA FORTRAN 77 LA FORTRAN 90 71
4.1.1 Compilatoare 72
4.1.2 Diferene formale 73
4.1.3 Specificri noi 73
4.2 STRUCTURI DE CONTROL NOI, INTRODUSE N FORTRAN 90 75
4.3 TABLOURI DE DATE 77
4.4 ALOCAREA DINAMIC A MEMORIEI 80
4.5 MODULE I INTERFEE 82
4.6 PROCEDURI N FORTRAN 90 85
4.7 STRUCTURI DE DATE, TIPURI DERIVATE 86
4.8 INTRRI I IEIRI 89
4.9 TRATAREA IRURILOR DE CARACTERE 92
4.10 POINTERI 93
4.11 ALTE ASPECTE 95
4.11.1 Funcii intrinseci i faciliti noi 96
4.11.2 Subprograme predefinite 97
4.11.3 Aspecte legate de evoluia limbajului 97
CUPRINS

CAPITOLUL 5: G77
5.1 COMPILATORUL GNU FORTRAN 77 99
5.2 COMPILAREA CU G77 100
5.3 BIBLIOTECI PENTRU G77 102

CAPITOLUL 6: EXERCIII
6.1 EXERCIII ELEMENTARE INTRODUCTIVE 103
6.2 EXERCIII CU EXPRESII ARITMETICE 107
6.3 EXERCIII CU TABLOURI DE DATE 110
6.4 EXERCIII CU SUBPROGRAME 124
6.5 EXERCIII CU INTRRI/IEIRI FOLOSIND FIIERE 130
6.6 EXERCIII DIVERSE 135
6.7 ANEXE 137

BIBLIOGRAFIE 143









- 7 -


1.1 NOIUNI DESPRE CALCULATOARE I PRELUCRAREA DATELOR
Oamenii au fost fascinai probabil dintotdeauna de capacitatea de lucru a mainilor. Este
evident c din aceast cauz exist o dorin profund pentru crearea acestora. Dac privim
napoi n istoria tehnicii, de la mecanismele vechi (cum ar fi scripetele, cntarul etc.) pn
la sistemele cele mai noi (cum ar fi digitizoarele, echipamentele de comunicaii etc.)
ntotdeauna au existat ncercri pentru copierea i reproducerea unor soluii naturale prin
mijloace artificiale. Un farmec aparte caracterizeaz tentativele de imitare ale unor
capaciti umane sau realizarea unor instrumente pentru extinderea acestor capaciti (de
exemplu celebrul i misteriosul juctor automat de ah, realizat de Kempelen). Versiunile
moderne ale acestora se refer la roboi, androizi i alte caracteristici tiinifico-fantastice
(de la Frankenstein la Star Trek). n planul tiinelor teoretice, filozofii din Grecia antic au
propus deja crearea unor mecanisme formale bazate pe logic. Cteva variante, realizate n
cursul timpului, au la baz construcia unor modele de raionare mecanizat. Un exemplu n
acest sens ar putea fi maina construit de Ramon Lull din Spania, pentru demonstrarea
existenei lui Dumnezeu. Lull a folosit caractere ca simboluri pentru reprezentarea
cuvintelor (i a argumentelor), precum i combinaii ale acestora pe baza unui sistem de
reguli. Dup cum reiese din descrieri, la baza acestui sistem a stat o schem mecanic prin
care era posibil realizarea unei varieti de figuri geometrice care, dac erau micate unele
fa de altele, determinau noi argumente logice. Sistemul conceput de Lull a fost limitat de
stadiul de dezvoltare al geometriei tridimensionale prin numrul operaiilor geometrice
posibile. Asemenea invenii rmneau de multe ori secrete sau ajungeau s fie privite ca
nite jucrii interesante.

O main ce poate manipula simboluri este i calculatorul. Principala virtute a acestuia este
viteza de operare (numrul ridicat de operaii realizate ntr-un interval scurt de timp).
Utilizarea eficient a acestor echipamente este posibil prin programarea lor, transpunnd
astfel gndirea omului n aceste maini. Folosirea sistemelor de calcul s-a extins astfel de la
aplicaiile contabile, financiar-bancare, pn la aplicaiile inginereti, de la recunoaterea i
sinteza sunetelor pn la modelarea virtual. Electronica i informatica, tehnicile de calcul
i automatizrile, sistemele de comunicaii sunt domenii care fac parte din viaa noastr
cotidian. Mai mult chiar, dezvoltarea acestor domenii a devenit o necesitate pentru modul
n care se msoar azi progresul societii umane. La actualul grad de dezvoltare al tiinei
i tehnicii volumul informaiilor a crescut foarte mult i continu s creasc n ritm
accelerat. Cantitatea de informaii ce intervine n caracterizarea unui fenomen depinde pe
de o parte de complexitatea acestuia, iar pe de alt parte de profunzimea cu care el trebuie
cunoscut. n marea lor majoritate fenomenele sunt complexe i se urmrete descrierea lor
ct mai exact. Pentru a putea manevra informaiile, acestea trebuie modelate. Informaia
este constituit prin juxtapunerea de simboluri grupate convenional pentru a reprezenta
evenimente, obiecte, idei i relaii ntre aceste diverse elemente. Modelul manevrabil al
informaiilor considerate elementare poart denumirea generic de date. Conform celor
enunate mai sus, este necesar deci s se prelucreze un volum mare de date.

CAPITOLUL 1: INTRODUCERE
- 8 -
Pentru unele procese apar n plus condiii legate de precizia calculelor. Ca atare, de cele mai
multe ori trebuie s se lucreze cu multe cifre semnificative, volumul calculelor crescnd
astfel. De asemenea, timpul afectat rezolvrii problemelor, orict de complexe ar fi acestea,
este limitat. Toate acestea atest utilitatea folosirii calculatoarelor care concomitent cu
viteza mare de calcul pot asigura i precizii de calcul care satisfac exigenele, oferind o
productivitate mrit. Totodat ele preiau o nsemnat parte din eforturile intelectuale
necesitate de efectuarea calculelor, ceea ce permite concentrarea acestor eforturi asupra
muncii de creaie. Paradoxal ns, prin volumul mare de calcule crete i efortul necesar
stpnirii problemelor abordate i rezolvate, prin interpretarea corespunztoare a volumului
crescut de rezultate. Deci n prezent, direct sau indirect, mijloacele moderne de calcul
contribuie din plin la orice realizare a tiinei i tehnicii, n tot mai multe sectoare de
activitate devenind nerentabil izolarea de calculator.

Cele de mai sus constituie o explicaie a avntului extraordinar pe care informatica l-a
nregistrat n ultimele decenii. Prin informatic (neologism creat n 1962 prin alturarea i
juxtapunerea parial a cuvintelor informaie i automatic) se nelege n general tehnica
prelucrrii automate i raionale a informaiei, suportul cunotinelor i al modului de
comunicare uman. Avnd n vedere cantitatea i complexitatea informaiilor, putem afirma
c mnemonica informatica acoper o arie larg a tehnicilor i metodologiilor legate de
punerea n funciune a dispozitivelor complexe reprezentate de calculatoare i sisteme
informatice. Informatica se ocup att de natura informaiei (care-i servete drept materie
prim) ct i de metodele care permit tratarea i prelucrarea lor, precum i de mijloacele
care pot fi puse n funciune pentru efectuarea concret a acestei prelucrri. Domeniile de
aplicare ale informaticii se regsesc n toate sferele de activitate ale lumii contemporane.

La culegerea i prelucrarea automat a datelor, un rol deosebit este jucat de erorile ntlnite.
Chiar dac acestea nu pot fi eliminate n totalitate, recunoaterea, stpnirea i limitarea
acestora are un rol important din perspectiva rezultatelor urmrite. Exist trei categorii de
erori ce nu pot fi eliminate, din acest motiv necesit o atenie deosebit pe parcursul tratrii
datelor:
1. Erorile inerente care in de instrumentele de msur utilizate la achiziionarea datelor.
Aceste instrumente dispun de anumite caracteristici legate de natura, alctuirea i
funcionarea lor. Indiferent dac este vorba de un liniar simplu sau de un instrument
optic de mare precizie, va exista o eroare la citirea datelor msurate, din cauza grosimii
fizice a gradaiilor i ale reperelor utilizate.
2. Erorile de metod se datoreaz modului de selectare a algoritmilor i procedeelor de
prelucrare. Pentru aceeai problem se pot alege mai multe abordri, mai multe metode
de rezolvare. Unele dintre aceste metode pot fi mai exacte dect altele, ns aplicarea
unor metode indirecte va conduce inevitabil la considerarea unor tolerane n funcie de
raportul de rentabilitatate generat de costuri i rezultate.
3. Erorile de calcul se nasc din modul de reprezentare valoric a datelor i rezultatelor.
Spaiul fizic utilizat ca memorie pentru reprezentarea valorilor numerice fiind limitat,
vor apare inevitabil trunchieri i rotunjiri.
- 9 -
Din punctul de vedere al clasificrii calculatoarelor putem vorbi de trei clase mari:
1. Calculatoarele numerice (cifrice sau digitale) prelucreaz cantiti sau mrimi discrete
reprezentate prin valori cu un numr finit de cifre de reprezentare semnificative.
Avantajele principale ale acestor calculatoare constau n universalitatea utilizrii,
precizia ridicat a soluiilor i adaptabilitatea structurii graie modulrii (n funcie de
complexitatea problemei de rezolvat). Calculatoarele personale fac parte din aceast
categorie.
2. Calculatoarele analogice opereaz cu mrimi ce pot varia continuu. Aceste
calculatoare au un domeniu mai limitat de aplicare (din motive tehnologice) i se
folosesc mai ales la rezolvarea unor probleme fizice, care din punct de vedere
matematic se pot modela prin sisteme de ecuaii difereniale. Precizia soluiilor
furnizate de aceste echipamente este limitat de precizia cu care funcioneaz diferitele
componente ale calculatorului. Avnd n vedere c multe probleme ale mecanicii
construciilor se pot modela matematic prin sisteme de ecuaii liniare (sau difereniale),
au fost realizate n diferite ri i calculatoare specializate pentru rezolvarea unor
asemenea probleme, dar avnd un domeniu restrns de aplicare nu au putut concura
calculatoarele numerice universale.
3. Calculatoarele electronice mixte (hibride) rezult de fapt din asocierea celor dou clase
precedente cumulnd avantajele lor.
n cele ce urmeaz ne vom referi doar la calculatoarele numerice (nespecializate). Apariia
i dezvoltarea calculatoarelor electronice este de un dinamism de-a dreptul exploziv. Pentru
a marca din punct de vedere constructiv progresele nregistrate n aceast ramur a tiinei
i tehnicii, perioada scurs din anul 1946 (cnd a aprut ENIAC, primul calculator
electronic) i pn n prezent, a fost mprit n etape, fiecare reprezentnd o generaie de
calculatoare.

Calculatoarele din prima generaie (19461953) aveau urmtoarele caracteristici
principale:
utilizau tuburi electronice;
aveau numai memorie intern cu o capacitate redus;
pentru introducerea datelor i extragerea rezultatelor utilizau de regul band
perforat;
efectuau un numr de cteva sute pn la cteva mii de operaii elementare pe
secund;
scrierea programelor se fcea numai n cod main (sau prin conectic), totui
conceptele de asamblor i subprogram sunt deja folosite;
sigurana n funcionare era redus (a se vedea i originea termenului debugging:
depanare prin eliminarea insectelor atrase de lumina tuburilor electronice
noiunea a fost consacrat prin nsemnrile de ntreinere ale calculatorului Mark
I de la universitatea Harvard).

- 10 -
Dup 1953 apar calculatoarele din generaia a doua, cu urmtoarele caracteristici:
tuburile electronice sunt nlocuite cu tranzistori i se folosesc circuite imprimate;
n afara memoriei interne (mai extinse dect la generaia precedent) apare i
memoria extern (banda magnetic);
viteza de operare crete (sute de mii de operaii elementare pe secund);
elementele periferice se dezvolt foarte mult (pentru introducerea informaiei se
utilizeaz cartele perforate dar i benzi magnetice, la extragerea rezultatelor se
folosesc imprimante rapide),
apar limbajele de programare de nivel ridicat, asociate noiunii de macro-
asamblor;
apar noiunile de hardware (ansamblul fizic al circuitelor logice ale
calculatorului) i software (ansamblul programelor de deservire i operare livrate
odat cu calculatorul).

Calculatoarele din generaia a treia apar dup 1964 cnd firma IBM (International Business
Machines) lanseaz calculatoarele din seria 360. Ele utilizeaz circuite miniaturizate, au
memorii perfecionate, rapide, partea de software mbogindu-se foarte mult. Limbajele de
programare se profileaz pe tipuri de probleme, apare noiunea de programare structurat.
La calculatoarele din generaia a treia:
apar concepii noi n exploatare ca: multitasking (executarea simultan
ntreesut a mai multor programe), regimul time-sharing (utilizarea aceluiai
calculator de ctre mai muli beneficiari simultan, prin acordarea de trane de
timp succesive fiecruia, astfel nct un beneficiar s nu blocheze n exclusivitate
calculatorul);
ncep s fie folosite circuitele integrate (cu 310 circuite active/modul);
apar sisteme elaborate pentru gestiunea fiierelor.

ncepnd cu anul 1968 se vorbete deja de generaia a patra de calculatoare. Se
consemneaz perfecionri tehnologice nsemnate n construcia memoriilor interne i
externe, precum i n evoluia perifericelor. Aceste calculatoare utilizeaz circuite integrate
cu un grad ridicat de integrare, cunoscute sub denumirea generic de chip-uri sau
microchip-uri, numrul circuitelor active pe modul fiind foarte ridicat. Paii fcui ctre
circuitele VLSI (Very Large Scale Integration) au asigurat capacitatea de prelucrare
necesar construirii calculatoarelor personale, care reprezint o parte din calculatoarele din
a patra generaie. Aceste aparate sunt de dimensiuni reduse, fiind eficiente i ieftine.
Deoarece nu necesit condiii ambientale speciale, ele pot fi amplasate pe un birou, n
locuine sau la diverse puncte de lucru, de exemplu n instituii, n magazine, la ieirea din
supermarket (n ghieul de cas), n hale de producie, pe antiere etc. Paralel cu
dezvoltarea aparatelor de dimensiune redus a crescut numrul programelor i aplicaiilor
de utilizare ce se pot rula pe asemenea calculatoare. Printre acestea se gsesc jocuri,
editoare de texte, tabele de calcul, pachete pentru gestionarea bazelor de date, programe
grafice, programe de comunicare etc. Aceste calculatoare nu mai sunt cumprate,
programate i controlate doar de ctre specialiti i administratori de sisteme. Ele se afl
deja, n sensul adevrat, la ndemna utilizatorilor.
- 11 -
De la mijlocul anilor 1980 se poate vorbi i de calculatoare din generaia a cincea, un
concept revoluionar introdus de fapt de ctre japonezi, concept ce prevedea realizarea unor
echipamente de calcul prin regndirea ndrznea a tehnologiilor i arhitecturilor existente.
Elaborarea acestui concept a fost posibil datorit dezvoltrii tehnologice coroborate cu
rezultatele cercetrilor n domeniul inteligenei artificale. Pn n prezent ns, raiunile
economice, dirijate i de cerinele pieei, precum i valoarea investiiilor existente deja n
domeniul produciei de componente i de calculatoare au frnat i au deturnat oarecum
generalizarea pe aceast direcie de dezvoltare.

Calculatoarele timpurii nu erau prea performante, posibilitile lor de aplicabilitate erau
destul de restrnse, dar s-au ntmplat dou lucruri. n primul rnd calculatoarele personale
au devenit din ce n ce mai eficiente, au devenit adecvate pentru rularea unor limbaje de
programare cu apetit mare de memorie. Utilizarea discurilor cu suprafee magnetice pe post
de memorie a realizat accesul aparent instantaneu la cantiti foarte mari de date. Pe de alt
parte, calculatoarele personale pot fi conectate n reele, realiznd astfel posibilitatea
conversrii nemijlocite ntre oameni de afaceri, proiectani etc., respectiv posibilitatea
comunicrii cu un calculator central care poate oferi resurse extinse.

Evoluia tehnologic a determinat deci schimbri importante n poziia i rolul
calculatoarelor n cadrul organizaiilor. La nceput ele erau centralizate n mare msur i
erau folosite pentru rezolvarea unui numr restrns de probleme (de exemplu pentru
realizarea evidenelor de salarizare). Dezvoltarea tehnologiei s-a materializat n calculatoare
cu dimensiuni reduse, ieftine, performante, care puteau fi amplasate pe birouri. Conform
unei analize efectuate n anul 1992 s-a demonstrat c dac automobilele RollsRoyce s-ar fi
dezvoltat n aceeai msur ca i calculatoarele, atunci ele ar fi consumat doar 3 litri de
combustibil pentru a parcurge 1000 de km cu o vitez normal de 800 km/h, preul lor ar
fi cobort sub 5 lire sterline, iar dup gabaritul atins ar fi ncput ntr-o cutie de chibrituri.
Nu se tie ns, cine ar fi avut nevoie de asemenea automobile


1.2 EVOLUIA LIMBAJELOR DE PROGRAMARE
S-a artat c la nceput, la calculatoarele din prima generaie, s-a utilizat programarea
numeric n cod main (binar) ceea ce reprezenta o operaie greoaie, necesitnd cunotine
asupra particularitilor echipamentelor, antrennd i o probabilitate considerabil de a
introduce erori n program. Pentru a scpa de inconvenientele acestei metode au fost
elaborate limbaje simbolice simple. Acestea conineau de fapt o serie de mnemonice
derivate din limba englez, de genul ADD (adun), MUL (nmulete) etc., alctuind un
limbaj asamblor legat de main i necesitnd traducerea n cod main. Prin introducerea
macro-instruciunilor au aprut limbajele simbolice evoluate. O macro-instruciune
corespundea la mai mult dect o operaie cunoscut (executat) de calculator, fiind nlocuit
n momentul traducerii cu seria de instruciuni main corespunztoare. Timpul alocat
scrierii programelor i implicit i riscul de a grei s-a redus astfel considerabil. Programul
traductor al acestor limbaje se numea autocodificator. Limbajele asamblor cu autocodifica-
tor au coexistat n perioada 19581964, dar s-au folosit i ulterior la programarea
- 12 -
calculatoarelor din generaia a treia cu meninerea denumirii unificate de limbaj asamblor
(sau limbaj macroasamblor).

Un salt calitativ n domeniul limbajelor de programare l constituia apariia limbajelor
algoritmice (sau limbaje procedurale) nelegate de calculator. De fapt independena nu era
total, fiind necesare mici corecturi, adaptri, funcie de particularitile calculatoarelor
utilizate, aceste modificri nefiind ns eseniale ca volum. Ca orice limbaj, i cele
algoritmice (procedurale) se caracterizeaz printr-un vocabular i prin reguli de sintax.

Vocabularul este alctuit dintr-un ansamblu de cuvinte cheie (preluate i adaptate de regul
din limba englez), iar numele variabilelor sunt date de programator (respectnd anumite
reguli). Limbajele algoritmice permit scrierea algoritmilor dup care urmeaz s fie
soluionat problema abordat, sub form de instruciuni (fraze cu un coninut semantic
bine precizat). Prin semantica limbajului se nelege ansamblul regulilor de coresponden
sau de interpretare corespunztoare cuvintelor cheie, respectiv grupelor (blocurilor) de
cuvinte cheie. Frazele limbajului (rndurile de instruciune) vor fi alctuite deci din
combinaii de cuvinte cheie i nume de variabile, dup anumite reguli. Sintaxa limbajului
stabilete combinaiile posibile de cuvinte cheie, nume de variabile precum i folosirea
punctuaiei.

Primul limbaj algoritmic de nivel nalt este considerat FORTRAN (denumirea provine de la
FORmula TRANslation system) aprut n 1954, ns merit s amintim i alte limbaje
consacrate de acest gen, cum ar fi COBOL (Common Business Oriented Language aprut
n 1959 ca urmare a dezvoltrii limbajelor B-O din 1957 i Flow-Matic din 1958, prima
standardizare fiind cea din 1961, derivat din CODASYL Conference on Data Systems
Language, 1959); ALGOL (ALGorithmic Language 1958, aprut pe baza limbajului
Fortran prin combinarea limbajelor JOVIAL, NELIAC, BALGOL i MAD) fiind limbajul
din care au fost dezvoltate ulterior limbajele CPL (predecesorul din 1963 al limbajului C
care a aprut n 1971), PL/I (1964), Simula (1964) Pascal (1970) etc.; sau BASIC
(Beginners All-purpose Symbolic Instruction Code 1964).

Paralel cu dezvoltarea limbajelor procedurale au aprut i primele limbaje funcionale de
programare. Structura acestora este oarecum detaat de noiunea convenional de algoritm
(n sensul utilizat la limbajele algoritmice), ea fiind ns mai apropiat modului uman de
gndire. Ca i reprezentare consacrat pentru aceast categorie trebuie s amintim limbajele
LISP (LISt Processing aprut n 1958) i PROLOG (PROgramming in LOGic aprut n
1970), existnd foarte multe variante ale acestora, pe lng alte limbaje funcionale noi.
Dei aceste limbaje sunt asociate n general cu cercetrile din domeniul inteligenei
artificiale, ele au aplicabilitate i n domeniul ingineriei.

Avnd n vedere c n rezolvarea unor categorii de probleme specifice anumitor domenii de
activitate se ntmpinau dificulti chiar utiliznd limbaje algoritmice avansate, orientate pe
sisteme, dificultile aprnd fie la introducerea datelor fie din folosirea unor cuvinte cheie
diferite de limbajul tehnic consacrat n domeniul respectiv, au fost dezvoltate limbaje (i
compilatoare) orientate pe problem. Astfel, n domeniul mecanicii construciilor pentru
- 13 -
determinarea eforturilor n structurile alctuite din bare s-a elaborat n S.U.A. limbajul
STRESS (STRuctural Engineering System Solver 1963), care s-a bucurat de o rspndire
larg, iar n 1966 a fost elaborat ICES (Integrated Civil Enginnering Systems), un sistem
integrat de rezolvare a problemelor de construcii care coninea urmtoarele limbaje
orientate pe probleme:
COGO (Coordinate GeOmetry) pentru rezolvarea problemelor geometrice,
STRUDL (STRUctural Design Language) pentru analiza i proiectarea
structurilor,
PROJ ECT (PROJect Evaluation and Coordination Techniques) pentru
problemele schirii, reele, drum critic etc.,
SEPOL (SEttlement Problem Oriented Language) pentru calcule de tasri n
mecanica solului,
ROADS (Roadway Analysis and Design System) pentru amplasarea, alinierea
drumurilor, rurilor etc.,
BRIDGE pentru analiza i proiectarea podurilor,
TRANSET (TRANSportation Evaluation Techniques) pentru analiza reelelor,
fluxurilor de transport.
Limbaje similare orientate pe probleme au mai fost elaborate i n alte ri. Preocupri n
aceast direcie i realizri remarcabile s-au obinut i la noi n ar. Amintind doar cteva
exemple specifice din domeniul analizei structurale: n cadrul C.O.C.C. Bucureti a fost
elaborat limbajul SISBAR (autor L. Dogaru) pentru analiza general a structurilor alctuite
din bare, iar n cadrul Universitii Tehnice din Cluj-Napoca a fost dezvoltat limbajul
SICAM (Sistem Interpretativ de Calcul Automat Matriceal, autor F. Gobesz) pentru analiza
structurilor n formularea matriceal.

Un salt calitativ considerabil n domeniul dezvoltrii limbajelor procedurale a reprezentat
apariia noiunii de orientare pe obiecte. Astfel, pe lng apariia unor limbaje noi, au fost
dezvoltate variante corespunztoare i n cadrul limbajelor existente i consacrate (Fortran
90, OO Cobol, C++, Borland Pascal etc.). Prin tendinele de detaare fa de varietatea
sistemelor de operare au aprut limbajele interpretate i script-urile (acestea nenecesitnd
compilatoare n sensul cunoscut, fiind convertite n cod main doar n momentul executrii
programului cu ajutorul unui sistem de interpretare specific sistemului de operare). Dintre
aceste limbaje merit s amintim J ava (aprut n 1995 din limbajul Oak care s-a nscut n
1991 din limbajele Cedar, Objective-C, C++i SmallTalk-80) respectiv J avaScript (aprut
n 1995 din LiveScript care la rndul lui a derivat din Cmm, acesta din urm dezvoltndu-se
din limbajul ISO C cunoscut i ca C90 respectiv din C++).

n cele ce urmeaz vom sintetiza istoria limbajului Fortran, avnd n vedere orientarea
acestei lucrri. Limbajul a aprut n noiembrie 1954, dezvoltarea lui fiind iniiat de ctre o
echip remarcabil de programatori de la IBM (sub conducerea lui J ohn Backus). Din anul
1957 se poate vorbi de limbajul i compilatorul Fortran I, destinate iniial calculatorului
IBM 704. Fiind primul limbaj algoritmic aprut, oferind o serie de avantaje fa de limbajul
de asamblare, a fost adoptat foarte repede de comunitile tiinifice din toate domeniile.
- 14 -
Acest succes a concurat la dezvoltarea fireasc a limbajului, aprnd variante ca Fortran II
n 1957, Fortran III n 1958, Fortran IV n 1962 precum i convertoare pentru a menine
compatibilitatea cu programele scrise n versiunile anterioare. n luna mai a anului 1962 a
devenit primul limbaj de nivel nalt standardizat oficial, iar n 1966 a fost adoptat primul
standard ANSI (American National Standards Institute) referitor la Fortran IV (acesta
primind denumirea oficial de Fortran 66 ANS). Aceast versiune a fost urmat de Fortran
V, respectiv de alte tentative de dezvoltare.

Pn la mijlocul anilor 1970 aproape toate calculatoarele mici i mari dispuneau de
compilatoare pentru Fortran 66, acesta fiind limbajul de programare cel mai rspndit. Cu
trecerea timpului i cu dezvoltarea limbajului, definiia standardizat a fost actualizat n
1978 (ANSI X3.9), ea fiind adoptat i de ISO (International Standardization Organiza-
tion) n 1980 ca norm internaional, aprnd astfel versiunea cea mai cunoscut a
limbajului, sub denumirea Fortran 77. Caracterul relativ conservator al acestui standard a
lsat limbajului un numr de faciliti ce preau din ce n ce mai depite de ctre noile
limbaje de programare aprute (unele derivate n parte chiar din Fortran), aa c n mod
firesc din anii 1980 s-a trecut la dezvoltarea acestuia (sub numele Fortran 8x). Dei limbaje
ca Algol, Basic, Pascal i Ada erau mai uor de nvat i de utilizat, ele nu se puteau
compara cu eficiena dovedit de Fortran n ceea ce privea viteza de calcul i compactitatea
codului generat.

A treia standardizare a limbajului Fortran s-a produs abia n 1991, versiunea limbajului
primind numele Fortran 90. Aceast ntrziere a dus la accentuarea competiiei n privina
popularitii limbajelor de programare, avnd efecte negative asupra limbajului Fortran.
Chiar adepi convini ai acestui limbaj au migrat ctre limbaje ca C sau C++, n ciuda lipsei
de performane n calcule ale acestora. Prin includerea complet a versiunii anterioare
(Fortran 77) alturi de noutile introduse, oferind flexibilitate i performane remarcabile,
noua versiune a limbajului Fortran a reuit s se impun n rndul programatorilor,
permind realizarea programelor n moduri adecvate mediilor moderne. Prin extinderea
limbajului n direcia procesrii paralele s-a standardizat HPF (High Performance Fortran)
n 1993. n anul 1996 s-a dat publicitii a patra standardizare a limbajului Fortran, acesta
primind numele Fortran 95, la care s-au adugat nc dou rapoarte tehnice elaborate sub
egida ISO. Ultima versiune a limbajului este cea din anul 2000, purtnd numele sugestiv
Fortran 2000.


1.3 NOIUNI REFERITOARE LA REPREZENTAREA DATELOR
Aa cum s-a menionat n primul capitol, datele reprezint modele manevrabile ale
informaiilor. Calculatoarele personale stocheaz aceste date pe medii magnetice i optice,
utiliznd structuri logice arborescente. Pentru a ne face o idee despre aceste structuri,
trebuie s lmurim cteva noiuni fundamentale.

Din motive tehnologice calculatoarele folosesc un set limitat de valori pentru reprezentarea
datelor. Unitatea elementar de memorie utilizat pentru date se numete bit. Aa cum un
- 15 -
magnet poate dispune de doi poli, un circuit electric poate avea curent sau nu, starea unui
bit poate fi notat cu dou valori distincte: 0 sau 1. Deoarece cele dou valori ofer o plaj
foarte limitat, aceste entiti elementare sunt grupate n octei (bytes), doi octei formnd o
entitate adresabil ce poart denumirea de cuvnt. Manevrarea teoretic a valorilor binare
fiind greoaie i consumatoare, se utilizeaz reprezentarea n cifre hexadecimale a acestora,
derivat din expresiile greceti hexa (6) i deca (10) care compuse, marcheaz numrul
aisprezece (16).
Tabel comparativ cu reprezentarea unor valori n sisteme de numrare diferite:
Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F
Binar (pe 4 bii) 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Privind tabelul de mai sus se poate observa uor faptul c pe un octet (pe opt bii) pot fi
reprezentate n sistemul binar dou cifre din sistemul hexadecimal, deci gruparea biilor n
octei nu este ntmpltoare. Astfel putem nelege de ce se consider mai comod utilizarea
cifrelor hexadecimale n locul celor decimale pe calculatoare. Cifrele decimale fiind de la 0
la 9, s-ar consuma cte 4 bii pentru reprezentarea uneia, combinaiile binare din plaja
10101111 fiind inaccesibile. Deci, dac am ncerca s reprezentm ntr-un octet (byte)
valorile prin cifre decimale, nu am putea scrie o valoare mai mare de 99, pierznd astfel
plaja valorilor dintre 100 i 255 (ceva mai mult de jumtatea numerelor reprezentabile).
Prin utilizarea sistemului hexadecimal putem reprezenta dou cifre pe un octet, deci patru
cifre pe un cuvnt (FFFF scris n hexa nsemnnd valoarea 65536 n sistemul decimal).
Dac se consider i noiunea de semn, atunci, n maniera anterior discutat, pe doi octei
pot fi reprezentate valorile corespunztoare unei notaii n sistemul decimal de la 65535
pn la +65535 (n acest caz FFFF scris n hexa va nsemna valoarea 1 n sistemul decimal
obinuit).

Pentru a putea manevra eficient datele, ele trebuie s fie grupate i adresabile. n acest sens
vom defini dou noiuni des ntlnite n utilizarea calculatoarelor:
1. Fiierul este o colecie organizat de date ce se trateaz uniform. (Dup prerea
autorilor, aceasta este cea mai scurt i cea mai pertinent definiie pentru asemenea
colecii, cuprinznd patru caracteristici eseniale: datele sunt coninute n fiiere, sunt
organizate, se pot efectua operaii asupra lor, toate datele dintr-un fiier pot suporta
aceleai operaii.)
2. Directorul (se utilizeaz i denumirile: folder, dosar) este o colecie de referine
organizate ce se trateaz uniform. Definiia este asemntoare cu cea a fiierelor, totui
exist diferene semnificative pe care le vom exemplifica n cele ce urmeaz.
Dac ne imaginm, pentru exemplificarea definiiilor anterioare, o cmar (pe post de
memorie de stocare) n care depozitm alimente (privite ca i date) i ambalaje, atunci
putem face urmtoarele analogii:
innd, de exemplu, mere ntr-o cutie, putem privi acea cutie ca pe un fiier de mere, iar o
alt cutie n care inem sticle goale, ca un fiier de sticle goale. Evident, att merele ct i
- 16 -
sticlele vor alctui colecii organizate (dupa forma cutiilor, dup legea gravitaiei etc.) care
pot suporta aceeai prelucrri. Chiar daca momentan nu avem mere n cutia respectiv,
cutia va fi tot un fiier de mere atta timp ct nu i se schimb caracteristicile, n acest caz
putnd vorbi despre un fiier gol de mere. Ceea ce este important de observat: cutiile pot
conine la nivel fizic entitile pentru care sunt destinate.
Dac dorim s avem o eviden referitoare la aceste cutii, vom nota ntr-un carneel numele
i poziia lor. Un asemenea carneel va conine astfel doar referine la cutii (la fiiere)
reprezentnd un director (folder sau dosar), fr a conine fizic cutiile (fiierele) respective.
Bineneles, un asemenea carneel poate conine i alte nsemnri, de exemplu referitoare la
alte carneele (n care sunt notate denumirile i poziiile altor cutii). Asemenea referine pot
fi percepute ca i subdirectoare. Prin acest mod de eviden se poate crea o structur
arborescent similar cu cea existent n mediile de stocare ale datelor.

Interfeele utilizator ale sistemelor de operare pot induce neclariti referitoare la aceste
concepte, sugernd prezena fizic a fiierelor n directoare pentru a simplifica operaiile.
De cele mai multe ori, tergnd o nregistrare se va obine de fapt marcarea special a
acesteia (referina devine ascuns iar zona alocat se poate suprascrie) i nu tergerea fizic.

Fiierele pot fi de tipuri diferite, n funcie de coninutul lor. Ele sunt mprite de regul n
dou categorii mari: fiiere cu caractere afiabile i fiiere cu coduri neimprimabile (dac
merele se pot mnca, ncercarea de a consuma sticle goale poate avea urmri imprevizibile).
Fiierele cu coduri neimprimabile pot fi executabile sau nu. n cazul n care ele sunt
executabile, poart numele generic de program sau de comand extern (comenzile interne
sunt cele coninute de programele ncrcate n memoria intern a calculatorului). Un caz
particular este reprezentat de fiierele cu caractere afiabile care sunt executabile (de
regul acestea sunt interpretate). Acestea conin de fapt linii de comenzi ntr-o succesiune
secvenial i poart denumirea generic de fiiere de comand.


1.4 NOIUNI REFERITOARE LA PROGRAME
n capitolul anterior am dat o definie pentru noiunea de program, din punctul de vedere al
fiierelor. Programul poate fi definit i ca mulimea comenzilor (instruciunilor)
selecionate de ctre programator din mulimea de instruciuni puse la dispoziie prin
platforma de calcul. n cele ce urmeaz vom discuta i alte aspecte legate de aceast
noiune.
Se tie foarte bine c dac pentru soluionarea unor probleme dintr-un domeniu limitat
dispunem de o descriere clar i bine definit a procedurii de rezolvare, atunci aceast
munc (n unele cazuri cu pronunat caracter repetitiv) poate fi ncredinat unui sistem
automat de calcul. Cele mai multe programe sunt scrise sub forma unor algoritmi, acestea
coninnd practic lista instruciunilor n ordinea corespunztoare executrii lor de ctre
calculator. De cele mai multe ori un asemenea algoritm utilizeaz i date care sunt
organizate ntr-o anumit form, n fiiere separate, externe. Programul de calculator poate
fi privit astfel i ca un pachet alctuit din date +algoritm.
- 17 -
De exemplu, un program pentru calculul salariilor poate fi descris n felul urmtor: caut
prima persoan din nregistrri, citete salariul brut al persoanei gsite, determin treapta de
impozitare n care se ncadreaz, calculeaz impozitul, caut toate celelalte sczminte
(contribuii la fonduri de asigurri, cotizaii etc.) i determin salariul net. Toate aceste
elemente ajung sub o form prestabilit pe fluturaul de salarizare i pe statul de plat.
Dup prelucrarea datelor primului angajat, sistemul pentru calcularea salariilor continu
determinarea salariilor pentru ceilali angajai, indiferent dac numrul lor este de ordinul
zecilor sau al sutelor. Algoritmul nu se schimb la nici un angajat. Sistemele de acest gen se
bazeaz pe tehnica de calcul timpurie proiectat pentru rezolvarea problemelor numerice
repetitive, complet plictisitoare. Aplicaiile mai recente oglindesc deja i schimbrile
tehnologiei. Rspndirea utilizrii calculatoarelor personale a condus la apariia unor
aplicaii mai mici de salarizare, bazate pe tabele de calcul, care sunt compuse din iruri i
coloane de numere manipulate cu ajutorul sistemului de calcul. Pachetele de programe care
au fost vndute n numrul cel mai mare sunt tabelele de calcul i procesoarele de texte.
Oamenii ns nu folosesc numai cuvinte i cifre, ci manevreaz i o cantitate din ce n ce
mai mare de informaii referitoare la acestea. Acest fapt a condus la apariia i dezvoltarea
bazelor de date. Bazele de date nmagazineaz o cantitate enorm de informaii sub form
structurat, utilizatorul avnd acces la informaia dorit oricnd, n orice form dorit. Un
exemplu foarte bun pentru ilustrarea celor amintite poate fi o baz cu date despre angajaii
din cadrul unei firme. n structura bazei de date fiecrui angajat i corespunde un articol,
acesta coninnd informaiile utile referitoare la angajat, de exemplu: numele, adresa, data
naterii, salariul de ncadrare, locul de munc etc. Utilizatorul poate ntocmi, din
informaiile coninute de ctre baza de date (de regul prin folosirea unui limbaj de
interogare), o situaie pentru analiz despre angajai, ori de cte ori este nevoie. Poate
obine rapoarte de genul: lista angajailor cu salariul peste X lei, cu vechime peste Y ani, sau
domiciliai ntr-o anumit zon. Ceea ce putem obine din baza de date este limitat doar de
ctre informaia nmagazinat i de ctre limbajul de interogare.

Din cele prezentate mai sus se desprinde ideea c un pachet de programe poate avea o
alctuire complex. n aceast carte vom aborda doar realizarea unor aplicaii de tip consol
cu ajutorul limbajului Fortran i al compilatorului g77, fr a discuta despre conceperea i
generarea interfeelor grafice sau despre detaliile i specificitile caacteristice diverselor
sisteme de operare. Etapele de programare sunt n general sintetizate prin 3 faze: concepia
(nivelul logic de rezolvare a problemei cu elaborarea sau alegerea algoritmului
corespunztor), codificarea (transcrierea algoritmului ntr-un limbaj de programare,
accesibil calculatorului), testarea i implementarea (verificarea corectitudinii cu date de test
i punerea la punct a programului). Aceste faze pot fi realizate att ntr-o form empiric
ct i n manier structurat, mai eficient dect prima variant (permind dezvoltarea i
testarea modulat). Prefernd abordarea structurat, n locul celor 3 faze generice amintite
prezentm urmtoarea succesiune de etape, considerate necesare realizrii unui program:

recunoaterea i definirea problemei de abordat;
alegerea i descrierea metodei (algoritmului) de rezolvare;
scrierea sursei programului ntr-un limbaj de programare;
compilarea (traducerea n cod main a) sursei;
- 18 -
realizarea legturilor cu modulele de bibliotec ale mediului de programare;
rularea i testarea programului creat.

De ce sunt necesare asemenea etape de parcurs?

n primul rnd, fr recunoaterea problemei nu avem ce rezolva. Prin definirea problemei
se pot determina datele de intrare necesare i suficiente, precum i rezultatele urmrite a fi
obinute.

Aproape orice problem poate fi abordat i rezolvat pe mai multe ci. Exist o varietate
foarte mare de metode studiate i validate n diferite domenii, din aceast cauz doar rareori
se impune crearea sau inventarea unor metode complet noi. Alegerea unei metode trebuie
s in seama att de caracteristicile problemei, ct i de echipamentele i instrumentele
informatice accesibile programatorului, precum i de generalitatea i aplicabilitatea
soluiilor urmrite. Descrierea pertinent i clar a metodei permite i eliminarea unor erori
pe lng modularizarea procedeelor n vederea eficientizrii programrii. n general
metodele pot fi clasificate n dou categorii: metode directe i metode indirecte. Metodele
directe sunt cele care ne conduc la rezultat ntr-un numr finit de pai. Metode indirecte
sunt considerate cele care ar necesita parcurgerea unui numr infinit (mai corect nedefinit)
de pai pentru a obine un rezultat exact. Dei un numr infinit de pai nu pare o soluie
practic, sunt cazuri n care nu avem la ndemn dect asemenea metode. Ele se aplic prin
alegerea unor tolerane fa de rezultatul urmrit (prin aprecierea convergenei, limitarea
unor abateri etc.) ceea ce conduce la un numr necunoscut de pai, dar finit. Condiionarea
metodelor este un alt concept de care se ine seama la alegere. Sunt considerate bine
condiionate acele metode la care perturbrile mici n datele iniiale nu conduc la alterarea
deranjant a rezultatelor. Metodele n care perturbrile iniiale au ca efect deranjarea
rezultatelor, se consider slab condiionate i au de regul o aplicabilitate mai redus,
necesitnd un control mai strict al validrilor. Experiena i rutina sunt factori importani n
aceast etap.

Limbajul de programare i mediul n care se scrie sursa programului se recomand a fi
alese dup specificul problemei abordate i a metodei de soluionare pentru care s-a optat.
Sursa poate fi compus din mai multe uniti surs de program (uneori denumite module)
care pot fi redactate chiar utiliznd fiiere separate. Ea trebuie s fie conform rigorilor
impuse de limbajul de programare ales i de mediul de dezvoltare folosit (sistemul de
operare, mediul de programare etc.). n limbajul Fortran se poate creea doar un singur
program surs principal care poate fi combinat ns cu diverse subuniti de program
(blocuri de date, subprograme, funcii externe etc.) scrise chiar n fiiere separate.

Deoarece textul rezultat n urma scrierii sursei se materializeaz prin crearea unor fiiere cu
caractere afiabile (imprimabile) ce nu sunt interpretabile de ctre calculator, instruciunile
coninute vor trebui traduse n coduri nelese de main. Acest lucru este realizat prin
compilarea sursei, etap n care se poate face i verificarea sintaxei (verificarea semanticii
ns nu poate fi efectuat de compilator). O asemenea traducere ns nu realizeaz i
transformarea sursei n program (fiier executabil), crend doar imagini obiect ale surselor
- 19 -
(fiiere neexecutabile dar care conin coduri main). Fiierele cu date de intrare nu trebuie
compilate pentru c ele nu conin instruciuni ci doar valori ce vor fi utilizate ca atare,
independente de limbajul de programare utilizat.

Pentru a obine fiiere executabile (programe propriu-zise), trebuie prelucrate legturile
generate n cadrul imaginilor obiect, innd cont i de bibliotecile necesare. Acest lucru se
realizeaz de regul prin procedee automate ale mediului de dezvoltare ales, n urma
opiunilor exprimate de programator. Unele medii de dezvoltare ofer aceast facilitate n
mod transparent, aparent mpreun cu opiunea de compilare. n aceast etap este posibil
i definirea unei structuri prefereniale explicite a programului prin segmentare (stabilirea
succesiunii de ncrcare n memorie i a dependinelor modulelor create).

Rularea i testarea programului realizat, menionate ca etap final, sunt foarte importante
pentru verificarea performanelor obinute i a corectitudinii rezultatelor n diverse ipostaze.
Toate etapele descrise pot i se recomand a fi supuse unor rafinri sau unor abordri
repetitive n scopul depistrii i eliminrii erorilor posibile.

Ca orice proces de proiectare, conceperea i dezvoltarea aplicailor informatice se supune
unor reguli i se poate privi ca un ciclu. Din acest punct de vedere, orice asemenea
activitate presupune parcurgerea nu numai a unor etape fizice, ci i a unora logice, pe
niveluri i n planuri diferite:



















Pentru a putea altera situaia existent, avem nevoie de un model corespunztor. Prin
formularea acestuia putem determina schimbrile necesare. Prima etap va nsemna
delimitarea i msurarea caracteristicilor ntr-un plan fizic, din care prin abstractizare se va
nate un model logic. Intervenind asupra acestuia prin concepia schimbrilor propuse,
considernd i cerinele externe, se va obine un nou model logic, care la rndul su se va
MODEL FIZIC
EXISTENT
MODEL LOGIC
EXISTENT
MODEL FIZIC
NOU
MODEL LOGIC
NOU
Cerine
EXISTENT NOU
NIVEL:

LOGIC


FIZIC
PLAN:
- 20 -
transforma ntr-un model fizic nou. Deci, pornind de la o situaie existent, am ajuns la o
situaie nou. Caracterul ciclic al acestui proces este evident n acest moment, deoarece
situaia nou creat va deveni una existent (din momentul implementrii), care la rndul ei
va fi la un moment dat alterat printr-un proces similar.
Era o vreme cnd programatorii erau considerai artiti, i asta n principal datorit
manierelor personale de lucru. Trecerea i n acest domeniu de la artizanat la industrializare
a constituit o constrngere, derivnd arta scrierii aplicaiilor n tiina programrii. Aceast
transformare urmrea i trecerea de la microeficien la macroeficien n domeniu, ceea ce
a necesitat un compromis ntre resursele necesare (spaiu de memorie, timp de rulare,
costuri de realizare i de ntreinere) i fiabilitate. Toate acestea au condus n mod firesc
ctre modularitatea programelor i ctre principiile structurrii, din 1968 fiind recunoscut
i disciplina ingineriei de soft.

Bazele programrii structurate au fost enunate n 1969 de ctre Dijkstra (prin teorema de
structur), fiind aplicate pentru prima dat n cadrul corporaiei IBM la un proiect pentru
determinarea orbitelor definitive ale sateliilor teretri, cu un rezultat deosebit (n decursul a
6 luni s-a reuit de ctre Mills un superprogramator scrierea i validarea n limbajul
PL/1 a 50 de mii de instruciuni, ceea ce pna atunci reprezenta norma obinuit pentru 30
de oameni de-a lungul unui an).






- 21 -


2.1 NOIUNI DESPRE ALGORITMI
Un algoritm poate fi definit ca mulimea finit de reguli care indic o succesiune de operaii
pentru rezolvarea n mod mecanic (sau automat) a unui anumit tip de probleme. Principiile
de baz, valabile att la analiza/definirea unei probleme, ct i la celelalte etape de realizare
(prezentate n capitolul precedent) pot fi sintetizate n urmtorul mod:

Concepia la orice nivel prin descompunere toate metodele utilizate n mod
curent respect acest principiu, de exemplu: principiul KISS (Keep It Stupid
Simple) din metoda Yourdon, principiul proiectrii ierarhice din metoda
Constantine, principiul detaliilor din metoda Warnier, principiul primitivelor din
metoda Dijkstra etc.;
Realizarea analizei/concepiei prin descompunere (de sus n jos) combinat cu
recompunerea (de jos n sus) n faza de realizare;
Structura datelor determin structura prelucrrilor (aplicarea metodelor bazate pe
structuri de date);
Aplicarea unui proces iterativ de verificare (revenire, chiar cu rafinare dac se
impune) n toate fazele de elaborare a unui produs informatic.

n general se recomand utilizarea metodelor de programare modular i structurat.
Aceaste metode reprezint o manier de a concepe i codifica programe astfel nct s fie
uor de neles i de modificat. Este nevoie de o anumit experien, dar aceasta se
acumuleaz relativ uor, metoda rezultnd din procesul de organizare al gndirii care duce
la o expresie inteligibil a procesului de calcul ntr-un timp rezonabil, fiind considerat i
arta simplitii sau rentoarcerea la bun-sim. Cele mai importante proprieti ale unui
algoritm sunt considerate urmtoarele:

Definibilitatea fiecare pas trebuie s fie foarte bine precizat, att ca i
coninut ct i ca poziie.
Realizabilitatea obinerea rezultatului n timp util, cu resurse corespunztoare.
Finitatea aplicarea algoritmului s ne conduc la rezultat dup un
numr finit de pai.
Generalitatea algoritmul s se aplice unei ntregi familii (clase) de
probleme i nu doar unui caz izolat (utilizarea variabilelor).
Automatismul s necesite ct mai puine intervenii umane dup lansarea n
execuie.

Elementele caracteristice ale unui algoritm sunt:

datele (informaia vehiculat) date de intrare, de ieire, intermediare;
operaiile operaii de atribuire, de calcul, de decidere, de salt, de citire sau de
scriere, de deschidere sau de nchidere fiiere etc.;
paii descriu regulile algoritmului.
CAPITOLUL 2: ALGORITMI
- 22 -
2.2 TEHNICI I INSTRUMENTE DE REPREZENTARE
Specificarea unui proces nseamn elaborarea unei descrieri concise i complete a
transformrii efectuate de acesta. Primul principiu enunat n subcapitolul anterior:
concepia la orice nivel prin descompunere, a condus la elaborarea descrierilor pentru
procesele elementare (numite i primitive funcionale). Aceste descrieri poart denumirea
de minispecificaii, reprezentnd regulile de transformare a elementelor datelor de intrare n
elemente ale datelor de ieire la nivelul procesului elementar. Descrierea algoritmilor
trebuie s respecte aceeai principii pe care le ntlnim la minispecificaii. Ea trebuie s
conin aspectele logice (ceea ce se realizeaz n cadrul procesului) i nu aspectele fizice
(cum se realizeaz ceea ce se proceseaz) ntr-o manier clar, concis i complet, fr a
eluda caracteristici eseniale ale procesului. Metodele de descriere a proceselor pot fi prin:
text obinuit: descriere imprecis, redundant, abund n elemente
nesemnificative, greu de scris, foarte greu de neles i
aproape imposibil de actualizat;
limbaj natural structurat: descriere precis, neredundant, greu de scris dar uor
de neles i se poate actualiza;
pseudocod: descriere foarte precis, vocabular redus i uor de
controlat (dar greu de neles pentru nespecialiti);
tabele de decizie: descriere foarte precis, uor de transformat n
programe, greu de scris (i relativ greu de neles de
ctre nespecialiti);
instrumente grafice: (arbori, grafuri, scheme etc.) cu caracteristici i faciliti
diferite, considerate ns ca fiind cele mai eficiente din
punct de vedere al comunicrii concise.

n cele ce urmeaz vom trece n revist cteva metode i instrumente de reprezentare.
Textul obinuit (limbajul natural scris sau nregistrat) nu prezint un interes deosebit n
cazul de fa (dei redactarea acestei cri s-a fcut n mare parte prin aceast metod), aa
c vom sri peste el i vom ncepe direct cu varianta structurat a acestuia.

2.2.1 Limbajul natural structurat
Deficienele limbajului natural n ceea ce privete descrierea proceselor (algoritmilor) au
condus la construirea unui limbaj cu o sintax riguroas dar cu un vocabular mai srac, prin
renunarea la calificatori considerai nesemnificativi (adjective i adverbe), la alte moduri
ale verbelor dect cele imperative, la punctuaia excesiv, la adnotri i prin impunerea
folosirii unor propoziii enuniative, simple. Ca i definiie, putem spune c limbajul natural
structurat (prescurtat: LNS) este un limbaj simplificat care mbin vocabularul limitat din
limbajul gazd cu sintaxa limbajelor de programare structurat.

Vocabularul limbajului natural structurat este constituit din verbe cu neles neambiguu (la
modul imperativ), termeni ce descriu obiecte i atribute precise, cuvinte rezervate pentru
formulare logic (dac, atunci, altfel, repet etc.). Sintaxa enunurilor este limitat la
- 23 -
propoziii enuniative simple, construcii decizionale (cu dou posibiliti: da sau nu),
construcii de repetiii, precum i combinaii ale acestor trei. Pentru claritatea exprimrii i
folosirea unui set redus de simboluri, terminarea unei construcii decizionale sau de
repetiie se marcheaz cu o linie vertical care ncepe la nceputul construciei i se ncheie
dup ultimul enun al acesteia. Pentru exemplificare, iat descrierea rezolvrii ecuaiei de
gradul doi (AX
2
+BX+C=0) n LNS, calculnd partea real (PR) i imaginar (PI) a
rdcinilor:
REPET pentru fiecare set de COEFICIENI
Citete COEFICIENI
DAC A=0
ATUNCI
Respinge COEFICIENIi
ALTFEL
Calculeaz =B
2
4AC
DAC 0
ATUNCI
PR(X1) =(B+ ) / (2A)
PR(X2) =(B ) / (2A)
PI(X1) =0
PI(X2) =0
ALTFEL
PR(X1) =(B) / (2A)
PR(X2) =(B) / (2A)
PI(X1) = / (2A)
PI(X2) = / (2A)
Scrie PR(X1) PI(X1) PR(X2) PI(X2)

SFRIT
Printre avantajele limbajului natural structurat putem meniona faptul c poate fi folosit n
orice etap din ciclul de via al proiectului (analiz, proiectare logic, proiectare tehnic)
fiind concis i uor de neles, cu o sintax simpl, constituind un bun limbaj intermediar
fiind apropiat att de limbajul natural ct i de limbajele evoluate de programare, i poate fi
redactat i ntreinut cu editoare de text sau chiar editoare de programare.

Ca i dezavantaje trebuie s menionm c realizarea unui set de reguli sintactice i a unui
vocabular adecvat pentru un LNS este o activitate de durat cu implicarea unei
responsabiliti majore din partea autorilor; prnd mai formalizat dect este n realitate
este acceptat mai greu de ctre analiti i programatori; refacerea iterativ a descrierilor (n
etapa de analiz mai ales) este consumatoare de timp i cere efort; i nu n ultimul rnd, o
bun descriere n LNS a procesului nu garanteaz corectitudinea (un fenomen prost neles
poate fi exprimat la fel de uor n i de coerent n LNS ca i n limbaj natural).
- 24 -
2.2.2 Pseudocodul
Este foarte asemntor cu LNS, fiind tot o reprezentare a pailor algoritmului sub form de
propoziii simple i construcii decizionale i repetitive. Diferena major fa de LNS
const n vocabularul creat din limba englez i din apropierea mai accentuat prin sintax
de limbajele de programare structurate de nivel nalt. n urmtorul tabel se poate observa
diferena dintre limbajul natural structurat, pseudocod i schema logic (prin prisma a trei
primitive funcionale: decizia logic, repetiia postcondiionat i repetiia precondiionat).

Tabel cu 3 exemple de structuri logice elementare
Descriere n LNS Descriere n pseudocod Reprezentare n schem logic

DAC C
ATUNCI
Procedura A
ALTFEL
Procedura B



IF C
THEN
DO A
ELSE
DO B
ENDIF



REPET pn cnd C
Procedura A


REPEAT UNTIL C
DO A
ENDREPEAT










REPET ct timp C
Procedura A





WHILE C
DO A
ENDWHILE









2.2.3 Tabele de decizie
Este bazat pe identificarea i codificarea condiiilor logice i a aciunilor ce intervin n
urma unor combinaii ale acestor condiii. Acest instrument se poate folosi n orice etap
din dezvoltarea unui program, cu toate c iniial era folosit doar pentru descrierea
procedurilor. Exist i generatoare de programe ce accept ca i surse de intrare tabele de
decizie. Tabelele pot fi mprite n patru zone cu semnificaii distincte: definirea
condiiilor, definirea aciunilor, combinaia condiiilor, respectiv efectul acestor combinaii
n aciuni. n funcie de tipul coninutului zonelor a treia i a patra, putem vorbi de tabele cu
C
B A
Da Nu
A
Nu
C
Da
Da
A
Nu
C
- 25 -
intrri/ieiri simple sau multiple. n cazul n care sunt marcate n cadrul aciunilor salturi
ctre alte tabele de decizie, putem vorbi de tabele imbricate (nlnuite).
n general, la alctuirea unei tabele de decizie trebuie respectate urmtoarele principii:
condiiile sunt prioritare fa de aciuni, acestea din urm find selectate n funcie
de combinaiile condiiilor;
condiiile trebuie s fie independente (unele fa de altele);
orice combinaie de condiii va conduce la un set de aciuni definit.

Pornind de la aceste principii, alctuirea unei tabele de decizii se realizeaz n urmtoarea
secven:
se identific i se definesc toate condiiile (n prima zon);
se definesc toate aciunile (ce vor alctui a doua zon);
se completeaz toate combinaiile valide ale condiiilor (n a treia zon);
se alctuiesc regulile prin marcarea aciunilor (n a patra zon) rezultate n urma
combinrii condiiilor;
se reduce tabela prin fuzionarea regulilor corespunztoare (i eliminarea celor
redundante dac este cazul);
se verific tabela prin testri succesive, validnd versiunea final.

Pentru o ilustrare sumar a structurii unei tabele de decizie vom prezenta exemplul cu
descrierea rezolvrii unei ecuaii de gradul doi (tratat i la LNS):




TD1 (AX
2
+BX+C=0) R1 R2 R3 R4
C1 Coeficientul A nul DA DA NU NU
C2 Discriminant negativ DA NU DA NU
A1 Respinge coeficienii DA DA
A2 Determin soluiile reale DA
A3 Determin soluiile complexe DA



n acest exemplu se poate observa c regulile R1 i R2 rezult n aciuni identice, deci
tabela de decizie prezentat (notat TD1) se poate reduce, prin suprapunerea acestor dou
reguli, obinnd o singur regul din ele (n care valoarea condiiei C1 ar fi DA, valoarea
condiiei C2 ar fi * adic ORICE, iar a aciunii A1 ar rmne DA).

Dac o tabel de decizii conine n condiii independente (n zona 1), numrul de combinaii
(din zona 3) va fi de 2
n
. Dac fiecare condiie i are un numr de p
i
alternative, vor rezulta
p
1
p
2
p
n
combinaii ale acestor n condiii n total.
marcarea regulilor pe
vertical: R1 R4
Zona 3:
cu valorile
condiiilor
Zona 4: cu valorile aciunilor
Zona 1:
condiii
Zona 2:
aciuni
Identificatorul
tabelei: TD1
- 26 -
2.2.4 Arbori de decizie
Pot fi considerate reprezentri grafice ale unor tabele de decizie, reprezentare n care
nodurile arborelor marcheaz condiii, iar ramurile desemneaz aciuni. Construirea unui
arbore de decizie pentru o procedur se poate face n mod asemntor celui de alctuire a
unei tabele de decizii. De multe ori se creaz arbori de decizii din tabele de decizii,
deoarece arborele (fiind un instrument grafic) constituie un mod mai eficient de comunicare
cu utilizatorii.

Iat exemplul rezolvrii ecuaiei de gradul doi, din nou, de data aceasta ns sub forma unui
arbore de decizie:













2.2.5 Scheme logice
Sunt cele mai cunoscute instrumente folosite pentru descrierea proceselor, din familia celor
grafice. Schema logic este de fapt o reprezentare grafic a pailor dintr-un algoritm, sub
form de blocuri (simboluri) legate prin linii. Pentru a folosi acest instrument ntr-o manier
structurat, trebuie s cunoatem pe lng primitivele funcionale de baz i cteva dintre
principiile fundamentale, cum ar fi:
schemele se alctuiesc i se citesc de sus n jos (excepiile se marcheaz),
ntr-un bloc iniial nu intr nici o legtur i din el pleac o singur linie de
legtur,
ntr-un bloc terminal intr oricte linii de legtur i nici o linie de legtur nu
pleac din el,
n toate celelalte blocuri intr cel puin o linie de legtur, pasul reprezentat de
simbol se aplic n cel puin o succesiune n descrierea algoritmului,
din blocurile de intrare/ieire, atribuire i procedur pleac o singur linie de
legtur,
dintr-un bloc de decizie pleac cel puin dou linii de legtur.

Printre avantajele oferite de acest instrument se pot meniona claritatea i simplitatea
reprezentrii, restrngerea spaiului necesar prin utilizarea simbolurilor grafice n locul
Coeficientul A
Nenul
Nul
Discriminant
Negativ
Nenegativ
Respinge coeficienii
Determin soluiile reale
Determin soluiile complexe
- 27 -
propoziiilor (fa de LNS i pseudocod). Fiind prea analitic, poate ocupa un spaiu destul
de mare n cazul prelucrrii unui volum mare de date (de exemplu prelucrarea fiierelor),
ceea ce este considerat un dezavantaj. Blocurile (simbolurile) folosite la construcia
schemelor logice sunt prezentate n tabelul urmtor.

Tabel cu simbolurile utilizate n scheme logice
Simbol Denumire Utilizare



Bloc iniial/terminal Marcarea nceputului/sfritului schemei



Bloc de intrare/ieire Marcarea operaiilor de citire/scriere



Bloc de intrare Marcarea operaiilor de citire



Bloc de ieire Marcarea operaiilor de scriere



Bloc de atribuire Punerea n eviden a operaiilor de
calcul i a atribuirii de valori



Bloc de decizie Marcarea operaiilor de evaluare prin
decidere (apariia ramificaiilor)



Bloc de procedur sau
modul
Marcarea pailor ce vor fi detaliai
ulterior



Bloc de procedur sau
modul (pentru fiiere)
Punerea n eviden a operaiilor de la
nceputul/sfritul prelucrrii fiierelor

sau

Linie de legtur Precizarea modului de nlnuire a
blocurilor (i marcarea salturilor)



Conector intern Marcarea ntreruperii i continurii unei
scheme logice n cadrul aceleiai pagini



Conector extern Marcarea ntreruperii i continurii unei
scheme logice de pe o pagin pe alta

Primitivele funcionale sunt nite structuri simple, standardizate n anii 19691970 la
propunerea lui Dijkstra n scopul structurrii programelor. Ele nu sunt specifice doar
schemelor logice, dar folosind aceste primitive, construirea i citirea schemelor logice


- 28 -
devine mai simpl. Dintre principiile utilizrii acestor structuri la alctuirea schemelor
logice, menionm cele mai importante:
ntr-o primitiv funcional intr o singur legtur i din ea iese o singur
legtur,
un modul dintr-o primitiv funcional poate conine orice primitiv funcional.

Pentru exemplificare vom prezenta rezolvarea ecuaiei de gradul doi (tratat i la LNS,
tabele de decizie i arbori decizionali):

































n mod evident nu aceasta este singura modalitate de a rezolva problem propus. Am ales o
singur variant doar pentru a permite compararea diverselor instrumente descriptive ntre
ele.
START
INTRODUCEREA
COEFICIENILOR
A =0
DA NU
:=B
2
4AC
0
DA NU
PR(X1) :=(B+ )/(2A)
PR(X2) :=(B )/(2A)
PI(X1) :=0
PI(X2) :=0
PR(X1) :=B/(2A)
PR(X2) :=B/(2A)
PI(X1) := /(2A)
PI(X2) := /(2A)
COEFICIENI
RESPINI
PR(X1), PI(X1)
PR(X2), PI(X2)
STOP
- 29 -
2.2.6 Diagrame de structur (de tip Jackson)
Utiliznd acest instrument grafic, paii algoritmului ales sunt reprezentai prin module
nlnuite conform unor legi de structur bine precizate. Un modul reprezint un ansamblu
de operaii cu funcii bine definite, delimitate fizic prin elemente de nceput i de sfrit, i
care pot fi referite prin nume. Exist dou tipuri principale de module: module de control
(cu rolul de a apela module componente subordonate) i module funcionale (care avnd
funcii concrete, nu se mai descompun). Simbolurile utilizate sunt ilustrate n tabelul
urmtor:

Simbol Semnificaie



Bloc pentru identificarea algoritmului (modul de
identificare).



Bloc pentru un modul executat necondiionat, secvenial, o
singur dat.



Bloc pentru un modul executat cel mult o dat, n funcie de
o condiie precizat (condiia se noteaz deasupra
modulului).



Bloc pentru un modul executat de mai multe ori, repetitiv,
ct timp este ndeplinit condiia precizat (notat deasupra
modulului).

Printre avantajele acestui instrument menionm posibilitatea descrierii la niveluri logice
diferite n cadrul aceleiai scheme, oferind tehnica optim pentru reprezentarea algoritmilor
compleci. Ca i dezavantaje se menioneaz spaiul extins ocupat pe orizontal (n funcie
de nivelul de detaliere abordat) i necesitatea unei descrieri ulterioare destul de laborioase
pentru modulele funcionale (se poate combina cu alte instrumente descriptive). Iat, din
nou, rezolvarea ecuaiei de gradul doi, descris prin diagram de structur (fr detalierea
modulelor elementare):












Dei exist nc foarte multe alte instrumente, neprezentate n acest capitol, vom trece n
cele ce urmeaz la prezentarea unei tehnici de baz n modelarea/programarea structurat.
*
o
CALCUL SCRIE SOLUII
0
DET.SOL.REALE
o
DET.SOL.COMPLEXE
o
REZ.EC.GRD.2
STRUCTURA
INTRRI RESPINGE COEF.
o
EC.GRD.2
o
A=0
- 30 -
2.2.7 Alte instrumente
n afara celor prezentate exist o varietate foarte mare de instrumente, n special cu caracter
grafic. Dintre acestea menionm doar cteva, ele fiind utile mai mult n fazele de analiz i
de proiectare a sistemelor informatice.

Diagramele cu flux de date (DFD) se pot utiliza pentru reprezentarea proceselor att la
nivel fizic ct i la nivel logic, fiind bazate pe fluxurile de date dintre procese. Ele sunt
completate de regul i cu alte instrumente, cel puin cu unele necesare descrierii datelor
cum ar fi dicionarul datelor (DD), sau diagrama de structur a datelor (DSD). Avantajul lor
const n principal n schematizarea sugestiv i modulat oferit pe parcursul etapelor de
descompunere (analiz) i recompunere (proiectare) a sistemelor informatice. Procesele
elementare, la rndul lor pot fi descrise prin LNS, tabele de decizie, arbori de decizie etc.
Iat cum ar arta reprezentarea generic a unui program, prin DFD:












Observnd maniera de reprezentare oferit de DFD se poate deduce necesitatea atarii
unor descrieri suplimentare. T (terminal) i DEPOZIT-DATE sunt periferice standard,
marcate ca atare. Dac prelucrarea marcat prin PROCES poate fi detaliat tot printr-un
DFD (de nivel mai jos, adic mai descompus), fr un dicionar de date nu putem ti ce
nseamn exact FLUX-INT., FLUX-IE., sau ce se transmite din DEPOZIT-DATE.
Specificarea corespunztoare dintr-un dicionar de date ar putea arta n felul urmtor:
FLUX-INT. = (COD) +
DESTINAIE +
{ } CANTITATE
10
0
+

+
COD_POSTAL
LOCALITATE J UDE


n acest exemplu COD este o component opional, CANTITATE se poate repeta de
la 0 la 10 ori, iar dintre J UDE +LOCALITATE i COD_POSTAL exist fie una, fie
alta.
FLUX-IE.
FLUX-INT.
PROCES
T
DEPOZIT-DATE
Date de intrare Prelucrare Date de ieire
- 31 -
2.2.8 Structurile de control primitive (de tip Dijkstra)
Acestea nu reprezint un instrument n sine, ci aa cum am menionat deja la schemele
logice, reprezint o tehnic de structurare a construirii/descrierii algoritmilor, ce poate fi
aplicat cu orice instrument de reprezentare. La introducerea lor s-a inut cont i de
microspecificaiile existente n cadrul diferitelor limbaje de programare de nivel nalt,
aceste primitive urmrind cerinele programrii structurate prin existena n aproape fiecare
limbaj de programare a unor instruciuni corespunztoare fiecrei structuri de control
primitive.

Exist trei tipuri de structuri de control primitive: secvenial, alternativ (selectiv sau
decizional) i repetitiv. Aceste structuri de control precizeaz de fapt nlnuirea posibil
a pailor unui algoritm, conform principiilor programrii modulare i structurate, paii
putnd fi: propoziii, blocuri sau module. n cele ce urmeaz, vom prezenta cele trei tipuri
de structuri de control (prezentnd i cteva subvariante), descriindu-le att n pseudocod
ct i cu scheme logice i diagrame de structur J ackson.

1. Structura secvenial (liniar) apare atunci cnd orice operaie se parcurge o dat:
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):
DO A
DO B


2. Structurile alternative (decizionale sau selective) apar atunci cnd operaiile se
execut opional, n funcie de condiii precizate:
a. varianta clasic (IF-THEN-ELSE):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):
IF C
THEN
DO A
ELSE
DO B
ENDIF
b. varianta cu ramur vid (IF-THEN):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):


IF C DO A

A
B
A B
A B
C
Da Nu
A B
C
o o
A
C
o o
A
C
Da Nu
- 32 -
c. varianta generalizat (CASE):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):
SELECT C
CASE C =1 : DO A
CASE C =2 : DO B
. . .
CASE C =n : DO P
ENDSELECT

3. Structurile repetitive apar cnd anumite operaii se execut de mai multe ori, n
funcie de o condiie precizat:
a. varianta condiionat anterior (WHILE-DO):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):

WHILE C
DO A
ENDWHILE

b. varianta condiionat posterior (DO-UNTIL):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):

REPEAT UNTIL C
DO A
ENDREPEAT



c. varianta combinat (LOOP-EXIT IF-ENDLOOP):
Pseudocod: Schem logic: Diagram de structur
(tip J ackson):

LOOP
DO A
IF NOT C EXIT
DO B
ENDLOOP

A
C
1 2
B P
n
C=1
o
A
o
B
o
P
C=2 C=n
A
C
*
C
Da
A
Nu
C
Da
A
Nu


Da
C
A
B
Nu
- 33 -


3.1 SCRIEREA PROGRAMELOR N LIMBAJUL FORTRAN
n acest capitol vom discuta aspectele legate de redactarea surselor, utiliznd limbajul de
programare Fortran. Un program scris n acest limbaj poate s conin una sau mai multe
seciuni (numite uneori module). Seciunile de program sunt segmente de instruciuni i/sau
de date ce pot fi nglobate n unul sau mai multe fiiere. Acestea pot fi compilate i separat,
ns la construirea programului executabil ele vor fi reunite, mpreun cu bibliotecile
necesare. Pentru redactarea fiierelor ce conin segmentele de program se poate apela la
orice editor de text ce genereaz fiiere cu coninut afiabil curat, ns trebuie avute n
vedere i cteva reguli, prezentate n cele ce urmeaz.

Setul de caractere const din caractere alfanumerice (cele 26 litere mici sau mari ale
alfabetului englez: az, AZ; i cifrele: 09), 4 simboluri pentru operaii aritmetice
(adunare: +, scdere: -, nmulire: *, mprire: /, ridicare la putere: **) precum i dintr-un
set determinat de caractere speciale (blank sau spaiu, tabulator orizontal, virgul, punct,
apostrof, paranteze rotunde deschise i nchise, precum i urmtoarele caractere: =, $, &).
Limbajul Fortran 90 a mai extins aceast list cu urmtoarele caractere speciale admise: _,
!, :, ;, ", %, <, >, ?, ^ i #. n general, conform conveniilor anglo-saxone, virgula are rol
de separator n cadrul unei liste, iar separatorul zecimal este punctul.

Pentru denumirea diferitelor seciuni de program precum i pentru identificarea funciilor,
variabilelor, tablourilor i blocurilor se folosesc nume simbolice. Dac conveniile
versiunilor mai vechi ale limbajului au permis utilizarea a doar 8 caractere (alctuite din
caractere alfanumerice i caracterul special $), Fortran 90 permite utilizarea a 31 de
caractere (alctuite din caractere alfanumerice, caracterul special $ i caracterul special _).
Primul caracter trebuie s fie ntotdeauna o liter. Numele seciunilor de program sunt
considerate globale i trebuie s fie unice n ntreaga surs.

Modul de redactare al sursei poate fi n format fix (Fortran 77), format tabular sau format
liber (admise de Fortran 90 i versiunile ulterioare ale limbajului). Formatul fix respect
structura de redactare bazat pe cartele perforate, considernd lungimea unui rnd (articol)
de maximum 80 de caractere, avnd urmtoarea structur:

Coloane: 15 6 772 7380
Coninut: Etichete.
(n prima
coloan se
poate scrie i
caracterul ce
marcheaz
ntregul rnd
explicit ca fiind
comentariu).
Caracter ce
marcheaz
continuarea
rndului
anterior (dac
este cazul).
Instruciuni. Comentariu
implicit.
CAPITOLUL 3: FORTRAN 77
- 34 -
Etichetele reprezint serii de cel mult 5 caractere numerice (cifre) cu rol de referin n
cadrul seciunii de program, ele marcnd instruciunile n faa crora apar (n rndul
respectiv). Folosirea lor este opional i supus unor restricii (nu toate instruciunile pot
purta etichet). Pentru ca o etichet s fie valid, valoarea ei trebuie s fie cuprins n
intervalul 199999. Dac se dorete marcarea rndului curent ca i comentariu, n prima
coloan se va scrie litera C sau caracterul * (respectiv ! n cazul versiunilor Fortran 90 i
ulterioare), n acest caz structura i coninutul rndului fiind ignorate la compilare. Unele
compilatoare permit i folosirea caracterului D pentru marcarea n prima coloan a rndului
curent ca i comentariu, aceast facilitate permind compilarea (interpretarea) opional a
acestor rnduri n caz de depanare a sursei (debugging).

n Fortran 77 se scrie doar o singur instruciune ntr-un rnd. Dac spaiul dintre coloanele
7 i 72 din rndul curent nu este suficient pentru a scrie instruciunea dorit, ea poate fi
extins marcnd n coloana 6 pe urmtoarele rnduri continuarea celor precedente, prin
cifre (doar din intervalul 19), litere sau prin unul din caracterele +, -, * (sub Fortran 90 se
poate folosi orice caracter n afar de cifra 0). ncepnd cu versiunea 90 a limbajului se
admite scrierea mai multor instruciuni pe un rnd, n cazul acesta caracterul ; fiind
separatorul dintre instruciuni. Numrul liniilor de continuare admise depinde i de
compilatorul ales (Fortran 90 permite pn la 90 de linii de continuare n formatul fix i
doar 31 de rnduri de continuare n formatul liber). Unele compilatoare permit extinderea
zonei de interpretare a rndurilor pn la coloana 80 (chiar coloana 132 n cazul utilizrii
Fortran 90), dar n mod implicit orice coninut din intervalul coloanelor 7280 este
considerat comentariu i ca atare ignorat la compilare.

n format liber structura rndurilor din surs nu conine constrngerile descrise mai sus,
instruciunile nu se limiteaz la o anumit ncadrare pe coloanele liniilor orice linie putnd
conine de la 0 la 132 de caractere. n schimb spaiile sunt semnificative, primind rol
separator n anumite cazuri, pentru a distinge nume, constante sau etichete de numele,
constantele sau etichetele cuvintelor cheie alturate. Acest format a fost introdus doar
ncepnd cu Fortran 90 (acesta accept ns i formatul fix i tabular). n formatul liber
comentariul este indicat de caracterul !, iar continuarea unui rnd curent prin caracterul &
la sfritul rndului curent (lungimea maxim a unui rnd fiind de 132 de caractere). Dac
se scriu mai multe instruciuni pe un rnd, ele trebuie separate prin caracterul ; (la sfritul
unui rnd acest caracter se ignor n mod firesc).


3.2 EXPRESII N FORTRAN
Expresiile sunt alctuite din operatori, operanzi i paranteze. Un operand este o valoare
reprezentat printr-o constant, variabil, element de tablou sau tablou, sau rezultat din
evaluarea unei funcii. Operatorii sunt intrinseci (recunoscui implicit de compilator i cu
caracter global, deci disponibili ntotdeauna tuturor secvenelor de program) sau definii de
utilizator (n cazul n care un operator e descris explicit de programator ca funcie). Dup
modul de operare, putem vorbi de operatori unari (ce opereaz asupra unui singur operand)
i operatorii binari (ce opereaz asupra unei perechi de operanzi).
- 35 -
Orice valoare sau referin la funcie folosit ca operand ntr-o expresie trebuie s fie
definit la momentul evalurii expresiei.

ntr-o expresie cu operatori intrinseci avnd ca operanzi tablouri, acetia din urm trebuie
s fie compatibili (trebuie s aib aceeai form), deoarece operatorii specificai se vor
aplica elementelor corespondente ale tablourilor, rezultnd un tablou corespunztor ca rang
i dimensiune cu operanzii. n cazul n care n expresie pe lng tablouri exist i un
operand scalar, acesta din urm se va aplica tuturor elementelor de tablou (ca i cum
valoarea scalarului ar fi fost multiplicat pentru a forma un tablou corespunztor).
Evaluarea unei expresii are ntotdeauna un singur rezultat, ce poate fi folosit pentru
atribuire sau ca referin.

Expresiile pot fi clasificate n funcie de natura lor n:
expresii aritmetice sau numerice,
expresii de ir (caractere),
expresii logice.

n variantele mai moderne ale limbajului Fortran (ncepnd cu Fortran 90) exist i expresii
considerate ca fiind de iniializare i specificare.

Expresiile numerice, aa cum sugereaz denumirea lor, exprim calcule numerice, fiind
formai din operatori i operanzi numerici, avnd rezultat numeric ce trebuie s fie definit
matematic (mprirea la zero, ridicarea unei baze de valoare zero la putere nul sau
negativ, sau ridicarea unei baze de valoare negativ la putere real constituie operaii
invalide). Termenul de operand numeric poate include i valori logice, deoarece acestea pot
fi tratate ca ntregi ntr-un context numeric (valoarea logic . FALSE. corespunde cu
valoarea 0 de tip ntreg). Operatorii numerici specific calculele ce trebuie executate, dup
cum urmeaz:
** ridicare la putere;
* nmulire;
/ mprire (diviziune);
+ adunare sau plus unar (identitate);
scdere sau minus unar (negaie).

ntr-o expresie numeric compus cu mai muli operatori, prima dat se vor evalua
ntotdeauna prile incluse n paranteze (dinspre interior spre exterior) i funciile,
prioritatea de evaluare a operatorilor intrinseci fiind dup cum urmeaz: ridicarea la putere,
nmulirea i mprirea, plusul i minusul unar, adunarea i scderea. n cazul operatorilor
cu aceeai prioritate operaiile vor fi efectuate de la stnga spre dreapta. Prin efect local,
operatorii unari pot influena aceast regul, genernd excepii n cazul unor compilatoare
care accept asemenea expresii. De exemplu, n cazul expresiei numerice X**Y*Z, dei
ridicarea la putere are prioritate mai mare dect nmulirea sau negaia, evaluarea se va face
sub forma
z y
x

(pentru forma z x
y

ar fi trebuit s scriem X**( Y) *Z ), sau, n cazul


- 36 -
expresiei numerice X/ Y*Z, evaluarea se va face sub forma
z y
x

(pentru z
y
x

ar fi
trebuit s scriem X/ ( Y) *Z sau X/ Y*Z ).

Expresiile sunt omogene dac toi operanzii sunt de acelai tip i sunt neomogene n caz
contrar. Tipul valorii rezultate n urma evalurii unei expresii numerice depinde de tipul
operanzilor i de rangul acestora. Dac operanzii din cadrul expresiei au ranguri diferite,
valoarea rezultat va fi de tipul operandului cu cel mai mare rang (cu excepia cazului n
care o operaie implic o valoare complex i una n dubl precizie, rezultatul n asemenea
situaii fiind de tip complex dublu). La verificarea corectitudinii unei expresii numerice
compuse se recomand s se in cont i de tipul valorilor pariale rezultate n cursul
evalurii. Rangul tipurilor de date n ordine descresctoare este urmtoarea:

( COMPLEX*8)
COMPLEX*4
( REAL*16)
REAL*8 i DOUBLE PRECI SI ON
REAL*4
( I NTEGER*8)
I NTEGER*4
I NTEGER*2
I NTEGER*1
( LOGI CAL*8)
LOGI CAL*4
LOGI CAL*2
LOGI CAL*1 i BYTE

Expresiile de ir (caractere) se pot alctui cu operatorul de concatenare intrinsec + (// n
Fortran 90) sau cu funcii create de programator, aplicate asupra unor constante sau
variabile de tip caracter. Evaluarea unei asemenea expresii produce o singur valoare de tip
caracter. Concatenarea se realizeaz unind coninuturile de tip caracter de la stnga spre
dreapta fr ca eventualele paranteze s influeneze rezultatul. Spaiile coninute de
operanzi se vor regsi i n rezultat.

Expresiile logice constau din operanzi logici sau numerici combinai cu operatori logici
i/sau relaionali. Rezultatul unei expresii logice este n mod normal o valoare logic
(echivalent cu una din constantele literale logice . TRUE. sau . FALSE. ), ns operaiile
logice aplicate valorilor ntregi vor avea ca rezultat tot valori de tip ntreg, ele fiind
efectuate bit cu bit n ordinea corespondenei cu reprezentarea intern a acestor valori. Nu
se pot efectua operaii logice asupra valorilor de tip real (simpl sau dubl precizie),
complex sau caracter n mod direct, ns asemenea tipuri de valori pot fi tratate cu ajutorul
unor operanzi relaionali n cadrul expresiilor logice. n tabelele urmtoare vom prezenta
operatorii relaionali i operatorii logici. Cei relaionali au nivel egal de prioritate (se
execut de la stnga la dreapta, dar naintea celor logici i dup cei numerici), iar operatorii
- 37 -
logici sunt dai n ordinea prioritii lor la evaluare. Operatorii relaionali sunt binari (se
aplic pe doi operanzi), la fel i operatorii logici, cu excepia operatorului de negaie logic
(. NOT. ) care este unar.

Tabel cu operatorii relaionali:
Operator
Fortran 77 Fortran 90
Semnificaie
. LT. < Mai mic dect ... (Less Than)
. LE. <= Mai mic sau egal cu ... (Less or Equal than)
. EQ. == Egal cu ... (EQual with)
. NE. / = Diferit de ... (Not Equal with)
. GT. > Mai mare dect ... (Greater Than)
. GE. >= Mai mare sau egal cu ... (Greater or Equal than)

Tabel cu operatorii logici:
Operator Semnificaie Prioritate
. NOT. Negaie logic (NU), rezult adevrat dac operandul are
valoarea fals i fals dac operandul are valoarea adevrat.
mare
. AND. Conjuncie logic (I), rezult adevrat doar dac ambii
operanzi au valoarea adevrat, n caz contrar rezult fals.
mai mic
. OR. Disjuncie logic (SAU), rezult adevrat dac unul din
operanzi are valoarea adevrat, n caz contrar rezult fals.
i mai mic
. EQV. Echivalen logic, rezult adevrat dac ambii operanzi au
aceai valoare, dac au valori diferite atunci rezult fals.
. NEQV. Inechivalen logic, rezult adevrat dac operanzii sunt
diferii, i fals dac sunt la fel.
. XOR. Disjuncie logic exclusiv (SAU exclusiv), efect similar cu
inechivalena logic.


cea mai
mic

Expresiile de iniializare i specificare pot fi considerate cele care conin operaii intrinseci
i pri constante, respectiv o expresie scalar ntreag. Aa cum sugereaz i denumirea
lor, ele servesc la iniializarea unor valori (de exemplu indicele pentru controlul unui ciclu
implicit) sau la specificarea unor caracteristici (de exemplu declararea limitelor de tablouri
sau a lungimilor din iruri de caractere).

Prioritatea de evaluare a operatorilor din cadrul expresiilor neomogene este dup cum
urmeaz:

Operatori unari definii (funcii);
Operatori numerici (n urmtoarea ordine: **; *, /; + unar, unar; +, );
Operatorul de concatenare pentru iruri (caractere);
Operatori relaionali (cu prioritate egal: . EQ. , . NE. , . LT. , . LE. , . GT. , . GE. );
Operatori logici (n ordinea: . NOT. ; . AND. ; . OR. ; . XOR. , . EQV. , . NEQV. ).
- 38 -
3.3 INSTRUCIUNILE LIMBAJULUI DE PROGRAMARE FORTRAN 77
Prezentarea instruciunilor o vom face n ordine alfabetic. Pentru fiecare instruciune se va
specifica forma general, semnificaia elementelor ce apar n sintax, precum i efectul
instruciunii. Instruciunile executabile pot purta etichete, cele declarative nu.

n ceea ce privete notaiile utilizate, v rugm s luai n considerare urmtoarele:
Instruciunile i cuvintele cheie specifice limbajului de programare sunt scrise cu
majuscule ngroate;
[ ] parantezele drepte ncadreaz elemente opionale, aceste paranteze nu fac parte din
sintaxa limbajului de programare prezentat;
. . . cele trei puncte semnific repetitivitatea unor elemente n cadrul sintaxei;
spaiul (blank-ul) face parte din sintax, apare scris ca atare (fr marcaj special);
( ) parantezele rotunde fac parte din sintax;
, virgula face parte din sintax, are rol separator n cadrul unei liste;
* asteriscul face parte din sintax, de cele mai multe ori se ntlnete la instruciunile de
intrare/ieire semnificnd o valoare implicit (unitatea implicit: consola, sau format
implicit: n funcie de natura elementelor din lista de intrare/ieire).
ACCEPT, citire secvenial cu format:

ACCEPT f [ , l i st ]
unde: ACCEPT instruciunea executabil;
f referina la format (specificator de format);
l i st lista de intrare.
Efect: Citete una sau mai multe nregistrri de la consol, convertete valorile
citite n conformitate cu specificaia de format asociat f, dup care le
atribuie elementelor din lista de intrare. Similar cu instruciunea READ.
Variant cu format implicit: ACCEPT *[ , l i st ]
Atribuire aritmetic/logic/caracter:

v=exp
unde: v variabil, element de tablou sau subir de caractere;
= simbolul pentru operaia de atribuire;
exp expresie.
Efect: Atribuie valoarea unei expresii aritmetice, logice sau caracter variabilei v.
Se recomand ca tipul variabilei v i tipul expresiei exp s corespund.
- 39 -
ASSIGN, asignare:

ASSI GN e TO v
unde: ASSI GN instruciunea executabil;
e eticheta unei instruciuni executabile sau a unei instruciuni FORMAT
din aceeai unitate de program cu instruciunea ASSIGN;
TO cuvnt cheie;
v variabil ntreag.
Efect: Atribuie eticheta s unei variabile ntregi v pentru a fi utilizat ulterior ntr-
o instruciune GOTO asignat sau ca un specificator de format n cadrul
unei instruciuni de citire/scriere.
BACKSPACE, repoziionare n cadrul unui fiier secvenial:

BACKSPACE u
sau
BACKSPACE( [ UNI T=] u[ , ERR=e] )
unde: BACKSPACE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Repoziioneaz un fiier secvenial, n curs de prelucrare, aflat pe unitatea
logic u, la nceputul nregistrrii precedente nregistrrii la care s-a fcut
accesul prin ultima instruciune de intrare/ieire efectuat nainte de
BACKSPACE. n cazul unei erori la executarea instruciunii se va preda
controlul instruciunii executabile care poart eticheta e din cadrul
aceluiai modul de program. Atunci cnd n sintax s-a folosit ERR=e i
apare o eroare la execuie, controlul va fi transferat instruciunii
executabile cu eticheta e din cadrul aceleiai uniti de program.
Bloc de date sub form de subunitate:

BLOCK DATA [ nume]
unde: BLOCK DATA instruciunea declarativ;
nume un nume simbolic.
- 40 -
Efect: Specific un subprogram (modul) executabil ce urmeaz a fi descris, ca
bloc de date.
CALL, apel la subprogram:

CALL nume[ ( [ p] [ , p] . . . ) ]
unde: CALL instruciunea executabil;
nume numele unui subprogram sau al unui punct de intrare (a se vedea
instruciunile SUBROUTI NE i ENTRY);
p parametru efectiv (poate fi o expresie sau numele unei variabile,
numele unui tablou sau numele unui subprogram).
Efect: Apeleaz un subprogram sau orice procedur extern avnd numele
nume, transfernd controlul execuiei la acesta i asociind parametrii
efectivi p parametrilor formali din procedura apelat.
CLOSE, nchiderea unui fiier deschis:

CLOSE( [ UNI T=] u[ , c=val ] [ , ERR=e] )
unde: CLOSE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
c opiune, unul din cuvintele cheie: STATUS, DI SPOSE sau DI SP;
val subir caracter corespunztor valorii cuvntului cheie c, putnd fi:
' SAVE' , ' KEEP' , ' DELETE' sau ' PRI NT' .
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Realizeaz nchiderea unui fiier deschis, deconectnd fiierul de unitatea
logic u la care a fost asociat anterior. A se vedea i instruciunea OPEN.
Atunci cnd n sintax s-a folosit ERR=e i apare o eroare la execuie,
controlul va fi transferat instruciunii executabile cu eticheta e din cadrul
aceleiai uniti de program.
COMMON, declararea unei zone comune de memorie:

COMMON [ / [ bc] / ] nl i st [ [ , ] [ / [ bc] / ] nl i st ] . . .
unde: COMMON instruciunea declarativ;
bc numele unui bloc comun;
- 41 -
nl i st o list de nume de variabile, nume de tablouri sau declaratori de
tablou, separate prin virgule.
Efect: Permite definirea uneia sau mai multor zone contigue de memorie, numite
blocuri comune, avnd numele specificat i coninnd variabile asociate
cu numele blocului.
CONTINUE, continuarea execuiei:

CONTI NUE
unde: CONTI NUE instruciunea executabil.
Efect: Transfer controlul execuiei la urmtoarea instruciune executabil. Fiind
o instruciune executabil, poate purta etichet, din acest motiv se
recomand utilizarea ei dup instruciunile declarative ce nu pot fi
etichetate, atunci cnd este cazul.
DATA, definirea datelor sub forma unui modul:

DATA nl i st / cl i st / [ [ , ] nl i st / cl i st / ] . . .
unde: DATA instruciunea declarativ;
nl i st este o list de una sau mai multe variabile, nume de tablouri,
elemente de tablouri sau nume de subiruri caracter, separate prin virgule;
cl i st este o list alctuit din una sau mai multe constante separate
prin virgule, de forma:
[ n*] val [ , [ n*] val ] . . .
unde n este o constant ntreag fr semn, diferit de zero;
val o valoare constant.
Efect: Valorile constante din fiecare clist sunt atribuite succesiv (n ordine de la
stnga la dreapta) cte unei entiti specificate n lista nlist asociat.
DECODE, citire intern cu transformare prin format:

DECODE( n, f , var [ , ERR=e] ) [ l i st ]
unde: DECODE instruciunea executabil;
n o expresie ntreag;
f referina la format (specificator de format);
- 42 -
var numele unei variabile, unui tablou, unui element de tablou sau
subir caracter;
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st lista de intrare.
Efect: Citete n caractere din tamponul var i atribuie valori elementelor din
list, valori care au rezultat din conversia conform specificaiei de format
f. Atunci cnd n sintax s-a folosit ERR=e i apare o eroare la execuie,
controlul va fi transferat instruciunii executabile cu eticheta e din cadrul
aceleiai uniti de program.
DEFINE FILE, definirea structurii unui fiier:

DEFI NE FI LE u( m, n, U, v) [ , u( m, n, U, v) ] . . .
unde: DEFI NE FI LE instruciunea declarativ;
u variabil sau constant ntreag;
m variabil sau constant ntreag;
n variabil sau constant ntreag;
U variabil sau constant ntreag;
v variabil ntreag.
Efect: Definete structura nregistrrii unui fiier n acces direct unde u este
numrul unitii logice, m este numrul nregistrrilor (de lungime fix
din cauza accesului direct) din fiier, n este lungimea n cuvinte a unei
nregistrri, U este un argument fixat, iar v este variabila asociat
fiierului (n aceast variabil se va memora numrul nregistrrii imediat
urmtoare celei curente).
DELETE, tergerea unei nregistrri:

DELETE( [ UNI T=] u[ , REC=r ] [ , ERR=e] )
sau
DELETE( u' r [ , ERR=e] )
unde: DELETE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
REC cuvnt cheie pentru desemnarea nregistrrii;
r expresie ntreag (semnificnd numrul nregistrrii vizate);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
- 43 -
e eticheta unei instruciuni executabile.
Efect: terge nregistrarea specificat prin r, din fiierul asociat unitii logice u,
sau cea mai recent nregistrare accesat. Atunci cnd n sintax s-a
folosit ERR=e i apare o eroare la execuie, controlul va fi transferat
instruciunii executabile cu eticheta e din cadrul aceleiai uniti de
program.
Declaraia de tip:

t i p var [ , var ] . . .
unde: tip este unul din urmtoarele tipuri de date: BYTE, LOGI CAL (sau
LOGI CAL*1, LOGI CAL*2, LOGI CAL*4), I NTEGER (sau
I NTEGER*2, I NTEGER*4), REAL (sau REAL*4, REAL*8), DOUBLE
PRECI SI ON, COMPLEX (sau COMPLEX*8), CHARACTER (sau
CHARACTER*lungime);
var numele unei variabile, unui tablou, unei funcii externe, unei
funcii aritmetic definite, unei funcii parametru formal sau al unui
declarator de tablou. Numele poate fi urmat opional de un specificator de
lungime de forma: *n
unde: n este o expresie ntreag semnificnd lungimea lui var n
octei (n cazul entitilor caracter semnific numrul de
caractere).
Efect: Numele simbolic var va avea asignat tipul specificat prin tip. Fiind
declaraie, nu poate purta etichet. Declaraia de tip poate fi combinat cu
declararea dimensiunilor pentru tablouri, n acest caz nemaifiind necesar
utilizarea instruciunii DI MENSI ON ntr-un mod explicit (n asemenea
cazuri var va avea forma: a( d) cu semnificaia termenilor de la
declaraia DI MENSI ON.
DIMENSION, declararea dimensiunilor:

DI MENSI ON a( d) [ , a( d) ] . . .
unde: DI MENSI ON instruciune declarativ;
a numele tabloului;
d declaratorul de dimensiune, sub forma: n[ , n] . . .
unde: n este o expresie ntreag (semnificnd numrul maxim de
elemente n dimensiunea respectiv).
- 44 -
Efect: Specific spaiul de memorie necesar tablourilor.
DO, instruciune pentru cicluri repetitive:

DO e[ , ] c=i , f [ , p]
unde: DO instruciune executabil;
e eticheta unei instruciuni executabile;
c variabil (variabila de control al ciclului);
i expresie numeric (desemnnd o valoare iniial);
f expresie numeric (desemnnd o valoare final);
p expresie numeric (desemnnd pasul variabilei de control).
Efect: Execut ciclul DO (instruciunile ce urmeaz, pn la cea care poart
eticheta e inclusiv, acestea alctuind corpul ciclului), realiznd
urmtoarele faze:
1. Evalueaz: cnt =I NT( ( f - i +p) / p) (cnt fiind contorul ciclului).
2. Execut atribuirea: c=i
3. Dac c este mai mic sau egal cu zero, nu se va executa ciclul.
4. Dac c este mai mare ca zero, atunci:
a. Execut instruciunile din corpul ciclului.
b. Evalueaz: c=c+p
c. Decrementeaz contorul ciclului: cnt =cnt - 1 i dac cnt este
mai mare dect zero, repet ciclul.
Varianta de ciclu implicit: ( [ l i st , ] c=i , f [ , p] )
unde: l i st list de intrare/ieire;
celelalte valori avnd semnificaiile de la instruciunea DO.
Efect: Determin executarea ciclului asupra elementelor din list n cadrul unei
operaii de intrare/ieire. Condiiile de realizare ale ciclului sunt similare
cu cele de la instruciunea DO.
Not: Varianta de ciclu implicit poate fi folosit doar n cadrul listelor de intrare/ieire de
la instruciunile de citire/scriere. Aceast variant nu reprezint o instruciune de
sine stttoare, este considerat doar expresie de iniializare.
ENCODE, scriere intern cu transformare prin format:

ENCODE( n, f , var [ , ERR=e] ) [ l i st ]
unde: ENCODE instruciunea executabil;
- 45 -
n expresie ntreag;
f referina la format (specificator de format);
var numele unei variabile, unui tablou, unui element de tablou sau
subir caracter;
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st lista de ieire.
Efect: Scrie n caractere din list n tamponul var, care va primi caracterele
convertite conform specificaiei de format f. Atunci cnd n sintax s-a
folosit ERR=e i apare o eroare la execuie, controlul va fi transferat
instruciunii executabile cu eticheta e din cadrul aceleiai uniti de
program.
END, marcaj de sfrit:

END
unde: END instruciunea declarativ;
Efect: Marcheaz sfritul unei uniti de program (fiind obligatoriu pentru
compilare).
ENDFILE, scrierea unei nregistrri EOF:

ENDFI LE u
sau
ENDFI LE( [ UNI T=] u[ , ERR=e] )
unde: ENDFI LE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Scrierea unei nregistrri de sfrit de fiier (EOF End Of File) n
fiierul secvenial asociat unitii logice u. Atunci cnd n sintax s-a
folosit ERR=e i apare o eroare la execuie, controlul va fi transferat
instruciunii executabile cu eticheta e din cadrul aceleiai uniti de
program.
- 46 -
ENTRY, declararea unui punct de intrare:

ENTRY nume[ ( p[ , p] . . . ) ]
unde: ENTRY instruciunea declarativ;
nume numele punctului de intrare;
p un nume simbolic reprezentnd un parametru formal.
Efect: Permite crearea unor puncte de intrare multiple n unitile de program
declarate ca FUNCTI ON i SUBROUTI NE.
EQUIVALENCE, echivalare prin declarare:

EQUI VALENCE ( nl i st ) [ , ( nl i st ) ] . . .
unde: EQUI VALENCE instruciunea declarativ;
nl i st este o list de cel puin dou variabile, nume de tablouri,
elemente de tablouri sau subiruri caracter, separate prin virgule.
Expresiile de indici trebuie s fie constante ntregi.
Efect: Aloc fiecrei entiti din nlist aceeai locaie de memorie.
EXTERNAL, declararea unor module externe:

EXTERNAL nume[ , nume] . . .
sau
EXTERNAL *nume[ , *nume] . . .
unde: EXTERNAL instruciunea declarativ;
nume numele unei uniti de program.
Efect: Definete numele specificat ca fiind numele unei uniti de program.
Cnd nume este precedat de *, definete o unitate (subprogram) extern
furnizat de utilizator.
FIND, poziionare n fiier:

FI ND( u' r [ , ERR=e] )
sau
FI ND( [ UNI T=] u[ , REC=r ] [ , ERR=e] )
- 47 -
unde: FI ND instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
REC cuvnt cheie pentru desemnarea nregistrrii;
r expresie ntreag (semnificnd numrul nregistrrii vizate);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Poziioneaz fiierul n acces direct de pe unitatea logic u pe articolul
specificat prin r. Atunci cnd n sintax s-a folosit ERR=e i apare o
eroare la execuie, controlul va fi transferat instruciunii executabile cu
eticheta e din cadrul aceleiai uniti de program.
FORMAT, declararea formei la operaii de intrare/ieire:

FORMAT( l i st )
unde: FORMAT instruciunea de specificare;
l i st list de una sau mai muli descriptori (specificatori de cmp).
Efect: Descrie formatul n care urmeaz s se transmit, prin intermediul
instruciunilor de citire/scriere, una sau mai multe nregistrri.
Instruciunea trebuie ntotdeauna etichetat, altfel nu-i are rostul.
Funcie aritmetic definit:

nume( [ p[ , p] . . . ] ) =exp
unde: nume nume simbolic (denumirea funciei);
p nume simbolic (al parametrului formal);
exp expresie.
Efect: Permite realizarea unei proceduri definite printr-o singur instruciune i
avnd p drept parametru formal. Cnd funcia nume astfel definit este
referit, se evalueaz expresia exp utiliznd parametri efectivi de apel.
Este o instruciune declarativ ce poate fi precedat de o declaraie de tip.
- 48 -
FUNCTION, declararea unei funcii ca modul:

FUNCTI ON nume[ ( [ p[ , p] . . . ] ) ]
unde: FUNCTI ON instruciunea declarativ;
nume nume simbolic (asociat modulului);
p nume simbolic (parametru formal).
Efect: Definete o unitate de program ca funcie extern (modul separat de
program) avnd numele indicat prin nume i utiliznd parametri formali p.
Transferarea valorilor parametrilor se efectueaz prin corespondena celor
formali p (ca ordine i tip) cu cei efectivi, la invocarea funciei prin nume.
GO TO, salt necondiionat:

GO TO e
sau
GOTO e
unde: GO TO cuvinte cheie ale instruciunii executabile;
e eticheta unei instruciuni executabile.
Efect: Determin transferul controlului la executarea instruciunii cu eticheta e
din cadrul aceleiai uniti de program.
GO TO, salt calculat:

GO TO ( l i st ) [ , ] exp
sau
GOTO ( l i st ) [ , ] exp
unde: GO TO cuvinte cheie ale instruciunii executabile;
l i st list de una sau mai multe etichete de instruciuni executabile,
separate prin virgul;
exp expresie aritmetic (ntreag).
Efect: Transfer controlul la instruciunea a crei etichet ocup poziia exp n
list. Dac exp este mai mic dect 1 sau mai mare dect numrul
etichetelor din list, nu se va efectua transferul.
- 49 -
GO TO, salt asignat:

GO TO v[ [ , ] ( l i st ) ]
sau
GOTO v[ [ , ] ( l i st ) ]
unde: GO TO cuvinte cheie ale instruciunii executabile;
v variabil de tip ntreg;
l i st list de una sau mai multe etichete de instruciuni executabile,
separate prin virgul.
Efect: Transfer controlul la instruciunea a crei etichet a fost atribuit
variabilei v printr-o instruciune prealabil ASSI GN. Dac se utilizeaz
list, valoarea atribuit lui v trebuie s aparin listei (n caz contrar, nu
are loc transferul).
IF aritmetic:

I F( exp) e1, e2, e3
unde: I F instruciunea executabil;
exp expresie aritmetic;
e1, e2, e3 etichetele unor instruciuni executabile.
Efect: Transfer controlul la instruciunea cu eticheta e1, e2 sau e3 din aceeai
unitate de program, n funcie de valoarea expresiei exp: dac exp rezult
mai mic ca zero, controlul este transferat la instruciunea cu eticheta e1;
dac exp rezult zero, controlul este transferat instruciunii cu eticheta e2;
dac exp rezult mai mare ca zero controlul este transferat instruciunii cu
eticheta e3.
IF logic simplu:

I F( exp) i nst
unde: I F instruciunea executabil;
exp expresie logic;
i nst orice instruciune executabil cu excepia urmtoarelor: DO, END,
I F logic simplu, I F logic structurat (IF-THEN sau bloc IF).
Efect: Execut instruciunea inst dac expresia logic exp are valoare . TRUE.
(adevrat). n caz contrar, se execut instruciunea care urmeaz
instruciunii I F logic fr a se mai executa instruciunea inst.
- 50 -
IF logic structurat (blocul IF):

I F( exp1) THEN
[ bl oc]
[ ELSE [ I F( exp2) THEN
[ bl oc]
[ ELSE
bl oc] ]
ENDI F
unde: I F instruciunea executabil;
exp1 expresie logic;
exp2 expresie logic;
THEN cuvnt cheie (obligatoriu);
ELSE cuvnt cheie (opional); definete un bloc de instruciuni ce
urmeaz a fi executate dac expresiile logice din instruciunile IF-THEN
precedente au valoarea . FALSE. (fals);
bl oc o secven de una sau mai multe instruciuni;
ENDI F cuvnt cheie (obligatoriu); marcheaz terminarea unui bloc I F.
Efect: Definete blocuri de instruciuni i le execut condiionat. Dac expresia
logic exp1 din instruciunea IF-THEN are valoarea . TRUE. , se va
executa primul bloc i controlul se va transfera la prima instruciune
executabil dup cuvntul cheie ENDI F. Dac expresia logic exp1 are
valoarea logic . FALSE. , procedura se va repeta pentru urmtoarea
instruciune ELSE IF-THEN. Dac toate expresiile logice au valoarea
. FALSE. , se va executa bloc-ul ce urmeaz cuvntului cheie ELSE.
Dac acest bloc nu exist, controlul se va transfera la urmtoarea
instruciune executabil care urmeaz cuvntului cheie ENDI F.
IMPLICIT, declararea naturii implicite de tip:

I MPLI CI T t i p ( a[ , a] . . . ) [ , t i p ( a[ , a] . . . ) ] . . .
unde: I MPLI CI T instruciunea declarativ;
t i p specificator de tip (a se vedea Declaraia de tip);
a fie o singur liter, fie dou litere, n ordine alfabetic, separate printr-
o liniu (de exemplu: A, DF).
Efect: Atribuie tipul specificat tuturor entitilor al cror nume simbolic ncepe
cu una din literele aparinnd domeniului descris ntre paranteze.
- 51 -
INCLUDE, inserare de cod:

I NCLUDE ' specf i s' [ / opt ]
unde: I NCLUDE instruciunea declarativ;
specf i s un specificator de fiier (citat);
opt opiune (comutator opional) cu una din urmtoarele dou forme:
LI STF se listeaz instruciunile incluse (implicit);
NOLI ST nu se listeaz instruciunile din fiierul inclus.
Efect: Include instruciunile surs din fiierul specificat prin specfis n
compilarea fiierului surs curent.
INTRINSIC, redeclararea funciilor interne:

I NTRI NSI C nume[ , nume] . . .
unde: I NTRI NSI C instruciunea declarativ;
nume numele simbolic al unei funcii intrinseci (interne).
Efect: Desemneaz numele simbolic ca funcii intrinseci i permite utilizarea
acestor nume n cadrul unitii curente de program, cu parametri efectivi.
Se subnelege c aceste funcii trebuie s fie funcii existente, predefinite
intern.
OPEN, deschiderea fiierelor:

OPEN( p[ , p] . . . )
unde: OPEN instruciunea executabil;
p parametru, fiind specificaia unui cuvnt cheie, de forma:
cuv sau cuv=val
unde cuv este cuvnt cheie (a se vedea tabelul urmtor);
val valoare n funcie de cuvntul cheie cuv (a se vedea
tabelul urmtor).
Efect: Deschide un fiier asociindu-l cu unitatea logic u specificat, n
conformitate cu parametrii specificai prin cuvintele cheie.
- 52 -
Tabel cu parametrii din instruciunea OPEN (n ordine alfabetic):
Cuvntul cheie (cuv) Valoarea (val) Funciune Implicit
ACCESS ' SEQUENTI AL'
' DI RECT'
' APPEND'
' KEYED'
Metoda de acces
'SEQUENTI AL'
ASSOCI ATEVARI ABLE val Numrul
nregistrrii
urmtoare n
accesul direct
Nu exist variabil
asociat
BLANK ' NULL'
' ZERO'
Interpretarea
spaiilor
(blank-urilor)
'NULL'
BLOCKSI ZE val Dimensiunea
tamponului de
intrare/ieire
Alocat de sistem
BUFFERCOUNT val Numrul de
tampoane de
intrare/ieire
Alocat de sistem
CARRI AGECONTROL ' FORTRAN'
' LI ST'
' NONE'
Controlul
(interpretarea)
returului de car
' FORTRAN' n
cazul formatat, i
' NONE' n cazul
neformatat
DI SPOSE
sau
DI SP
' SAVE'
' KEEP'
' PRI NT'
' DELETE'
Starea fiierului la
nchidere
'SAVE'
ERR e Eticheta de transfer
la eroare
Nu se face transfer
la eroare
EXTENDSI ZE val Extensie de alocare
a spaiului de
memorie pentru
fiier
Dat de sistemul
de operare sau de
volum (partiie)
FI LE
sau
NAME
specfis Specificator de
fiier
Depinde de unitate
i de sistem
FORM 'FORMATTED'
' UNFORMATTED'
Formatul fiierului Depinde de
cuvntul cheie
ACCESS
I NI TI ALSI ZE val Spaiu de memorie
alocat pentru fiier
Nu se aloc
KEY ( k[ , k] . . . ) Cmpurile de cheie
pentru fiier
indexat
Nu este implicit
- 53 -
Cuvntul cheie (cuv) Valoarea (val) Funciune Implicit
MAXREC val Numrul maxim de
nregistrri n
accesul direct
Nu exist
maximum
NOSPANBLOCKS nregistrrile nu
traverseaz
blocurile
nregistrrile pot
traversa blocurile
ORGANI ZATI ON 'SEQUENTI AL'
'RELATI VE'
' I NDEXED'
Structura fiierului
'SEQUENTI AL'
READONLY Protecie la scriere Neprotejat la
scriere
RECL
sau
RECORDSI ZE
val Lungimea
nregistrrii
Depinde de
cuvintele cheie:
TYPE,
ORGANI ZATI ON,
RECORDTYPE
RECORDTYPE 'FI XED'
' VARI ABLE'
' SEGMENTED'
Structura
nregistrrii
Depinde de
cuvintele cheie:
ACCESS, FORM
SHARED Acces partajat la
fiier
Nu este permis
accesul partajat la
fiier
STATUS
sau
TYPE
'OLD'
' NEW'
' SCRATCH'
' UNKNOWN'
Starea fiierului la
deschidere
'UNKNOWN'
UNI T u Numrul unitii
logice asociate
fiierului
Nu este implicit
USEROPEN nume Opiune pentru un
program utilizator
Nu exist opiune

Semnificaia notaiilor din coloana valorilor val (exceptnd cuvintele cheie):
val valoare numeric;
e eticheta unei instruciuni executabile;
specfis specificator de fiier;
k numele simbolic asociat cmpului de cheie;
u numrul unitii logice;
nume numele simbolic al unei uniti de program.
- 54 -
PARAMETER, declaraie pentru parametri:

PARAMETER ( p=c[ , p=c] . . . )
unde: PARAMETER instruciunea declarativ;
p nume simbolic;
c constant.
Efect: Definete un nume simbolic pentru o constant.
PAUSE, suspendarea temporar a execuiei:

PAUSE [ i r ]
unde: PAUSE instruciunea executabil;
i r un ir constituit din maximum cinci caractere numerice (cifre), o
constant octal sau un literal alfanumeric.
Efect: Suspend execuia programului i afieaz ir la terminal. Execuia
programului se continu doar dup comanda dat de la tastatur de ctre
utilizator.
PRINT, scriere secvenial:

PRI NT f [ , l i st ]
unde: PRI NT instruciunea executabil;
f referin la format (specificator de format);
l i st list de ieire.
Efect: Scrie o nregistrare pe dispozitivul de ieire implicit (consol/monitor sau
imprimant), coninnd valorile elementelor din list. Valorile sunt
convertite n conformitate cu specificaia de format f.
Varianta cu format implicit: PRI NT *[ , l i st ]
PROGRAM, definirea programului principal:

PROGRAM nume
unde: PROGRAM instruciunea declarativ;
- 55 -
nume nume simbolic (asociat corpului programului principal).
Efect: Specific un nume pentru programul principal. Declaraia fiind opional,
n cazul n care este omis, programul principal va purta numele simbolic
MAI N.
READ, citire secvenial:

READ( [ UNI T=] u[ , [ FMT=] f ] [ , END=e1] [ , ERR=e2] ) [ l i st ]
sau
READ f [ , l i st ]
unde: READ instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
END cuvnt cheie pentru tratarea ntlnirii sfritului fiierului (EOF);
e1 eticheta unei instruciuni executabile;
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e2 eticheta unei instruciuni executabile;
l i st list de intrare (cu elemente separate prin virgul).
Efect: Citete una sau mai multe nregistrri logice de la unitatea u i atribuie
valori elementelor din list. Valorile sunt convertite n conformitate cu
specificatorul de format f. Atunci cnd n sintax s-a folosit END=e1 i la
executarea instruciunii se ntlnete sfritul fiierului (EOF), controlul
va fi transferat instruciunii executabile cu eticheta e1 din cadrul aceleiai
uniti de program. Atunci cnd n sintax s-a folosit ERR=e2 i apare o
eroare la execuie, controlul va fi transferat instruciunii executabile cu
eticheta e2 din cadrul aceleiai uniti de program.
Varianta cu format implicit:
READ( [ UNI T=] u, [ FMT=] *[ , END=e1] [ , ERR=e2] ) [ l i st ]
sau
READ *[ , l i st ]
Efect: Citete una sau mai multe nregistrri logice de la unitatea u i atribuie
valori elementelor din list. Valorile sunt convertite n conformitate cu
tipul elementelor din list.
- 56 -
Varianta fr format:
READ( [ UNI T=] u[ , END=e1] [ , ERR=e2] ) [ l i st ]
Efect: Citete o nregistrare (un articol) fr format de la unitatea logic u i
atribuie valori elementelor din list.
READ, citire n acces direct:

READ( [ UNI T=] u, REC=r [ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
sau
READ( u' r [ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
unde: READ instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
REC cuvnt cheie pentru desemnarea nregistrrii;
r expresie ntreag (semnificnd numrul nregistrrii vizate);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st list de intrare (cu elemente separate prin virgul).
Efect: Citete nregistrri pornind cu nregistrarea r de la unitatea logic u i
atribuie valori elementelor din list. Valorile sunt convertite n
conformitate cu specificatorul de format f. Atunci cnd n sintax s-a
folosit ERR=e i apare o eroare la execuie, controlul va fi transferat
instruciunii executabile cu eticheta e din cadrul aceleiai uniti de
program.
Varianta fr format:
READ( [ UNI T=] u, REC=r [ , ERR=e] ) [ l i st ]
sau
READ( u' r [ , ERR=e] ) [ l i st ]
Efect: Citete nregistrarea r de la unitatea logic u i atribuie valori elementelor
din list.
Not: Citirea direct se aplic fiierelor cu organizare relativ. Un fiier secvenial poate
fi citit n acces direct numai dac nregistrrile au lungimi egale (fixe) i fiierul a
fost asociat cu o unitate logic prin instruciunea OPEN utiliznd i parametrul
ACCESS=' DI RECT' . A se vedea instruciunea OPEN.
- 57 -
READ, citire indexat:

READ( [ UNI T=] u[ , [ FMT=] f ] , cc=vc[ , KEYI D=nc] [ , ERR=e] ) [ l i st ]
unde: READ instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
cc cuvnt cheie, una din urmtoarele:
KEY, KEYEQ, KEYGE sau KEYGT;
vc expresie (valoare) de cheie;
KEYI D cuvnt cheie pentru referina cheii;
nc expresie ntreag (numrul de referin sau rangul cheii);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st list de intrare (cu elemente separate prin virgul).
Efect: Citete nregistrarea, de la unitatea logic u, descris de expresia de cheie
vc i numrul de referin al cheii nc. Valorile din nregistrare sunt
convertite n conformitate cu specificatorul de format f i vor fi atribuite
elementelor din list. Dac cuvntul cheie KEYI D este omis (i implicit
referina de cheie nc), atunci se subnelege un singur cmp definit ca i
cheie n structura nregistrrii. Atunci cnd n sintax s-a folosit ERR=e i
apare o eroare la execuie, controlul va fi transferat instruciunii
executabile cu eticheta e din cadrul aceleiai uniti de program.
Varianta fr format:
READ( [ UNI T=] u, cc=vc[ , KEYI D=nc] [ , ERR=e] ) [ l i st ]
Efect: Citete nregistrarea, de la unitatea logic u, descris de expresia de cheie
vc i numrul de referin al cheii nc. Valorile din nregistrare vor fi
atribuite elementelor din list.
Not: Citirea indexat se poate aplica doar fiierelor indexate care conin una sau mai
multe cmpuri de nregistrare declarate sub form de cheie. A se vedea instruciu-
nea OPEN.
READ, citire intern:

READ( [ UNI T=] c, [ FMT=] f [ , END=e1] [ , ERR=e2] ) [ l i st ]
- 58 -
unde: READ instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
c specificator de fiier intern;
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
END cuvnt cheie pentru tratarea ntlnirii sfritului fiierului (EOF);
e1 eticheta unei instruciuni executabile;
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e2 eticheta unei instruciuni executabile;
l i st list de intrare (elementele separate prin virgul).
Efect: Citete date caracter de la un fiier intern c, transform datele din caracter
n form binar utiliznd specificatorul de format f, atribuie datele
transformate elementelor din list n ordine, de la stnga la dreapta.
Atunci cnd n sintax s-a folosit END=e1 i la executarea instruciunii se
ntlnete sfritul fiierului (EOF), controlul va fi transferat instruciunii
executabile cu eticheta e1 din cadrul aceleiai uniti de program. Atunci
cnd n sintax s-a folosit ERR=e2 i apare o eroare la execuie, controlul
va fi transferat instruciunii executabile cu eticheta e2 din cadrul aceleiai
uniti de program.
Not: Citirea intern se utilizeaz pentru convertirea caracterelor. A se vedea i
instruciunea DECODE.
RETURN, revenire din subunitatea curent de program n cel apelant:

RETURN
unde: RETURN intruciune executabil.
Efect: ntoarce controlul programului apelant din cadrul subprogramului curent.
REWIND, repoziionare:

REWI ND( [ UNI T=] u[ , ERR=e] )
sau
REWI ND u
unde: REWI ND instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
- 59 -
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Repoziioneaz unitatea logic u la nceputul fiierului curent, deschis.
Atunci cnd n sintax s-a folosit ERR=e i apare o eroare la execuie,
controlul va fi transferat instruciunii executabile cu eticheta e din cadrul
aceleiai uniti de program.
REWRITE, rescriere:

REWRI TE( [ UNI T=] u[ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
unde: REWRI TE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st lista de ieire.
Efect: Rescrie nregistrarea curent de pe unitatea logic u, utiliznd valorile
elementelor din list. Valorile sunt convertite conform referinei de
format f (dac aceasta a fost specificat). Atunci cnd n sintax s-a folosit
ERR=e i apare o eroare la execuie, controlul va fi transferat instruciunii
executabile cu eticheta e din cadrul aceleiai uniti de program.
SAVE, salvarea entitilor:

SAVE [ a[ , a] . . . ]
unde: SAVE instruciunea declarativ;
a numele unui bloc comun (incadrat de /-uri), nume de variabil sau de
tablou.
Efect: Pstreaz definirea curent a entitilor a dup ntlnirea unei instruciuni
END sau RETURN a unui subprogram.
- 60 -
STOP, oprirea execuiei:

STOP [ i r ]
unde: STOP instruciunea executabil;
i r un ir de maximum cinci cifre zecimale, un literal alfanumeric sau
o constant octal.
Efect: Termin execuia programului, afind la terminalul utilizatorului ir-ul
specificat.
SUBROUTINE, declararea unui subprogram:

SUBROUTI NE nume[ ( [ p[ , p] . . . ] ) ]
unde: SUBROUTI NE instruciunea declarativ;
nume nume simbolic (asociat subprogramului);
p nume simbolic (parametru formal).
Efect: Definete o unitate de program ca subprogram extern avnd numele
indicat prin nume i utiliznd parametri formali p. Transferarea valorilor
se efectueaz prin corespondena parametrilor formali p (ca ordine i tip)
cu parametrii efectivi din linia de apel. A se vedea instruciunea CALL.
TYPE, scriere secvenial:

TYPE f [ , l i st ]
unde: TYPE instruciunea executabil;
f referin la format (specificator de format);
l i st list de ieire.
Efect: Scrie o nregistrare pe dispozitivul de ieire implicit (consol/monitor),
coninnd valorile elementelor din list. Valorile sunt convertite n
conformitate cu specificaia de format f.
Varianta cu format implicit: TYPE *[ , l i st ]
- 61 -
UNLOCK, deblocarea unitii logice:

UNLOCK( [ UNI T=] u[ , ERR=e] )
sau
UNLOCK u
unde: UNLOCK instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile.
Efect: Deblocheaz toate nregistrrile curente blocate, de pe unitatea logic u.
Atunci cnd n sintax s-a folosit ERR=e i apare o eroare la execuie,
controlul va fi transferat instruciunii executabile cu eticheta e din cadrul
aceleiai uniti de program.
VIRTUAL, declararea memoriei virtuale:

VI RTUAL a( d) [ , a( d) ] . . .
unde: VI RTUAL instruciunea declarativ;
a numele tabloului;
d declaratorul de dimensiune, sub forma:
n[ , n] . . .
unde: n este o expresie ntreag (semnificnd numrul de elemente n
dimensiunea respectiv).
Efect: Specific rezervarea spaiului necesar memorrii tablourilor indicate prin
a(d), n afara spaiului direct adresabil al programului.
WRITE, scriere secvenial:

WRI TE( [ UNI T=] u[ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
unde: WRI TE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
- 62 -
l i st list de ieire.
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u, coninnd
valorile elementelor din list. Valorile sunt convertite conform referinei
de format f (dac aceasta a fost specificat). Atunci cnd n sintax s-a
folosit ERR=e i apare o eroare la execuie, controlul va fi transferat
instruciunii executabile cu eticheta e din cadrul aceleiai uniti de
program.
Varianta cu format implicit:
WRI TE( [ UNI T=] u, [ FMT=] *[ , ERR=e] ) [ l i st ]
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u, coninnd
valorile elementelor din list. Valorile sunt convertite n conformitate cu
tipul elementelor din list.
Varianta fr format:
WRI TE( [ UNI T=] u[ , ERR=e] ) [ l i st ]
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u, coninnd
valorile elementelor din list.
WRITE, scriere n acces direct:

WRI TE( [ UNI T=] u, REC=r [ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
sau
WRI TE( u' r [ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
unde: WRI TE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
REC cuvnt cheie pentru desemnarea nregistrrii;
r expresie ntreag (semnificnd numrul nregistrrii vizate);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st list de ieire (cu elemente separate prin virgul).
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u, coninnd
valorile elementelor din list, ncepnd de la nregistrarea r. Valorile sunt
convertite n conformitate cu referina de format f (dac aceasta s-a
- 63 -
specificat n cadrul instruciunii). Atunci cnd n sintax s-a folosit
ERR=e i apare o eroare la execuie, controlul va fi transferat instruciunii
executabile cu eticheta e din cadrul aceleiai uniti de program.
Varianta fr format:
WRI TE( [ UNI T=] u, REC=r [ , ERR=e] ) [ l i st ]
sau
WRI TE( u' r [ , ERR=e] ) [ l i st ]
Efect: Scrie nregistrarea r pe unitatea logic u coninnd valorile elementelor
din list.
Not: Scrierea direct se aplic fiierelor cu organizare relativ deschise n acces direct.
A se vedea instruciunea OPEN.
WRITE, scriere indexat:

WRI TE( [ UNI T=] u[ , [ FMT=] f ] [ , ERR=e] ) [ l i st ]
unde: WRI TE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
u expresie ntreag (semnificnd numrul unei uniti logice);
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st list de ieire.
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u (conectat la un
fiier indexat), coninnd valorile elementelor din list. Valorile sunt
convertite conform referinei de format f (dac aceasta a fost specificat).
Atunci cnd n sintax s-a folosit ERR=e i apare o eroare la execuie,
controlul va fi transferat instruciunii executabile cu eticheta e din cadrul
aceleiai uniti de program.
Varianta fr format:
WRI TE( [ UNI T=] u[ , ERR=e] ) [ l i st ]
Efect: Scrie una sau mai multe nregistrri pe unitatea logic u (conectat la un
fiier indexat), coninnd valorile elementelor din list.
Not: Scrierea indexat corespunde sintactic cu scrierea secvenial.
- 64 -
WRITE, scriere intern:

WRI TE( [ UNI T=] c, [ FMT=] f [ , ERR=e] ) [ l i st ]
unde: WRI TE instruciunea executabil;
UNI T cuvnt cheie pentru desemnarea unitii logice;
c specificator de fiier intern;
FMT cuvnt cheie pentru referina de format;
f referin la format (specificator de format);
ERR cuvnt cheie pentru tratarea unei erori la executarea instruciunii;
e eticheta unei instruciuni executabile;
l i st list de ieire (elementele separate prin virgul).
Efect: Scrie elementele din list pe fiierul intern specificat prin c, convertindu-
le n iruri de caractere n conformitate cu specificaia de format f. Atunci
cnd n sintax s-a folosit ERR=e i apare o eroare la execuie, controlul
va fi transferat instruciunii executabile cu eticheta e din cadrul aceleiai
uniti de program.
Not: Scrierea intern se poate utiliza pentru convertirea valorilor de tip ntreg n
caractere (chiar n caractere extinse, neimprimabile), cu condiia ca valorile s
corespund cu codul ASCII. A se vedea i instruciunea ENCODE.


3.4 DESCRIPTORII DE INTRARE/IEIRE
Descriptorii sunt specificatori de cmpuri utilizai la operaiile de citire/scriere n cadrul
instruciunii FORMAT pentru stabilirea formei valorilor din lista de intrare/ieire. Ei pot fi
folosii i fr instruciunea FORMAT, fiind citai n asemenea cazuri n lista de parametri a
instruciunilor de intrare ieire, n locul referinei de format f, sub forma: ' ( l i st ) '
(unde list are semnificaia prezentat la instruciunea FORMAT). Lista descriptorilor
trebuie s corespund ca ordine i tip cu elementele din lista de intrare/ieire, n caz contrar
putnd avea loc conversii, efecte nedorite sau erori.

Descriptorii pot alctui liste complexe, repetiiile putnd fi marcate prin includerea n
paranteze rotunde precedate de un factor de repetiie opional (scalar). Dac numrul
descriptorilor specificai n list este mai mic dect numrul valorilor din lista de
intrare/ieire, se vor relua de la stnga la dreapta descriptorii din ultima parantez deschis.

n cele ce urmeaz, vom prezenta sub form tabelar descriptorii din Fortran 77 n ordine
alfabetic. Acetia se regsesc i n variantele ulterioare ale limbajului pe lng ali
descriptori mai noi bineneles, ei putnd fi grupai n dou categorii: de editare i de
control.

- 65 -
Tabel cu descriptorii de editare:
Tip Sintax Efect
A [ n] Aw
Descrie n cmpuri de tip alfanumeric (CHARACTER),
fiecare cu w poziii.
D [ n] Dw. d
Descrie n cmpuri de numere reale extinse (DOUBLE
PRECI SI ON sau REAL*8), fiecare cu cte w poziii din
care d sunt dup punctul zecimal.
E [ n] Ew. d[ Ee] Descrie n cmpuri de numere reale sub form exponenial,
fiecare cu cte w poziii din care d sunt dup punctul
zecimal. Opional se poate specifica prin e numrul de
caractere utilizate pentru exponent.
F [ n] Fw. d Descrie n cmpuri de numere reale, fiecare cu cte w poziii
din care d sunt dup punctul zecimal.
G [ n] Gw. d[ Ee]
Descrie n cmpuri de numere reale extinse (DOUBLE
PRECI SI ON sau REAL*8) sub form exponenial, fiecare
cu cte w poziii din care d sunt dup punctul zecimal.
Opional se poate specifica prin e numrul de caractere
utilizate pentru exponent.
H cHa[ a. . . ] Descrie o constant de tip Hollerith avnd lungimea c i
coninutul specificat prin a (un numr de c caractere ce
urmeaz dup litera cheie H).
I [ n] I w Descrie n cmpuri de numere ntregi, fiecare cu cte w
poziii.
L [ n] Lw Descrie n cmpuri de tip logic, fiecare cu cte w poziii.
Z [ n] Zw Descrie n cmpuri de numere hexadecimale, fiecare cu cte
w poziii.
Tabel cu descriptorii de control:
Tip Sintax Efect
/ / [ / . . . ] Similar cu returul de car (Enter). Determin ncheierea
rndului curent i saltul la nceputul unui rnd nou pentru
tratarea urmtoarelor valori prin descriptorii din lista
curent.
\ \ [ \ . . . ] Inhib saltul la rnd nou. Urmtoarele valori formatate vor
fi tot pe rndul curent, n continuare.
BN BN Ignor spaiile dintr-un cmp numeric (Blank None).
BZ BZ Determin interpretarea spaiilor dintr-un cmp numeric ca
zerouri (Blank Zero).
S S Determin tratarea semnului valorilor numerice (Sign),
anulnd efectul descriptorilor SP i SS.
SP SP
Determin afiarea semnului plus (+) la valori numerice
pozitive (Sign Plus).
SS SS
Inhib semnul opional plus (+) la valori numerice pozitive
(Sign Suppressed).
- 66 -
Tip Sintax Efect
T Tn Introduce n tabulatori orizontali (Tab).
TL TLn Introduce n tabulatori orizontali spre stnga (Tab Left).
TR TRn Introduce n tabulatori orizontali spre dreapta (Tab Right).
X nX Sare peste n poziii (introduce n spaii)
Not: Descriptorii de formatare / i \ nu trebuie separai neaprat prin virgul de
restul descriptorilor din list, ei nii avnd i rol de separare.


3.5 FUNCIILE INTRINSECI DIN FORTRAN 77
Funciile intrinseci sunt specifice bibliotecilor utilizate, avnd nume simbolice prestabilite
(rezervate). Printre ele exist unele ce fac parte din echiparea standard a mediului de
programare, regsindu-se n toate variantele limbajului Fortran. Numele acestor funcii sunt
rezervate, nu pot exista variabile sau tablouri de variabile care s aibe nume ce coincid cu
cele ale funciilor intrinseci. De asemenea, numele acestor funcii nu se recomand s apar
ntr-o list a unei instruciuni EXTERNAL, acest fapt ducnd la anularea definiiei lor
intrinseci. n cazul includerii numelor lor n liste ale instruciunii declarative I NTRI NSI C,
ele vor putea fi utilizate ca parametri la proceduri (uniti de subprograme sau de funcii
definite de utilizator).

Sintaxa general a acestora este urmtoarea:
nume( p[ , p] . . . )
unde: nume nume simbolic (denumirea funciei);
p nume simbolic (al parametrului efectiv).

Tabel cu funciile intrinseci din limbajul Fortran 77:
Parametrii Funcia Definiie Nume
generic Nr. Tip Nume Tip
Efect
R ABS R
D DABS D
R CABS R
I I I ABS I

ABS
I4 J I ABS I4
I I I ABS I

|x|
I ABS

1
I4 J I ABS I4
Returneaz valoarea
absolut (modulul)
argumentului specificat.
R COS R
D DCOS D cos(x)

COS

1
C CCOS C
Returneaz valoarea
cosinusului argumentului
exprimat n radiani.
R SI N R
D DSI N D sin(x)

SI N

1
C CSI N C
Returneaz valoarea
sinusului argumentului
exprimat n radiani.
- 67 -
Parametrii Funcia Definiie Nume
generic Nr. Tip Nume Tip
Efect
R EXP R
D DEXP D e
x


EXP

1
C CEXP C
Returneaz valoarea
exponenial a
argumentului.
R ALOG R
D DLOG D ln(x)

LOG

1
C CLOG C
Returneaz valoarea
logaritmului natural al
argumentului.
R ALOG10 R log(x) LOG10 1
D DLOG10 D
Logaritmul n baza 10 al
argumentului.
R SQRT R
D DSQRT D x

SQRT

1
C CSQRT C
Returneaz radicalul
argumentului.
R TAN R tg(x) TAN 1
D DTAN D
Tangenta argumentului
exprimat n radiani.
R ACOS R arccos(x) ACOS 1
D DACOS D
Arccosinusul argumentului
exprimat n radiani.
R ASI N R arcsin(x) ASI N 1
D DASI N D
Arcsinusul argumentului
exprimat n radiani.
R ATAN R arctg(x) ATAN 1
D DATAN D
Arctangenta argumentului
exprimat n radiani.
R ATAN2 R arctg(x/y) ATAN2 2
D DATAN2 D
Arctangenta argumentului
exprimat n radiani.
R COSH R cosh(x) COSH 1
D DCOSH D
Cosinusul hiperbolic al
argumentului.
R SI NH R sinh(x) SI NH 1
D DSI NH D
Sinusul hiperbolic al
argumentului.
R TANH R tgh(x) TANH 1
D DTANH D
Tangenta hiperbolic a
argumentului.
I I MOD I
I4 J MOD I4
R AMOD R

rest din x/y

MOD

2
D DMOD D
Returneaz restul mpririi
dintre argumente (cu
semnul primului argument).
I I MAX0 I
I4 J MAX0 I4
R AMAX1 R

MAX
D DMAX1 D
Returneaz valoarea
maxim dintre elementele
cuprinse n lista de
argumente.
I I MAX0 I MAX0
I4 J MAX0 I4
Valoarea maxim dintr-o
list de valori ntregi.
R I MAX1 I4 MAX1
R J MAX1 I4
Maximul dintr-o list de
valori reale, ca ntreg.
I AI MAX0 R

max(x,y,...)
AMAX0

>1
I4 AJ MAX0 R
Maximul dintr-o list de
valori ntregi, ca real.
- 68 -
Parametrii Funcia Definiie Nume
generic Nr. Tip Nume Tip
Efect
I I MI N0 I
I4 J MI N0 I4
R AMI N1 R

MI N
D DMI N1 D
Returneaz valoarea
minim dintre elementele
cuprinse n lista de
argumente.
I I MI N0 I MI N0
I4 J MI N0 I4
Valoarea minim dintr-o
list de valori ntregi.
R I MI N1 I4 MI N1
R J MI N1 I4
Minimul dintr-o list de
valori reale, ca ntreg.
I AI MI N0 R

min(x,y,...)
AMI N0

>1
I4 AJ MI N0 R
Minimul dintr-o list de
valori ntregi, ca real.
R I I NT I
R J I NT I4
D I I DI NT I

I NT
D J I DI NT I4
D I I DI NT I I DI NT
D J I DI NT I4
Returneaz valoarea
trunchiat a argumentului la
cel mai apropiat ntreg.
R AI NT R

trunchiere [x]
AI NT

1
D DI NT D
Valoarea real trunchiat
(cu zero la zecimale).
R I NI NT I
R J NI NT I4
D I I DNNT I

NI NT
D J I DNNT I4
D I I DNNT I I DNI NT
D J I DNNT I4
Returneaz valoarea
rotunjit a argumentului la
cel mai apropiat ntreg.
R ANI NT R

rotunjire la
cel mai
apropiat
ntreg
[x +
0.5*sign(x)]
ANI NT

1
D DNI NT D
Valoarea real rotunjit (cu
zero la zecimale).
I I I DI M I
I4 J I DI M I4
R DI M R

DI M
D DDI M D
I I I DI M I

x min(x,y)
I DI M

2
I4 J I DI M I4
Returneaz valoarea
diferenei dintre cele dou
argumente, dac aceasta
este pozitiv. Altfel
returneaz zero.
I I I SI GN I
I4 J I SI GN I4
R SI GN R

SI GN
D DSI GN D
I I I SI GN I

transferul
semnului
ntre dou
valori
I SI GN

2
I4 J I SI GN I4
Returneaz valoarea
primului argument cu
semnul celuilalt:

SI GN( y) *ABS( x)
1 I4 RAN R generarea
unui numr
RAN
2 I RAN R
Returneaz un numr
pseudoaleator cu distribuie
uniform ntre 0 i 1.
- 69 -
Parametrii Funcia Definiie Nume
generic Nr. Tip Nume Tip
Efect
I FLOATI R FLOAT 1
I4 FLOATJ R
Conversie ntreg n real.
I DFLOTI D DFLOAT 1
I4 DFLOTJ D
Conversie ntreg n dubl
precizie.
R I I FI X I I FI X 1
R J I FI X I4
Conversie real n ntreg prin
rotunjire.
D SNGL R
I FLOATI R
SNGL

1
I4 FLOATJ R
Conversie n real (simpl
precizie).
R DBLE D
I DFLOTI D
DBLE

1
I4 DFLOTJ D
Conversie n dubl precizie.
I C
I4 C
R CMPLX C

CMPLX

1,2
D C
Conversie n valoare
complex a argumentului
(sau n parte real i
imaginar a argumentelor).

conversii de
valori, ntre
diferite tipuri
I CHAR 1 CH I CHAR I Conversie n codul ASCII.
C REAL R
I FLOATI R
I4 FLOATJ R

parte real

REAL

1
D SNGL R
Returneaz partea real a
argumentului.
parte
imaginar
AI MAG 1 C AI MAG R Returneaz partea imagina-
r dintr-un numr complex.
conjugare CONJ G 1 C CONJ G C Conjugatul unui complex.
produs, lun-
gime dubl
DPROD 2 R DPROD D n dubl precizie produsul
celor dou argumente reale.
I I I AND I I logic pe bit I AND 2
I4 J I AND I4
AND logic ntre dou
argumente.
I I I OR I SAU logic pe
bit
I OR 2
I4 J I OR I4
OR logic inclusiv ntre dou
argumente.
I I I EOR I SAU exclusiv
pe bit
I EOR 2
I4 J I EOR I4
OR logic exclusiv ntre dou
argumente.
I I NOT I negaia logic
pe bit
NOT 1
I4 J NOT I4
Complementul logic al
argumentului.
I I I SHFT I deplasare
logic pe bit
I SHFT 2
I4 J I SHFT I4
Deplasarea terminal logic
a biilor din argument.
lungimea
unui ir
LEN 1 CH LEN I Numrul de caractere din
irul considerat argument.
poziia ntr-
un ir a unui
subir
I NDEX 2 CH I NDEX I Poziia de nceput a
subirului n irul specificat
ca primul argument.
- 70 -
Parametrii Funcia Definiie Nume
generic Nr. Tip Nume Tip
Efect
CH LLT L
CH LLE L
CH LGT L

comparaie
lexical



2
CH LGE L
Returneaz o valoare logic
rezultat dintr-o comparaie
ntre argumente de tip
caracter.

Not: Pentru tipul parametrilor i a funciilor s-au utilizat urmtoarele notaii:
I I NTEGER*2
I4 I NTEGER*4
R REAL*4
D DOUBLE PRECI SI ON ( REAL*8)
CH CHARACTER
C COMPLEX
L LOGI CAL*2

Observaii:
Argumentul funciei logaritmice reale sau dubl precizie trebuie s fie pozitiv,
iar argumentul funciei CLOG trebuie s fie diferit de (0.,0.).
Argumentul funciei rdcin ptrat real sau dubl precizie trebuie s fie
pozitiv sau nul. Valoarea funciei CSQRT are ntotdeauna partea real mai mare
sau egal cu zero (cnd partea real a valorii funciei este zero, atunci partea sa
imaginar este mai mare sau egal cu zero).
Rezultatul funciilor ATAN i DATAN este n intervalul /2.../2, iar ale
funciilor ATAN2 i DATAN2 n intervalul ..., semnul fiind dat de primul
argument. Dac ambele argumente sunt nule atunci rezultatul este nedefinit.
Funcia MOD(x,y) fiind definit prin expresia x| x/ y| *y, rezult nedefinit
dac al doilea argument este nul.
Funcia de transfer al semnului este nedefinit dac al doilea argument este nul.
Dac funcia CMPLX are un singur argument, acesta este convertit i atribuit
prii reale a valorii complexe rezultate, partea imaginar rezultnd nul.


- 71 -


4.1 TRECEREA DE LA FORTRAN 77 LA FORTRAN 90
n prezent se lucreaz la un compilator GNU Fortran 90, ceea ce impune discutarea unor
aspecte legate de scrierea programelor ntr-o manier mai modern. Dac se compar
posibilitile oferite de Fortran 77 cu cele din alte limbaje de programare (Forth, C, C++,
Pascal etc.) se observ foarte uor motivul pierderii interesului programatorilor pentru acest
limbaj. Dezvoltarea acestuia a survenit n mod firesc, ca o necesitate pentru susinerea i
adaptarea programelor deja existente pe lng realizarea de aplicaii noi, moderne i
competitive, n pas cu dezvoltarea domeniillor tiinifice conexe i cu cerinele utilizatorilor
de programe. Aspectele imputate n general versiunii consacrate a limbajului Fortran 77
sunt urmtoarele:
Lipsa facilitilor de stocare dinamic;
Lipsa tipurilor i structurilor de date definite de utilizator (exceptnd blocul
COMMON, considerat chiar revoluionar la momentul apariiei);
Uurina cu care se pot comite greeli nesesizate de compilator, n special la
apelarea procedurilor (subprograme sau funcii);
Portabilitatea uneori limitat a programelor (de multe ori coninnd caracteristici
dependente de platform, mai ales n cazul folosirii extensiilor specifice);
Structurile de control sunt slabe (de multe ori nu se pot evita instruciunile de salt
ceea ce conduce la complicarea nelegerii codului);
Reguli arhaice rmase din era cartelelor perforate (format fix pe 80 de coloane,
nume simbolice limitate la 6 caractere, etc.).

Schimbrile eseniale aduse de limbajul Fortran 90 sunt considerate a fi urmtoarele:
Format liber la scrierea sursei, concomitent cu alte mbuntiri simple;
Tablouri ca i obiecte, expresii de tablouri, asignri i funcii;
Alocare dinamic a memoriei, pointeri ce permit construcii de structuri
complexe i dinamice de date;
Tipuri de date definite de utilizator (pe lng posibilitatea definirii unor operatori
noi, operatorii existeni pot fi redefinii prin suprancrcare);
Modulul o unitate de program care poate conine date i seturi de proceduri
conexe (subprograme sau funcii). Se pot implementa clase i funcii
aparintoare pentru programarea orientat pe obiecte;
Procedurile pot fi recursive, pot avea nume generice, argumente opionale etc.;
Structuri noi de control (cum ar fi: SELECT CASE, CYCLE, EXI T) care permit
restrngerea utilizrii etichetelor i a salturilor explicite.

Programele pot fi redactate astfel ntr-o manier mai simpl, uurnd ntreinerea lor. Codul
generat poate deveni mai sigur i mai stabil deoarece compilatorul poate detecta mult mai
multe greeli n cazul utilizrii caracteristicilor de securitate avansat. Programele sunt mai
portabile, rmnnd foarte puine trsturi legate de main, nevoia de a utiliza extensii
specifice unor platforme fiind redus. Se pot scrie chiar aplicaii pentru procesare paralel,
CAPITOLUL 4: FORTRAN 90
- 72 -
asemenea operaii fiind suportate pe lng celelalte trsturi noi. n aceeai timp Fortran 77
rmne un subset acceptat pe deplin, deci noile trsturi se pot adopta gradual n funcie de
nevoile ivite. Exist ns anumite extensii obinuite ale limbajului Fortran 77 care nu au
fost incluse n varianta 90 de baz, dintre care menionm:
Formatul tabular (caracterul de tabulare <TAB>se convertete n spaii);
Declaraiile de tipul I NTEGER*2 i REAL*8 (sintaxa nou este mai bun dar
mai complicat);
Constante hexadecimale, octale i binare n expresii (se admit doar n declaraiile
de tip DATA);
Structuri de date VAX (sintaxa structurilor este diferit n Fortran 90);
Expresii n cadrul instruciunilor FORMAT (se pot realiza indirect cu operaii
interne de intrare/ieire);
Anumite opiuni de la instruciunea OPEN (de exemplu ACCESS=' APPEND'
schimbat cu POSI TI ON=' APPEND' ).
Dac se folosete varianta curat a standardului Fortran 77, atunci nu apar probleme la
compilarea dup standardul Fortran 90. Dei n Fortran 90 nu exist cuvinte strict rezervate,
sunt disponibile 75 de funcii intrinseci noi fa de versiunea anterioar a limbajului.
Problemele legate de eventuale coincidene la numele funciilor se pot evita folosind
instruciunea declarativ EXTERNAL.
4.1.1 Compilatoare
Compilatoarele Fortran 77 realizeaz n general stocarea variabilelor n mod static, deci
omiterea opiunii SAVE nu avea repercursiuni semnificative. Majoritatea sistemelor Fortran
90 stocheaz ns local variabilele, n proceduri (prin stiv), folosind alocare static doar
atunci cnd e nevoie (cum ar fi cazul variabilelor cu o valoare iniial, sau cu atributul
SAVE explicit), aa c omiterea opiunii SAVE n cadrul surselor vechi poate crea anumite
probleme.
Dei exist deja o varietate mare de compilatoare Fortran 90, att comerciale (ce-i drept mai
scumpe dect compilatoarele Fortran 77), ct i cu licen liber, necomerciale, nu toate
sunt eficiente sau stabile. Dintre cele accesibile la acest moment menionm compilatorul F
(fiind practic realizat pe baza unui subset din Fortran 90, produs de firma Imagine1,
disponibil la ora actual sub licen liber doar pentru sistemul de operare Linux, disponibil
la http://www.imagine1.com/imagine1/). Din pcate, compilatorul ELF90 (o variant mai
restrns a compilatorului Fortran 90, creat de firma Lahey, http://www.lahey.com/), la ora
actual nu mai este promovat. Dei se lucreaz la compilatorul GNU Fortran 90, va mai
trece ceva timp pn cnd acesta va fi finalizat. Predecesorul su, compilatorul GNU
Fortran 77 (g77) este poate cel mai cunoscut deocamdat, fiind disponibil pentru mai multe
platforme de lucru. Este stabil i accesibil dar, dei suport complet standardul Fortran 77,
nu accept dect cteva dintre trsturile noi introduse prin limbajul Fortran 90. Exist i
traductoare ntre diferite versiuni ale limbajului Fortran (cum ar fi cel creat de compania
Pacific-Sierra Research, http://www.psrv.com/, pentru a traduce codul surs din Fortran 90
n Fortran 77, n scopul compilrii cu g77).
- 73 -
4.1.2 Diferene formale
Sursa unui program poate fi scris n Fortran 90 att n form liber, ct i n form fix,
ns cele dou formate nu pot fi amestecate. n general compilatoarele consider fiierele
surs cu extensia . F90 ca fiind implicit n form liber. Liniile din cadrul sursei pot avea o
lungime maxim de 132 de caractere (incluznd i spaiile). n cazul unor rnduri mai lungi
ntreruperea se va marca prin caracterul ampersand (&) scris la captul rndului incomplet.
Pe rndul incomplet, dup marcajul de continuare se pot scrie comentarii (cu condiia s nu
se depeasc cele 132 de caractere n total). Dac prin ntreruperea rndului s-a desprit
un nume simbolic sau o constant, atunci urmtoarea linie (rndul de continuare) trebuie s
nceap cu caracterul &. Cei ce doresc s scrie cod valabil n ambele formate (se poate
dovedi util folosind instruciunea INCLUDE att pentru surse vechi ct i pentru surse de
tipul Fortran 90), pot marca continuarea unui rnd dup coloana 72 (se va considera
comentariu n formatul vechi) n acelai timp scriind caracterul & i n coloana 6 din rndul
de continuare.
n formatul liber spaiile (caracterele blank) sunt semnificative, ele nu pot aprea n nume
simbolice sau constante (cu excepia valorii citate a constantelor de tip caracter), avnd rol
de separare n anumite cazuri. La scrierea codului surs se pot folosi att litere mici ct i
litere mari (mrimea caracterelor conteaz doar n cadrul valorii constantelor de tip
caracter). Numele simbolice pot avea lungimi de pn la 31 de caractere, putnd conine pe
lng caracterele alfanumerice i caracterul de subliniere (_). Instruciunile scrise pe un
rnd comun trebuie s fie separate prin caracterul punct-virgul (;). Comentariile se mar-
cheaz cu semnul exclamrii n fa, ele putnd ncepe oriunde n cadrul unui rnd (chiar i
dup o instruciune, dar n cazul formatului fix marcajul nu poate fi n coloana 6). Constan-
tele de tip caracter pot fi citate ca i coninut prin delimitarea lor fie cu caracterul apostrof
(') fie folosind caracterul ghilimele ("). Operatorii relaionali pot fi scrii att sub forma
veche, ct i sub forma nou (a se vedea tabelul corespunztor din capitolul precedent).

4.1.3 Specificri noi
Declaraia IMPLICIT NONE este comun n Fortran 90, fiind recomandat i pentru
verificarea mai temeinic la compilare. Declaraia de tipul DOUBLE PRECISION este doar
un caz special al declaraiei de tip REAL, n consecin i datele de tip complex pot fi
reprezentate n mod firesc pe lungime dubl (DOUBLE COMPLEX). Dei se sprijin n
continuare instruciunea INCLUDE, o varianta nou: MODULE, ofer mai multe faciliti.
Declaraiile de tip accept o sintax nou (cu separator alctuit din dou puncte duble ntre
declaraii i list), permind definirea simultan a tuturor atributelor pentru elementele unei
liste, precum i iniializarea simultan, de exemplu:
I NTEGER, DI MENSI ON( 10, 10) : : x, y, z
REAL, PARAMETER : : pi = 3. 12159, ud = 180. 0/ pi
CHARACTER( LEN=12) : : f i s = " i nt r ar e1. dat "
Declaraia DATA devine astfel aproape redundant (rmne util la iniializarea unor zone
pariale de tablou, a unor constante hexadecimale etc), iar atributul SAVE este aplicat
- 74 -
implicit asupra tuturor variabilelor cu valori iniiale (indiferent dac ele sunt declarate prin
tip sau DATA). Evoluia sintaxei permite alctuirea unor adevrate expresii de specificare.
Atributul INTENT permite declararea inteniei de folosire a unor argumente formale
(valorile admise fiind: IN, OUT i INOUT).

Declaraiile de tip LOGI CAL*1, I NTEGER*2, sau REAL*8 erau extensii obinuite ale
limbajului Fortran 77, dar ele nu se regsesc n Fortran 90. Aceast variant mai nou a
limbajului dispune de cinci tipuri intrinseci de valori (tip caracter, logic, ntreg, real i
complex) admind diferite feluri (specificate explicit prin atributul KIND) ale acestor
tipuri. Pentru valorile de tip complex i real exist dou feluri predefinite (al doilea
corespunznd reprezentrii pe lungime dubl). Felul se poate specifica printr-o valoare
ntreag, corespunztoare teoretic lungimii de reprezentare (standardul limbajului nu
precizeaz semnificaia acestei valori ntregi), cum ar fi de exemplu I NTEGER( 2) n loc
de I NTEGER*2. Pentru a oferi o flexibilitate i implicit o portabilitate mrit programelor,
exist dou funcii intrinseci noi: SELECTED_INT_KIND (care selecteaz o valoare
ntreag pentru numrul minim de cifre zecimale dorite) i SELECTED_REAL_KIND
(care selecteaz pentru valori reale precizate numrul cifrelor zecimale i domeniul pentru
exponent). Astfel:
I NTEGER, PARAMETER : : &
scur t = SELECTED_I NT_KI ND( 4) , & ! i nt r egi cu >= 4 ci f r e
l ung = SELECTED_I NT_KI ND( 9) , & ! i nt r egi cu >= 9 ci f r e
dubl u = SELECTED_REAL_KI ND( 15, 200) ! val or i r eal e cu 15 ci f r e si
! cu domeni ul 10**200
I NTEGER( scur t ) : : poza( 1024, 768)
I NTEGER( l ung) : : numar
REAL( dubl u) : : t abl ou( 20, 20)
Cea mai bun metod este de a include definiiile parametrilor de fel (ca cele de mai sus)
ntr-un modul care s fie utilizat de-a lungul programului. La rndul lor, i constantele pot
avea ataate atribute de fel, acolo unde corespondena felului este cerut (de exemplu n
cadrul parametrilor unei proceduri). Iat un exemplu cu apelarea unui subprogram, folosind
pe post de parametri efectivi valori cu specificaie de fel (acestea fiind desprite de
constante prin caracterul _):
CALL subpr ogr am( 3. 14159265358_dubl u, 12345_l ung, 42_scur t )
Menionm c felul parametrilor (dublu, lung, scurt) din acest apel este cel definit n
exemplul anterior.
Funcia KI ND returneaz la rndul su parametrul de fel al oricrei variabile, de exemplu:
WRI TE( *, *) " f el ul pent r u dubl a pr eci zi e est e " , KI ND( 0d0)
n principiu, regula de fel poate fi extins i la valorile de tip caracter, sistemele Fortran
putnd suporta seturi de caractere pe 16 bii (cum este setul Unicode).
- 75 -
4.2 STRUCTURI DE CONTROL NOI, INTRODUSE N FORTRAN 90
n varianta anterioar a limbajului Fortran nu exista instruciune corespunztoare
reprezentrii primitivei alternative generalizate. Pentru traducerea unei asemenea structuri
din pseudocod sau dintr-o schem logic era nevoie fie de un set de instruciuni de salt
calculate cu multitudinea de etichete corespunztoare, fie de un set de instruciuni IF (ELSE
IF) care rezulta destul de complex. n Fortran 90, asemenea structuri se pot scrie foarte
uor prin utilizarea instruciunii SELECT CASE. Iat un exemplu preluat din literatura de
specialitate de limb englez, referitor la alegerea indicelui corespunztor unui numr de
ordine pentru zilele unei luni:
SELECT CASE( numar _zi )
CASE( 1, 21, 31) ! cazul numer el or ce se t er mi n cu unu
i ndi ce = st
CASE( 2, 22) ! cazul numer el or t er mi nat e cu doi
i ndi ce = nd
CASE( 3, 23) ! cazul numer el or t er mi nat e cu t r ei
i ndi ce = r d
CASE( 4: 20, 24: 30) ! cazul cel or l al t or numer e
i ndi ce = t h
CASE DEFAULT ! cazul i mpl i ci t , cu val oar e i nval i da
i ndi ce = ??
WRI TE( *, *) dat a i nval i da: , numar _zi
END SELECT
WRI TE( *, " ( I 4, A2) " ) numar _zi , i ndi ce

Expresiile utilizate pot fi de tip ntreg sau caracter, ns domeniile precizate la instruciunile
CASE nu pot s se suprapun sau s se intersecteze. Aceste domenii trebuie s fie foarte
clar precizate. Tratarea cazului implicit (CASE DEFAULT) este opional.

i n ceea ce privete instruciunile de ciclare/repetare s-au fcut mbuntiri semnifica-
tive. Instruciunea DO a fost actualizat n Fortran 90, eticheta ce marca sfritul modulului
de repetat nemaifiind necesar, ea fiind nlocuit prin instruciunea END DO. n plus,
instruciunea CYCLE va determina pornirea unui ciclu, iar instruciunea EXIT permite
ieirea din ciclu nainte de atingerea marcajului terminal (END CYCLE).
Exist i posibilitatea specificrii unui ciclu DO nedefinit, adic fr un contor explicit, n
acest caz ieirea din ciclu trebuie asigurat prin EXIT. Se poate folosi i instruciunea DO
WHILE (corespunztoare unei primitive repetitive pre-condiionate), aceasta va avea efect
similar cu instruciunea DO nedefinit, dup cum se poate observa i n urmtorul exemplu:
DO WHI LE( ABS( x - xmi n) > 1. 0e- 5) ! var i ant a cu ci cl u DO- WHI LE
CALL i t er eaza( x, xmi n)
END DO
! . . . sau
DO ! aceeasi ci cl u, cu DO nedef i ni t
I F( ABS( x - xmi n) <= 1. 0e- 5) EXI T
CALL i t er eaza( x, xmi n)
END DO

- 76 -
Pentru a facilita citirea i nelegerea programelor se pot boteza anumite structuri (cicluri
DO, blocuri IF, structuri CASE) n cazul n care sunt prea complexe i ar necesita EXIT
(sau CYCLE) suplimentar. Aceste nume ns nu pot fi folosite ca etichete pentru
instruciunile de salt GO TO. Iat un mic exemplu, cu numele exterior i interior pentru
dou cicluri:
! . . .
suma = 0. 0
ext er i or : DO j = 1, ny ! suma pana l a obt i ner ea l ui zer o
i nt er i or : DO i = 1, nx
I F( t abl ou( i , j ) == 0. 0) EXI T ext er i or
suma = suma + t abl ou( i , j )
END DO i nt er i or
END DO ext er i or

Etichetele marcheaz de regul instruciunile la care se ajunge printr-un salt. Multitudinea
salturilor poate complica claritatea programelor scrise, din acest motiv se recomand
utilizarea structurilor mai avansate acolo unde se poate. Folosirea etichetelor poate fi uor
evitat n urmtoarele situaii:
folosirea ciclurilor DO structurate (cu END DO), tratarea excepiilor putndu-se
realiza prin instruciunile EXIT sau RETURN;
nlocuirea instruciunilor de salt (GO TO) calculat prin structuri SELECT CASE;
citarea listei de descriptori n locul specificrii de format la instruciunile de
citire sau scriere. De exemplu:
CHARACTER( LEN=2) : : r aspuns
! . . .
WRI TE( *, " ( A) " ) " r aspundet i cu DA sau NU : "
READ( *, ( A2) ) r aspuns

Funciile se puteau defini n Fortran 77 n dou moduri: printr-o singur expresie (pe o
linie) sau ca modul extern (subprogram FUNCTION). n Fortran 90 exist ns posibilitatea
declarrii unor proceduri interne, ntr-o manier structurat, ca n exemplul urmtor:
SUBROUTI NE ar i e_pol i gon( l at ur i ) ! o pr ocedur a ext er na
I MPLI CI T NONE ! val abi l pest e t ot
! . . .
ar i a1 = ar i e_t r i unghi ( a, b, x)
! . . .
ar i a2 = ar i e_t r i unghi ( x, c, d)
! . . .
CONTAI NS ! ur meaza pr ocedur a i nt er na . . .
REAL FUNCTI ON ar i e_t r i unghi ( a, b, c) ! pr ocedur a i nt er na
REAL, I NTENT( I N) : : a, b, c
REAL : : s ! var i abi l a l ocal a i n f unct i e
s = 0. 5 * ( a + b + c)
ar i e_t r i unghi = sqr t ( s * ( s- a) * ( s- b) * ( s- c) )
END FUNCTI ON ar i e_t r i unghi ! sf ar si t ul pr ocedur i i i nt er ne
SUBROUTI NE i ncl us ! o al t a pr ocedur a i nt er na
! . . .
END SUBROUTI NE i ncl us ! sf ar si t ul pr ocedur i i
END SUBROUTI NE ar i e_pol i gon
- 77 -
Astfel, specificarea funciilor nu mai este restrns la doar o singur linie. Procedurile
interne pot fi i subprograme (nu numai funcii). La fel ca n exemplul precedent, ele
trebuie s fie precedate de instruciunea declarativ CONTAINS care totodat marcheaz i
finalul descrierii procedurii externe gazd. n cadrul unei uniti de program se pot declara
oricte proceduri interne, care la rndul lor se pot apela i reciproc, ns nu se admite
combinarea (intersectarea) lor. Folosirea declaraiilor END SUBROUTINE i END FUNC-
TION sunt obligatorii pentru a marca finalul specificaiilor, precizarea numelor procedu-
rilor dup aceste instruciuni fiind opional (se recomand doar pentru claritatea sursei).

Procedurile interne au acces la toate variabilele modulului gazd (cu excepia cazurilor n
care conin declaraii cu nume identice), dar acest aspect nu este valabil i invers.


4.3 TABLOURI DE DATE
Tablourile au o semnificaie i un rol mai extins ca n varianta anterioar a limbajului,
devenind obiecte de prim clas asupra crora se pot aplica operaii prin expresii generice.
Operaiile vor fi efectuate pentru fiecare element al tablourilor (fr a scrie cicluri explicite)
cu condiia ca tablourile s fie conforme (form i dimensiuni compatibile). Dac apar
valori scalare ntr-o expresie, ele se vor aplica prin operatorii specificai, pe fiecare element
al tablourilor vizate. De exemplu:
REAL : : scal ar , vect or ( 123) , t abl ou( 4, 5, 6)
CHARACTER( LEN=1) , PARAMETER : : zi ( 0: 6) = ( / D , L , M , M , J , V , S / )
REAL, DI MENSI ON( 768, 1024) : : i mg, f undal , expuner e, r ezul t at , st d_er r
! . . .
st d_er r = 0. 0 ! t oat e el ement el e di n acest t abl ou pr i mesc val oar ea
! nul
r ezul t at = ( i mg - f undal ) / expuner e ! expr esi e cu t abl our i
f undal = 0. 1 * expuner e + 0. 125 ! expr esi e cu t abl our i i scal ar i
! . . .

Noiunea de zon sau seciune desemneaz elemente de tablou referite prin indici de poziie
sau un domeniu definit prin elementele de tablou componente. Declararea acestor zone se
poate face prin numele tabloulului de care aparin i ele pot fi iniializate cu valori cuprinse
ntr-o list (ca n exemplul de mai sus, la tabloul zi). Fiecare zon sau element al tabloului
motenete proprietile corespunztoare de tip INTENT, PARAMETER i TARGET ale
tabloului, ns fr a moteni atributul POINTER. La definirea seciunilor nu trebuie s ne
referim neaprat la zone contigue, fiind permise i suprapuneri de elemente ntre diferite
zone. De exemplu:
! i mg( 2: 101, 301: 500) est e o r ef er i nt a l a o zon de 100x200 di n t abl oul i mg
! b( 1: 10: 2) est e o r ef er i n l a b( 1) , b( 3) , b( 5) , b( 7) i b( 9)
! . . .
a( 2: 10) = a( 1: 9) ! t r ansl at ar e n sus cu un el ement
b( 1: 9) = b( 3: 11) ! t r ansl at ar e n j os cu doua el ement e

Bineneles, n asemenea cazuri compilatorul trebuie s genereze codul corespunztor, fr
a ncurca valorile referite. Se admite i folosirea unor zone de mrime zero, de exemplu:
- 78 -
b( 3: 2) , primul indice fiind mai mare dect al doilea fr ca s fie precizat un pas negativ.
Se admite folosirea tablourilor unidimensionale (vectorilor) pe post de indici de tablouri.
Pentru a crea i atribui valori tablourilor unidimensionale (i tablourilor de constante) se pot
utiliza i constructori de tablouri, alctuind chiar expresii. Pentru tablouri cu mai multe
dimensiuni, unde constructorii nu pot fi utilizai, se recomand folosirea funciei
RESHAPE (al doilea argument al funciei specific forma dorit). Iat cteva exemple:
I NTEGER : : l i st a( 2, 3) = & ! f ol osi r ea f unct i ei RESHAPE:
RESHAPE( ( / 11, 12, 21, 22, 31, 32 / ) , ( / 2, 3/ ) )
! . . .
zona = ( / 3. 14, x, 2. 33, y, 3. 51 / ) ! ut i l i zar ea const r uct or i l or ,
i ndi ce = ( / ( REAL( i ) , i = 1, 10) / ) ! ci cl u i mpl i ci t i n cadr ul
! const r uct or ul ui de t abl ou,
! exempl u cu f ol osi r ea unui vect or pe post de i ndi ce
I NTEGER : : vect or ( 4) ! vect or ul ce va f i f ol osi t ca i ndi ce
REAL : : t abel ( 100) ! t abl oul decl ar at
vect or = ( / 33, 11, 12, 13 / ) ! i ni t i al i zar ea vect or ul ui ( i ndi cel or )
WRI TE( *, *) t abel ( vect or ) ! se vor scr i e doar el ement el e de pe
! pozi t i i l e 33, 11, 12 si 13 di n
! t abl oul t abel .

Indicii sub form de vectori pot fi utilizai n partea stng a unei asignri/atribuiri doar
dac nu apar valori repetate n lista cu indici (altfel un element ar trebui s fie asociat la
dou valori diferite). O seciune de tablou cu indice sub form de vector nu poate fi int
ntr-o instruciune de atribuire cu pointeri (a se vedea subcapitolul 4.10).

n Fortran 90 exist o serie de funcii intrinseci noi, dintre acestea prezentm sub form
tabelar cele referitoare la tablouri:
Tabel cu funcii intrinseci noi pentru tratarea tablourilor de date:
Funcie Efect
ALL( abl on [ , DI M=d] )
Are valoarea . TRUE. dac toate
elementele filtrate cu ablon au aceast
valoare.
ANY( abl on [ , DI M=d] )
Are valoare . TRUE. dac cel puin un
element filtrat cu ablon are aceast
valoare.
COUNT( abl on [ , DI M=d] )
Returneaz numrul elementelor cu
valoarea . TRUE. din lista generat de
ablon.
CSHI FT( t abl ou, pas [ , DI M=d] )
Translatare circular a elementelor din
tablou (cu pasul pas).
EOSHI FT( t abl ou, pas [ , DI M=d] )
Translatare liniar (End-Off) a elementelor.
MATMUL( mat a, mat b)
Produsul matriceal dintre mata i matb.
MAXLOC( t abl ou[ , abl on] )
Locaia (poziia) elementului cel mai mare.
MI NLOC( t abl ou[ , abl on] )
Locaia (poziia) elementului cel mai mic.
MAXVAL( t abl ou[ , DI M=d, abl on] )
Valoarea cea mai mare din tablou.
MI NVAL( t abl ou[ , DI M=d, abl on] )
Valoarea cea mai mic din tablou.
- 79 -
Funcie Efect
MERGE( sur saT, sur saF, abl on)
Combin tablourile conform ablonului
(utiliznd elementele corespunztoare din
sursaT pentru valorile . TRUE. , i din
sursaF pentru valorile . FALSE. din
ablon).
PACK( t abl ou, abl on [ , r ezul t at ] )
mpacheteaz elementele tabloului conform
ablonului pasndu-le tabloului rezultat.
PRODUCT( t abl ou[ , DI M=d, abl on] )
Produsul valorii elementelor din tablou.
SUM( t abl ou[ , DI M=d, abl on] )
Suma valorii elementelor din tablou.
TRANSPOSE( mat r i ce)
Transpusa matricei (a tabloului
bidimensional matrice).
Meniune: funciile MAXLOC i MINLOC aplicate pe un vector vor returna un tablou cu
un element, ceea ce nu trebuie confundat cu un scalar (nu sunt identice).
Iat i cteva exemple pentru ilustrarea funciilor prezentate:
I F( ANY( a / = b) ) THEN . . . ! compar ar ea t abl our i l or a si b pent r u
! a vedea daca sunt i dent i ce ( condi t i a
! f i i nd pusa sub f or ma: DACA ORI CE
! el ement di n A DI FERA f at a de el emen-
! t ul cor espunzat or di n B ATUNCI . . .
! . . . un al t exempl u:
REAL : : t abl ou( 2, 3) ! decl ar ar ea unui t abl ou de f or ma
t abl ou=( / 1, 3, 5, 2, 4, 6 / ) ! 1 3 5
! 2 4 6
! si f ol osi r ea f unct i ei SUM va r et ur na:
SUM( t abl ou) ! suma t ut ur or el ement el or : 21
SUM( t abl ou, DI M=1) ! suma dupa pr i ma di mensi une,
! adi ca pe r andur i : ( / 9, 12 / )
SUM( t abl ou, DI M=2) ! suma dupa a doua di mensi une,
! adi ca pe col oane: ( / 3, 7, 11 / )

! si i nca un exempl u, pent r u
! cal cul ul var i ant zei i nt r - un t abl ou, i gnor and el ement el e nul e:
medi a = SUM( x, MASK= x / = 0. 0) / COUNT( x / = 0. 0)
var i ant za = SUM( ( x- medi a) **2, MASK= x / = 0. 0) / COUNT( x / = 0. 0)

Cnd unele elemente ale unui tablou trebuie tratate diferit, utilizarea structurii WHERE
poate fi foarte util, iat de exemplu:
WHERE( x / = 0. 0)
i nver sa = 1. 0 / x
ELSEWHERE
i nver sa = 0. 0
END WHERE
Exist i o form pe o singur linie, iat de exemplu:
WHERE( t abl ou > 100. 0) t abl ou = 0. 0
- 80 -
4.4 ALOCAREA DINAMIC A MEMORIEI
Exist trei modaliti distincte pentru alocarea dinamic a memoriei la tablouri: automat,
prin declarare de tablou alocabil (ALLOCATABLE) i tablou pointer.
Tablourile automate sunt considerate ca variabile locale, find permise doar n funcii i
subprograme (declarate corespunztor). Limitele lor sunt stabilite n momentul n care se
face apel sau referire la modulul n care au fost declarate. Iat un exemplu:
SUBROUTI NE f i net e( npct , spect r um)
I MPLI CI T NONE
I NTEGER, I NTENT( I N) : : npct
REAL, I NTENT( I NOUT) : : spect r um
REAL : : zona( npct ) , mai _mar e( 2*npct ) ! t abl our i aut omat e
Limitele dimensiunilor pot fi i expresii de tip ntreg, alctuite din variabile definite i
accesibile la momentul respectiv. n cadrul procedurii tablourile astfel definite se comport
n general la fel cu celelalte tablouri, pot fi utilizate i de ctre procedurile subordonate
incluse, dar n momentul n care controlul revine la nivelul procedurii gazd tablourile
devin nedefinite. Un tablou automat nu poate fi iniializat i nu poate fi folosit nici pentru a
salva valori de la un apel la altul. Cele mai multe sisteme stocheaz asemenea tablouri n
stiv (unele sisteme Unix nu aloc prea mult spaiu pentru stiv).

Tablourile alocabile sunt mai des utilizate deoarece dimensiunile lor se pot fixa n orice
moment (implicit ncep cu 1), doar rangul (numrul dimensiunilor) trebuie declarat n avans
(marcnd cu caracterul : fiecare dimensiune):
REAL, ALLOCATABLE : : vect or ( : ) , mat r i ce( : , : ) , t r ei _d( : , : , : )
! . . .
ALLOCATE( vect or ( 123) , mat r i ce( 0: 9, - 2: 7) ) ! decl ar ar ea di mensi uni i
! . . .
DEALLOCATE( mat r i ce, vect or ) ! el i ber ar ea memor i ei
Tablourile alocabile pot fi pasate procedurilor subordonate fr probleme, ns nainte de
terminarea procedurii n care au fost declarate ele trebuie dealocate (folosind instruciunea
DEALLOCATE, ca n exemplul de mai sus) pentru a evita problemele de scurgeri de
memorie. Dac unui asememnea tablou i s-au fixat dimensiunile, acestea nu pot fi
modificate (doar printr-o nou alocare dup o dealocare prealabil). Nu se admite alocarea
dubl a aceluiai tablou, se poate folosi funcia intrinsec ALLOCATED pentru a evita
asemenea situaii:
I F( ALLOCATED( t abl ou) ) THEN ! ut i l i zar ea f unct i ei
DEALLOCATE( t abl ou) ! deal ocar e daca se i mpune
END I F
ALLOCATE( t abl ou( 1: nouadi mensi une) ) ! r eal ocar e

Pentru verificarea succesului alocrii spaiului n cazul unor asemenea tablouri, cu
dimensiuni extinse, se poate apela la interogarea unei variabile de stare care n mod normal
returneaz valoare nul, iar n cazul unei erori de alocare va returna o valoare diferit:
- 81 -
ALLOCATE( t abl ou_i mens( 1: npct ) , STAT=i er r or )
I F( i er r or / = 0) THEN
WRI TE( *, *) " Er oar e l a i ncer car ea de al ocar e pent r u t abl ou_i mens "
STOP
END I F
n cazul unor asemenea erori se recomand aplicarea unui alt algoritm, cu nevoi mai reduse
de memorie dac e posibil, altfel programul se va termina neateptat.

Un tablou alocabil nu poate fi specificat ntr-o instruciune COMMON, DATA,
EQUIVALENCE sau NAMELIST. Poate ns avea atributul SAVE, ceea ce-i furnizeaz un
caracter global n cadrul modulului.

Tablourile pointer sunt a treia modalitate de alocare dinamic. Un pointer nu conine date,
dar indic ctre un scalar sau un tablou n care sunt stocate date. Poate fi considerat deci, ca
o referin ctre o referin. Dat fiind natura lui, nu are spaiu de stocare de la nceput
alocat, ci doar la execuia programului. Un tablou alocabil nu poate fi transmis unei
proceduri dac nu a fost alocat n prealabil, dar cu un tablou pointer se poate realiza acest
lucru. Iat un exemplu:
PROGRAM pdemo
I MPLI CI T NONE
REAL, POI NTER : : pt abl ou( : ) ! decl ar ar ea unui t abl ou poi nt er
OPEN( UNI T=1, FI LE= f i si er , STATUS= ol d )
CALL ci t i r e( 1, pt abl ou)
WRI TE( *, *) t abl ou de , SI ZE( t abl ou) , punct e:
WRI TE( *, *) pt abl ou
DEALLOCATE( pt abl ou)
STOP ! STOP- ul est e opt i onal
CONTAI NS
SUBROUTI NE ci t i r e( uni t at e, x)
I NTEGER, I NTENT( I N) : : uni t at e
REAL, POI NTER : : x( : ) ! poi nt er nu poat e avea I NTENT
I NTEGER : : npunct e
READ( uni t at e) npunct e ! numar ul punct el or de ci t i t
ALLOCATE( x( 1: npunct e) ) ! al ocar ea spat i ul ui
READ( uni t at e) x ! ci t i r ea i nt r egul ui t abl ou
END SUBROUTI NE ci t i r e
END PROGRAM pdemo

Se poate observa din exemplul de mai sus, c la declararea tablourilor pointer se aplic o
sintax similar cu cea de la tablourile alocabile (se marcheaz cu caracterul : poziiile
dimensiunilor sau, altfel spus, rangul tabloului). Exemplul prezentat este simplu pentru c
prezint o procedur intern, deci compilatorul se va descurca foarte uor cunoscnd toate
detaliile interfeei la traducerea apelului subprogramului (la transmiterea unui pointer ctre
o procedur, se cere o asemenea interfa explicit, noiune ce va fi prezentat n
subcapitolul urmtor).
- 82 -
4.5 MODULE I INTERFEE
n Fortran 90 exist patru tipuri de uniti de program:
1. Programul principal (Main care ncepe de regul cu declaraia PROGRAM).
2. Proceduri externe sau subprograme (ce ncep fie cu declaraia SUBROUTINE, fie cu
FUNCTION).
3. Uniti cu blocuri de date (specificai prin declaraia BLOCK DATA).
4. Module (specificai prin declaraia MODULE) ce pot conine orice combinaie a
urmtoarelor elemente:
- definiii de constante;
- definiii de date derivate (structuri de date);
- declaraii de stocare;
- proceduri (subprograme i funcii).

Un modul poate fi accesat n orice unitate de program prin instruciunea USE (inclusiv
dintr-un alt modul). Instruciunea USE trebuie s precead celelalte declaraii, ea trebuie s
fie prima dup specificaia de identificare a unitii de program. Dei modulul poate fi
coninut ntr-un fiier separat sau n aceeai fiier cu celelalte uniti de program, el trebuie
compilat nainte de unitatea care conine referina la el. Cele mai multe compilatoare
suport compilarea separat a modulelor, genernd fiiere cu extensia .mod (sau ceva
similar) din ele. Din acest punct de vedere, utilizarea modulelor prin instruciunea USE s-ar
asemna cu inserarea prin instruciunea INCLUDE, dar de fapt utilizarea modulelor este o
facilitate mai performant din cauza procedurilor de modul.

Un modul ncepe de regul cu seciunea datelor urmat de o specificaie CONTAINS (dac
conine vreo procedur), dup care urmeaz descrierile procedurilor de modul. Aceste
proceduri de modul au acces direct la toate definiiile de date i specificaii de stocare prin
asociere. Permit ncapsularea datelor i a mulimii de proceduri ce opereaz cu aceste date
sau ce folosesc zona de stocare pentru schimb de valori (intercomunicare). Urmtorul
exemplu prezint un modul ce trateaz ieirea pe un videoterminal sau ntr-o fereastr de
tipul X-term (prin secvene escape, similare cu cele din ANSI.SYS sub DOS):
MODULE vt _mod ! speci f i car ea modul ul ui
I MPLI CI T NONE ! val abi l i nt r egul ui modul
CHARACTER( 1) , PARAMETER : : escape = achar ( 27)
I NTEGER, SAVE : : l at i me_ecr an = 80, i nal t i me_ecr an = 24
CONTAI NS
SUBROUTI NE gol est e ! Gol est e ecr anul si mut a
! cur sor ul i n st anga sus
CALL af i seaza( escape / / " [ H" / / escape / / " [ 2J " )
END SUBROUTI NE gol est e

SUBROUTI NE f a_l at i me( l at i me) ! set eaza noua l at i me de ecr an
I NTEGER, I NTENT( I N) : : l at i me ! l a l at i mea dor i t a ( 80 sau 132)
I F( l at i me > 80) THEN
CALL af i seaza( escape / / " [ ?3h" ) ! comut ar e l a 132 de col oane
l at i me_ecr an = 132
ELSE
- 83 -
CALL af i seaza( escape / / " [ ?3l " ) ! comut ar e l a 80 de col oane
l at i me_ecr an = 80
END I F
END SUBROUTI NE f a_l at i me

SUBROUTI NE i a_l at i me( l at i me) ! r et ur neaza l at i mea ecr anul ui
I NTEGER, I NTENT( OUT) : : l at i me ! ( de 80 sau 132 de car act er e)
l at i me = l at i me_ecr an
END SUBROUTI NE i a_l at i me
SUBROUTI NE af i seaza( r and) ! doar pent r u uz i nt er n
I NTEGER, I NTENT( I N) : : r and
WRI TE( *, " ( 1X, A) " , ADVANCE=" NO" ) r and
END SUBROUTI NE af i seaza
END MODULE vt _mod
Pentru a folosi acest modul, la nceputul sursei trebuie inserat doar:
USE vt _mod
dup ce exemplul de mai sus a fost compilat, fiind transformat ntr-un fiier imagine obiect
(cu extensia .mod).

Toate variabilele din modul sunt accesibile n mod implicit tuturor programelor care
utilizeaz modulul. Acest aspect ns poate fi deranjant: de multe ori, procedurile de modul
oferind toate funciunile necesare de acces, este preferabil ca utilizatorii s nu se amestece
cu aspectele interne. Pentru a schimba accesibilitatea generic de tip PUBLIC a numelor
simbolice dintr-un modul se poate utiliza specificaia PRIVATE n cadrul acestuia. Uneori
ns aceast soluie nu este suficient: se poate ntmpla ca un modul s conin nume de
proceduri sau de variabile care s intre n conflict cu cele alese deja de un utilizator. Pentru
asemenea situaii exist dou soluii. Dac nu se dorete utilizarea ntregului modul, din
motivul evitrii conflictului dintre unele nume folosite, se poate specifica o list coninnd
doar entitile publice sau identificatorii generici dorii a fi utilizai din modul, prin
combinaia USE ONLY, ca de exemplu:
USE vt _mod, ONLY: gol est e
Cealalt soluie ar fi redenumirea entitii al crei nume deranjeaz (crearea unui alias
pentru numele simbolic al acesteia). De exemplu, dac numele ia_latime din modulul
prezentat mai sus ne creeaz probleme, putem proceda n felul urmtor:
USE vt _mod, e_l at a => i a_l at i me
i astfel numele e_lata va nlocui temporar numele ia_latime n cadrul modulului vt_mod.

Modulele permit ncapsularea unei structuri de date mpreun cu mulimea procedurilor ce-l
manipuleaz, ceea ce n programarea orientat obiect nseamn c ele pot conine o clas i
metodele acesteia.

Atunci cnd o procedur de metod este apelat, se spune c este vorba de o interfa
explicit, ceea ce nseamn c compilatorul poate verifica consistena argumentelor actuale
efective i fictive. Aceasta se consider o trstur foarte valoroas deoarece n Fortran 77
- 84 -
asemenea interfee nu se puteau verifica i erorile erau obinuite din aceast cauz. Din
acest punct de vedere, utilizarea modulelor se dovedete mai avantajoas dect folosirea
blocurilor comune (COMMON), a blocurilor de date (BLOCK DATA) sau a punctelor de
intrare (ENTRY).

Modulele furnizeaz un nivel structural suplimentar n proiectarea programelor, putnd
clasifica nivelurile n ordine descresctoare n felul urmtor: programe; module; proceduri;
instruciuni.
Interfeele explicite derivate din module permit utilizarea multor faciliti avansate, cum ar
fi: tablourile de pointeri cu form presupus, argumententele opionale, operatorii definii
de ctre utilizator, numele generice etc. Exist ns i cteva dezavantaje:
fiecare modul trebuie compilat nainte de unitile de program apelante;
necesit atenie mrit;
scrise ntr-un singur fiier, modulele trebuie s precead programul principal;
dac un modul este modificat, vor trebui recompilate toate unitile de program
apelante ceea ce poate conduce la consum excesiv de timp;
un modul rezult de regul ntr-un singur fiier imagine obiect, reducnd
avantajele bibliotecilor imagine obiect, putnd conduce la fiiere executabile de
dimensiuni mari.

O interfa explicit nseamn c argumentele fictive ale procedurii sunt vizibile
compilatorului n momentul traducerii instanei de apel ctre procedura respectiv. O
interfa se consider explicit atunci cnd:
se apeleaz o procedur de modul de ctre o unitate de program sau de ctre o
alt procedur din cadrul aceluiai modul;
se apeleaz o procedur intern de ctre o unitate gazd sau de ctre orice alt
procedur din aceeai gazd;
se apeleaz o funcie intrinsec (intern);
se specific un bloc de interfa explicit;
o procedur recursiv se autoapeleaz direct sau indirect.

Specificarea unu bloc de interfa are urmtoarea form:
I NTERFACE [ speci f i cat or _gener i c]
[ cor p i nt er f a]
[ MODULE PROCEDURE l i st _nume]
END I NTERFACE [ speci f i cat or _gener i c]
Un bloc de interfa poate fi specificat i n cadrul unui modul, pentru a facilita utilizarea
acestuia. n cazul n care se folosesc biblioteci existente din Fortran 77, se recomand
crearea unui modul care s conin toate interfeele de proceduri (exist chiar programe de
conversie i generare pentru asemenea situaii).


- 85 -
4.6 PROCEDURI N FORTRAN 90
n cazul folosirii tablourilor pe post de parametri transferai ntre proceduri, se recomand
utilizarea tablourilor cu form presupus. Un asemenea tablou este un argument formal care
i asum mrimea tabloului din postura argumentului efectiv, ns rangul (i implicit
dimensiunile) poate s fie diferit fa de tabloul asociat (din postura argumentului efectiv).
De aici rezult c la specificarea unui asemenea tablou (cu form presupus) se specific
rangul, marcnd prin caracterul : fiecare dimensiune. Forma efectiv va fi luat de fiecare
dat doar n momentul realizrii apelului (prin argumentele efective). Limita inferioar a
indicilor este implicit 1, ea nu trebuie s corespund neaprat cu cea a tablourilor efective
din apel, ca atare funciile intrinseci LBOUND i UBOUND nu vor putea servi informaii
adiionale.
Dac exist o interfa implicit, se pot folosi cuvinte cheie n loc de notaiile poziionale
uzuale. De asemenea, toate funciile intrinseci pot fi apelate prin cuvinte cheie. Utilizarea
apelurilor prin cuvinte cheie se poate dovedi util cnd argumentele opionale se omit:
I NTEGER : : vect or ( 8)
CALL DATE_AND_TI ME( VALUES=vect or )
n cadrul unui apel se pot amesteca cuvintele cheie cu argumente poziionale, dar acestea
din urm trebuie s fie n fa. Argumente opionale pot fi furnizate n proceduri scrise de
utilizator, ns testarea existenei lor (prin funcia intrinsec PRESENT) este esenial
nainte de utilizarea lor (cu excepia cazului unui alt apel al unei proceduri cu un argument
opional):
SUBROUTI NE scr i e_t ext ( si r , ngol )
CHARACTER( *) , I NTENT( I N) : : si r ! l i ni e de t ext ,
I NTEGER, I NTENT( I N) , OPTI ONAL : : ngol ! l i ni i goal e i nai nt e,
I NTEGER : : l ocal gol ! st ocar e l ocal a
I F( PRESENT( ngol ) ) t hen
l ocal gol = ngol
ELSE
l ocal gol = 0 ! val oar e i mpl i ci t a,
END I F
! . . .
END SUBROUTI NE scr i e_t ext

Apelurile posibile din cadrul diverselor uniti de program, ctre subprogramul de mai sus,
pot arta n felul urmtor:

CALL scr i e_t ext ( " t i t l u document " ) ! al doi l ea ar gument omi s
CALL scr i e_t ext ( " 22 Decembr i e 1989" , 3)
CALL scr i e_t ext ( ngol =5, si r =" un al t r and" ) ! i n al t a or di ne

Argumentele opionale de la sfritul listei de parametri pot fi omise la apel fr probleme,
dar dac se omit argumentele din cadrul listei, atunci trebuie folosite cuvinte cheie pentru
cele urmtoare (nu este suficient utilizarea unor virgule succesive ca n anumite extensii
ale limbajului Fortran 77).
- 86 -
Funciile intrinseci au n general nume generice, astfel o funcie poate furniza valori diferite
n funcie de tipul argumentelor utilizate. Funciile definite de utilizator pot avea la fel,
nume generice. Presupunnd c am scrie un modul n care s avem mai multe funcii
similare, de exemplu pentru sortare: sortare_i pentru valori ntregi, sortare_r pentru valori
reale i sortare_s pentru iruri de caractere, numele generic sortare s-ar putea defini n felul
urmtor:
I NTERFACE sor t ar e
MODULE PROCEDURE sor t ar e_i , sor t ar e_r , sor t ar e_s
END I NTERFACE
Regulile pentru rezolvarea numelor generice sunt destul de complicate, ns este suficient
s ne asigurm ca fiecare procedur s difere de celelalte care au acelai nume prin tipurile
valorilor, rangul tablourilor sau cel puin printr-un argument utilizat efectiv.

Procedurile se pot autoapela n mod direct sau indirect dac sunt declarate recursive (prin
specificaia RECURSIVE). Cazurile tipice se ntlnesc la tratarea structurilor de date
similare cum ar fi arbori de directoare, de tip B etc. Un exemplu clasic este calculul
factorialului unui numr ntreg:
RECURSI VE FUNCTI ON f act or i al ( n) RESULT( nf act )
I MPLI CI T NONE
I NTEGER, I NTENT( I N) : : n
I NTEGER : : nf act
I F( n > 0) THEN
nf act = n * f act or i al ( n- 1)
ELSE
nf act = 1
END I F
END FUNCTI ON f act or i al
La fel de simplu se poate realiza exemplul artat i utiliznd un ciclu DO. Folosirea
variabilei RESULT este opional, ea fiind necesar doar pentru a evita ambiguitatea
sintaxei (de exemplu, dac funcia ar returna un tablou, un element de tablou nu s-ar
distinge de un apel de funcie).


4.7 STRUCTURI DE DATE, TIPURI DERIVATE
Noiunile de date definite de utilizator, structuri de date i tipuri derivate de date nseamn
toate unul i acelai lucru. Instruciunea declarativ pentru tipuri derivate (TYPE) permite
specificarea proprietilor obiectelor i funciilor definite de utilizator. Iat un exemplu
simplu, ilustrnd tratarea unei liste de puncte:
TYPE : : t i p_punct
CHARACTER( 10) : : nume ! numel e obi ect ul ui
REAL : : x, y, z ! coor donat el e punct ul ui
I NTEGER : : cul oar e ! cul oar ea punct ul ui
END TYPE t i p_punct
- 87 -
Dup cum se poate observa, n asemenea structuri se pot amesteca i entiti de tip caracter
cu entiti numerice i logice (spre deosebire de blocurile comune), ajustarea aspectului
fizic pentru un acces eficient cznd n sarcina compilatorului. Exemplul de mai sus descrie
doar structura dorit, iar pentru a creea variabile cu tipul definit de date de mai sus
instruciunea TYPE trebuie folosit ntr-o alt form, i anume:
TYPE( t i p_punct ) : : punct _vechi , noua_l i st a( 20)
Prin aceast specificare s-a creat o variabil structurat (sub numele: punct_vechi) i un
tablou cu 20 de elemente (noua_lista), fiecare dintre ele avnd cele cinci componente
specificate (nume, x, y, z i culoare). Bineneles, tipul derivat referit trebuie s fie definit
nainte de specificarea unor obiecte de acel tip.
Componentele unei structuri astfel definite sunt accesate utiliznd caracterul % (i nu
punctul ca n cele mai multe limbaje de programare). Astfel punct_vechi%nume este o
variabil de tip caracter, iar noua_lista(11)%x este o variabil de tip real. Asemenea entiti
structurale pot fi folosite n mod similar cu variabilele simple, de exemplu:
! . . .
noua_l i st a( 1) %nume = " pr i mul "
noua_l i st a( 1) %x = 23. 4
noua_l i st a( 1) %y = - 2. 15
noua_l i st a( 1) %z = 0. 0
noua_l i st a( 1) %cul oar e = 8
! . . .
noua_l i st a( 2) = punct _vechi ! copi er ea t ut ur or component el or
noua_l i st a( 2) %x = noua_l i st a( 2) %x + 1. 5
! . . .
Numele componentelor sunt considerate locale n cadrul structurii, deci nu apar probleme
dac aceai unitate de program folosete variabile simple cu denumiri similare (ca nume, x
etc. dac considerm exemplul prezentat).
Constructorii de structur permit specificarea valorii obiectelor de tip derivat, numele
tipului este folosit ca i cum ar fi vorba de o funcie de conversie, cu o list de valori ale
componentelor pe post de argumente:
noua_l i st a( 3) = t i p_punct ( " al t r ei l ea" , 43. 21, - 15. 3, 0. 0, 2)
Dac exist un tablou declarat ca i tip derivat, fiecare component a structurii poate fi
tratat ca tablou (conform exemplului prezentat noua_lista%x va fi un tablou cu 20 de
valori de tip real). Elementele acestor entiti nu se pot situa n locaii adiacente n
memorie, de acest aspect se va ngriji compilatorul.

Variabilele structurate pot fi utilizate i n instruciuni de intrare/ieire. n cazul unor
operaii de citire/scriere fr format sau cu format implicit nu se pune nici o problem, ns
n cazul operaiilor formatate trebuie alctuit o list corespunztoare de descriptori:
WRI TE( *, *) punct _vechi ! cu f or mat i mpl i ci t
READ( f i si er , " ( A, 3F5. 2, I 2) " ) noua_l i st a( 4) ! cu f or mat expl i ci t
- 88 -
De asemenea, putem defini structuri nlnuite, ca n exemplul urmtor:
TYPE : : punct
REAL : : x, y ! coor donat el e punct ul ui
END TYPE punct

TYPE : : l i ni e
TYPE( punct ) : : capat ( 2) ! coor donat el e capet el or
I NTEGER : : gr osi me ! gr osi mea l i ni ei i n pi xel i
END TYPE l i ni e

TYPE( l i ne) : : v
REAL : : l ungi me
v = l i ni e( ( / punct ( 1. 2, 2. 4) , punct ( 3. 5, 7. 9) / ) , 2)
l ungi me = SQRT( ( v%capat ( 1) %x - v%capat ( 2) %x) **2 &
+ ( v%capat ( 1) %y - v%capat ( 1) %y) **2)
! . . .
O limitare a acestor structuri n Fortran este necesitatea fixrii n prealabil a lungimii
componentelor de tip tablou, adic, altfel spus un tablou alocabil nu poate fi componenta
unei structuri definite de utilizator. Din fericire ns, se admit pointeri ca i componente:
TYPE : : t i p_document
CHARACTER( 80) , POI NTER : : r and( : ) ! component a t i p poi nt er
END TYPE t i p_document
! . . .
TYPE( t i p_document ) : : doc ! decl ar a o var i abi l a st r uct ur at a
ALLOCATE( doc%r and( 200) ) ! spat i u al ocat pent r u 200 de r andur i
Pentru a face structura i mai flexibil am putea aloca un tablou de variabile de tip caracter
cu lungimea de cte un caracter a elementelor, pentru fiecare rnd (dei probabil ar fi mai
greu de utilizat aa). Pentru a transmite o variabil structurat ntr-o procedur, pe ambele
pri ale interfeei trebuie s asigurm aceeai definiie de structur. Cea mai simpl cale
pentru acest deziderat este folosirea unui modul. Exist ns dou limitri n ceea ce
privete utilizarea tipurilor derivate de date care conin pointeri:
ele nu se pot utiliza n listele de intrare/ieire ale instruciunilor de citire/scriere;
dac o instruciune de asignare copiaz valorile unei date derivate ntr-alta, dei
orice component de tip pointer va fi copiat, noul pointer va indica tot aceeai
zon de memorie.

Atunci cnd se definete un nou tip de date, ar fi de dorit ca obiectele de acel tip s se poat
utiliza n expresii obinuite. Evident, ar fi mai simplu s scriem a*b+c*d dect
add( mul t ( a, b) , mul t ( c, d) ) . n acest scop ns, fiecare operator pe care dorim s-l
utilizm va trebui definit (sau suprancrcat) pentru fiecare tip derivat de date. Exemplul
urmtor prezint definirea unei structuri de date cu numele fuzzy, care conine un numr
real i eroarea sa standard. Cnd dou asemenea valori fuzzy sunt adunate, erorile se vor
aduna la ptrat. Pentru o astfel de adunare am suprancrcat operatorul +:
MODULE f uzzy_mat e
I MPLI CI T NONE

- 89 -
TYPE f uzzy
REAL : : val oar e, er oar e
END TYPE f uzzy

I NTERFACE OPERATOR ( +) ! i nt er f at a expl i ci t a
MODULE PROCEDURE f uzzy_pl us_f uzzy
END I NTERFACE

CONTAI NS
FUNCTI ON f uzzy_pl us_f uzzy( pr i m, secund) RESULT ( suma)
TYPE( f uzzy) , I NTENT( I N) : : pr i m, secund ! I NTENT necesar
TYPE( f uzzy) , I NTENT( OUT) : : suma ! I NTENT opi onal
sum%val oar e = pr i m%val oar e + secund%val oar e
sum%er oar e = SQRT( pr i m%er oar e**2 + secund%er oar e**2)
END FUNCTI ON f uzzy_pl us_f uzzy
END MODULE f uzzy_mat e

PROGRAM t est _f uzzy
I MPLI CI T NONE
USE f uzzy_mat e
TYPE( f uzzy) a, b, c
a = f uzzy( 10. 0, 4. 0) ; b = f uzzy( 12. 5, 3. 0)
c = a + b
PRI NT *, c
END PROGRAM t est _f uzzy
Rezultatul afiat de programul de test ar trebui s fie: 22. 5 5. 0 .
i operatorul = (instruciunea de asignare) poate fi suprancrcat pentru tipuri derivate de
date, ns n cazul de mai sus nu a fost necesar pentru c am folosit un subprogram cu un
argument avnd atributul INTENT(IN) i cellalt INTENT(OUT).

O implementare complet a clasei fuzzy ar trebui s cuprind suprancrcarea operatorilor
aritmetici, funcii intrinseci (ca de exemplu: SQRT), respectiv combinaii ntre operanzi de
tip real i fuzzy. Ulterior, reprezentarea intern poate fi schimbat fr a afecta programele
care folosesc tipul derivat fuzzy, cu condiia ca interfeele s rmn nemodificate.

Prioritatea la evaluare a unui operator existent rmne neschimbat prin suprancrcare, iar
operatorii unari noi vor avea o prioritate mai mare dect cei intrinseci existeni, pe cnd noii
operatori binari vor avea prioritate mai sczut. La suprancrcarea unui operator existent se
recomand ca semnificaia lui s nu fie alterat, altfel e mai sntos s se inventeze unul
nou pentru operaia dorit.


4.8 INTRRI I IEIRI
Intrrile i ieirile cuprind aspectele legate de transferul datelor, precum i cele referitoare
la conectarea, interogarea, modificarea, i poziionarea fiierelor. Ca i n cazul limbajului
Fortran 77, exist fiiere considerate externe (ntr-un mediu extern programului executabil)
i fiiere considerate interne (n spaiul de stocare al memoriei interne). Din punctul de
- 90 -
vedere al operaiilor posibile de citire i scriere, articolele (nregistrrile) din cadrul
fiierelor pot fi considerate de trei tipuri: formatate, neformatate, i marcajul de sfrit de
fiier (EOF, poate fi scris ntr-un fiier secvenial printr-o instruciune ENDFILE). Fiecrui
tip de articol i corespunde o modalitate de citire. nregistrrile formatate se citesc prin
instruciuni cu format explicit sau implicit, iar cele neformatate prin instruciuni fr
format. Articolele neformatate pot s fie goale (s nu conin date), reprezentarea intern a
datelor din asemenea nregistrri fiind dependent de echipamentul de calcul.
n ceea ce privete accesul la fiiere, prin dezvoltarea limbajului n varianta 90 exist cteva
parametri i opiuni noi pentru deschiderea acestora, iat-le n tabelul urmtor:
Tabel cu parametrii noi din instruciunea OPEN:
Cuvntul cheie Valoarea Funciunea
" READ" Acces doar pentru citire.
" WRI TE" Acces pentru scriere.
ACTI ON=
" READWRI TE" Acces pentru citire i scriere.
" APPEND" Adugarea la un fiier secvenial
existent.
POSI TI ON=
" REWI ND" Asigurarea poziionri la nceputul
fiierului deschis.
STATUS= " REPLACE" Suprascrierea unui fiier existent,
sau crearea unui fiier nou.
RECL= lungime Se poate folosi la crearea unui fiier
secvenial n scopul precizrii
lungimii maxime a nregistrrilor.
Valoarea lungime a parametrului RECL semnific numrul de caractere n cazul accesului
formatat, iar n cazul accesrii neformatate (acces direct, binar) semnificaia este n funcie
de sistem. Instruciunea INQUIRE beneficiaz de asemenea de cuvinte cheie adiionale
pentru a returna informaii legate de deschiderea unei uniti. De exemplu, preciznd un
specimen pentru o list de intrare/ieire, ne poate returna valoarea lungimii necesare
parametrului RECL din instruciunea OPEN:
I NQUI RE( I OLENGTH=l ungi me) speci men, l i st a, de, el ement e
OPEN( UNI T=uni t at e, FI LE=specf i s, STATUS=" new" , &
ACCESS=" di r ect " , RECL=l ungi me)
Se pot utiliza citiri i scrieri dirijate prin liste (cu format implicit/liber) i asupra unor fiiere
interne, iat cum:
CHARACTER( LEN=10) : : si r
si r = " 3. 14 "
READ( si r , *) var i abi l a
- 91 -
De asemenea, pe lng descriptorii deja cunoscui sunt disponibile variante mai
performante i chiar noi, pentru formatul operaiilor de intrare/ieire, prezentate n tabelul
urmtor.
Tabel complementar, cu descriptori noi:
Tip Sintax Efect
B [ n] Bw[ . z] Pentru transferul valorilor sub form binar. Prin z se poa-
te specifica numrul zerourilor premergtoare la afiare.
ES [ n] ESw. d[ Ee] Form exponenial (notaie tiinific), cu zecimale
dup prima cifr semnificativ (exemplu: 1.234E-01 n
loc de 0.1234E-00).
EN [ n] ENw. d[ Ee] Form exponenial (notaie tehnic), exponentul fiind
multiplu de 3 (exemplu: 123.4E-03 n loc de 0.1234E-00).
G [ n] Gw. d[ Ee] Descriptor modificat, cu caracter general, poate fi utilizat
att pentru valori numerice ct i pentru valori logice sau
de tip caracter.
O [ n] Ow[ . z] Pentru transferul valorilor sub form octal. Prin z se poa-
te specifica numrul zerourilor premergtoare la afiare.
P mP Interpreteaz anumite numere reale cu un factor de
mrime m specificat.
Q Q Returneaz numrul caracterelor rmase ntr-o
nregistrare citit.
Z [ n] Zw[ . z] Pentru transferul valorilor sub form hexazecimal. Prin z
se poate specifica numrul zerourilor premergtoare la
afiare.
$ $ Inhib returul de car la operaia curent de intrare/ieire
(similar cu descriptorul \ din Fortran 77).
: : ncheie controlul formatrii (dac nu mai sunt elemente n
list).
Operaiile de citire/scriere trateaz n mod normal o nregistrare complet. Exist ns i o
facilitate nou de a trata nregistrrile, prin specificarea atributului ADVANCE n cadrul
acestor instruciuni, ca n exemplul urmtor:
WRI TE( *, " ( A) " , ADVANCE=" NO" ) " Numar ul ci cl ur i l or : "
READ( *, *) n_ci cl u
n acest caz, n loc de trecerea la articolul urmtor se va muta doar un pointer teoretic n
cadrul articolului att ct este necesar, permind introducerea valorii variabilei n_ciclu pe
linia curent pe care s-a afiat mesajul (ca la un prompter) pe ecran. Acest atribut combinat
cu atributul SIZE permite i msurarea lungimii actuale a rndului citit:
CHARACTER( LEN=80) : : t ext
I NTEGER : : n_car
READ( *, " ( A) " , ADVANCE=" no" , SI ZE=n_car ) t ext
Aceast facilitate se poate dovedi util n cazul citirii unor fiiere secveniale parial corupte
sau cu structuri neconvenionale.
- 92 -
4.9 TRATAREA IRURILOR DE CARACTERE
Aa cum am mai menionat, exist o sumedenie de funcii intrinseci noi i performante
introduse prin Fortran 90, dintre acestea unele fiind destinate tratrii irurilor sau a
subirurilor alctuite din caractere. n tabelul urmtor se pot vedea aceste funcii, mpreun
cu descrierea efectului produs prin apelarea lor.
Tabel cu noile funcii intrinseci pentru tratarea irurilor de caractere:
Funcie
Nume generic Tip
Efect
ACHAR( n)
CH Returneaz caracterul de pe poziia n din tabela
ASCII.
I ACHAR( c)
I Returneaz poziia caracterului c din tabela
ASCII.
LEN_TRI M( i r )
I Returneaz lungimea lui ir (n numr de
caractere) ignornd spaiile de la sfrit.
TRI M( i r )
CH Returneaz ir-ul fr spaiile de la sfrit.
ADJ USTL( i r )
CH Elimin spaiile premergtoare din ir.
ADJ USTR( i r )
CH Elimin spaiile finale din ir.
REPEAT( i r , n)
CH Concatenare repetat de n ori a ir-ului.
I NDEX( i r , s[ , BACK=v] )
I Poziia primului caracter al subirului s n ir
(dac v este . TRUE. , ir va fi parcurs dinspre
capt ctre nceput).
SCAN( i r , s[ , BACK=v] )
I Poziia primului caracter al subirului s n ir,
sau al ultimului caracter din s dac v este
. TRUE. .
VERI FY( i r , s[ , BACK=v] )
I Poziia primului caracter din ir care difer de
caracterele din subirul s (dac v este . TRUE. ,
ir va fi parcurs dinspre capt).

Prin noua sintax sunt admise i suprapuneri de subiruri, ca n exemplul urmtor:
t ext ( 1: 5) = t ext ( 3: 7) ! neper mi s i n For t r an77, acumadmi s
Operatorul de concatenare // poate fi aplicat fr restricii i asupra argumentelor (cu
lungimea transmis) din proceduri.
Funciile care trateaz entiti de tip caracter pot returna iruri cu o lungime ce depinde de
argumentele specificate, de exemplu:
FUNCTI ON concat ( s1, s2)
I MPLI CI T NONE
CHARACTER( LEN=LEN_TRI M( s1) +LEN_TRI M( s2) ) : : concat ! numel e f unct i ei
CHARACTER( LEN=*) , I NTENT( I N) : : s1, s2
concat = TRI M( s1) / / TRI M( s2)
END FUNCTI ON concat
- 93 -
Se pot folosi iruri cu lungimea zero, cum ar fi referine de genul subi r ( i : j ) unde i >
j, i constante de forma " " . Sunt admise i subiruri de constante, iat un exemplu pentru
convertirea unei valori n de tip ntreg, din domeniul 09, n caracterul corespunztor:
car act er _n = " 0123456789" ( n: n) ! al ocar ea ci f r ei ca si car act er .
Variabila caracter_n va conine cifra corespunztoare valorii lui n, cu condiia ca n-ul
precizat s nu fie mai mic dect zero sau mai mare dect 9 (altfel va rezulta eroare).


4.10 POINTERI
Foarte multe limbaje de programare suport pointeri pentru c utilizarea acestora uureaz
implementarea structurilor dinamice de date: liste nlnuite, stive i arbori. Programele
scrise n limbajul C depind n mare msur de pointeri deoarece transmiterea unui tablou
ctre o funcie genereaz instantaneu o referin de acest tip. ns utilizarea pointerilor
poate crea i greuti:
Folosirea lor poate fora programatorul s ia n considerare aspecte de un nivel
apropiat mainii, ceea ce ar fi mai eficient dac s-ar lsa pe seama compilatorului.
Utilizarea lor excesiv conduce la surse greu inteligibile i greu mentenabile.
Conduc foarte uor la erori detectabile doar n faza de rulare (o mare parte din
greelile sub limbajul C sunt datorate utilizrii accidental eronate a pointerilor).
Inhib optimizarea automat a codului la compilare (dou obiecte aparent distincte
se pot dovedi a fi doar pointeri indicnd ctre aceeai locaie de memorie).
Limbajul J ava este considerat de ctre unii ca fiind un dialect fr pointeri al limbajului
C++. Dei pointerii din Fortran sunt relativ blnzi, ei trebuie folosii totui cu atenie.

Dup cum am menionat n subcapitolul referitor la tablouri, un pointer poate fi perceput ca
o referin ctre o referin. Deci un pointer nu conine date, el indic doar ctre o variabil
care conine date. n Fortran, poate indica doar ctre un alt pointer sau ctre o variabil
declarat explicit ca fiind o int valid (prin specificatorul TARGET). Fiecare pointer are o
stare de asociere care-l determin s indice sau nu, la un moment dat, ctre un obiect int.
Funcia intrinsec ASSOCIATED permite interogarea acestei stri. Aceast funcie va
returna valoarea . FALSE. n cazul unei stri neasociate (iar n caz contrar valoarea
. TRUE. ).
n Fortran 90, din pcate, la declararea iniial a unui pointer (prin atributul POINTER)
starea acestuia este nedefinit (n Fortran 95 acest aspect este ns rezolvat). Din acest
motiv, cea mai bun metod este ca la nceput s setm fiecare pointer ntr-o stare
neasociat (prin instruciunea NULLIFY), dup care se va putea testa starea lor (apelnd
funcia intern ASSOCIATED) naintea alocrii lor unor inte valide. Starea de asociere a
pointerilor poate fi desetat i prin instruciunea DEALLOCATE (sau prin apelarea funciei
intrinseci NULL).
- 94 -
Limbajul Fortran 90 nu permite crearea unor tablouri din pointeri, dar permite crearea unor
tablouri de obiecte definite de utilizator (de tip derivat) care s conin pointeri:
TYPE : : t abl ou_de_pt r
REAL, DI MENSI ON( : ) , POI NTER : : t p
END TYPE t abl ou_de_pt r

TYPE( t abl ou_de_pt r ) , ALLOCATABLE : : x( : )
! . . .
ALLOCATE( x( nx) )
DO i = 1, nx
ALLOCATE( x( i ) %t p( m) )
END DO
Pointerilor le pot fi asignate valori de tip int, printr-o operaie special marcat cu
simbolul => (pentru a se deosebi de operaiile curente de asignare sau de atribuire). Dac
inta nu este definit sau asociat, pointerul primete acelai statut ca i variabila dinamic
reprezentat de int. Pointerii se pot dovedi foarte utili la notarea prescurtat a seciunilor
de tablouri, ca i alias, de exemplu:
REAL, TARGET : : poza( 1024, 768) ! decl ar ar e ca t i nt a
REAL, DI MENSI ON( : , : ) , POI NTER : : al f a, bet a
al f a => poza( 1: 512, 385: 768) ! asi gnar e l a un sf er t di n poza
bet a => poza( 1: 1024: 1, 768: 1: - 1) ! asi gnar e l a poza ogl i ndi t a

Iat i ilustrarea unei situaii (printr-o funcie de realocare cuprins ntr-un modul) n care
se poate dovedi util returnarea unui pointer pentru un tablou, de ctre o funcie:
MODULE r eal ocar e_m
CONTAI NS
FUNCTI ON r eal oca( p, n) ! r eal oca de t i p r eal
REAL, POI NTER, DI MENSI ON( : ) : : p, r eal oca ! decl ar ar e poi nt er i
I NTEGER, i nt ent ( i n) : : n
I NTEGER : : n_vechi , i _er oar e
ALLOCATE( r eal oca( 1: n) , STAT=i _er oar e)
I F( i _er oar e / = 0) STOP " Er oar e de al ocar e" ! t r at ar ea er or i i
I F( . NOT. ASSOCI ATED( p) ) RETURN ! t est ar ea asoci er i i
n_vechi = MI N( SI ZE( p) , n)
r eal oca( 1: n_vechi ) = p( 1: n_vechi ) ! at r i bui r e " comuna"
DEALLOCATE( p) ! el i ber ar e poi nt er p
END FUNCTI ON r eal oca
END MODULE r eal ocar e_m
PROGRAM t est _r eal ocar e
USE r eal ocar e_m ! speci f i car ea ut i l i zar i i modul ul ui
I MPLI CI T NONE ! decl ar ai e obi snui t a i n For t r an 90
REAL, POI NTER, DI MENSI ON( : ) : : p
I NTEGER : : j , n_el em= 2
ALLOCATE( p( 1: n_el em) )
p( 1) = 12345
p => r eal oca( p, 10000) ! obser vat i mani er a speci f i ca de asi gnar e
WRI TE( *, *) " sunt al ocat e " , n_el em, si ze( p) , " el ement e"
WRI TE( *, *) " p( 1) =" , p( 1)
END PROGRAM t est _r eal ocar e
- 95 -
Pointerii se pot folosi i la alctuirea unor structuri de date dinamice complexe, cum ar fi
listele nlnuite, arborii binari etc. Acest lucru este posibil deoarece o variabil de tip
derivat poate conine pointeri care s indice ctre sine sau ctre alte obiecte similare (cu
condiia ca intele s fie valide). n exemplul urmtor prezentm o posibil implementare a
unei cozi:
PROGRAM coada
I MPLI CI T NONE
TYPE : : t i p_el ement ! speci f i car ea unei st r uct ur i de dat e
CHARACTER( 20) : : si r
! poi nt er cat r e un obi ect si mi l ar :
TYPE( t i p_el ement ) , POI NTER : : ur mat or
END TYPE t i p_el ement
TYPE( t i p_el ement ) , POI NTER : : f at a, spat e, pozi t i e
CHARACTER( 20) : : t ampon
I NTEGER : : st ar e
NULLI FY( f at a, spat e) ! set ar ea i ni t i al goal a a cozi i , apoi
! ci cl u pent r u ci t i r ea unor car act er e
DO ! t ast at e de ut i l i zat or , i n t ampon
READ( *, " ( A) " , I OSTAT=st ar e) t ampon
I F( st ar e / = 0) EXI T ! i esi r ea di n ci cl u
I F( . NOT. ASSOCI ATED( f at a) ) THEN
ALLOCATE( f at a) ! cr ear ea l ocat i ei pent r u pr i ma pozi t i e
spat e => f at a ! spr e car e i ndi ca f at a si spat e
ELSE
ALLOCATE( spat e%ur mat or ) ! l ocat i a pent r u pozi t i a ur mat oar e
spat e => spat e%ur mat or ! spr e car e i ndi ca spat e
END I F
spat e%si r = t ampon ! st ocar ea si r - ul ui i n pozi t i a noua si
NULLI FY( spat e%ur mat or ) ! mar car ea acest ei a ca ul t i ma di n coada
END DO
! dupa i esi r ea di n ci cl u ur meaza par cur ger ea cozi i
! cu af i sar ea cont i nut ul ui f i ecar ui el ement :
pozi t i e => f at a ! r epozi t i onar e pe i nceput ul cozi i ,
! si ci cl u pent r u
DO WHI LE( ASSOCI ATED( pozi t i e) )
WRI TE( *, *) pozi t i e%si r ! af i sar ea cont i nut ul ui di n pozi t i a
! cur ent a, si
pozi t i e => pozi t i e%ur mat or ! asi gnar ea poi nt er ul ui l a ur mat or ea
! pozi t i e di n coada
END DO
STOP
END PROGRAM coada
4.11 ALTE ASPECTE
Valorile de tip binar, octal, i hexadecimal se pot citi sau scrie utiliznd descriptorii noi de
tipul B, O, i Z, iar constantele numerice de acest fel se scriu cu litera corespunztoare
tipului n faa valorii citate (de exemplu, valoarea decimal 15 se poate scrie sub form
binar ca: B"1111" , sub form octal ca: O" 17" , sub form hexadecimal ca: Z" F" ).
Specificaiile DATA pot s conin de asemenea constante binare, octale i hexadecimale.

- 96 -
4.11.1 Funcii intrinseci i faciliti noi
Standardul limbajului Fortran a fost extins i cu o serie de funcii intrinseci ce faciliteaz
manipulrile valorilor la nivel de bii. Numerotarea biilor se face de regul dinspre dreapta
spre stnga, pornind de la poziia zero (sau de la captul cel mai puin semnificativ).

Tabel cu noile funcii intrinseci pentru operaii la nivel de bit asupra valorilor ntregi:
Funcie Efect
BI T_SI ZE( t ) Returneaz numrul biilor din variabila de tipul t.
BTEST( i , p) Testeaz bitul de pe poziia p din valoarea i de tip ntreg.
I AND( i , j ) I logic ntre dou argumente de tip ntreg.
I BCLR( i , p) Golete coninutul bitului de pe poziia p din ntregul i
(valoarea bitului va fi zero).
I BCHNG( i , p) Inverseaz valoarea bitului de pe poziia p din ntregul i.
I BI TS( i , p, l ) Extrage irul de bii cu lungimea l ncepnd de la p din i.
I BSET( i , p) Seteaz valoarea bitului de pe poziia p din ntregul i pe unu.
I EOR( i , j ) SAU exclusiv ntre dou argumente de tip ntreg.
I OR( i , j ) SAU inclusiv ntre dou argumente de tip ntreg.
I SHFT( i , n) Translatare logic de bii la stnga (sau la dreapta dac n este
negativ) cu n poziii n cadrul lui i.
I SHFTC( i , n) Deplasare circular logic de bii la stnga (sau la dreapta
dac n este negativ) cu n poziii n cadrul lui i.
NOT( i ) Complementul logic al argumentului i de tip ntreg.

Noile funcii intrinseci FLOOR i MODULO au sintaxe i efecte similare cu cele ale
funciilor AINT i MOD deja cunoscute, cu deosebiri doar n cazul numerelor negative.
Funcia CEILING, similar acestora ca form, rotunjete argumentul n sus, la cel mai
apropiat ntreg.

Funcia intrinsec TRANSFER poate fi folosit pentru copierea biilor dintr-o valoare de un
anume tip ntr-o valoare de alt tip (o alternativ mai sigur dect artificiile posibile prin
declaraii EQUIVALENCE). Iat spre exemplu, cum se poate folosi aceast funcie pentru
testarea unui calculator din cadrul unui program, cu privire la reprezentarea caracterelor:
LOGI CAL, PARAMETER : : bi gend = I ACHAR( TRANSFER( 1, " a" ) ) == 0
Dac platforma este de tip big-endian atunci parametrul bigend va primi valoarea . TRUE.
(altfel va avea valoarea . FALSE. ).
Dintre funciile numerice intrinseci menionm funciile TINY (care returneaz cel mai mic
numr pozitiv de tipul i felul argumentului) i HUGE (care returneaz cel mai mare numr
pozitiv de tipul i felul argumentului), care accept ca argument att valori ntregi ct i
valori reale, de orice fel. Dei exist nc multe alte funcii intrinseci noi, ne limitm doar la
a meniona cteva: BIT_SIZE, DIGITS, EPSILON, MAXEXPONENT, MINEXPONENT,
PRECISION, RADIX, RANGE etc.
- 97 -
4.11.2 Subprograme predefinite
Pe lng multitudinea funciilor noi exist i cteva subprograme interne, apelabile din
orice unitate de program. Dintre acestea menionm:
DATE_AND_TI ME( [ dat a] [ , t i mp] [ , zona] [ , val or i ] ) returneaz data i ora curent sub
forma unui ir sau sub forma unui
tablou de valori ntregi;
RANDOM_NUMBER( [ HARVEST=] t abl ou) returneaz un tablou de valori
pseudoaleatoare uniform distribuite n
intervalul 01;
RANDOM_SEED( [ msuma] [ , pune] [ , i a] ) iniializeaz sau recupereaz valoarea
iniial a generatorului de numere
pseudoaleatoare;
SYSTEM_CLOCK( [ cont or ] [ , r at a] [ , maxi m] ) permite tratarea unor intervale de timp
n funcie de ceasul calculatorului (n
Fortran 95 exist o rutin mai curat:
CPU_TIME).

4.11.3 Aspecte legate de evoluia limbajului
Anumite aspecte din Fortran au fost considerate att de depite nct au fost excluse din
standardele noi ale limbajului. Dup saltul imens produs de apariia standardului Fortran 90
limbajul a fost dezvoltat n continuare, iar pn n 1996 s-a elaborat o nou versiune sub
specificaia de Fortran 95. Diferenele dintre aceste dou versiuni nu sunt att de mari, ns
caracteristicile considerate depite au fost lsate uitrii. Folosirea lor nu este recomandat,
chiar dac unele compilatoare Fortran 95 semnaleaz doar erori de atenionare la ntlnirea
acestora. Iat cteva dintre aceste aspecte problematice:
Cicluri DO cu variabil de control de tip real (sau dubl precizie).
Cicluri DO finalizate prin alte instruciuni dect CONTINUE sau END DO.
Dou sau mai multe cicluri DO (incluse) finalizate prin aceeai instruciune.
Instruciunea IF aritmetic.
Folosirea constantelor Hollerith (sau descriptorului H) n listele de descriptori
din instruciunile FORMAT.
Folosirea instruciunii PAUSE (se poate nlocui lesne cu o instruciune de citire
fr list de intrare).
Folosirea instruciunii ASSIGN (i implicit a instruciunii GO TO asignate, a
etichetelor asignate pentru FORMAT etc.).
Folosirea facilitii de revenire (RETURN) alternativ.
Specificarea unei ramuri ctre instruciunea END IF din afara blocului IF
(posibil n Fortran 77 din greeal).
- 98 -
Excluderea acestor faciliti nu reprezint o problem, cu att mai puin pentru cei ce nu
uzau de ele. Exist i alte aspecte care dei sunt utilizate n mod obinuit n Fortran 77, sunt
considerate ca fiind redundante i ca atare se recomand a fi evitate n scrierea surselor. De
exemplu: formatul fix, tipurile de date implicite (nedeclararea explicit a tipurilor),
blocurile comune (COMMON), tablourile cu mrime presupus, instruciunile INCLUDE,
EQUIVALENCE, ENTRY, unitile de program BLOCK DATA etc.

Dintre principalele caracteristici noi ale limbajului Fortran 95 menionm:
instruciunea FORALL (i facilitile noi oferite i pentru WHERE);
subprogramele pure (PURE) i elementare (ELEMENTAL) definite de utilizator;
starea de asociere iniial a pointerilor, prin => NULL( ) ;
iniializarea implicit a obiectelor de tip derivat;
referirile la proceduri pure n expresiile de specificare;
dealocarea automat a tablourilor alocabile;
formatarea prin specificator cu lungime zero produce considerarea numrului
minim de poziii necesare (de exemplu: I 0);
noua funcie intrinsec CPU_TIME;
schimbri ale unor funcii intrinseci etc.

Pentru detalii suplimentare v recomandm consultarea sitului realizat de Bo Einarsson (la
adresa http://www.nsc.liu.se/~boein/f77to90/f95.html).

Ultima variant dezvoltat a fost botezat Fortran 2000. Dintre noutile aduse de aceasta i
facilitile oferite menionm:
performane ridicate n domeniul calculelor tiinifice i inginereti (operaii
asincrone de citire/scriere, tratarea excepiilor de virgul flotant, interval
aritmetic);
abstractizarea datelor cu extensibilitatea oferit ctre utilizatori (componente
alocabile, intrri/ieiri de tip derivat);
orientare pe obiecte (constructori/destructori, motenire, polimorfism);
tipuri derivate parametrizate;
pointeri la proceduri;
internaionalizare;
interoperabilitate cu limbajul C.

Ca i resurse disponibile (standarde i versiuni ale limbajului, compilatoare, medii de
programare, generatoare de interfee, programe de conversie, programe gratuite, produse
comerciale, documentaii, liste cu ntrebri frecvente i forumuri etc.) v recomandm
consultarea adresei http://www.fortran.com/fortran/ .

- 99 -


5.1 COMPILATORUL GNU FORTRAN 77
GNU Fortran 77 (cunoscut i ca g77) este un compilator realizat de ctre o echip condus
de Craig Burley n cadrul organizaiei Free Software Foundation (Fundaia pentru Software
Liber) cu scopul de a sprijini dezvoltarea programelor n acest limbaj. Ofer suport complet
pentru fiiere surs scrise n Fortran 77, acceptnd i unele extensi comune derivate n
specificaii de tip Fortran 90. Fiierele executabile (programele) rezultate sunt la fel de
rapide ca cele realizate cu compilatoare comerciale. Compilatorul g77 este accesibil prin
internet tuturor celor interesai pornind de la urmtoarea adres, ca parte a pachetului gcc
(GNU Compiler Collection):
http://www.gnu.org/directory/gcc.html
sau
http://www.gnu.org/software/gcc/gcc.html

Pentru cei ce folosesc sistemul de operare Windows, merit s menionm i unul dintre
siturile educaionale, cum ar fi cea de la Universitatea Statului Utah, la adresa:
http://www.engineering.usu.edu/cee/faculty/gurro/Classes/Classes_Main.htm
unde pe lng pachetul G77.ZIP exist i cursuri de iniiere n programare cu ajutorul
limbajului Fortran 77, folosind i facilitile noi permise de compilatorul g77.

Sursele programelor pot fi redactate cu ajutorul oricrui editor de text ce poate salva fiiere
text curate (ASCII). Compilatorul g77 lansat sub sistemul de operare Windows ruleaz n
mod normal sub fereastr DOS. Acest aspect implic respectarea conveniilor din DOS
pentru specificatorii de fiiere i directoare (cel mult 8 caractere alfanumerice pentru nume
i 3 pentru extensie). Exist ns i cteva interfee grafice accesibile (cu licen de utilizare
liber) care conin i editoare de text adecvate pe lng compilatorul g77, asemntoare cu
medii de dezvoltare comerciale, uneori prea scumpe. Dintre cele mai simple asemenea
interfee amintim dou: Vfort (printre primele aprute, autorii fiind N. i P. Vabicevici din
Rusia, http://www.imamod.ru/~vab/vfort/), i Force2 (un proiect realizat i dezvoltat de
ctre G. Lepsch Guedes, http://www.forceproject.hpg.com.br/).

Pentru a creea fiiere executabile cu ajutorul compilatorului g77, se poate folosi o linie de
comand de genul:

G77 nume1. F[ op] [ nume2. EXE]

unde: G77 numele compilatorului GNU Fortran 77;
nume1. F specificatorul fiierului surs;
op opiune pentru compilare;
nume2. EXE specificatorul fiierului executabil ce se creeaz.
CAPITOLUL 5: G77
- 100 -
Fiierul executabil nume2.exe rezultat poate fi lansat n execuie prin invocarea numelui
nume2 ntr-o linie nou de comand, cu condiia ca s nu existe erori care s impieteze
asupra generrii lui.

Dac n timpul compilrii sursei erorile de sintax afiate n fereastra DOS curent sunt
prea numeroase, depind zona afiajului curent, se poate redirecta ieirea stderr (Standard
Error) ntr-un fiier text. Aceast facilitate este oferit de cele mai multe medii de
programare, dar poate fi realizat i prin programul ETIME.EXE (program de temporizare
cu redirectare cuprins n pachetul G77.ZIP oferit de Gilberto E. Urroz de la Utah State
University, la adresa deja menionat) sub DOS printr-o linie de comand de forma:

ETI ME 2specf i s G77 nume1. F

unde: ETI ME numele programului de redirectare;
2 opiune pentru redirectarea descriptorului de fiiere 2 (stderr);
specf i s specificatorul fiierului n care se vor nregistra mesajele
redirectate;
G77 numele compilatorului GNU Fortran 77 (g77.exe);
nume1. F specificatorul fiierului surs.

n acest caz nu se va genera nici un mesaj (ecou) pe ecran, nu se va crea nici imagine obiect
nici imagine executabil pentru fiierul surs nume1.F, ns fiierul specificat prin specfis
va conine toate mesajele ce ar fi aprut pe ecran n urma compilrii cu g77. Vizualiznd
coninutul fiierului specfis generat se poate depana mai uor sursa coninut n nume1.F.


5.2 COMPILAREA CU G77
Comanda G77 sub forma primului exemplu din subcapitolul precedent va determina
compilarea i editarea legturilor din programul scris, genernd un fiier executabil ce va
putea fi rulat sub DOS sau Windows 9x/NT (n fereastr DOS). Dac numele fiierului
executabil nu se specific n linia de comand, se va genera un fiier cu numele identic cu
cel al sursei (dar cu extensia .EXE). Exist mai multe opiuni ce se pot specifica dup
numele fiierului surs (atenie la litere mici i la majuscule!), dintre care menionm:

c doar compilare (Compile-only), se va genera doar imagine
obiect fr imagine executabil (rezult doar fiier cu
extensia .OBJ );
f f r eef or m pentru fiier surs redactat sub form liber;
f pedant i c va avertiza asupra codului neportabil sau nestandard;
f noaut omat i c pentru alocare static la toate variabilele (similar cu SAVE
universal):
f nobacksl ash va interpreta \ ca i caracter normal n iruri;
f vxt pentru interpretarea anumitor sintaxe de tipul VAX Fortran;
- 101 -
g va produce informaii pentru depanare;
I di r ect or pentru specificarea directorului cu fiiere de inclus (prin
INCLUDE);
O pentru optimizarea codului generat;
Wi mpl i ci t va avertiza asupra numelor de date cu tip neexplicit;
Wuni ni t i al i sed va avertiza n anumite cazuri asupra variabilelor fr
valoare (dac s-a folosit opiunea O);
Wal l va genera mesaje de avertizare referitoare la variabile
neutilizate sau nedeclarate (ca cele dou opiuni precedente
combinate).

n linia de comand se pot specifica mai multe fiiere surs, se admite i caracterul * n
specificaii (conform conveniilor din DOS). De asemenea, se pot specifica fiiere
compilate (imagini obiect cu extensia .OBJ ) i fiiere de bibliotec (numite arhiv n
jargonul utilizatorilor de Unix, fiiere cu extensia .A). La specificarea opiunilor trebuie s
avem grij la respectarea formei de scriere, ns specificatorii de fiiere sub DOS (i sub
Windows) nu sunt sensibili la mrimea caracterelor utilizate (caracterele mici sunt
echivalente cu majusculele corespunztoare). Iat i un scurt exemplu pentru ilustrarea
compilrii cu G77:

Creeai un fiier text (ASCII) cu un editor convenabil (de exemplu NotePad sub Windows),
cu urmtorul coninut, innd cont de faptul c n format fix instruciunile ncep din coloana
a 7-a i se termin pn n coloana 72:

C2345678901234567890123
Pr ogr amTEST
i nt eger i
r eal x( 10)
do 1 i =1, 10
x( i ) =i *i
1 wr i t e( *, *) i , x( i ) ! ci cl u f i nal i zat f ar a CONTI NUE
end

Salvai fiierul sub numele TEST.F alturi de programul G77.EXE i deschidei o fereastr
DOS (avnd grij s v aflai n directorul n care avei compilatorul i fiierul surs creat).
Pentru a compila sursa scris i pentru a creea o imagine executabil tastai linia de
comand:

G77 TEST. F O TEST

Dac ai lucrat corect, dup terminarea procesului lansat se va afia din nou prompterul
curent din fereastra DOS. n cazul n care vi se afieaz mesaje de eroare, citii-le cu
atenie, dac trebuie editai din nou fiierul surs i corectai inadvertenele nainte de a-l
salva din nou. Pentru a verifica existena programului generat putei tasta comanda:

DI R TEST. *
- 102 -
Dac pe ecran vi se afieaz printre altele i specificatorul de fiier TEST.EXE, atunci
putei lansa n execuie programul creat, tastndu-i numele:

TEST

Programul va afia pe ecran valorile de la 1 la 10 cu ptratul lor, succesiv. Prin comanda
DIR putei vedea i diferena de mrime dintre fiierul surs (TEST.F) i programul creat
(TEST.EXE). Evident, vei putea creea fiiere surs i programe i n alte directoare, pentru
acest fapt ns vei fi nevoii s v configurai mediul de lucru corespunztor (setarea
variabilei PATH etc.).

Dac folosii mediile de programare cu interfa grafic VFort sau Force2 amintite, atunci
va trebui s inei cont de setrile i opiunile acestora, compilarea i editarea legturilor
realizndu-se cu comenzile grafice corespunztoare (prin activarea butoanelor oferite prin
interfaa grafic). Pentru informaii mai detaliate recomandm consultarea adreselor de web
menionate.


5.3 BIBLIOTECI PENTRU G77
Fortran fiind un limbaj de programare dezvoltat n scopuri tiinifice, exist o varietate
foarte mare de biblioteci matematice, mai ales cu implementri de metode numerice. Ne
rezumm ns s amintim doar dou pachete disponibile prin internet (pornind de la adresa:
http://www.geocities.com/Athens/Olympus/5564/ ,
la care se gsete pagina dedicat compilatorului G77 pentru variantele pe 32 de bii ale
sistemului de operare Windows) i compatibile cu GNU Fortran 77.

Primul pachet este biblioteca matematic SLATEC, dezvoltat la Laboratoarele Naionale
Americane (din Los Alamos, Lawrence Livermore, NIST, Oak Ridge, Sandia etc.), ce
conine 902 de module apelabile de ctre utilizatori, fiind de fapt o colecie compus din
rutinele considerate ca cele mai utile din cadrul altor pachete de bibliotec (BLAS,
LINPACK, EISPACK, SLAP, FFTPACK, FISHPACK, LLSQ, MINPACK, MP, PCHIP,
QUADPACK i SPLPACK).

Al doilea pachet este o bibliotec grafic cu numele PSPLOT, ce permite generarea
imaginilor n format PS (PostScript). Acest format este independent de sistemul de operare
folosit, fiind acceptat i utilizat de ctre multe periferice de imprimare, pentru vizualizarea
imaginilor pe ecran fiind ns nevoie de o aplicaie corespunztoare (cum ar fi pachetele
Aladdin Ghostscript i GSView, disponibile sub licene libere pentru diverse platforme).


- 103 -


6.1 EXERCIII ELEMENTARE INTRODUCTIVE
6.1.1 S se schieze o schem logic pentru alegerea celei mai mari valori dintre a, b, i
c, i s se scrie un program FORTRAN pe baza schemei respective.

Soluie propus:

! 2345678901234567890123456789012345678
! r andul de mai sus ar at a doar col oana.
! i ncepemdi r ect cu
! af i sar ea mesaj ul ui pent r u cer er e:
wr i t e( *, *) ' a, b, c: '

! ci t i r ea val or i l or pent r u a, b, c:
r ead( *, *) a, b, c

! t est ar ea pr i mei condi t i i
! ( si i n caz af i r mat i v at r i bui r e) :
i f ( a. l t . b) a=b


! t est ar ea ur mat oar ei condi t i i
! ( si i n caz af i r mat i v at r i bui r e) :
i f ( a. l t . c) a=c


! af i sar ea r ezul t at ul ui st ocat i n a:
wr i t e( *, *) ' max: ' , a
st op
end



6.1.2 S se schieze o schem logic pentru ordonarea cresctoare a valorilor a, b, i c,
dup care s se scrie un program FORTRAN pe baza schemei ntocmite.

Soluie propus:

! i ncepemcu decl ar at i a de pr ogr am:
pr ogr amabcor dc

! af i sar ea mesaj ul ui pent r u cer er e:
wr i t e( *, *) ' a, b, c: '
! ci t i r ea val or i l or pent r u a, b, c:
r ead( *, *) a, b, c

! schema l ogi ca est e cont i nuat a pe
! pagi na ur mat oar e, l a f el si
! pr ogr amul , scr i s al at ur at .

START
a, b, c
a, b, c :
a <b
Da Nu
a :=b
a <c
Da Nu
a :=c
max:, a
STOP
START
a, b, c
a, b, c :
1
CAPITOLUL 6: EXERCIII
- 104 -
! cont i nuar ea schemei
! si a pr ogr amul ui ,

! cu t est ar ea pr i mei condi t i i
! ( i n caz af i r mat i v schi mbamval or i l e
! di nt r e a si b cu aj ut or ul l ui t ) :
i f ( a. gt . b) t hen
t =a
a=b
b=t
endi f


! t est ar ea ur mat oar ei condi t i i
! ( i n caz af i r mat i v schi mbamval or i l e
! di nt r e a si c cu aj ut or ul l ui t ) :
i f ( a. gt . c) t hen
t =a
a=c
c=t
endi f


! t est ar ea ur mat oar ei condi t i i
! ( i n caz af i r mat i v schi mbamval or i l e
! di nt r e b si c cu aj ut or ul l ui t ) :
i f ( b. gt . c) t hen
t =b
b=c
c=t
endi f


! af i sar ea r ezul t at ul ui :
wr i t e( *, *) ' cr escat or : ' , a, b, c
! si i mpl i ci t sf ar si t ul pr ogr amul ui
end



6.1.3 S se scrie un program FORTRAN care n urma citirii de la tastatur a unui numr
ntreg din intervalul [1,7], afieaz ziua din sptmn care corespunde acelui
numr (1 luni, 2 mari etc.).

Soluie propus:

pr ogr amsapt amana
! - - - pr ogr amul i ndi ca zi ua sapt amani i pe baza unui nr . i nt r eg
! di n i nt er val ul [ 1, 7]
! nu a f ost decl ar at expl i ci t t i pul var i abi l el or , i n mod i mpl i ci t
! var i abi l el e al e car or nume i ncepe cu i , j , k, l , m, n sunt de
! t i p i nt r eg, i ar r est ul de t i p r eal ( de evi t at acest st i l ! )
33 wr i t e( *, *) ' dat i un nr . i nt r eg di n i nt er val ul [ 1, 7] : '
r ead( *, *) i
wr i t e( *, *) ! se t i par est e o l i ni e goal a
a >c
Da Nu
t :=a
a :=c
c :=t
crescator:,a,b,c
STOP
b >c
Da Nu
t :=b
b :=c
c :=t
a >b
Da Nu
t :=a
a :=b
b :=t
1
- 105 -
! t est ar e caz
sel ect case ( i )
case ( 1)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e LUNI '
case ( 2)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e MARTI '
case ( 3)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e MI ERCURI '
case ( 4)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e J OI '
case ( 5)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e VI NERI '
case ( 6)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e SAMBATA'
case ( 7)
wr i t e( *, *) ' zi ua cor espunzat oar e nr . al es est e DUMI NI CA'
case def aul t
wr i t e( *, *) ' nr . er onat ! ! '
wr i t e( *, *)
got o 33
end sel ect
end


6.1.4 S se scrie un program FORTRAN care pe baza lungimilor a 3 segmente, decide
dac acestea pot forma un triunghi.

Soluie propus:

pr ogr amt r i unghi
! - - - deci de daca 3 segment e pot f i l at ur i l e unui t r i unghi
! pe baza i negal i t at i l or cunoscut e de l a geomet r i e
!
! se f ol osest e r egul a i mpl i ci t a
! deci f ar a decl ar at i i expl i ci t e al e t i pul ui var i abi l el or
!
wr i t e( *, *) ' dat i l ungi mea pr i mul ui segment : '
r ead( *, *) s1
wr i t e( *, *) ' dat i l ungi mea cel ui de- al doi l ea segment : '
r ead( *, *) s2
wr i t e( *, *) ' dat i l ungi mea cel ui de- al t r ei l ea segment : '
r ead( *, *) s3
! t est ar e i negal i t at i
i f ( ( s1. l t . ( s2+s3) ) . and. ( s2. l t . ( s1+s3) ) . and.
+ ( s3. l t . ( s1+s2) ) ) t hen
wr i t e( *, *) ' segment el e POT f i l at ur i l e unui t r i unghi '
el se
wr i t e( *, *) ' segment el e NU pot f i l at ur i l e unui t r i unghi '
endi f
end

- 106 -
6.1.5 S se scrie un program FORTRAN care afieaz pe ecran urmtorul tabel, folosind
instruciunea FORMAT.

*********************
| N | Npat r at |
*********************
| 1 | 1 |
- - - - - - - - - - - - - - - - - - - - -
| 2 | 4 |
- - - - - - - - - - - - - - - - - - - - -
| 3 | 9 |
- - - - - - - - - - - - - - - - - - - - -
| 4 | 16 |
- - - - - - - - - - - - - - - - - - - - -
| 5 | 25 |
- - - - - - - - - - - - - - - - - - - - -
| 6 | 36 |
- - - - - - - - - - - - - - - - - - - - -
| 7 | 49 |
- - - - - - - - - - - - - - - - - - - - -
| 8 | 64 |
- - - - - - - - - - - - - - - - - - - - -
| 9 | 81 |
- - - - - - - - - - - - - - - - - - - - -
| 10 | 100 |
- - - - - - - - - - - - - - - - - - - - -

Soluie propus:

pr ogr amt abel
! - - - cr eeaza un t abel , ut i l i zand FORMAT
!
i mpl i ci t none
i nt eger n
100 f or mat ( 1x, a21)
pr i nt 100, ' *********************'
pr i nt *, ' | N | Npat r at | '
pr i nt 100, ' *********************'
do n=1, 10
pr i nt 200, ' | ' , n, ' | ' , n*n, ' | '
pr i nt *, ' - - - - - - - - - - - - - - - - - - - - - '
enddo
200 f or mat ( 1x, a2, i 2, a8, i 3, a6)
end


- 107 -
6.2 EXERCIII CU EXPRESII ARITMETICE
6.2.1 S se scrie un program FORTRAN care calculeaz valorile expresiei
d c
b a
e

+
=
2
dac a, b, c, i d iau toate valorile ntregi din intervalul [0,2].

Soluie propus:

pr ogr amexpr esi e
! - - - cal cul ul val or i i unei expr esi i i n f unct i e
! de 4 var i abi l e car e par cur g un i nt er val de nr . i nt r egi
i mpl i ci t none
i nt eger a, b, c, d
i nt eger i ! cont or al nr . de oper at i i / l i ni i
r eal e
! i ni t i al i zar e cont or
i =0
! 4 ci cl ur i DO i mbr i cat e
do 1 a=0, 2
do 2 b=0, 2
do 3 c=0, 2
do 4 d=0, 2
i =i +1
! - - - se pune pr obl ema af i sar i i unui nr . dor i t de l i ni i pe ecr an
! adi ca der ul ar e cont r ol at a a r ezul t at el or
! - - - sa pr esupunemca se dor est e af i sar ea a cat e 21 de l i ni i
i f ( mod( i , 21) . eq. 0) pause
! - - - f unct i a MOD t est eaza daca i est e mul t i pl u de 21
! - - - i nst r uct i unea PAUSE opr est e t empor ar execut i a pr ogr amul ui
! - - - ur meaza acumun t est de numi t or nul
i f ( c. eq. d) t hen
wr i t e( *, *) ' a=' , a, ' b=' , b, ' c=' , c, ' d=' , d,
& ' e nu se poat e cal cul a'
el se
e=( a+2. 0*b) / ( c- d)
wr i t e( *, *) ' a=' , a, ' b=' , b, ' c=' , c, ' d=' , d, ' - > e=' , e
endi f
4 cont i nue
3 cont i nue
2 cont i nue
1 cont i nue
! - - - ci t e oper at i i s- au ef ect uat
wr i t e( *, ' ( / / , 1x, a14, i 2, a9) ' ) ' s- au ef ect uat ' , i , ' oper at i i '
! - - - pt . af i sar e au f ost ut i l i zat i descr i pt or i de f or mat
end


6.2.2 S se scrie un program FORTRAN care calculeaz suma 1
2
+2
2
+3
2
+... +10
2
.

Soluie propus:

pr ogr amspat r at
! - - - cal cul ul sumei pat r at el or pr i mel or 10 nr . nat ur al e
- 108 -
i mpl i ci t none
i nt eger n
par amet er ( n=10) ! i n F90, s- ar f i scr i s I NTEGER, PARAMETER: : n=10
i nt eger s, i
s=0
do i =1, n
s=s+i *i
enddo
wr i t e( *, *) ' suma pat r at el or pr i mel or ' , n, ' nr . nat ur al e est e : ' ,
& s
end


6.2.3 S se scrie un program FORTRAN care calculeaz media aritmetic a primelor 10
numere naturale impare. Se cere deci calculul expresiei:
10
19 17 15 13 11 9 7 5 3 1 + + + + + + + + +


Soluie propus:

pr ogr ammedi mpar
! - - - cal cul ul medi ei ar i t met i ce a pr i mel or 10 nr . nat ur al e i mpar e
!
i mpl i ci t none
i nt eger n
par amet er ( n=10)
i nt eger s, i
i nt eger k ! cont or
s=0 ! i ni t i al i zar ea sumei
i =1 ! i ni t i al i zar ea pr i mul ui nr . i mpar
k=1 ! i ni t i al i zar ea cont or ul ui
333 s=s+i
i =i +2
k=k+1
i f ( k. l e. n) got o 333
wr i t e( *, *) ' medi a ar i t met i ca a pr i mel or ' , n,
& ' nr . nat ur al e i mpar e est e : ' , s*1. / n
end


6.2.4 S se scrie un program FORTRAN care decide dac un triunghi este echilateral, pe
baza coordonatelor vrfurilor.

Soluie propus:

pr ogr amechi l at
! - - - deci de daca un t r i unghi est e echi l at er al
! pe baza coor donat el or var f ur i l or
!
i mpl i ci t none
r eal x1, y1, x2, y2, x3, y3
r eal l 1, l 2, l 3
- 109 -
pr i nt *, ' dat i coor donat el e var f ur i l or t r i unghi ul ui : '
wr i t e( *, ' ( / , a3, $) ' ) ' x1='
r ead*, x1
wr i t e( *, ' ( a3, $) ' ) ' y1='
r ead*, y1
wr i t e( *, ' ( / , a3, $) ' ) ' x2='
r ead*, x2
wr i t e( *, ' ( a3, $) ' ) ' y2='
r ead*, y2
wr i t e( *, ' ( / , a3, $) ' ) ' x3='
r ead*, x3
wr i t e( *, ' ( a3, $) ' ) ' y3='
r ead*, y3
l 1=sqr t ( ( x2- x1) **2+( y2- y1) **2)
l 2=sqr t ( ( x2- x3) **2+( y2- y3) **2)
l 3=sqr t ( ( x3- x1) **2+( y3- y1) **2)
! ur meaza un exempl u de f ol osi r e per i cul oasa a oper at or ul ui . EQ.
! i n r eal i t at e, nr . r eal e i n cal cul at or pot f i " egal e" doar i n
! l i mi t el e unei t ol er ant e admi se
i f ( l 1. eq. l 2. and. l 2. eq. l 3) t hen
pr i nt *
pr i nt *, ' t r i unghi ul ESTE echi l at er al '
el se
pr i nt *
pr i nt *, ' t r i unghi ul NU ESTE echi l at er al '
endi f
end


6.2.5 S se scrie un program FORTRAN care calculeaz valorile funciei:
f(x) =x
2
+sin(x)
n intervalul [0,2], cu pasul 0,1.

Soluie propus:

pr ogr amf unct i e
! - - - cal cul eaza val or i l e f unct i ei x**2+si n( x) i n [ 0, 2]
! cu pasul 0. 1
!
i mpl i ci t none
r eal x, y
i nt eger i
do i =0, 20, 1
! est e r ecomandabi l a ut i l i za cont or de t i p i nt r eg i n ci cl ul DO
! chi ar daca F90 accept a si cont or nr . r eal , exi st a per i col ul
! de a nu " i nchi de" ci cl ul DO
x=i / 10.
y=x*x+si n( x)
wr i t e( *, ' ( a9, f 3. 1, a7, f 8. 6) ' ) ' pent r u x=' , x, ' f ( x) =' , y
! mai si mpl u, se put ea scr i e nef or mat at PRI NT*, x, y
enddo
end

- 110 -

6.2.6 S se scrie un program FORTRAN care rezolv un sistem liniar de 2 ecuaii cu 2
necunoscute.

Soluie propus:

pr ogr amsi st em
! - - - r ezol va un si st eml i ni ar 2x2, de t i pul
! ax+by=c
! dx+ey=f
!
i mpl i ci t none
r eal a, b, c, d, e, f
r eal del t a, x, y
pr i nt *, ' dat i a, b, c di n pr i ma ecuat i e : ax+by=c '
r ead*, a, b, c
pr i nt *, ' dat i d, e, f di n a doua ecuat i e : dx+ey=f '
r ead*, d, e, f
del t a=a*e- b*d
i f ( del t a. eq. 0) t hen
i f ( b*f . eq. c*e) t hen
pr i nt *
pr i nt *, ' si st emul est e compat i bi l nedet er mi nat '
el se
pr i nt *
pr i nt *, ' si st emul est e i ncompat i bi l '
endi f
el se
x=( c*e- b*f ) / del t a
y=( a*f - c*d) / del t a
pr i nt *
pr i nt *, ' si st emul est e compat i bi l det er mi nat '
pr i nt *, ' x=' , x
pr i nt *, ' y=' , y
endi f
end


6.3 EXERCIII CU TABLOURI DE DATE
6.3.1 S se scrie un program FORTRAN care determin cte numere pare exist ntr-un
ir de n numere naturale. Seria de n numere naturale va fi introdus de la tastatur.

Soluie propus:

pr ogr ampar
! - - - det er mi na cat e nr . par e exi st a i nt r - un si r de N nr . nat ur al e
!
i mpl i ci t none
i nt eger a( 50) ! di mensi unea maxi ma a si r ul ui est e 50
i nt eger n ! di mensi unea ef ect i va a si r ul ui va f i n
i nt eger i , k
503 pr i nt *, ' dat i nr . de el ement e di n si r : N < 50'
- 111 -
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 50) got o 503
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - i ni t i al i zar e cont or
k=0
! - - - det er mi nar ea nr . de el ement e par e
do i =1, n
i f ( mod( a( i ) , 2) ==0) k=k+1
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt *
wr i t e( *, ' ( a26, i 2, a9) ' ) ' I n si r ul i nt r odus exi st a ' , k, ' nr . PARE'
pr i nt *
end


6.3.2 S se scrie un program FORTRAN care determin intersecia a dou mulimi
avnd fiecare m elemente numere ntregi.

Soluie propus:

pr ogr ami nt er sect i e
! - - - i nt er sect i a a 2 mul t i mi A, B avand ambel e M el ement e i nt r egi
!
i mpl i ci t none
i nt eger a( 50) , b( 50) , i nt er s( 50) ! di mensi unea maxi ma a mul t i mi l or
i nt eger m ! di mensi unea ef ect i va a mul t i mi l or
i nt eger i , j , k
999 pr i nt *, ' dat i di mensi unea ef ect i va a mul t i mi l or : M < 50'
r ead*, m
! - - - sa ne asi gur amca ut i l i zat or ul r espect a cer i nt a :
i f ( m. l t . 1. or . m. gt . 50) got o 999
! - - - i nt r oducer ea el em. mul t i mi i A
pr i nt *
pr i nt *, ' El em. mul t i mi i A ( nr . i nt r egi di st i nct e, max. 3 ci f r e! ) : '
pr i nt *
do i =1, m
22 wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
! - - - ver i f i car ea pr ezent ei el em. dubl e
do j =1, i - 1
i f ( a( i ) . eq. a( j ) ) t hen
! exi st a el em. dubl e
pr i nt *, ' *** El ement el e t r ebui e sa f i e t oat e di st i nct e ***'
pr i nt *
got o 22
endi f
- 112 -
enddo
enddo
! - - - i nt r oducer ea el em. mul t i mi i B
pr i nt *
pr i nt *, ' El em. mul t i mi i B ( nr . i nt r egi di st i nct e, max. 3 ci f r e! ) : '
pr i nt *
do i =1, m
33 wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' b( ' , i , ' ) ='
r ead( *, *) b( i )
! - - - ver i f i car ea pr ezent ei el em. dubl e
do j =1, i - 1
i f ( b( i ) . eq. b( j ) ) t hen
! exi st a el em. dubl e
pr i nt *, ' *** El ement el e t r ebui e sa f i e t oat e di st i nct e ***'
pr i nt *
got o 33
endi f
enddo
enddo
! - - - i ni t i al i zar e cont or el ement e comune
k=0
! - - - det er mi nar ea i nt er sect i ei
do i =1, m
do j =1, m
i f ( a( i ) . eq. b( j ) ) t hen
k=k+1
i nt er s( k) =a( i )
endi f
enddo
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' I nt er sect i a mul t i mi l or est e : '
pr i nt *
i f ( k. ne. 0) t hen
do i =1, k
wr i t e( *, ' ( i 4, $) ' ) i nt er s( i )
enddo
el se
pr i nt *, ' vi da'
endi f
end


6.3.3 S se scrie un program FORTRAN care efectueaz produsul a dou matrici de
numere reale.

Soluie propus:

pr ogr ampr odus
! - - - pr odusul a 2 mat r i ci r eal e AxB
* A est e de t i p MxN
* B est e de t i p NxP
!
i mpl i ci t none
- 113 -
r eal a( 50, 40) , b( 40, 60) , pr od( 50, 60) ! di mens. maxi me al e mat r i ci l or
i nt eger m, n, n2, p ! di mensi uni l e ef ect i ve
i nt eger i , j , k
1 pr i nt *, ' dat i di mensi uni l e ef ect i ve al e mat r i ci i A : M<50, N<40'
r ead*, m, n
! - - - ver i f i car e di mensi uni A
i f ( m. l t . 1. or . m. gt . 50. or . n. l t . 1. or . n. gt . 40) got o 1
2 pr i nt *, ' dat i di mensi uni l e ef ect i ve al e mat r i ci i B : N<40, P<60'
r ead*, n2, p
! - - - ver i f i car e compat i bi l i t at e
i f ( n. ne. n2) t hen
pr i nt *, ' I nmul t i r ea nu poat e f i f acut a ! '
got o 1
endi f
! - - - ver i f i car e di mensi uni B
i f ( p. l t . 1. or . p. gt . 60) got o 2
! - - - i nt r oducer ea el em. mat r i ci i A
pr i nt *
pr i nt *, ' El ement el e mat r i ci i A : '
pr i nt *
do i =1, m
do j =1, n
wr i t e( *, ' ( 1x, a2, i 1, a1, i 1, a2, $) ' ) ' a( ' , i , ' , ' , j , ' ) ='
r ead( *, *) a( i , j )
enddo
enddo
! - - - i nt r oducer ea el em. mat r i ci i B
pr i nt *
pr i nt *, ' El ement el e mat r i ci i B : '
pr i nt *
do i =1, n
do j =1, p
wr i t e( *, ' ( 1x, a2, i 1, a1, i 1, a2, $) ' ) ' b( ' , i , ' , ' , j , ' ) ='
r ead( *, *) b( i , j )
enddo
enddo
! - - - i nmul t i r ea pr opr i u- zi sa
do 44 i =1, m
do 55 j =1, p
pr od( i , j ) =0.
do 66 k=1, n
pr od( i , j ) =pr od( i , j ) +a( i , k) *b( k, j )
66 cont i nue
55 cont i nue
44 cont i nue
! - - - af i sar ea r ezul t at ul ui , pe l i ni i
pr i nt *
pr i nt *, ' Mat r i cea pr odus AxB est e : '
pr i nt *
do i =1, m
wr i t e( *, *) ( pr od( i , j ) , j =1, p)
enddo
end


- 114 -
6.3.4 S se scrie un program FORTRAN care determin cte elemente sunt pozitive,
negative, respectiv nule ntr-o matrice patrat nxn.

Soluie propus:

pr ogr ami nvent ar
! - - - det er mi na cat e nr . >0, <0, =0 exi st a i nt r - o mat r i ce NxN r eal a
!
i mpl i ci t none
r eal a( 50, 50) ! di mmaxi ma a mat r i ci i
i nt eger n ! di mensi unea ef ect i va a mat r i ci i
i nt eger i , j , pl us, mi nus, zer o
pr i nt *, ' Dat i di mensi unea ef ect i va a mat r i ci i A : N < 9'
r ead*, n
! - - - i nt r oducer ea el em. mat r i ci i A
pr i nt *
pr i nt *, ' Dat i el ement el e mat r i ci i A : '
pr i nt *, ' . . . pr i mul i ndi ce - > l i ni a'
pr i nt *, ' . . . al doi l ea i ndi ce - > col oana'
pr i nt *
do i =1, n
do j =1, n
wr i t e( *, ' ( 1x, a2, i 1, a1, i 1, a2, $) ' ) ' a( ' , i , ' , ' , j , ' ) ='
r ead( *, *) a( i , j )
enddo
enddo
! - - - i ni t i al i zar e cont or i
pl us=0
mi nus=0
zer o=0
! - - - i nvent ar dupa semnul el ement el or
do 4 i =1, n
do 5 j =1, n
i f ( a( i , j ) . gt . 0. ) t hen
pl us=pl us+1
el sei f ( a( i , j ) . l t . 0. ) t hen
mi nus=mi nus+1
el se
zer o=zer o+1
endi f
5 cont i nue
4 cont i nue
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' *** Rezul t at i nvent ar ***'
pr i nt *
pr i nt *, ' Nr . pozi t i ve : ' , pl us
pr i nt *, ' Nr . negat i ve : ' , mi nus
pr i nt *, ' Nr . nul e : ' , zer o
end

- 115 -
6.3.5 S se scrie un program FORTRAN care determin cte elemente dintr-un ir de n
numere naturale sunt divizibile cu 3.

Soluie propus:

pr ogr amdi vi z3
! - - - det er mi na cat e nr . di vi zi bi l e cu 3 exi st a i nt r - un
! si r de N nr . nat ur al e
!
i mpl i ci t none
i nt eger a( 50) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i , k
11 pr i nt *, ' dat i nr . de el ement e di n si r : N < 50'
r ead*, n
! - - - ver i f i car e nr . el em. ( ut i l i zat or i i pot sa nu f i e at ent i ! ! )
i f ( n. l t . 1. or . n. gt . 50) got o 11
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - i ni t i al i zar e cont or
k=0
! - - - det er mi nar ea nr . de el ement e di vi zi bi l e cu 3
do i =1, n
i f ( mod( a( i ) , 3) ==0) k=k+1
enddo
! - - - af i sar ea r ezul t at ul ui
wr i t e( *, ' ( / / , a26, i 2, a20) ' ) ' I n si r ul i nt r odus exi st a ' , k,
+ ' nr . DI VI ZI BI LE cu 3'
end


6.3.6 S se scrie un program FORTRAN care calculeaz media aritmetic a termenilor
irului de numere reale x
1
, x
2
, ..., x
n
cuprini ntre a i b, a <b (reali).

Soluie propus:

pr ogr amsi r medi e
! - - - cal cul eaza medi a el em. di nt r - un si r , cupr i nse i nt r e A si B
!
i mpl i ci t none
r eal x( 50) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i , k
r eal a, b ! i nt er val ul [ A, B]
r eal suma, medi a
113 pr i nt *, ' dat i nr . de el ement e di n si r : N < 50'
r ead*, n
! - - - ver i f i car e nr . el em. ( ut i l i zat or i i pot sa gr eseasca ! ! )
- 116 -
i f ( n. l t . 1. or . n. gt . 50) got o 113
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' x( ' , i , ' ) ='
r ead( *, *) x( i )
enddo
! - - - i nt r oducer ea capet el or i nt er val ul ui de cont r ol [ A, B]
888 pr i nt *
pr i nt *, ' Dat i capet el e i nt er val ul ui [ A, B] : '
wr i t e( *, ' ( / , 5x, a2, $) ' ) ' A='
r ead*, a
wr i t e( *, ' ( / , 5x, a2, $) ' ) ' B='
r ead*, b
! - - - ver i f i car e A<B
i f ( a. ge. b) got o 888
! - - - i ni t i al i zar e cont or pt . el ement e ; i ni t i al i zar e suma
k=0
suma=0
! - - - det er mi nar ea nr . de el ement e car e se gasesc i n i nt er val ul [ A, B]
do i =1, n
i f ( ( x( i ) . ge. a) . and. ( x( i ) . l e. b) ) t hen
k=k+1
suma=suma+x( i )
endi f
enddo
!
medi a=suma/ k
!
! - - - af i sar ea r ezul t at ul ui
pr i nt *
i f ( k. ne. 0) t hen
pr i nt *
pr i nt *, ' Medi a el em. di n [ A, B] est e : ' , medi a
el se
pr i nt *
pr i nt *, ' Nu exi st a ni ci un el em. al si r ul ui i n [ A, B] ! ! '
pr i nt *, ' deci medi a l or nu se poat e cal cul a'
endi f
end


6.3.7 Se introduce de la tastatur un ir de n numere ntregi. S se scrie un program
FORTRAN care calculeaz produsul elementelor mai mici dect 100 i suma celor
mai mari dect 10.

Soluie propus:

pr ogr amsi r SP
! - - - cal cul eaza suma, r espect i v pr odusul el em. di nt r - un si r
! car e sat i sf ac anumi t e condi t i i
!
i mpl i ci t none
- 117 -
i nt eger a( 30) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i , ks, kp
r eal suma, pr od ! pr odusul poat e gener a usor OVERFLOWi n I NTEGER
116 pr i nt *, ' dat i nr . de el ement e di n si r : N < 30'
r ead*, n
! - - - ver i f i car e nr . el em.
i f ( n. l t . 1. or . n. gt . 30) got o 116
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui ( nr . i nt r egi ! ) : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - i ni t i al i zar e cont or i pt . el ement e
ks=0
kp=0
! - - - i ni t i al i zar e suma si pr odus
suma=0.
pr od=1.
! - - - det er mi nar ea nr . de el ement e pt . car e cal cul ez suma si pr od
do i =1, n
i f ( a( i ) . gt . 10) t hen
ks=ks+1
suma=suma+a( i )
endi f
i f ( a( i ) . l t . 100) t hen
kp=kp+1
pr od=pr od*a( i )
endi f
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt *
i f ( ks. ne. 0) t hen
pr i nt *
pr i nt *, ' Suma el em. >10 est e : ' , suma
el se
pr i nt *
pr i nt *, ' Nu exi st a ni ci un el em. >10 i n si r ! ! '
pr i nt *, ' deci suma l or nu se poat e cal cul a'
endi f
!
pr i nt *
i f ( kp. ne. 0) t hen
pr i nt *
pr i nt *, ' Pr odusul el em. <100 est e : ' , pr od
el se
pr i nt *
pr i nt *, ' Nu exi st a ni ci un el em. <100 i n si r ! ! '
pr i nt *, ' deci pr odusul l or nu se poat e cal cul a'
endi f
end

- 118 -
6.3.8 S se scrie un program FORTRAN care genereaz transpusa unei matrici de
dimensiuni nxn.

Soluie propus:

pr ogr amt r ansp
! - - - t r anspusa unei mat r i ci r eal e NxN
!
i mpl i ci t none
r eal a( 50, 50) , at ( 50, 50) ! di mmaxi ma a mat r i ci l or
i nt eger n ! di mef ect i va
i nt eger i , j
1 pr i nt *, ' dat i di mens. ef ect i va a mat r i ci i pat r at e A: N < 50'
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 50) got o 1
! - - - i nt r oducer ea el em. mat r i ci i A, l i ni e dupa l i ni e
pr i nt *
pr i nt *, ' Dat i el ement el e mat r i ci i A, pe l i ni i : '
pr i nt *, ' . . . deci cat e n val or i despar t i t e de spat i u sau vi r gul a'
pr i nt *, ' apoi <Ent er >'
pr i nt *
do i =1, n
r ead( *, *) ( a( i , j ) , j =1, n)
enddo
! - - - gener ar ea mat r i ci i t r anspuse
do 44 i =1, n
do 55 j =1, n
at ( i , j ) =a( j , i )
55 cont i nue
44 cont i nue
! - - - af i sar ea r ezul t at ul ui , pe l i ni i
pr i nt *
pr i nt *, ' Mat r i cea t r anspusa est e : '
pr i nt *
do i =1, n
wr i t e( *, *) ( at ( i , j ) , j =1, n)
enddo
end


6.3.9 S se scrie un program FORTRAN care determin elementul maxim dintr-un ir
de n numere naturale.

Soluie propus:

pr ogr amemaxi m
! - - - det er mi na el em. MAXI M di nt r - un si r de N nr . nat ur al e
!
i mpl i ci t none
i nt eger a( 50) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i , emax
50 pr i nt *, ' dat i nr . de el ement e di n si r : N < 50'
- 119 -
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 50) got o 50
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - i ni t i al i zar e
emax=a( 1)
! - - - det er mi nar ea el em. MAXI M
do i =2, n
i f ( emax. l t . a( i ) ) emax=a( i )
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' El ement ul maxi mdi n si r est e : ' , emax
pr i nt *
end


6.3.10 Folosind problema precedent, s se scrie un program FORTRAN care ordoneaz
descresctor un ir de n numere naturale.

Soluie propus:

pr ogr amor dsi r
! - - - or doneaza descr escat or un si r de N nr . nat ur al e
!
i mpl i ci t none
i nt eger a( 50) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i , j , emax, i dxmax
50 pr i nt *, ' dat i nr . de el ement e di n si r : N < 50'
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 50) got o 50
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - or donar e
do i =1, n- 1
emax=a( i )
i dxmax=i
do j =i +1, n
i f ( emax. l t . a( j ) ) t hen
emax=a( j )
- 120 -
i dxmax=j
endi f
enddo
! manevr a SWAP
a( i dxmax) =a( i )
a( i ) =emax
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' Si r ul or donat descr escat or est e : ' , ( a( i ) , i =1, n)
pr i nt *
end


6.3.11 S se scrie un program FORTRAN care ordoneaz cresctor un ir de n numere
reale prin interschimbarea elementelor consecutive.

Soluie propus:

pr ogr amor dswap
! - - - or doneaza cr escat or un si r de N nr . r eal e pr i n i nt er schi mbar e
!
i mpl i ci t none
r eal a( 30) ! di mmaxi ma a si r ul ui
i nt eger n ! di mensi unea ef ect i va a si r ul ui
i nt eger i
l ogi cal f l ag
r eal manevr
30 pr i nt *, ' dat i nr . de el ement e di n si r : N < 31'
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 30) got o 30
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el em. si r ul ui : '
pr i nt *
do i =1, n
wr i t e( *, ' ( 1x, a2, i 2, a2, $) ' ) ' a( ' , i , ' ) ='
r ead( *, *) a( i )
enddo
! - - - or donar e pr i n i nt er schi mbar e
1000 f l ag=. t r ue. ! si r ul est e or donat daca f l ag nu se mai modi f i ca
do i =1, n- 1
i f ( a( i ) . gt . a( i +1) ) t hen
f l ag=. f al se. ! adi ca si r ul nu est e i nca or donat
! ur meaza SWAP ( i nt er schi mbar e) , cu var i abi l a de manevr a
manevr =a( i +1)
a( i +1) =a( i )
a( i ) =manevr
endi f
enddo
i f ( f l ag. eqv. . f al se. ) got o 1000
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' Si r ul or donat cr escat or est e : ' , ( a( i ) , i =1, n)
- 121 -
pr i nt *
end


6.3.12 S se scrie un program FORTRAN care ordoneaz elevii unei clase n ordinea
descresctoare a mediilor. Datele se vor introduce de la tastatur.

Soluie propus:

pr ogr amcl asa
! - - - or doneaza el evi i unei cl ase i n or di nea descr escat oar e a medi i l or
!
i mpl i ci t none
char act er *30 nume( 40) ! max 40 el evi , nume+pr en. max 30 car act er e
r eal medi a( 40)
i nt eger n ! di mensi unea ef ect i va a cl asei
i nt eger i , j , pozi t i a
r eal medmax
char act er *30 manevr a
300 pr i nt *, ' dat i nr . de el evi di n cl asa : N < 41'
r ead*, n
! - - - ver i f i car e
i f ( n. l t . 1. or . n. gt . 40) got o 300
! - - - i nt r oducer ea el em. si r ul ui
pr i nt *
pr i nt *, ' I nt r oducet i el evi i si medi i l e l or : '
pr i nt *
do i =1, n
wr i t e( *, ' ( / , a7, i 2, a3, $) ' ) ' El evul ' , i , ' : '
r ead( *, ' ( a) ' ) nume( i ) ! f or mat pent r u l ungi me oar ecar e
! i n execut i e, se vor i nt r oduce f ar a apost r of nume+pr enume
wr i t e( *, ' ( a10, a30, a3, $) ' ) ' Medi a l ui ' , nume( i ) , ' : '
r ead*, medi a( i )
enddo
! - - - or donar e dupa medi i
do i =1, n- 1
medmax=medi a( i )
pozi t i a=i
do j =i +1, n
i f ( medmax. l t . medi a( j ) ) t hen
medmax=medi a( j )
pozi t i a=j
endi f
enddo
! manevr a de i nt er schi mbar e
medi a( pozi t i a) =medi a( i )
medi a( i ) =medmax
! se depl aseaza si numel e l a noua pozi t i e
manevr a=nume( i )
nume( i ) =nume( pozi t i a)
nume( pozi t i a) =manevr a
enddo
! - - - af i sar ea r ezul t at ul ui
pr i nt ' ( / / ) '
pr i nt *, ' El evi i or donat i i n or di nea medi i l or : '
- 122 -
pr i nt *
do i =1, n
pr i nt ' ( 1x, i 2, a2, a30, a8, f 5. 2) ' , i , ' . ' , nume( i ) , ' Medi a: ' , medi a( i )
enddo
end


6.3.13 S se scrie un program FORTRAN care determin cel mai mic element dintr-o
matrice cu numere ntregi, de dimensiuni mxn.

Soluie propus:

pr ogr ammi nmat r
! - - - det er mi na el em. MI NI M di nt r - o mat r i ce MxN de nr . i nt r egi
!
i mpl i ci t none
i nt eger a( 40, 30) ! di mmaxi ma a mat r i ci i
i nt eger m, n ! di mensi uni l e ef ect i ve al e mat r i ci i
i nt eger i , j , emi n
1 pr i nt *, ' dat i di mensi uni l e ef ect i ve al e mat r i ci i : M<40, N<30'
r ead*, m, n
! - - - ver i f i car e di mensi uni A
i f ( m. l t . 1. or . m. gt . 40. or . n. l t . 1. or . n. gt . 30) got o 1
! - - - i nt r oducer ea el em. mat r i ci i A
pr i nt *
pr i nt *, ' Dat i el ement el e mat r i ci i ( nr . I NTREGI ) : '
pr i nt *, ' . . . pr i mul i ndi ce - > l i ni a'
pr i nt *, ' . . . al doi l ea i ndi ce - > col oana'
pr i nt *
do i =1, m
do j =1, n
wr i t e( *, ' ( 1x, a2, i 1, a1, i 1, a2, $) ' ) ' a( ' , i , ' , ' , j , ' ) ='
r ead( *, *) a( i , j )
enddo
enddo
! - - - i ni t i al i zar e
emi n=a( 1, 1)
! - - - det er mi nar e MI NI M
do 4 i =1, m
do 5 j =1, n
i f ( a( i , j ) . l t . emi n) emi n=a( i , j )
5 cont i nue
4 cont i nue
! - - - af i sar ea r ezul t at ul ui
pr i nt *
pr i nt *, ' El ement ul MI NI M al mat r i ci i est e: ' , emi n
end

- 123 -
6.3.14 S se scrie un program FORTRAN care nlocuiete elementul maxim de pe fiecare
coloan a unei matrici mxn cu suma elementelor de pe coloana respectiv.

Soluie propus:

pr ogr amsumcol
! - - - se i nl ocui est e el em. MAXI M de pe f i ecar e col oana a unei
! mat r i ci r eal e MxN cu suma el em. de pe col oana r espect i va
!
i mpl i ci t none
r eal a( 40, 30) ! di mmaxi ma a mat r i ci i
i nt eger m, n ! di mef ect i va
i nt eger i , j , i dx
r eal emax, suma
1 pr i nt *, ' dat i di mensi uni l e ef ect i ve al e mat r i ci i : M<40, N<30'
r ead*, m, n
! - - - ver i f i car e di mensi uni A
i f ( m. l t . 1. or . m. gt . 40. or . n. l t . 1. or . n. gt . 30) got o 1
! - - - i nt r oducer ea el em. mat r i ci i A, l i ni e dupa l i ni e
pr i nt *
pr i nt *, ' Dat i el ement el e mat r i ci i A, pe l i ni i : '
pr i nt *, ' . . . deci cat e n val or i despar t i t e de spat i u sau vi r gul a'
pr i nt *, ' apoi <Ent er >'
pr i nt *
do i =1, m
r ead( *, *) ( a( i , j ) , j =1, n)
enddo
! - - - pr el ucr ar e
do 44 j =1, n ! est e convenabi l a par cur ger ea pe col oane
emax=a( 1, j )
i dx=1
suma=a( 1, j )
do 55 i =2, m
suma=suma+a( i , j )
i f ( a( i , j ) . gt . emax) t hen
emax=a( i , j )
i dx=i
endi f
55 cont i nue
a( i dx, j ) =suma ! dar pent r u mai mul t e maxi me egal e ?
! st udi at i acest caz par t i cul ar si
! modi f i cat i pr ogr amul
44 cont i nue
! - - - af i sar ea r ezul t at ul ui , pe l i ni i
pr i nt ' ( / / ) '
pr i nt *, ' Mat r i cea modi f i cat a est e : '
pr i nt *
do i =1, m
wr i t e( *, *) ( a( i , j ) , j =1, n)
enddo
end


- 124 -
6.4 EXERCIII CU SUBPROGRAME
6.4.1 S se scrie un program FORTRAN care calculeaz suma 1!+2!+3!+...+10!. Se va
utiliza un subprogram de tip FUNCTION pentru calculul lui n!.

Soluie propus:

pr ogr amsumf act
! - - - cal cul ul sumei f act or i al el or pr i mel or 10 nr . nat ur al e
! ut i l i zand FUNCTI ON
!
i mpl i ci t none
i nt eger n
par amet er ( n=10) ! i n F90, s- ar f i scr i s I NTEGER, PARAMETER: : n=10
i nt eger f act , s, i
s=0
do 55 i =1, n
s=s+f act ( i )
55 cont i nue
wr i t e( *, *) ' suma f act or i al el or pr i mel or ' , n,
& ' nr . nat ur al e est e : ' , s
end

i nt eger f unct i on f act ( n)
! mai cor ect ar f i REAL f unct i on, caci exi st a per i col de Over f l ow
i nt eger n, j , i
j =1
do i =1, n
j =j *i
enddo
f act =j
r et ur n
end


6.4.2 S se scrie un program FORTRAN care calculeaz perimetrul i aria unui patrat de
latura L, n 3 variante: folosind funcie definit aritmetic, funcie definit ca modul
(FUNCTION), respectiv subprogram (SUBROUTINE).

Soluie propus (utiliznd funcie definit aritmetic):

pr ogr ampat r at 1
! - - - cal cul ul per i met r ul ui si ar i ei unui pat r at de l at ur a L
! ut i l i zand o f unct i e def i ni t a ar i t met i c
!
i mpl i ci t none
r eal ar i a, per i m, l at ur a
r eal a, p, l
! - - - ai ci se def i nesc ar i t met i c 2 f unct i i cu par amet r ul f or mal LATURA
per i m( l at ur a) =4*l at ur a
ar i a( l at ur a) =l at ur a**2
!
pr i nt *, ' Dat i l at ur a pat r at ul ui : '
- 125 -
r ead*, l
! - - - l a apel , se i nl ocui est e par amet r ul f or mal cu cel ef ect i v L
! r ezul t at ul est e r et ur nat pr i n i nt er medi ul numel ui f unct i ei
p=per i m( l )
a=ar i a( l )
! - - - af i sar e r ezul t at e
pr i nt *
pr i nt *
wr i t e( *, *) ' Per i met r ul pat r at ul ui de l at ur a ' , l , ' est e : ' , p
wr i t e( *, *) ' Ar i a pat r at ul ui de l at ur a ' , l , ' est e : ' , a
end

Soluie propus (utiliznd FUNCTION):

pr ogr ampat r at 2
! - - - cal cul ul per i met r ul ui si ar i ei unui pat r at de l at ur a L
! ut i l i zand FUNCTI ON
!
i mpl i ci t none
r eal ar i a, per i m
r eal p, a, l
pr i nt *, ' Dat i l at ur a pat r at ul ui : '
r ead*, l
! - - - l a apel , se i nl ocui est e par amet r ul f or mal cu cel ef ect i v L
! r ezul t at ul est e r et ur nat pr i n i nt er medi ul numel ui f unct i ei
p=per i m( l )
a=ar i a( l )
! - - - af i sar e r ezul t at e
pr i nt *
pr i nt *
wr i t e( *, *) ' Per i met r ul pat r at ul ui de l at ur a ' , l , ' est e : ' , p
wr i t e( *, *) ' Ar i a pat r at ul ui de l at ur a ' , l , ' est e : ' , a
end

r eal f unct i on per i m( l at ur a)
r eal l at ur a
per i m=4*l at ur a
end

r eal f unct i on ar i a( l at ur a)
r eal l at ur a
ar i a=l at ur a**2
end

Soluie propus (utiliznd SUBROUTINE):

pr ogr ampat r at 3
! - - - cal cul ul per i met r ul ui si ar i ei unui pat r at de l at ur a L
! ut i l i zand SUBROUTI NE
!
i mpl i ci t none
r eal l , p, a
pr i nt *, ' Dat i l at ur a pat r at ul ui : '
r ead*, l
! - - - l a apel , se i nl ocui esc par amet r i i f or mal i cu cei ef ect i vi
- 126 -
! par amet r ul de i nt r ar e est e l
! r ezul t at ul est e r et ur nat pr i n par amet r i i p, a ( de i esi r e)
cal l cal cul ( l , p, a)
! - - - af i sar e r ezul t at e
pr i nt *
pr i nt *
wr i t e( *, *) ' Per i met r ul pat r at ul ui de l at ur a ' , l , ' est e : ' , p
wr i t e( *, *) ' Ar i a pat r at ul ui de l at ur a ' , l , ' est e : ' , a
end

subr out i ne cal cul ( l at ur a, per i m, ar i a)
r eal l at ur a, per i m, ar i a
per i m=4*l at ur a
ar i a=l at ur a**2
end


6.4.3 S se scrie un program FORTRAN care transform un numr din baza 2 n baza
10, folosind un subprogram de tip SUBROUTINE.

Soluie propus:

pr ogr amt r ans2_10
! - - - conver t est e un nr . di n baza 2 i n baza 10
! ut i l i zand SUBROUTI NE
!
i mpl i ci t none
char act er *20 nr bi n
i nt eger nr zece
wr i t e( *, *) ' Tr ansf or mar ea unui nr . di n baza 2 i n baza 10'
666 wr i t e( *, *)
wr i t e( *, *) ' Dat i nr . bi nar ( max 20 ci f r e, doar 0 si 1) : '
r ead( *, ' ( a) ' ) nr bi n
cal l t r 210( nr bi n, nr zece)
i f ( nr zece. eq. - 1) got o 666 ! i nput gr esi t
wr i t e( *, *) ' Nr . i n baza 10 est e : ' , nr zece
end

subr out i ne t r 210( doi , zece)
char act er *( *) doi
i nt eger zece
i nt eger ci f r e, i , apor t
! - - - i ni t i al i zar e
ci f r e=0
zece=0
! - - - det er mi nar e nr . de ci f r e
do i =l en( doi ) , 1, - 1 ! LEN det er mi na l ungi mea var . t i p car act er
i f ( doi ( i : i ) . ne. ' ' ) got o 888 ! t est subsi r de 1 car act er
enddo
888 ci f r e=i
! - - - val i dar e ci f r e ( i n nr . bi nar sa f i e numai 0 sau 1 ! ! )
i f ( ci f r e. eq. 0. or . doi ( 1: 1) . eq. ' 0' ) t hen
pr i nt *, ' Numar gr esi t ! '
zece=- 1
got o 77
- 127 -
endi f
! - - - t r ansf or mar e
do i =1, ci f r e
i f ( doi ( i : i ) . eq. ' 0' ) t hen
apor t =0
el sei f ( doi ( i : i ) . eq. ' 1' ) t hen
apor t =2**( ci f r e- i )
zece=zece+apor t
el se
pr i nt *, ' Numar gr esi t ! '
zece=- 1
exi t ! i esi r e f or t at a di n DO
endi f
enddo
77 r et ur n
end


6.4.4 S se scrie un program FORTRAN care calculeaz cel mai mare divizor comun a
dou numere naturale, pe baza algoritmului lui Euclid. Se va utiliza un subprogram
de tip FUNCTION.

Soluie propus:

pr ogr amdi vcom
! - - - det er mi na CMMDC a 2 nr . nat ur al e nenul e
! ut i l i zand subpr ogr amFUNCTI ON
!
i mpl i ci t none
i nt eger a, b
i nt eger cmmdc
44 pr i nt *, ' Dat i pr i mul nr . nat ur al : '
r ead*, a
i f ( a. l e. 0) t hen
pr i nt *, ' NUMAR GRESI T ! '
got o 44
endi f
55 wr i t e( *, *) ' Dat i al doi l ea nr . nat ur al : '
r ead( *, *) b
i f ( b. l e. 0) t hen
pr i nt *, ' NUMAR GRESI T ! '
got o 55
endi f
pr i nt ' ( / / ) '
wr i t e( *, *) ' Cel mai mar e di vi zor comun est e : ' , cmmdc( a, b)
end

i nt eger f unct i on cmmdc( nr 1, nr 2)
i nt eger nr 1, nr 2, x, y, r est
x=nr 1
y=nr 2
r est =mod( x, y)
1 i f ( r est . ne. 0) t hen
x=y
y=r est
- 128 -
r est =mod( x, y)
got o 1
el se
cmmdc=y
endi f
end


6.4.5 S se scrie un program FORTRAN care afieaz toate numerele prime mai mici
dect 1000. Se va utiliza un subprogram de tip SUBROUTINE.

Soluie propus:

pr ogr amnr pr i me
! - - - det er mi na t oat e nr . pr i me mai mi ci decat 1000
! f ol osi nd subpr ogr amSUBROUTI NE
!
i mpl i ci t none
i nt eger l i mi t a
par amet er ( l i mi t a=1000)
pr i nt *, ' Nr . pr i me de l a 1 l a ' , l i mi t a, ' sunt : '
pr i nt *
pr i nt ' ( 1x, i 3, 1x, i 3, 1x, $) ' , 1, 2 ! pr i mel e 2 nr . pr i me
cal l pr i m( l i mi t a)
end

subr out i ne pr i m( l i msup)
i nt eger l i msup, i , j , k
l ogi cal i pr i m
do i =3, l i msup, 2 ! nr . pr i me sunt o submul t i me a cel or i mpar e
i pr i m=. t r ue.
j =i nt ( sqr t ( i *1. ) ) ! SQRT cer e ar gument r eal
! j est e l i mi t a pana l a car e caut di vi zor i
do k=2, j
i f ( mod( i , k) ==0) t hen
i pr i m=. f al se.
exi t ! i esi r e f or t at a di n DO
endi f
enddo
i f ( i pr i m. eqv. . t r ue. ) t hen
wr i t e( *, ' ( 1x, i 3, $) ' ) i
endi f
enddo
end


- 129 -
6.4.6 S se scrie un program FORTRAN care determin ctul i restul mpririi unui
polinom de grad n la binomul (X-a), folosind schema lui Horner. Se va utiliza un
subprogram de tip SUBROUTINE.

Soluie propus:

pr ogr ampol i nom
! - - - det er mi na cat ul si r est ul i mpar t i r i i unui pol i nomP( x) l a ( X- a)
! f ol osi nd subpr ogr amSUBROUTI NE pt . schema l ui Hor ner
!
i mpl i ci t none
r eal a( 0: 30) ! si r ul coef i ci ent i l or pol i nomul ui P( X)
r eal b( 0: 29) ! si r ul coef i ci ent i l or cat ul ui Q( X)
i nt eger n ! gr adul pol i nomul ui P( X) , n<30
r eal r est , al f a
i nt eger i
90 pr i nt ' ( a35, $) ' , ' Dat i gr adul pol i nomul ui P ( n<30) : '
r ead*, n
i f ( n. l t . 1. or . n. gt . 30) got o 90
pr i nt *
pr i nt *, ' Dat i coef . l ui P i n or di ne descr . a put er i l or l ui X : '
pr i nt *
do i =n, 0, - 1
pr i nt ' ( a15, i 2, a8, $) ' , ' - coef . l ui X**' , i , ' est e : '
r ead*, a( i )
enddo
pr i nt *
pr i nt ' ( a44, $) ' , ' Dat i coef i ci ent ul " a" al bi nomul ui ( X- a) : '
r ead*, al f a
! - - - apel
cal l hor ner ( a, b, n, al f a, r est )
! - - - af i sar e r ezul t at
pr i nt ' ( / / ) '
pr i nt *, ' ************ REZULTAT **************'
pr i nt *
pr i nt *, ' Coef . cat ul ui , i n or di ne descr . a put er i l or l ui X : '
pr i nt *
do i =n- 1, 0, - 1
pr i nt ' ( a15, i 2, a8, f 7. 3) ' , ' - coef . l ui X**' , i , ' est e : ' , b( i )
enddo
pr i nt *
pr i nt *, ' Rest ul i mpar t i r i i l ui P l a ( X- ' , al f a, ' ) est e : ' , r est
end

subr out i ne hor ner ( p, q, gr adp, a, r )
i nt eger gr adp, i
r eal p( 0: gr adp) , q( 0: ( gr adp- 1) )
r eal a, r
q( gr adp- 1) =p( gr adp)
do i =gr adp- 2, 0, - 1
q( i ) =q( i +1) *a+p( i +1)
enddo
r =q( 0) *a+p( 0)
end
- 130 -
6.5 EXERCIII CU INTRRI/IEIRI FOLOSIND FIIERE
6.5.1 S se modifice soluia propus pentru problema 6.2.1, folosind un fiier de ieire
pentru rezultate, n locul afirii pe ecran. Fiierul creat se va numi L51.REZ.

Soluie propus:

pr ogr amexpr esi e
! - - - cal cul ul val or i i unei expr esi i i n f unct i e
! de 4 var i abi l e car e par cur g un i nt er val de nr . i nt r egi
! f ol osest e FI SI ER de i esi r e pent r u r ezul t at e
!
i mpl i ci t none
i nt eger a, b, c, d
i nt eger i ! cont or al nr . de oper at i i / l i ni i
r eal e
! i ni t i al i zar e cont or
i =0
! deschi der e f i si er pent r u r ezul t at e
open( 1, f i l e=' l 51. r ez' , st at us=' unknown' )
! 4 ci cl ur i DO
do 1 a=0, 2
do 2 b=0, 2
do 3 c=0, 2
do 4 d=0, 2
i =i +1
! - - - ur meaza acumun t est de numi t or nul
i f ( c. eq. d) t hen
wr i t e( 1, 456) ' a=' , a, ' b=' , b, ' c=' , c, ' d=' , d,
& ' e nu se poat e cal cul a'
el se
e=( a+2. 0*b) / ( c- d)
wr i t e( 1, 567) ' a=' , a, ' b=' , b, ' c=' , c, ' d=' , d, ' - > e=' , e
endi f
4 cont i nue
3 cont i nue
2 cont i nue
1 cont i nue
! i nchi der e f i si er
cl ose( 1)
! - - - se af i seaza ( pe ecr an) ci t e oper at i i s- au ef ect uat
wr i t e( *, ' ( / / , 1x, a14, i 2, a9) ' ) ' s- au ef ect uat ' , i , ' oper at i i '
456 f or mat ( a2, i 1, a3, i 1, a3, i 1, a3, i 1, a25)
567 f or mat ( a2, i 1, a3, i 1, a3, i 1, a3, i 1, a9, f 7. 3)
end

Not: Coninutul fiierului de rezultate L51.REZ se gsete n anexa A-1.


- 131 -
6.5.2 S se modifice soluia propus pentru problema 6.2.5, folosind un fiier de ieire
pentru rezultate, n locul afirii pe ecran. Fiierul rezultat se va numi L52.REZ.

Soluie propus:

pr ogr amf unct i e
! - - - cal cul eaza val or i l e f unct i ei x**2+si n( x) i n [ 0, 2]
! cu pasul 0. 1
! f ol osest e FI SI ER de i esi r e pent r u r ezul t at e
!
i mpl i ci t none
r eal x, y
i nt eger i
! deschi der e f i si er de i esi r e
open( 2, f i l e=' l 52. r ez' , st at us=' unknown' )
! ci cl ul DO
do i =0, 20, 1
! est e r ecomandabi l a ut i l i za cont or de t i p i nt r eg i n ci cl ul DO
! chi ar daca F90 accept a si cont or nr . r eal , r ezul t at el e pot f i
! er onat e
x=i / 10.
y=x*x+si n( x)
wr i t e( 2, ' ( a9, f 3. 1, a7, f 8. 6) ' ) ' pent r u x=' , x, ' f ( x) =' , y
! mai si mpl u, se put ea scr i e nef or mat at PRI NT*, x, y
enddo
! i nchi der e f i si er
cl ose( 2)
end

Not: Coninutul fiierului L52.REZ cu rezultate se gsete n anexa A-2.


6.5.3 S se modifice soluia propus pentru problema 6.3.3, folosind un fiier de intrare
pentru cele dou matrici i un fisier de ieire pentru rezultat. Fiierul cu datele de
intrare se va numi L53.DAT iar cel cu rezultate L53.REZ.

Soluie propus:

pr ogr ampr odus
! - - - pr odusul a 2 mat r i ci r eal e AxB
! A est e de t i p MxN
! B est e de t i p NxP
! f ol osest e un FI SI ER pent r u i nput ( cel e 2 mat r i ci )
! un FI SI ER pent r u out put ( mat r i cea pr odus)
!
i mpl i ci t none
r eal a( 50, 40) , b( 40, 60) , pr od( 50, 60) ! di mmaxi ma a mat r i ci l or
i nt eger m, n, n2, p ! di mensi uni l e ef ect i ve
i nt eger i , j , k
char act er *26 separ a
! - - - deschi der e f i si er de dat e
open( 1, f i l e=' l 53. dat ' , st at us=' ol d' )
! - - - ci t i r e di mens. ef ect i ve al e mat r i ci i A
- 132 -
r ead( 1, *) m, n
! - - - ver i f i car e di mensi uni A
i f ( m. l t . 1. or . m. gt . 50. or . n. l t . 1. or . n. gt . 40) got o 1
! - - - ci t i r e di mens. ef ect i ve al e mat r i ci i B
r ead( 1, *) n2, p
! - - - ver i f i car e compat i bi l i t at e
i f ( n. ne. n2) t hen
pr i nt *, ' I nmul t i r ea nu poat e f i f acut a ! Dat e ERONATE'
st op
endi f
! - - - ver i f i car e di mensi uni B
i f ( p. l t . 1. or . p. gt . 60) got o 2
! - - - ci t i r e separ at or
r ead( 1, *) separ a
! - - - ci t i r e el em. mat r i ci i A, l i ni e cu l i ni e
do i =1, m
r ead( 1, *) ( a( i , j ) , j =1, n)
enddo
! - - - ci t i r e separ at or
r ead( 1, *) separ a
! - - - ci t i r e el em. mat r i ci i B, l i ni e cu l i ni e
do i =1, n
r ead( 1, *) ( b( i , j ) , j =1, p)
enddo
! - - - i nchi der e f i si er de i nt r ar e dat e
cl ose( 1)
! - - - i nmul t i r ea pr opr i u- zi sa
do 44 i =1, m
do 55 j =1, p
pr od( i , j ) =0.
do 66 k=1, n
pr od( i , j ) =pr od( i , j ) + a( i , k) *b( k, j )
66 cont i nue
55 cont i nue
44 cont i nue
! - - - deschi der e f i si er de i esi r e ( r ezul t at =mat r i cea pr odus)
open( 2, f i l e=' l 53. r ez' , st at us=' unknown' )
! - - - af i sar ea r ezul t at ul ui , pe l i ni i
wr i t e( 2, *)
wr i t e( 2, *) ' Mat r i cea pr odus AxB est e : '
wr i t e( 2, *) separ a
wr i t e( 2, *)
do i =1, m
wr i t e( 2, *) ( pr od( i , j ) , j =1, p)
enddo
! - - - i nchi der e f i si er de r ezul t at e
cl ose( 2)
st op
! - - - t r at ar ea er or i l or di n f i si er ul de i nt r ar e
1 pr i nt *, ' EROARE DATE : di m. ef ect i ve pt . mat r . A vor f i M<50, N<40'
st op
2 pr i nt *, ' EROARE DATE : di m. ef ect i ve pt . mat r . B vor f i N<40, P<60'
st op
end
Not: n anexa A-3 este prezentat un exemplu pentru coninutul fiierului de date
L53.DAT urmat de coninutul fiierului rezultat L53.REZ corespunztor.
- 133 -
6.5.4 S se modifice soluia propus pentru problema 6.4.5, folosind un fiier de ieire
numit T54.REZ pentru rezultate, n condiiile n care trebuie determinate toate
numerele prime pn la 10000.

Soluie propus:

pr ogr ampr i m_f i si er
! - - - det er mi na t oat e nr . pr i me mai mi ci decat 10000
! si scr i e r ezul t at ul i nt r - un f i si er
!
i mpl i ci t none
i nt eger l i mi t a, f i s
par amet er ( l i mi t a=10000)
par amet er ( f i s=1)
open( f i s, f i l e=' t 54. r ez' , st at us=' unknown' )
wr i t e( f i s, *) ' Nr . pr i me de l a 1 l a ' , l i mi t a, ' sunt : '
wr i t e( f i s, *)
wr i t e( f i s, ' ( 1x, i 5, 1x, i 5, 1x, $) ' ) 1, 2 ! pr i mel e 2 nr . pr i me
cal l pr i m( l i mi t a, f i s)
cl ose( f i s)
end

subr out i ne pr i m( l i msup, f i si er )
i nt eger l i msup, i , j , k, f i si er
l ogi cal i pr i m
do i =3, l i msup, 2 ! nr . pr i me sunt o submul t i me a cel or i mpar e
i pr i m=. t r ue.
j =i nt ( sqr t ( i *1. ) ) ! SQRT cer e ar gument r eal
! j est e l i mi t a pana l a car e caut di vi zor i
do k=2, j
i f ( mod( i , k) ==0) t hen
i pr i m=. f al se.
exi t ! i esi r e f or t at a di n DO
endi f
enddo
i f ( i pr i m. eqv. . t r ue. ) t hen
wr i t e( f i si er , ' ( 1x, i 5, $) ' ) i
endi f
enddo
end

Not: Coninutul fiierului de rezultate T54.REZ este prezentat n anexa A-4.


6.5.5 S se modifice soluia propus pentru problema6.3.12, folosind un fiier de intrare
numit T55.DAT pentru date i un fisier de ieire numit T55.REZ pentru
rezultate.

Soluie propus:

pr ogr amcl asa_f i si er
! - - - or doneaza el evi i unei cl ase i n or di nea descr escat oar e a medi i l or
! ut i l i zand f i si er e pt . i nput , r espect i v out put
- 134 -
i mpl i ci t none
i nt eger nmax
par amet er ( nmax=40)
char act er *30 nume( nmax) ! max NMAX el evi , nume+pr en. max 30 car act .
r eal medi a( nmax)
i nt eger n ! di mensi unea ef ect i va a cl asei
i nt eger i , j , pozi t i a
r eal medmax
char act er *30 manevr a
char act er *1 separ at or
! - - - i ni t i al i zar e nr . i nr egi st r ar i i n f i si er
n=0
! - - - ci t i r ea dat el or di n f i si er
open( 1, f i l e=' t 55. dat ' , st at us=' ol d' )
788 r ead( 1, ' ( a30, a1, f 5. 2) ' , END=500) nume( n+1) , separ at or , medi a( n+1)
! daca se at i nge END OF FI LE se cont i nua cu CLOSE( 1)
n=n+1
! ver i f i car e nr . el evi
i f ( n. gt . nmax) t hen
pr i nt *, ' EROARE : f i si er ul cont i ne mai mul t de 40 nume el evi ! '
st op ! gat a
el se
got o 788 ! se cont i nua cu un nou el ev
endi f
500 cl ose( 1)
! - - - or donar e dupa medi i
do i =1, n- 1
medmax=medi a( i )
pozi t i a=i
do j =i +1, n
i f ( medmax. l t . medi a( j ) ) t hen
medmax=medi a( j )
pozi t i a=j
endi f
enddo
! manevr a de i nt er schi mbar e
medi a( pozi t i a) =medi a( i )
medi a( i ) =medmax
! se depl aseaza si numel e l a noua pozi t i e
manevr a=nume( i )
nume( i ) =nume( pozi t i a)
nume( pozi t i a) =manevr a
enddo
! - - - f i si er ul de r ezul t at e
open( 2, f i l e=' t 55. r ez' , st at us=' unknown' )
wr i t e( 2, ' ( / / ) ' )
wr i t e( 2, *) ' El evi i or donat i i n or di nea medi i l or : '
wr i t e( 2, ' ( / / ) ' )
do i =1, n
wr i t e( 2, 44) i , ' . ' , nume( i ) , ' Medi a: ' , medi a( i )
44 f or mat ( 1x, i 2, a2, a30, a8, f 5. 2)
enddo
cl ose( 2)
end

Not: n anexa A-5 se prezint coninutul fiierelor T55.DAT i T55.REZ.
- 135 -
6.6 EXERCIII DIVERSE
6.6.1 S se scrie un program FORTRAN care simuleaz aruncarea simultan a 2 zaruri.

Soluie propus:

pr ogr amzar ur i
! - - - si mul ar ea ar uncar i i si mul t ane a 2 zar ur i
!
i mpl i ci t none
r eal r ( 2)
i nt eger zar ( 2) , i
! i ni t i al i zar e gener at or de numer e pseudoal eat oar e
r ( 1) = RAND( TI ME( ) )
!
do i =1, 2
r ( i ) = RAND( 0)
zar ( i ) =i nt ( 6*r ( i ) ) +1
pr i nt *, zar ( i )
enddo
end

! Var i ant a scr i sa i n For t r an 90 st andar d
!
! pr ogr amzar ur i
! i mpl i ci t none
! r eal , di mensi on( 2) : : r
! i nt eger , di mensi on( 2) : : zar
! i nt eger : : i
! cal l r andom_seed( )
! cal l r andom_number ( r )
! do i =1, 2
! zar ( i ) =i nt ( 6*r ( i ) ) +1
! pr i nt *, zar ( i )
! enddo
! end pr ogr amzar ur i


6.6.2 S se scrie un program FORTRAN cu ajutorul cruia s se simuleze o extragere
LOTO 6/49.

Soluie propus:

pr ogr aml ot o
! - - - si mul eaza o ext r ager e LOTO 6/ 49
!
i mpl i ci t none
i nt eger nmax, ci t e, i dx, i , manevr a
par amet er ( nmax=49)
par amet er ( ci t e=6)
i nt eger si r ( nmax)
r eal r ( nmax)
! i ni t i al i zar e gener at or de numer e pseudoal eat oar e
- 136 -
r ( 1) =r and( t i me( ) )
! i ni t i al i zar e si r de numer e i nt r egi de l a 1 l a 49
do i =1, nmax
si r ( i ) = i
enddo
! ext r ager e ( f ar a r epet ar ea vr eunui nr . ! )
do i =1, ci t e
r ( i ) =r and( 0)
i dx = I NT( r ( i ) * ( nmax - i + 1) ) + i
manevr a=si r ( i )
si r ( i ) =si r ( i dx)
si r ( i dx) =manevr a
pr i nt *, si r ( i )
enddo
end





- 137 -
6.7 ANEXE
A-1 Coninutul fiierului de rezultate L51.REZ de la exerciiul 6.5.1:

a=0 b=0 c=0 d=0 e nu se poat e cal cul a
a=0 b=0 c=0 d=1 - > e= 0. 000
a=0 b=0 c=0 d=2 - > e= 0. 000
a=0 b=0 c=1 d=0 - > e= 0. 000
a=0 b=0 c=1 d=1 e nu se poat e cal cul a
a=0 b=0 c=1 d=2 - > e= 0. 000
a=0 b=0 c=2 d=0 - > e= 0. 000
a=0 b=0 c=2 d=1 - > e= 0. 000
a=0 b=0 c=2 d=2 e nu se poat e cal cul a
a=0 b=1 c=0 d=0 e nu se poat e cal cul a
a=0 b=1 c=0 d=1 - > e= - 2. 000
a=0 b=1 c=0 d=2 - > e= - 1. 000
a=0 b=1 c=1 d=0 - > e= 2. 000
a=0 b=1 c=1 d=1 e nu se poat e cal cul a
a=0 b=1 c=1 d=2 - > e= - 2. 000
a=0 b=1 c=2 d=0 - > e= 1. 000
a=0 b=1 c=2 d=1 - > e= 2. 000
a=0 b=1 c=2 d=2 e nu se poat e cal cul a
a=0 b=2 c=0 d=0 e nu se poat e cal cul a
a=0 b=2 c=0 d=1 - > e= - 4. 000
a=0 b=2 c=0 d=2 - > e= - 2. 000
a=0 b=2 c=1 d=0 - > e= 4. 000
a=0 b=2 c=1 d=1 e nu se poat e cal cul a
a=0 b=2 c=1 d=2 - > e= - 4. 000
a=0 b=2 c=2 d=0 - > e= 2. 000
a=0 b=2 c=2 d=1 - > e= 4. 000
a=0 b=2 c=2 d=2 e nu se poat e cal cul a
a=1 b=0 c=0 d=0 e nu se poat e cal cul a
a=1 b=0 c=0 d=1 - > e= - 1. 000
a=1 b=0 c=0 d=2 - > e= - 0. 500
a=1 b=0 c=1 d=0 - > e= 1. 000
a=1 b=0 c=1 d=1 e nu se poat e cal cul a
a=1 b=0 c=1 d=2 - > e= - 1. 000
a=1 b=0 c=2 d=0 - > e= 0. 500
a=1 b=0 c=2 d=1 - > e= 1. 000
a=1 b=0 c=2 d=2 e nu se poat e cal cul a
a=1 b=1 c=0 d=0 e nu se poat e cal cul a
a=1 b=1 c=0 d=1 - > e= - 3. 000
a=1 b=1 c=0 d=2 - > e= - 1. 500
a=1 b=1 c=1 d=0 - > e= 3. 000
a=1 b=1 c=1 d=1 e nu se poat e cal cul a
a=1 b=1 c=1 d=2 - > e= - 3. 000
a=1 b=1 c=2 d=0 - > e= 1. 500
a=1 b=1 c=2 d=1 - > e= 3. 000
a=1 b=1 c=2 d=2 e nu se poat e cal cul a
a=1 b=2 c=0 d=0 e nu se poat e cal cul a
a=1 b=2 c=0 d=1 - > e= - 5. 000
a=1 b=2 c=0 d=2 - > e= - 2. 500
a=1 b=2 c=1 d=0 - > e= 5. 000
a=1 b=2 c=1 d=1 e nu se poat e cal cul a
a=1 b=2 c=1 d=2 - > e= - 5. 000
a=1 b=2 c=2 d=0 - > e= 2. 500
- 138 -
a=1 b=2 c=2 d=1 - > e= 5. 000
a=1 b=2 c=2 d=2 e nu se poat e cal cul a
a=2 b=0 c=0 d=0 e nu se poat e cal cul a
a=2 b=0 c=0 d=1 - > e= - 2. 000
a=2 b=0 c=0 d=2 - > e= - 1. 000
a=2 b=0 c=1 d=0 - > e= 2. 000
a=2 b=0 c=1 d=1 e nu se poat e cal cul a
a=2 b=0 c=1 d=2 - > e= - 2. 000
a=2 b=0 c=2 d=0 - > e= 1. 000
a=2 b=0 c=2 d=1 - > e= 2. 000
a=2 b=0 c=2 d=2 e nu se poat e cal cul a
a=2 b=1 c=0 d=0 e nu se poat e cal cul a
a=2 b=1 c=0 d=1 - > e= - 4. 000
a=2 b=1 c=0 d=2 - > e= - 2. 000
a=2 b=1 c=1 d=0 - > e= 4. 000
a=2 b=1 c=1 d=1 e nu se poat e cal cul a
a=2 b=1 c=1 d=2 - > e= - 4. 000
a=2 b=1 c=2 d=0 - > e= 2. 000
a=2 b=1 c=2 d=1 - > e= 4. 000
a=2 b=1 c=2 d=2 e nu se poat e cal cul a
a=2 b=2 c=0 d=0 e nu se poat e cal cul a
a=2 b=2 c=0 d=1 - > e= - 6. 000
a=2 b=2 c=0 d=2 - > e= - 3. 000
a=2 b=2 c=1 d=0 - > e= 6. 000
a=2 b=2 c=1 d=1 e nu se poat e cal cul a
a=2 b=2 c=1 d=2 - > e= - 6. 000
a=2 b=2 c=2 d=0 - > e= 3. 000
a=2 b=2 c=2 d=1 - > e= 6. 000
a=2 b=2 c=2 d=2 e nu se poat e cal cul a


A-2 Coninutul fiierului de rezultate L52.REZ de la exerciiul 6.5.2:

pent r u x=0. 0 f ( x) =0. 000000
pent r u x=0. 1 f ( x) =0. 109833
pent r u x=0. 2 f ( x) =0. 238669
pent r u x=0. 3 f ( x) =0. 385520
pent r u x=0. 4 f ( x) =0. 549418
pent r u x=0. 5 f ( x) =0. 729426
pent r u x=0. 6 f ( x) =0. 924643
pent r u x=0. 7 f ( x) =1. 134218
pent r u x=0. 8 f ( x) =1. 357356
pent r u x=0. 9 f ( x) =1. 593327
pent r u x=1. 0 f ( x) =1. 841471
pent r u x=1. 1 f ( x) =2. 101207
pent r u x=1. 2 f ( x) =2. 372039
pent r u x=1. 3 f ( x) =2. 653558
pent r u x=1. 4 f ( x) =2. 945450
pent r u x=1. 5 f ( x) =3. 247495
pent r u x=1. 6 f ( x) =3. 559574
pent r u x=1. 7 f ( x) =3. 881665
pent r u x=1. 8 f ( x) =4. 213847
pent r u x=1. 9 f ( x) =4. 556300
pent r u x=2. 0 f ( x) =4. 909297
- 139 -
A-3 Pentru exerciiul 6.5.3:

Exemplu de fiier cu date (L53.DAT) pentru exerciiul 6.5.3:

2, 2
2, 3
===================
1 2
3 4
===================
5 6 7
8 9 5

Coninutul fiierului cu rezultate (L53.REZ) de la exerciiul 6.5.3:

Mat r i cea pr odus AxB est e :
===================

21. 24. 17.
47. 54. 41.


A-4 Coninutul fiierului de rezultate T54.REZ de la exerciiul 6.5.4:

Nr . pr i me de l a 1 l a 10000 sunt :

1 2 3 5 7 11 13 17 19 23 29 31 37
41 43 47 53 59 61 67 71 73 79 83 89 97
101 103 107 109 113 127 131 137 139 149 151 157 163
167 173 179 181 191 193 197 199 211 223 227 229 233
239 241 251 257 263 269 271 277 281 283 293 307 311
313 317 331 337 347 349 353 359 367 373 379 383 389
397 401 409 419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541 547 557 563
569 571 577 587 593 599 601 607 613 617 619 631 641
643 647 653 659 661 673 677 683 691 701 709 719 727
733 739 743 751 757 761 769 773 787 797 809 811 821
823 827 829 839 853 857 859 863 877 881 883 887 907
911 919 929 937 941 947 953 967 971 977 983 991 997
1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087
1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181
1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279
1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373
1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471
1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559
1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637
1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747
1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867
1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973
1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063
2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143
2153 2161 2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269
2273 2281 2287 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357
2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 2437 2441 2447
- 140 -
2459 2467 2473 2477 2503 2521 2531 2539 2543 2549 2551 2557 2579
2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 2671 2677 2683
2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749 2753
2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857
2861 2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969
2971 2999 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 3083
3089 3109 3119 3121 3137 3163 3167 3169 3181 3187 3191 3203 3209
3217 3221 3229 3251 3253 3257 3259 3271 3299 3301 3307 3313 3319
3323 3329 3331 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413
3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 3517 3527 3529
3533 3539 3541 3547 3557 3559 3571 3581 3583 3593 3607 3613 3617
3623 3631 3637 3643 3659 3671 3673 3677 3691 3697 3701 3709 3719
3727 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 3823 3833
3847 3851 3853 3863 3877 3881 3889 3907 3911 3917 3919 3923 3929
3931 3943 3947 3967 3989 4001 4003 4007 4013 4019 4021 4027 4049
4051 4057 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 4153
4157 4159 4177 4201 4211 4217 4219 4229 4231 4241 4243 4253 4259
4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363 4373
4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493
4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603
4621 4637 4639 4643 4649 4651 4657 4663 4673 4679 4691 4703 4721
4723 4729 4733 4751 4759 4783 4787 4789 4793 4799 4801 4813 4817
4831 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 4943 4951
4957 4967 4969 4973 4987 4993 4999 5003 5009 5011 5021 5023 5039
5051 5059 5077 5081 5087 5099 5101 5107 5113 5119 5147 5153 5167
5171 5179 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 5281
5297 5303 5309 5323 5333 5347 5351 5381 5387 5393 5399 5407 5413
5417 5419 5431 5437 5441 5443 5449 5471 5477 5479 5483 5501 5503
5507 5519 5521 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639
5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 5701 5711 5717
5737 5741 5743 5749 5779 5783 5791 5801 5807 5813 5821 5827 5839
5843 5849 5851 5857 5861 5867 5869 5879 5881 5897 5903 5923 5927
5939 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 6067 6073
6079 6089 6091 6101 6113 6121 6131 6133 6143 6151 6163 6173 6197
6199 6203 6211 6217 6221 6229 6247 6257 6263 6269 6271 6277 6287
6299 6301 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 6373
6379 6389 6397 6421 6427 6449 6451 6469 6473 6481 6491 6521 6529
6547 6551 6553 6563 6569 6571 6577 6581 6599 6607 6619 6637 6653
6659 6661 6673 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761
6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 6841 6857 6863
6869 6871 6883 6899 6907 6911 6917 6947 6949 6959 6961 6967 6971
6977 6983 6991 6997 7001 7013 7019 7027 7039 7043 7057 7069 7079
7103 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 7211 7213
7219 7229 7237 7243 7247 7253 7283 7297 7307 7309 7321 7331 7333
7349 7351 7369 7393 7411 7417 7433 7451 7457 7459 7477 7481 7487
7489 7499 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 7573
7577 7583 7589 7591 7603 7607 7621 7639 7643 7649 7669 7673 7681
7687 7691 7699 7703 7717 7723 7727 7741 7753 7757 7759 7789 7793
7817 7823 7829 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919
7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 8039 8053 8059
8069 8081 8087 8089 8093 8101 8111 8117 8123 8147 8161 8167 8171
8179 8191 8209 8219 8221 8231 8233 8237 8243 8263 8269 8273 8287
8291 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 8389 8419
8423 8429 8431 8443 8447 8461 8467 8501 8513 8521 8527 8537 8539
8543 8563 8573 8581 8597 8599 8609 8623 8627 8629 8641 8647 8663
8669 8677 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 8747
8753 8761 8779 8783 8803 8807 8819 8821 8831 8837 8839 8849 8861
- 141 -
8863 8867 8887 8893 8923 8929 8933 8941 8951 8963 8969 8971 8999
9001 9007 9011 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109
9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 9203 9209 9221
9227 9239 9241 9257 9277 9281 9283 9293 9311 9319 9323 9337 9341
9343 9349 9371 9377 9391 9397 9403 9413 9419 9421 9431 9433 9437
9439 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 9539 9547
9551 9587 9601 9613 9619 9623 9629 9631 9643 9649 9661 9677 9679
9689 9697 9719 9721 9733 9739 9743 9749 9767 9769 9781 9787 9791
9803 9811 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901
9907 9923 9929 9931 9941 9949 9967 9973


A-5 Pentru exerciiul 6.5.5:

Exemplu de fiier cu date T55.DAT:

I l i escu Dan : 5. 89
Gheor ghe Adr i an : 10. 00
Al exandr escu Val ent i n : 8. 85
Zor i l a Sor i n Cl audi u : 7. 26
Achi mHor at i u : 8. 88
Pascu Cr i st i na : 9. 83
Cr i san Adel i na : 9. 57
Ol t eanu Cr i st i an : 7. 22

Coninutul fiierului T55.REZ cu rezultate:




El evi i or donat i i n or di nea medi i l or :



1. Gheor ghe Adr i an Medi a: 10. 00
2. Pascu Cr i st i na Medi a: 9. 83
3. Cr i san Adel i na Medi a: 9. 57
4. Achi mHor at i u Medi a: 8. 88
5. Al exandr escu Val ent i n Medi a: 8. 85
6. Zor i l a Sor i n Cl audi u Medi a: 7. 26
7. Ol t eanu Cr i st i an Medi a: 7. 22
8. I l i escu Dan Medi a: 5. 89










- 142 -







- 143 -


1. COMPAQ FORTRAN. Language Reference Manual, Compaq Computer Corporation,
Houston, Texas, 1999.
2. E. W. Dijkstra A Discipline of Programming, Prentice-Hall, Englewood Cliffs, New
J ersey, 1976.
3. FORTRAN -77, Operare, I.T.C.I. Filiala Cluj-Napoca, 1988.
4. FORTRAN -77, Programare, I.T.C.I. Filiala Cluj-Napoca, 1988.
5. F. Gobesz, A. Ctrig Programarea calculatoarelor electronice, Institutul Politehnic
Cluj, 1974.
6. IBM FORTRAN/2, Language Reference, I.B.M. Corp., 1987
7. H. M. Kienle History, Architecture & Evolution of Compilers, SENG420, University
of Victoria, Canada, 2002.
8. A. C. Marshall Fortran 90 Course Notes, The University of Liverpool, 1997.
9. S. Niculescu FORTRAN, Iniiere n programare structurat, Editura Tehnic,
Bucureti, 1979.
10. E. Petac, C. Partale Limbajul FORTRAN, Programare i aplicaii, Matrix Rom,
Bucureti, 2002.
11. M. Petrina, A. Ctrig Programare, teorie i aplicaii pe PC-uri compatibile IBM,
Universitatea Tehnic din Cluj-Napoca, 1993.
12. T. Roberts, S. Egdorf A Face-Lift for Aging FORTRAN Scientific Applications, LA-
UR 01-6629, Los Alamos National Laboratory, 2001.
13. G. E. Urroz Getting started with GNU FORTRAN G77, Utah State University, 2002.
14. http://www.cfm.brown.edu/tutorials/Fortran.html
15. http://www.engineering.usu.edu/cee/faculty/gurro/
16. http://www.forceproject.hpg.ig.com.br/
17. http://www.fortran.com/
18. http://www.geocities.com/Athens/Olympus/5564/
19. http://www.geog.nottingham.ac.uk/~mather/useful/Computing.html#FORTRAN
20. http://www.hep.man.ac.uk/guide/unix_tutorial/section3.6.html
21. http://www.hpctec.mcc.ac.uk/hpctec/courses/Fortran90/mc_f90.html
22. http://www.imamod.ru/~vab/vfort/
23. http://www.levenez.com/lang/
BIBLIOGRAFIE
INIIERE N
PROGRAMARE I
N LIMBAJULFORTRAN
Zsongor F. GOBESZ Ciprian BACOIU
U.T.PRES
I
N
I

I
E
R
E

N
P
R
O
G
R
A
M
A
R
E

N
L
I
M
B
A
J
U
L
F
O
R
T
R
A
N

S-ar putea să vă placă și