1 Uniti de program
Orice program, atunci cnd este executat de computer, ndeplinete un scop, realizeaz a anumit misiune caracterizat de ndeplinirea unor obiective precise de prelucrare a datelor. Mulimea obiectivelor impuse ce definesc o misiune de prelucrare a datelor se numete task. Proiectarea unui program ncepe ntotdeauna cu descrierea taskului. Atunci cnd misiunea programului este prea complicat, se folosete tactica "divide et impera": un task T se mparte n subtaskuri T1 , T2 , , Tn cu condiia ca ndeplinirea taskurilor T1 , T2 , , Tn s nsemne ndeplinirea taskului T . Orice program Fortran executabil este alctuit din una sau mai multe uniti de program. Unitate de program poate fi: programul principal (main), un subprogram extern (subrutin sau funcie), un modul, sau un bloc de date (block data). Dac programul este format dintr-o singur unitate de program, acea unitate, n mod obligatoriu, este programul principal. Dac un program executabil ndeplinete un task T, fiecare unitate de program corespunde unuia din subtaskurile T1 , T2 , , Tn care contribuie la ndeplinirea taskului T. Fiecare unitate de program este format din instruciuni executabile i neexecutabile (8.2). Fiecare unitate de program ncepe cu o instruciune iniial special i se termin cu o instruciune END. Atunci cnd programul este alctuit din mai multe uniti de program, programul principal controleaz i ordinea n care se execut diferitele uniti de program. Subprogramul extern (funcie sau subrutin) se poate folosi pentru a efectua prelucrri asupra unor entiti care sunt disponibile subprogramului extern. Aceste entiti pot fi argumente ale subprogramului care se dau n referina de subprogram, sau, sunt fcute accesibile subprogramului prin alte mijloace, de exemplu, prin blocuri common. Pentru a apela o subrutin se folosete instruciunea CALL. Atunci cnd este nevoie de valoarea unei funcii se apeleaz un subprogram funcie. Procesul computaional specificat de o funcie sau de o subrutin se numete procedur. Altfel spus, un subprogram extern definete o procedur. O procedur se poate apela din orice alt unitate de program. Modulele i blocurile de date nu sunt executabile; de aceea ele nu sunt considerate proceduri. O unitate de program BLOCK DATA conine numai definiii de date i se folosete pentru a specifica valori iniiale pentru un anumit set de obiectedate. Modulul conine definiii ce pot fi fcute accesibile altor uniti de program. Modulul conine definiii de date, definiii de tip, definiii de procedur, numite subprograme modul, i specificaii de interfee procedur. Subprogramele modul pot fi subprograme subrutin sau funcie. Un subprogram modul poate fi apelat de orice alt subprogram modul sau de orice alt unitate de program ce are acces la modul. Programul principal, subprogramele externe i subprogramele modul pot conine subprograme interne care pot fi subrutine sau funcii. Programul principal, sub116
programul extern sau subprogramul modul ce conine un subprogram intern se numete gazda (host) subprogramului intern. Subprogramele interne se introduc cu instruciunea CONTAINS. Subprogramele interne pot fi apelate de subprogramele lor gazd sau de alte subprograme interne ale aceleiai gazde. Toate unitile de program, cu excepia blocurilor de date, pot conine blocuri de interfa. Un bloc de interfa descrie interfaa la o procedur extern, adic numele procedurii, numrul de argumente, tipul lor, atribute, nume. Aceast informaie permite procesorului s verifice dac accesul a fost fcut n mod corect. Structura unitilor de program este artat n Fig. 8.1.
main
modul
subprograme modul
subprograme interne
Fig. 8.1
117
descriem sintaxa instruciunilor de aciune. Numele instruciunii este dat de un cuvnt cheie pe care l scriem cu litere mari. Formele instruciunilor de aciune sunt:
ALLOCATE ( list_de_alocaie [ , STAT = var_scal_int ] ) ASSIGN et TO var_scal_int BACKSPACE unitate_de_fisier_extern CALL nume_de_sub [ ( [ list_de_spec_arg_act ] ) ] CLOSE ( list_de_spec_close ) CONTINUE CYCLE [ nume_de_constr_DO ] DEALLOCATE ( list_de_nume [ , STAT = var_scal_int ] ) ENDFILE unitate_de_fiier_extern ENDFILE ( list_de_spec_de_poziie ) EXIT [ nume_de_constr_DO ] GO TO et GO TO ( list_de_et ) [ , ] expr_scal_int GO TO var_scal_int [ [ , ] ( list_de_et ) ] IF ( expr_logic_scal ) instr_de_aciune IF ( expr_num_scal ) et , et , et INQUIRE ( list_de_spec_inquire ) [ list_de_spec_output ] NULLIFY ( list_de_ob_pointer ) OPEN ( list_de_spec_de_conect ) PAUSE ( cod_acces )
118
PRINT format [ , list_de_ent_output ] READ ( list_de_spec_de_control_io ) [ list_de_ent_input ] READ format [ , list_de_ent_input ] RETURN [ expr_scal_int ] REWIND unitate_de_fiier_extern REWIND ( list_de_spec_de_poziie ) STOP
[ cod_de_acces ]
var_pointer => expr_int (instruciune de atribuire pointer) var = expr ( instruciune de atribuire ) Mai sus am folosit prescurtrile din tabelul 8.1. Tabelul 8.1
Prescurtare Semnificaie Prescurtare Semnificaie
act arg atrib conect constr dimens ent et execut expr fin incr
actual(e) argument(e) atribuire conectare contrucie dimensiune(i) entitate(entiti) etichet(e) executabil() expresie final() increment
init int instr io num ob scal sel spec sub val var
iniial() ntreg(ntreag) instruciune input-output numeric(numeric) obiect(e) scalar() selector specificaie(i) subrutin valoare(valori) variabil
Prin construcie de control nelegem un anumit grup de instruciuni cu care se realizeaz instruciunile compuse ale programrii structurate (7.8), adic instruciuni executabile, de pild instruciuni de aciune i instruciuni ce controleaz ordinea n
119