Sunteți pe pagina 1din 58

PROCEDURI SI FUNCTII

PROCEDURI PASCAL

O procedura Pascal poate avea uan din urmatoarele sintaxe.


Forma a) fara parametrii formli cu sintaxa
PROCEDURE nume;
[sectiunea declaratii]
BEGIN
[ instructiuni]
END

Forma b) cu parametrii formali, cu sintaxa


PROCEDURE nume([VAR] l1: t1; [VAR] l2:t3; [VAR] ln: tn);
[sectiunea declaratiei]
BEGIN
[instructiunii]
END;

unde
-nume este un indentificator Pascal, unde si este numele procedurii;
-(l1:t1;;ln: tn) reprezinta listele parametrilor formali si a tipurilor acestora,
daca

multimea acestora nu e vida; li : ti, i=1,2,,n sint separate prin

caracterul i( punct si virgula) si se numesc parametric formali.


Parametrii formali dintr-o procedura(si functie) se declara numai in antetul de
procedura(functie) si nu in sectiunea declaratiei ca celelalte obiecte Pascal.
Observatii:
1)

O procedura are o structura asemanatoare cu a unui program diferit doar

prin antet (instructiunea de inceput).

2)

Intr-o declaratie de procedura sunt obligatorii doar antetul de procedura

si instructiunea compusa BEGIN.END.


3)

Orice identificator folosit in zona de instructiuni a procedurii, exceptand

parametrii formali, trebuie sa fie declarat fie in sectiunia de decalratii a


procedurii(cand are valoare locala-numai in corpul procedurii), fie in programul din
care face parte procedura in care caz variabila are valoare gloabla dac aceiasi
variabila nu este declarata si in procedura
4)

Daca un identificator cu acelas nume figureaza si este declarat si in

programul principal si in subprogram(procedura functie), atunci semnificatiiele lui


sunt diferite in programul principal si subprogram

FUNCTII PASCAL
O functie Turbo Pascal are o structura sintactica asemanatoare cu a unui
proceduri Turbo Pascal. Sintaxa functiei este urmatoarea:
FUNCTION nume ([VAR] l1:t1;[var] l2:t2;;
[var] ln:tn):tip nume;
[sectiunea declaratii locale]
BEGIN
{..}
{NUME :=. ;} sectiunea instructiuni
{..}
END:

unde:
tip nume este valorii pe care o ia nume sip e care o va returna programului
apelat. El poate fi : intreg, real, CHAR, BOOLEAN, pointer, STRING. O functie
calculeaza o valoare ce se asociaza numelui functiei nume, prin urmare este necesara

precizarea tipului numelui. De asemenea este necesara, in cadrul sectiuni de


instructiuni, prezenta numelui functiei: nume cel putin odata, in membrul sting a unei
instructiuni de atribuire. Specificarea tipului de functie se face in antet. In urma
executiei unei functii rezultatul obtinut este atribuit numelui functiei, prin
intermediul caruia se face returnarea acestui rezultat.
li:ti

sint declaratori de tip aiparametrilor formali si au aceeai semnificatie ca

la proceduri. La functii lista parametrilorformali nu poate fi vida.


Exemplu. Sa se elaboreze o functie Turbo Pascal care sa calculeze minimul a
doua numere reale.
Functia este urmatoarea :
FUNCTION min(z,y:REAL) : REAL;
BEGIN
IF X<Y
THEN min:=x
ELSE min:=y
END.
In acest exemplu numele functia sint x si y tip REAL acest lucru fiind precizat
astfel:
FUNCTION min(..) :REAL;
Parametrii functiei sint x si y de tip REAL si sunt parametrii formali-constante.
Se observa ca in cazul functiei numele min apare de doua ori partea stanga a
unei instructiuni de atribuire.
IF X <Y
min :=x

THEN

ELSE
min :=y

END.
Apelul functiei se face prin numele sau, urmat in paranteza de lista
parametrilor actuali, nume ce apare in cadrul unei expresii. In apelul functiei
parametrii actuali nume ce apare in cadrul unei expresii de acelasi tip cu parametrul
formal corespunzator. Ca si la apelul procedurilor parametri actuali trebuie sa se
corespunda cu parametrii formali in numar, ordine si tip.
Aplicatia 1. Se citesc in programul principal n parechi de numere reale (a,b)si
se cere sa se calculeze si sa se afiseze pentru fiecare pereche citita tripletul
(a,bmin(a,b)) pentur calculul lui min (a,b) folosind o functie.

Programul este urmatorul :


PROGRAM minim ;
VAR ,a,b,z :REAL ; i, n :INTEGER ;
FUNCTIONmin(x,y:REAL):REAL;
BEGIN
IF x<y
THEN min:=x
ELSE min:=y
END;

BEGIN
write(dati n:);readln(n);
FOR i :=1 TO n DO
BEGIN
write(dati a si b:) readln(a,b)
z :=min (a,): {apel functie}
write (a:6:2, b:6:2,min=,z :6:2).

END
END.
In program era posibila ca in loc de
z :=min(a,b);
write(a:6:2, b:6:2,min=,z :6:2).
sa scriem doar
write(a: 6:2, b:6:2,min=,min=(a,b):6:2).
APLICATIA 2. Sa se scrie un program Pascal care sa citeasca doi vectori reali
a,b de dimensiuni n si care sa calculeze produsul scalar al celor doi vectori, precum si
a lungimii fiecarui vector, folosind in aceste scopuri o singura functie. Se va afisa
valoarea produsului scalar precum si valorile lungimilor celor doi vectori .
Rezolvare . Pentru calculul produsului scalar a doi vectori a= (ai), b=(bi) si a
lungimii unui vector x=(xi) se folosesc formulele
n

a1, b2

p=<a,b>= i 1

lx =

x 2
i 1

Programul este urmatul :


PROGRAM vectori :
CONST n=10
TYPE vector = ARRAY [1..n] OF REAL;
VAR I :INTEGER: a,b: vector; la, lb, REAL;
FUNCTION produs(x,y : vector) :REAL;
VAR s :REAL ;
BEGIN
s:=0
FOR i:=1 TO n DO s:=s+x[i]* y[i]
produs:= s
END;

BEGIN
FOR i:=1 TO n DO
BEGIN
write(a[,i,]=); readln(a[i])
END;
writeln
FOR i:=1 TO n DO
BEGIN
write(b[,i,]=); readln(b[i])
END;
writeln;
p:=produs(a,b); writeln(produs scalar=,p:10:3);
la:=produs(a,a); la:=sqrt(la)
writeln(lungimea vectorului a =,la :10 :3) ;
lb := produs(b,b) ;lb :=sqrt(lb) ;
writeln(lungimea vectorului b=,lb :10 :3)
END
Pentru obtinerea produsului s-a folosit in functie variabila locala s. In functie
nu este corecta folosirea formei, de exemplu,
produs:= 0
FOR i:= 1 TO n DO produs:= produs+ x[i]*y[i];
Deoarece numele functiei produs figurand si in dreapta semnalul:= ar aprecia
un apel recursive al functiei, tehnicace este permisa in Turbo Pascal, dar intr-o forma
ce va fi precizata ulterior.
Parametrii formali din antet nu pot fi datio astfel
FUNCTION produs(x,y:ARRAY[1.n] OF REAL): REAL;

Deoarece acestea se dau in forma li:ti unde li sunt parametric formali, iar ti
sunt identificatori de tip ce apar in sectiunea TYPE sau sunt predefiniti.
Aplicatia 3. Sa se citeasca in programul principal perechi de caractere (c1,c2)
si sa se precizeze daca cele doua caractere sunt identice sqau distincte, folosind in
acest scop o functie. In progamul se va afisa perweche citita
cuvantulidenticsaudiferit,dupa caz, impreuna cu perechea de caracter.
Rezolvare. Functia o vom denumi egalitate. Ea este o functie de tip
BOOLEAN avand parametrii(agumentele fictive) de tip CHAR.
Programul este urmatorul:
PROGRAM test;
VAR c1,c2,symbol:CHAR;
FUNCTION egalitate(c,d:CHAR):BOOLEAN
BEGIN
egalitate;=c=d
END:
BEGIN
REPEAT
write(dati caracterele c1,c2:)
readln (c1,c2);
IF egalitate(c1,c2)
THEN writeln(c1, ,c2 , identice)
ELSE writeln(c1, ,c2, diferite);
writeln;
writeln (alte caractere? (Da/Nu);
readln(simbol)
UNTIL simbol<>D
END.

Citirea se va face atat timp cat utilizator apasa tastaD


In acest program apelul functiei este egalatate(c1,c2) ce apare in expresia
booleana din cadrul instructiunii IF.
IF egalitate (c1,c2) THEN..ELSE..
A se mai observa forma foarte nsimpla a in structiunii de atribuire din functie
egalitatea :=c=d
fata de o alta varianta posibila ca
IF c=d
THEN egalitate :=TRUE
ELSE egalitate:= FALSE
Aplicatia 4. se citeste o matrice reala A=(aij) de tip mxn care se afiseaza. Se
cere sa se calculeze noema matricei A. notataA care se afiseaza si apoi se
construieste o alta matrice notata tot A , dar ale carei elemente sunt insa aij/ A. Se
afisaeza noua matrice.
Rezolvae. In cadrul programului se vor executa urmatoarele :
-citirea matricei A se va face folosind o procedura numita citire ;
-afisarea matricei A si a matricei A-modificate se face cu o procedura tipar ;
-calculul normei se face intr-o functie cu numele norma, folosind formula
n
A=max aij
1im j=1
Calculul maximului dintr-un vector facandu-se intr-o alta functie numita
maxim, care va fi declarata locala in norma, adica va apare in corpul functiei norma.
Calcuul noii matrici se va face in programul principal. Schema logica a
programului principal este urmatorul.

START

CITIRE A

NORMA

TIPAR A

MAXIM

A=A/
A

TIPAR A

STOP

Pentru determinarea normei A se va folosi un vector v=(vi), unde


n
Vi=aij, i= l,.,m si

A=max Vi

j=1

1im

a11... a1n

. .
.

. .
ai1... ain (a11 ..a1n)v1

. .

. .
. .

am1...amn
.

(ai1ain)vi
.

(am1amn) vm
Programul este urmatorul :
PROGRAM norme ;
CONST m=10 ; n= 15 ;
TYPE matrice= ARRAY[1..m, 1..n] OF REAL ;
VAR a : matrice ; I, j : INTEGER;nn :REAL;
PROCEDURE citrice; (VAR a : matrice);
BEGIN
FOR I := 1 TO m DO
FOR j := 1 TO n DO read (a[I, j])
END;
PRODUCERE tipar(a : matrice);
BEGIN
writeln;
FOR I := 1TO m DO
BEGIN
FOR j := 1 TO n DO write(a[I,j],
writeln
END
END;
FUNCTION norma(a: matrice) :REAL;

10

);

TYPE v : ARRY[1..m] OF REAL


VAR v : vector; s:REAL;
FUNCTION maxim(v : vector) : REAL;
VAR max : REAL;
BEGIN
max :=v [1]
FOR i := 2 TO m DO
IF max <v[i] THEN max := v[i];
maxim:=max
END;
BEGIN
FOR i :=1 TO m DO
BEGIN
S:=0
FOR j := 1 TO n DO s := s+ abs (a[i,j]);
V[i] :=s
END;
norma:=maxim(v)
END;
BEGIN
writeln;
citire(a) ; tipar(a) ; nn :=norma(a)
writeln(norma= ,nn :10:2);
FOR i :=1TO m DO
FOR i := 1 TO m DO a[i,j] := a [i,j]/nn;
writeln;
tipar(a)

11

END.
Functia cu numele maxim care apare in functia norma are un caracter
local, ea ne putind fi apelata decit din norma. Apelul ei s-a facut prin
norma := maxim(v).

TIPURILE FUNCTION SI PROCEDURE


In afara de tipurile simple si structurate prezente in capitolele anterioare
se pot

declara alte tipuri de date si anumite tipul FUNCTION

si tipul

PROCEDURE si care au urmatoarele sintaxe :


TYPE
nume_functie=FUNCTION(l1:t1;ln:tn): tip_rezutat;
nume_procedura= PROCEDURE(l1:t1;ln:tn);

unde :
tip_rezultat este un tip: intreg,real, BOOLEAN,CHAR, STRING sau
pointer, li:ti cu i =1,2, n sunt declatori de tip ai parametrilor.
Avand declarate tipurile FUNCTION sauPROCEDURE, variabilele de
tip FUNCTION sau PROCEDURE se declara in VAR, de EXEMPLU
VAR f1,f2:nume_functie; sub1, sub2: nume-procedura;

Unde s-au declarat f1,f2 ca functii,iar sub1,sub2 ca proceduri.

12

FUNCTII SI PROCEDURI CA PARAMETRII FORMALI

In lista parametrilor formali ai unei proceduri sau functii pot figura si nume
de functii sau proceduri. Daca un parametru formal este un nume de functie sau
procedura, atunci parametrul actul corespunzator actual corespunzator, in apel,
trebuie sa fie de asemenea un nume de functie sau procedura.
In implementarea Turbo Pascal, trebuie procedat astfel :
1) Se declara tipul FUNCTION sau PROCEDURE, ca la paragraful procent
prin TYPE
nume_functie=FUNCTION(par,,par:tip) : tip_functie;
nume_procedura=PROCEDURE(par,par,..:tip:);
2) Inainte de compilare directiva $F din optiuni se pune pe ON adica se
activeaza{$F+}, dupa care se trece la compilarea programului.
Exemplu :
TYPE fun= FUNCTION(x : REAL) :REAL ;

FUNCTION suma(m, n :INTEGER; f : fun) :REAL;


BEGIN

END,

In acest exemplu, se poate folosi in subprogram


FUNCTION

suma(m,n : INTEGER ; f : fun) : REAL;

parametrul formal-constanta f de tip fun , deoarece s-a definit fun anterior. Lucrurile
sint asemanatoare formali de tip ARRY sau alte tipuri structurate sau nu. Cert este ca

13

nu puteam folosi un parametru formal formal par, functia sau procedura, cu o


declaratie in antet astfel
FUNCTION nume(par : tip ; FUNCTION/PROCEDURE par) : tip ;
O functie sau o procedura fl se foloseste ca parametru formal intr-o procedura
sau functie f2 daca in momentul executiei luii f2 trebuie calculat f1 ca un caz
particular.
Sa presupunem ca avem de calculat urmatoarele sume
100

50

s1= i

s2= i * 2 s3=

i 1

i 3

104

i 1

i 525

Sa observam ca aici avem de a face cu o suma mai generala si anume


n

suma= f (i )
i m

unde f(i) este respectiv i, i2, i/(i+1).


Pentru calculul lui suma pe forma generala am putea construi un subprogram,, de
exemplu.
FUNCTION suma(m,n : INTEGER ; f :ff) : real ;
VAR I : INTEGER: s :REAL;
BEGIN

S :=0
FOR i :=m TO n DO s := s+f(i);
suma:a=s
END;
iar tipul ff trebuie declarat anterior ca functie reala de argument intreg, astfel
TYPE ff = FUNCTION(X : INTEGER) : REAL.

14

De exemplu, pentru calculul lui s3 va trebui precizata functia f(i)= i/(i+1).


Pentru aceasta vom scrie un alt subprogram functia astfel
FUNCTION f3 (k : INTEGER) : REAL;
BEGIN
F3:= k*k
END;
In cadrul programului, pentru calculul sumei s3 , se poate folosi instructiunea
s3 := suma (25,104,f3).
Pentru calculul sumei s2 va trebui precizata functia f(i) = i2 prin subprogramul
FUNCTION f2(k:INTEGER): REAL;
BEGIN
f2:= k*k
END;
iar apelul subprogramului general suma se va face, de exemplu, prin
s2 :=suma (3.50.f2).
Asemanator pentru calculul lui s1.
Programul complet pentru calculul s3 va arata astfel :
{$F+}
PROGRAM sume ;
TYPE ff= FUNCTION (x :INTEGER) : REAL ;
VAR ss :REAL;
FUNCTION f3 (k:INTEGER) : REAL;
BEGIN
f3 := h/(k+1)
END
FIUNCTION suma (m,n :INTEGER; f: ff) REAL;
VAR I :INTEGER ; s :REAL;

15

BEGIN
s:= 0;
FOR i:= m TO n DO s:= s+f(i);
suma:= s
END;
BEGIN
ss:=suma (25,104,f3);
write( s3=,ss)
END.
In instructiunea ss :=suma(25,104,f3),f3 este un parametru actual, nume de
functie si aceasta functi este declarata in sectiunea declaratii a programului, in mod
complet.
In momentul apelului suma prin ss :=suma (25,104,f3), m vafi inlocuit cu 25,
n cu 104, iar f3 cu expresia i/(i+1) si se va calcula s3. Pentru calculul lui s1 avem
nevoie de functia f1, subprogramul suma ramanind neschimbat. Programul este
urmatorul .
{$F+}
PROGRAM sume ;
TYPE ff= FUNCTION (x :INTEGER) : REAL ;
VAR ss :REAL;
FUNCTION f1 (k:INTEGER) : REAL;
BEGIN
F1 :=k
END
FIUNCTION suma (m,n :INTEGER; f: ff) REAL;
VAR I :INTEGER ; s :REAL;

16

BEGIN
s:= 0;
FOR i:= m TO n DO s:= s+f(i);
suma:= s
END;
BEGIN
ss:=suma (1,100,f1);
write( s1=,ss)
END.
Se observa ca, pentru o suma particulara, trebuie modificat numai
subprogramul functie ce precizeaza functia particulara f1,f2 sau f3 si functia din
apelul respectiv.

PROCEDURI SI FUNCTII
PROGRAM prog ;
PROCEDURE p;
PROCEDURE pl;
BEGIN

END;
BEGIN

pl;
END.

PROCEDURE q ;
PROCEDURE pl ;

17

BEGIN

END,
BEGIN

ql;

END;
BEGIN

p;q
END.
Procedura pl este deschisa in procedura q, este deci locala pentru q si nu
poate fi apelata decat din p. la fel procedura ql fiind declarata in q are, la fel, caracter
local pentru q si nu poate fi apelata decat din q. Sa urmarim unrmatoarea aplicatie.
APLICATIE. Se citeste o matrice A reala, de tip m x n si se cere sa se
calculeze si sa se afiseze urmatoarele norme ale matricei A definite astfel
n
A1=max aij,
1im j=1
m
A2=max aij,
1in j=1
Rezolvare. In prima definbitie a normei se va calcula mai intii un vector v = (v1), i
n

18

=1,2,..,m, unde vi =

aij,iarA1= maxi(vi)i=1,2,..,m,iar in cazul al doilea se

va
j=1

calcula un vector w-(w), j=1,2,..,n, unde wj== aij,iarA2=max(wj), j=


1,2,..n.In
i=1
programul principal vom folosi urmatoarele functii. Functia normal care calculeaza
norma dupa formula A1 , care va apela functia vector 1 declarata local in normal.
Functia norma 2 calculeaza norma matricei dupa formula A2, care va apela
functia vector 2 declarata local in norma 2.
Programul principal va apela normal si norma 1 va afisa aceste norme.
Programul este urmatorul :
PROGRAM norme ;
CONST m = 10 ; n= 8 ;
TYPE matrice = ARRY[1.. m , 1..n] OF REAL :
VAR a : matrice; n1,n2 :REAL;
i,j:INTEGER;
FUNCTION norma 1 (a: matrice) :REAL
TYPE matrice = ARRY[1.. m] OF REAL
VAR s :REAL ; v : vector;
FUNCTION vector1(v :vector) : REAL;
VAR max : REAL;
BEGIN
max := v[1];
FOR i :=1 TO m DO
IF max <v[i] THEN max :=v[i];
vector 1 := max

19

END;
BEGIN
FOR i:= 1 TO m DO
BEGIN
s := 0;
FOR j := 1 TO n DO s:=s+abs (a[i,j];v[i]:=s
END;
norma1:=(v)
END;
FUNCTION norma 2(a: matrice): REAL;
TYPE vector=ARRAY [1.m] OF REAL
VAR s :REAL; w : vector;
FUNCTION vector2 (w : vector): REAL;
VAR max :REAL;
BEGIN
max := w[1];
FOR j := 1 TO n DO
IF max <w[j] THEN max :=w[j];
vector2:=max
END;
BEGIN
FOR j:=1 TO n DO
BEGIN
s :=0
FOR i :=1 TO n DO s:=s+abs (a[i,j])
w[j]:= s
END;

20

norma2:=vector2(w)
END
BEGIN
writeln;
writeln( dati matrice de ,mlinii si ,n, coloane);
writeln;
FOR i :=1 TO n DO
BEGIN
FOR j := 1TO n DO read (a[I,j]);
readln
END
n1 := norma 1(a); n2 :=norma 2(a);
writeln; ( norma1=,n1 :10 :2) ;
writeln ;( norma2=,n2 :10 :2)
END.
Daca matricea si atunci A ar fi de ordinal n atunci declaratiile de tip
TYPE vector =ARRAY [1..m] OF REAL din FUNCTION norma1() ;
TYPE vector =ARRAY [1..n] OF REAL din FUNCTION norma1() ;
ar coincide si atunci FUNTION vector1 si FUNCTION vector 2 coincid si sub o
denumire comuna, de exemplu FUNCTION maxim s-ar putea scoate si declara la
nivel s
PROGRAM normat ;
CONST n = 10 ;
TYPE matrice = ARRY[1.. m , 1..n] OF REAL :
vector = ARRY[1..n]

OF REAL :

VAR a : matrice; n1,n2 :REAL;


i,j:INTEGER; v : vector;

21

FUNCTION maxim (v : vector) :REAL :


VAR max : REAL;
BEGIN
max := v[1];
FOR i :=1 TO m DO
IF max <v[i] THEN max :=v[i];
maxim:= max
END;
FUNCTION norma 1 (a : matrice) : REAL;
VAR s : REAL; v : vector;
BEGIN
FOR i:= 1 TO m DO
BEGIN
s := 0;
FOR j := 1 TO n DO s:=s+abs (a[i,j]);
v[i] := s
END;
norma1:=maxim(v)
END;
FUNCTION norma 2(a: matrice): REAL;
VAR s :REAL; w : vector;
BEGIN
FOR j := 1 TO n DO
BEGIN
s :=0
FOR i :=1 TO n DO s:=s+abs (a[i,j]);
w[j]:= s

22

END;
norma2:= maxim(w)
END
BEGIN
writeln;
writeln( dati matrice de ,nlinii si ,n, col);
writeln;
FOR i := 1TO n DO
BEGIN
FOR j := 1TO n DO read (a[i,j]);
readln
END
n1 := norma 1(a);
n2 :=norma 2(a);
writeln ( norma1 =,n1:10:3);
write( norma2 =,n2:10:3)
END

PROCEDURI SI FUNCTII RECURSIVE


S-a arata in sectiunile anterioare ca in Pascal exista posibilitaeta ca procedurile
si functiile sa se poata apela intre ele in cazul in care ele sint descries la un acelasi
nivel. Aceasta posibilitate este largita in asa fel icit o procedura/ functie sa se poata
autoapela .
O procedura care se poate apela pe ea insasi se numeste recursiva.

23

Exemplu :
PORGRAM recursiv ;
PROCEDURE p ;
BEGIN

END;
PROCEDURE q;
BEGIN

q;

END;
BEGIN

p;
q;

END.
In acest exemplu procedura q are in corpul sau un autoapel. Ea este recursive.
Scrierea ei trebuie realizata intr-un anume fel care va fi prezentat in aceasta sectiune.
Exista clase intregi de probleme care se rezolva mult mai elegant prin tehnica

24

procedurilor/ functilor, recursive. De exemplu, problemele de sortare, de parcurgere a


arborilor binari.
O rezi\olvare a unei probleme se zice ca este recursive daca ea se exprima in
termanii rezolvarii unei variante mai simple a aceleiasi probleme si cu folosirea
instructiunilor particulare pentru versiunea cea mai simpla a problemei.
Cu aceasta notiune ne-am intilnit in scoala, de exemplu in legatura cu sirurile
recursive.
Exemple :
1. Sirul
a0=

an=

2 a n-1,

n 1;

In care termenul a n,fiind definit in functie de termenul precedent an_1, este


definit recursiv, cazul particular aici este a0 =

2. Un alt sir cunoscut este sirul Fibonacci, definit astfel


f(0)=1 ;
f(1)=1 ;
f(n)=f(n-1)+f(n-2),n>2 ;
In acest exemplu termenul f(n)este definit in functie de precedentii f(n_1) si
f(n-2). Cazurile particulare sint f(0)=1 si f(0)=1.
3. Fie suma s(k)=1*2+2*2+.+k2+.. Aceasta suma se poate scrie

0, k 0

s
(
k

1
)

k
*
2
,
k

s(k)=
Cazul particular fiind s(0) =0
4. Produsul p=1x2.j se poate scrie recursiv astfel

1, i 1

jp( j 1), j 1

p(j)=

Cazul particular fiind p(1)=1.

25

Vom arata modalitatea de folosire a

functiilor si procedurilor recursive pe

urmatoarea.
Aplicatie. Sa se calculeze suma patratelor primelor n numere naturale.
Vom prezenta mai multe variante de rezolvare.
1. Intr-o formula simpla, aceasta suma se poate calcula folosind formula
s=12+22++n2=

n(n 1)(2n 1)
6

Si programul este urmatorul:


PROGRAM sumal;
VAR n,s:INTEGER;
BEGIN
readln(n)
s:=n*(n+1)*(2*n+1)/6;
write(suma=,s)
END
Aceasta este de altfel matoda cea mai rapida.
2. Se va folosi o functie pentru calculul iterativ al sumei punand
s :=0
s :=s+i*2,i=1,2,..,n
Programul este urmatorul :
PROGRAM suma2 ;
VAR n, total: INTEGER;
FUNCTION s(n:INTEGER):INTEGER;
VAR t,i:INTEGER
BEGIN
t:=0

26

FOR i:=1 TO n DO t:=t+i*i


s:= t
END;
BEGIN
readln(n)
total:=s(n)
write(,suma=,total)
END.
3. Se foloseste varianta de rezolvare su functie recursive, baza pe faptul ca suma
se scrie , as cum am mai spus, astfel

0, k 0

s(k 1) k * 2, k 1,2,...., n

s(k)=

Programul se scrie astfel :


PROGRAM suma3 ;
VARn, total : INTEGER ;
FUNCTION s(k:INTEGER): INTEGER;
BEGIN
IF k-0
THEN s:=0
ELSE s:=(k-1)+k*k{apelul recursiv}
END;

BEGIN
readln(n) ;
total :=s(n) ; {apelul functiei}
write(suma=,total)
END.
Apelul recursive este redat aici prin instructiunea
s :=s(k-1)+k*k

27

care figureaza in parte ELSE a instructiunii IFTHENELSE si in


partea stanga a insructiunii de atributie trebuie sa figureze numai numele functiei s,
fara parametru, adica nu este corecta forma.
IF..THEN..ELSE s(k):=s(k-1)+k*k
Deaorece s(k) nu este o variabila sau nume de functie. Cazul particular este redat in
partea THEN a instructiunii IF, adica
IF k=0 THEN s:=0
4. In loc de functie recursive se poate folosi varianta cu procedura recursive
bazata pe aceeasi definitie recursive a sumei. Programul este urmatorul:
PROGRAM suma4;
VAR n,sum:INTEGER;
PROCEDURE ss(k: INTEGER; VAR
s:INTEGER)
BEGIN
IF k=0 THEN s:=0
ELSE
BEGIN
ss(k-1,s);{apelul recursiv}
s:=s+k*k
END
END;

BEGIN
readln(n);
ss(n,sum);{apelul prodedurii ss}
write(suma=,sum)
END.
Sa urmarim cum se delureaza operatiile pentru n=4.
In corpul programului exista instructiunea de apel ss(n,sum); adica pentru n=4
acela este
ss(4,sum).

28

In urma apelului procedurii, parametrul k din procedura in valoarea 4 si se


executa partea ELSE a instructiunii IF din corpul procedurii,prin urmare trebuie
executate instructiunile
BEGIN
ss(3,s);
s:=s+4*4
END.
Insa instructinea s:=s+4*4; nu poate fi executata deoarece ea este precedata de apelul
ss(3,s), prin urmare executia sa ramana deocamdata suspendata. Se executa de apelul
de procedura
ss(3,s) ;
cu k=3 si cum k>0 se executa partea ELSE a instructiunii IF adica
BEGIN
ss(2,s);
s:=s+3*3
END.
Executia instructiunii s:=s+3*3

nu poate avea loc, ramanad suspendata,

deorece se executa apel


ss(1,k)
cu k=1 si cum k.>0 se executa iarasi partea ELSE a instructiunii IF, adica

BEGIN
ss(0,s);
s:=s+1*1
END.

29

Executia s:=s+1*1 ramane suspendata,executandu-se mai inatai apelul


ss(0,s);
cu k=0, executandu-se de aceasta dat parte THEN ainstructiunii IF, adica se executa
instructiunea
s:=0;
si in continuare, in ordine inverse suspendarii, se executa instructiunile suspendate.
De fapt de executa instructiunile
s:=0
s:=s+1*1
s:=s+2*2
s:=s+3*3
s:=s+4*4
rezultand in final suma
s=1*2+2*2+3*2+4*2
De obsevat ajungerea in final la executia insctructiunii s:=0 din partea THEN a
instructiunii IF. Ea asigura iesirea din recursie, astfel programmul ar lucra, teoretic
indefinit.
Pentru executie programmul foloseste o stiva. Schematizat functionarea ei ar
putea fi redata astfel.

30

Program
principal

Ss(k,s)

Ss(k,s)

Ss(k,s)

Ss(k,s)

Ss(k,s)

Ss(3,s)

Ss(1,s)

Ss(2,s)

Ss(0,s)

Ss(4,s)
S:=0

S:=s+4*4

S:=s+3*3

S:=s+2*2

S:=s+1*1

Program
principal

Observatii:
1. Ori de cate ori se foloseste o structura cu proceduri cu proceduri/functii recursive
trebuie asigurata iesirea din recursivitate. Din acest motiv apelul recursive al unei
proceduri/functii p trebuie plasat in una din urmatoarele structuri de control
IF.THEN. p;
WHILEDO.p;
REPEAT..p..UNTIL..
2. Datorita numeroasalor apeluri, functiile si procedurile recursive consuma mult
timp,din acest motiv,de multe ori, recursia se inlocuieste cu itentia, mult mai
rapida. Forma recursiva are insa mai multe avantaje claritatii si elegantei.

31

Prezentam in continuare o functie recursiva care consuma foarte mult timp datorita
apelurilor incrucisate. Acesta este functia Akerman-prezenta frecvent in teoria
complexitatii algoritmilor.
n 1, m 0

A(m,n)= A(m 1,1), n 0

A( m 1), A( m, n 1))

in rest

unde m,n sunt numeroase naturale. Programul este urmatorul:


PROGRAM Akerman;
VAR m,n,a:INTEGER;
FUNCTION Ack(I,j:INTEGER):INTEGER;
BEGIN
IFi=0
THEN ack:=j+i
ELSE
IF j=0
THEN Ack:=Ack(i-1,1)
ELSE Ack:=Ack(i-1,Ack(i,j-1))
END;
BEGIN;
readln(m,n)
a:=Ack(m,n)
write(valoare=a)
END.

ALTE FUNCTII SI PROCEDURI DEFINITE

32

Capitolul 7 se ocupa de descrierea structurilor functiilor si procedurilor create


de utilizator pentru necesitatile sale de programare. Pe parcursul descrierii diferitelor
obiecte si actiuni din Turbo Pascal s-au prezentat o serie de functii si proceduri care
sunt predefinite, folosindu-se fregvent in aplicatii. Citim citeva din aceste functii si
proceduri:
1. Functiile de conversie Ord,Chr,Round,Trunc.
2. Functii aritmetice: Abs,ArcTan,Cos,Exp,Frac,Int,Ln,Pi,Sin,Sqr,Sqrt
3. Functii de ordonare:Odd,Pred,Succ.
4. Proceduri si functii de intrare/iesire pentru fisiere:Assign, Close, Reset, Rewrite,
Eof, Read, Readln, Write, Writeln, Eoln, SeekEof, SeekEoln, Seek, FilePos
s.a
5. Proceuri si functii de gestionare dinamica a memoriei.
In acest paragraf continuam sa prezentam si alte functii si proceduri predefinite
folosite in programele Turbo Pascal.
In legatura cu variabilele de tip STRING prezentam urmatoarele functii si proceduri.
1. Procedura Delete cu sintaxa
PROCEDURE delete (VAR s :STRING ; Index, n :INTEGER)
Este apelata prin instructiunea.
Delete(s,intex,n)

Executia procedurii are ca efect stergea din sirul s a n caractere incapand de


la pozitia specificata prin index. Daca valoarea lui index e mai mare decat lungimea
sirul nu se strege nici un character. Daca n este mai mare decat numarul caracterelor
de la index pana la sfarsit, atunci vor fi sterse vor fi sterse toate caracterele incepand
de le index.

33

Exemplu :
PROGRAM stergere ;
VAR s :STRING[12] ;
BEGIN
s:=1234567890ab;
Delete(s,2,6);writeln(s);{s=1890ab }
Delete(s,0,4);writeln(s);{s=0ab }
writeln
END.
2. Rpocedura Insert are ca scop inserarea unui cuvint(sursa )intr-un sir dat. Sintaxa
sa este
PROCEDURE insert (sursa : STRING ; VAR s :STRING ; index : INTEGER) si
este apelata prin
insert(sursa, s, index)
unde :
sursa este cuvintul ce trebuie inserat;
s este sirul in care este inserat cuvintul ;
index este pozitia din sirul s incepind cu care se insereaza cuvintul.
In urma inserarii sirul rezultat nu trebuie sa depaseaca 255 se pierd. Daca
index este mai mare decit lungimea s, sursa va fi alaturat lui s.
Exemplu :
PROGRAM inserare ;
VAR s,x : STRING[20] ;
BEGIN
s :AUTOMOBIL;
x := CLUBUL;

34

Insert (x,s,11); {s=AUTOMOBIL CLUBUL}


write(sirul nou=,s)
END.
3. Procedura Str converteste o valoare numerica intr-un sir de caractere.
Sintaxa sa este
PROCEDURE str(x[ :lung[ :zecimale]) ;VAR s :STRING)
unde:
x-este o variabila reala sau intreaga a carei valoare se converteste intreg sirul
lung-apare daca dorim sa precizam dimensiunea in caractere a sirului numeric
generat. Zerourile nesemnificative se vor inlocui cu spatii. Daca sirul numeric
generat e mai mare decit lung, atunci s va contine rezultatul corect ;
zecimalele daca este present precizeaza, in cazul valorilor reale, lungimea
partii zecimale;
s este o variabila STRING ce contine sirul de caractere obtinut dupa executia
procedurii. Sirul s obtinut va fi aliniat la dreapta.
Daca lung lipseste sau este prea mic, atunci x va fi reprezentat pe atitea caractere
cite sint necesare.
Exemplu :
PROGRAM siruri;
VAR x : INTEGER; y :REAL; sir : STRING;
BECIN
x:=2478;
str(x,sir); writeln(sir); {sir=2478}
y :=-12.59;
str (y : 10 : 2, sir);
writeln(sir) {sir=

-12.59}

END.

35

In urma executiei procedurii Str valoarea intrega 2478 a variabilei x va fi


transformata in sirul 2478 iar valoarea reala-12.59 a caribilei y va fi transformata in
sirul

-12.59.

4. Procedura Val are rol invers procedurii Str, adica transforma continutul unei
expresii de tip STRING intr-un numar. Procedura are sintaxa
PROCEDURE val (s : STRING; VAR x: tip_ numeric; VAR cod :
INTEGER);
unde
s este expresia de tip STRING;
v este variabila reala sau intreaga in care se depune rezultatul transformarii;
cod contine, in urma pelului procedurii, in codul de eroare care este de erori,
cod
=0 . Propcedura ignora blancurile conducatoare din sir.
Instructiunea de appel are sintaxa
val(s,v,cod)
unde s,v ,cod au semificatiile de mai sus.
Exemple :
PROGRAM conversie ;
VAR sir STRING ; v, cod :INTEGER ;
BEGIN
sir :=12579;
val(sir,v,cod);{ v=12579-numar intreg}
write(v=,v,,cod)
END.
5. Functia Concat concateneaza intr-un singur sir o suita de siruri. Sintaxa sa
este
FUNCTION concat(s1 [,s2..] : STRING):STRING

36

unde s1,s2,sint constantate sau varibile STRING.


Sirul obtinut nu trebuie sa depaseasca 255 caractere. Caracterele cu numar de
ordine peste 255 se pierd.
Exemplu :
PROGRAM unire ;
VAR s1,s2,s3 : STRING[8] ;s :STRING[20];
BEGIN
s1 :=CEL ;s2 :=MIRCEA; s3 :=BATRIN.
s :=contact(2,s1,s3);
write(s)
END.
Programul va afisa textul MIRCEA CEL BATRIN;
Aceasta functie se poate inlocui cu operatorul +, deci
s: =s2+s1+s3
are acelasi effect cu s :=Concat(s2,s1,s3).
1) Functia Copy se foloseste pentru a extrage un subsir dint-un sir de
caractere.
Sintaxa functiei este
FUNCTION copy(s : STRING ; index, n : INTEGER): STRING
Unde:
s este o variabila sau constanta de tip STRING din care se extrage un cuvint
(subsir) ;
index e o variabila sau constanta intraga ce precizeaza numarul de ordine
de la care incepe extragerea cuvintului ;
n reprezinta numarul de caractere extras din sir.

37

Daca n este mai mare decat lungimea sirului atunci nu se extrage nici un
cuvant. Daca n este mai mar decat numarul de caractere ramase dupa index atunci
numai aceste caractere vor fi returnate.
Exemplu :
PROGRAM extragere ;
CONST sir=,UNIVERSITATEA DIN TIMISOARA
VAR cuvant :STRING[13] ;
BEGIN
cuvant :=copy(sir,1,13) ;{cuvant=UNIVERSITATE}
writeln(cuvant) ;
cuvant :=copy(sir,15,3) ;{cuvant=DIN}
writeln(cuvant)
END.
2) Functia Lenght furnizeaza lungimea actuala a unui sir de caractere. Ea are
sintaxa
FUNCTION length(s:STRING):INTEGER;
unde s este o variabila de tip STRING.
Exemplu :
PROGRAM lung;
CONST sir=BARBAROASA;
VAR lu:INREGER;
BEGIN
lu:=length(sir); write(lungimea=,lu)
END.
3) Functia Pos furnizeaz pozitia unui cuvant intr-un sir. Sintaxa functiei este
FUNCTION pos(cuvant,s:STRING):BYTE
unde

38

cuvantul este subsirul cautat in sir;


s este sirul in care se cauta.
Daca cuvantul nu se gaseste in sirul s atunci valoarea functiei este zero.
Exemplu:
PROGRAM pozitie;
CONST s=NABUCODONOSOR;
VAR cuvint :STRING ; p : BYTE
BEGIN
cuvant=DON
p:=pos(cuvant,s)
write(pozitia=,p)
END.
9) Procedura FillChar initializeaza o zona de memorie cu acelasi caracter.
Sintaxa ei este
PROCEDURE fillchar(VAR x,n:WORD;car: tip_ordinal)
unde:
x-este o variabila de la a carei adresa incape zona de memorie de
initializat;
n-este lungimea in octeti a zonei de initializat ;
car-este o expresie de tip_ordinal,0ord(car)255. Cu acest caracter va fi
initializat fiecare octet al zonei definite.
Exemplu :
PROGRAM incarcare ;
TYPE litere=A..Z ;
Var car : litere ; i :INTEGER;
vector: ARRAY[1.10] OF CHAR;
BEGIN

39

car:=Y;fillchar(vctor,10,car);
FOR i:=1 TO 10 DO write(car)
END.
Dupa executia programului fiecare octet in vector va fi incarcat cuY si se va afisa
YYYYYYYYY.
TIPUL FILE
NOTIUNE DE FISIER
Dupa cum este cunoscuta una din componentele de baza ale unui sistem de
calcul este memoria centrala sau operativa(RAM) cu rolul de a stoca programul,
informatiile prelucrate de aceasta, rezultatele intermediare si finale. Ea este foarte
rapida dar de capacitate nu prea mare. La Calculatoarele Personale aceasta este de
obicei de 640 kocteti. La locatiile memoriei RAM, programul era acces direct fie
pntru inregistrarea, fie pentru etragerea informatilor. Acest tip de memorie este
volatila asu nepermamenta, adica

continutul ei se distruge la intreruperea

alimentatiei electrice. Daca volumul de informatii care trebuie memorat in vederea


prelucrarii este prea mare este posibil ca memoria RAM sa nu fie suficienta, deci nu
poate fi stocata informatia in ea. Nu este posibil nici transportul de la o localitate la
alta daca informatia ar fi stocata in memoria RAM
In afara de memoria operativa sistemele de calcul mai dispun si de o memorie
auxiliara sau interna realizata pe suporturi externe de informatii e obicei acestea
fiind suporturi magnetice (discuri si benzi) care se caracterizeaza prin aceea ca pot
retine cantitati foarte mari de informatii(de ordinul zecilor

sau sutelor de

Megaocteti ; 1Mo=106 octeti), nu sunt volatile si permit transportul si perlucrarea pe


alte sisteme de calcul compatibile.

40

Schimbul de informatii om-calculator se face totdeauna prin intermediul


ispozitivelor periferice : claviatura, ecran, imprimanta etc. Intotdeauna si extragerea
informatiilor in si din calculator se face prin intermediul instructiunilor de
intrare/iesire( citira/scriere).
Pentru inregistrarea(scriere) informatilor pe un support extern precum si
consultarea(citirea) lor inn vaderea prelucrarii, limbajului TurboPascal dispune de un
concept foarte general numit fisier(file in limba engleza).
Definitie. Un fisier este o colectie, organizata de obicei pe un suport extern,
de date numite componente(sau articole), toate componentele avand aceeasi structura
si acelasi tip.
Componenta (articolul) este unitatea logica cea mai mica care e accesata in
operatiile de citire/scriere. Numarul de componante
dinainte, iar

al fisierului nu e cunoscut

compomentele nu au indici ca la tablouri. Componentele sunt

inregistrate in fisier una dupa alta. Spunem ca fisierul este o organizat secvential. In
Turbo Pascal exista mai multe tipuri de fisiere care pot fi definite. In toate tipurile de
fisiere Turbo Pascal la fiecare componenta a fisierului se poate ajunge numai daca sau parcurs toate componentele acestuia care o preced. In acest caz spunem ca
accesul la componenta este secvential. Pentru anumite tipuri de fisier este permis si
accesul direct la o componenta.
Exemple de fisiere.
1. Informatiile despre studentii unui an de studiu inregistrate pe un disc
magnetic, fiecare componenta a fisierului retinand informatiile despre un
student.
2. Informatiile despre persoanele unei intreprinderi si adresele lor aparut pe
un ecran TV etc, fiecare articol continand informatiile despre o persoana
di adresa sa
Proprietati.

41

1. Suportul fizic al fisierului este extern : imprimanta, disc sau banda magnetica,
ecran TV,claviatura( dispozitive periferice). Oricarui dispozitiv periferic ii este
asociata o structura de fisier, adica o organizarelogica a infornatiilor ce
corespunde unei animute tehnici de aranjare a acestor date.
2. Deoarece, in general, numarul componentelor unui

fisier nu se cunoaste

dinainte este necesara punerea in evidenta a sfarsitului de fisier. Acesta se face


printr-un caracter special numit marca de sfarsitului de fisier, notata EOF(de la
End Of File= sfarsit de fisier). Pentru fisiere TEXT,aceasta este caracterul ^Z.
daca un fisier nu are inregisrata nici o componenta atunci el se numeste vid

Marca EOF
articol

A) fisier nevid

B) fisier vid

3. Un program nu poate prelucra niciodata direct informatiile dintr-un fisier.


Pentru a putea fi prelucrate, informatiile din fiecare componenta, trebuie transferate
mai intai succesiv in memoria centrala. La un moment dat programul nu poate avea
acces decat la o singura componenta a fisierului si aceasta nu direct ci prin
intermediul unei zone de memorie centrala de aceeasi marime si structura cu
componentele fisierului numit zona tampon(buffer), creata automat de sistem
compilarii variabilei de tip fisier.
4. Asupra fisierelor pot fi efectuate urmatarele operatii:
a) Operatia de creare(scriere) a fiierului prin care continutul zonei de memorie
care stocheaza o variabila de tip dat este inregistrata ca o componenta a fisierului
prin intermediul zonei tampon, dupa care fisierul avanseaza cu o pozitie.

42

b) Operatia de consultare(citire) a fisierului prin care continutul unei


componente(articol) al fisierului este transferat im memoria centrala in zona unde
este stocata o variabila, tot prin intermediul zonei

tampon, dupa care fisierul

avnseaza o pozitie. Prin citire continutul nu se modifica.


Localizarea fizica a
variabilei fisier in
memoria centrala

Memorie
centrala

citire

scriere

fisier

In exploararea fisierelor, odata cu initierea operatiilor de citire/scriere, se


asciaza fiecarui fisier un indicator numit si pointer de fisier care indica adresa
relative a unei componente a fisierului fata de inceputul fisierului. Prin urmare
pointerull de fisier indica numarul de ordine al componentei, prima componenta
avand numar de fisier indica numarul de ordine al componetei, prima componenta
avand numarul de ordin zero. In urma fiacarei citiri sau screri, pointerul de fisier va fi
marit cu 1(unu).
5.Orice operatie de acces la un fisier, fie pentru scriere fie pentru citire nu
poate avea loc decat in urma executiei unei executiei unei proceduri dedechidere
a fisierului. Dar daca un fisier este dechis pentru citire acelasi fisier este inchis pentru
scriere si invers.

43

Prin urmare, un fisier nu poate fi simultan deschis si pentru scriere si pentru citire. La
deschiderea fisieruluipointerul de fisier se plaseaza totdeauna pe prima componenta a
fisierului(daca fisierul nu e vid) sau pe marca EOF(daca fisierul e vid). La fiecare
executia a unei operatii asupra fisierului pointerul de fisier e marit automat cu 1. La
fiecare operatie de citire, laun moment dat, acest pointer va ajunge pe marca EOF,
pentru fisierul f consultat. Acest moment este pus in evidenta de o functie booleana
eof(f) care intoarce rezultatul TRUE si FALSE daca nu s-a atins marca EOF.
Inchiderea unui fisier se face automat la iesirea din blocul in care s-a folosit
fisierul(program principal sau subprogram) sau prin apelul unei proceduri speciale de
inchidere numita CLOSE.
Orice fisier este precedat de anumite informatii scrise de sistem prin care se
identifica numele sau, dupa care urmeaza informatia utila(componentele) urmate de
marca EOF.
6.Fisierele Turbo Pascal sunt gestionate prin anumite procedeuri si functii
dintre care prezentam pe urmatoarele, unde f va desemna o variabila fisier.
a) Reset(f) deschide fisierul pentru citire (consultare). Executia procedurii are
ca efect pozitionarea pointeruli d fisier pe prima componenta a fisierului si
copierea acesteia in zona tampon a acesuia. Valoara lui eof(f) va fi FALSE
daca fisierul nu e vid, in caz contrar valoarea sa va fi TRUE.
Inaite de reset(f).

44

pointer

EOF

Dupa reset(f)
pointer
f

transfer
buffer

b) Rewrite(f)-deschide fisierul pentru scriere(creare) . volorile fisierului f sunt


distruse, marca EOF fiind plasata la inceputul fisierului, pointerul de fisier
fiind plastat la nivelul componentei zero. Valoarea lui eof(f) este TRUE.
f

pointer

EOF

Observatie. Trebuie avut grija pentru a nu da un rewrite(f) accidental care sa


stearga continutul unui fisier f.
c) Close(f)-procedura a carei appel are ca efect inchiderea logica si fizica a
fisierului f.
d) Assign- ataseaza un fisier logic unui fisier fizic. Prin assign se precizeaza
dispozitivul periferic unde va fi stocat fisierul fizic. In momentul compilarii
unei variabile de un anume tip , altul decit fisierul , se determina locul unde
acesta este stocata inmemorie. In cazul variabelelor de tip fisier acest loc de
stocare al variabilei nu va fi determinat in timpul compilarii ci in timpul

45

executiei, prin procedura assing . in timpul compilarii, pentru variabile de tip


fisier vor fi rezervate zone in care se retin informatii necesare exploatarii
fisierului informati ce vor fi luate din fisierul fizic la deschiderea acestuia.
Instrctiuni de appel de procedura asign are sintaxa ;
assign(f,nume')
sau
sir :=nume
assign(f,sir);
unde:
f-este numele variabilei fisier,
nume-este un sir de cel mult 256 caractere ce contin numele fisierului fizic
cu care se pune in corespondenta fisierul f.
Tipul lui sir este STRING. Numele fisierului fizic poate fi cel obosnuit
xxxxxxxx.yyy
format din numele xxxxxxxx, de 1-8 caractere ; urmat de un punct si de axtensia
yyy, de 1-3 carctere.
Exemplu :
ssign(f,buget.92).
Nume poate fi si numele unei unitati standard :
CON-pentru consola,
LPT1(=PRN), LPT2, LPT3- pentru imprimante,
KBD(Ky BorD)-pentru tastatura, fiind admisa numai citirea, s.a.
Apelul procedurii assign este obligatoriu la orice utilizare a fisierelor. Sint
necesare atitea instructiuni de appel assign cite fisiere exista in program.
In Turbo Pascal exista urmatoarele structuri de tip fisier :
-fisier cu tip,
-fisier TEXT ;

46

-fisier fara tiparire.

FISIERE CU TIP
Fisierul cu tip este o structura de date in care fiecare componenta (articol) are acelasi
tip numit tipul de baza al componentelor. Declaraera sa se face in sectiune TYPE
si are urmatoarea sintaxa.
TYPE
tip_baza=
nume= FILE OF tip baza
unde tip- baza poate fi orice tip, exceptind tipul fisier.

Exemplu :
TYPE
int=1..100;
fisint =FILE OF int;
complex= RECORD x,y : REAL END;
fiscomplex=FILE OF complex;
mul= SET OF mul;
txt = FILE OF CHAR.
In acest exemplu s-au definit tipurile: fisint-care este un tip fisier de intregi
intre 1si100, fiscomplex-un tip fisier de numere complexe definite ca RECORD,
fismul- un tip fisier de multimi si txt-ca fisier de caractere.
Definirea unei variabile f de tip fisier se face in sectiune VAR cu sintaxa

47

TYPE fisier= FILE OF t ;


VAR f : fisier ;
Caz in care s-a definit tipul anterior in sectiune TYPE sau direct prin
VAR f : FILE OF t;
unde t este tipul de baza al componentelor.
Oservatie : declararea unei variabile f de tip fisier are drept consecinta
declararea implicita a unei variabile notata cu
f1 sau f@
de acelasi tip cu componentele fisierului f si care defineste zona tampon asociata
(buffer). In limvajul Pascal standard aceasta varibila este folosita in procedurile PUT
si GET care in Turbo Pascal nu exista explicit.
Dupa apelul procedurilor assign(f) , reset(f), rewrite(f)varibila f va contine
informatii referitoare la fisierul fizic atasat.

CREAREA FISIERULUI
Scrierea informatiei intr-un fisier cu tip se face prin apelul procedurii write, cu
sintaxa:
write(f,v)
unde f este variabila ce desemneaza fisierul, deschis pentru scriere, iar v este o
variabila de tipul de baza al componentelor.
Daca inainte de executia lui write(f,v) situatia in fisier era

48

dupa executia lui write(f,v) situatia in fisier este


f

valoarea variabilei v fiind copiata in componenta fisierului f.


Observatie. De fiecare data marca EOF se afla ultima componenta
(articol)scrisa.
APLICATIE. Sa se intocmeasca programul Turbo Pascal prin care se citesc
de la claviatura patru numere, pentru variabile intregi a,b,c,d si cu aceste numere sa
se construiasca un fisier.
Program Turbo Pascal este urmatorul :
PROGRAM numere;
{construirea unui fisier de numere intregi}
VAR a,b,c d :INTEGER ; f : FILE OF INTEGER ;
BEGIN
assign( f ,fisier. int);
rewrite(f);
read(a) ; write( f, a);
read(b) ; write( f, b);
read(c) ; write( f, c);
read(d) ; write( f, d);
END.

49

Se observa ca s-a declaram f ca un fisier de intregi. Instructiuni de apel de


procedura assign(f,fisier,int) ataseaza un periferic fisierului f, numele fisierului fizic
fiind fisir.int. procedura rewrite(f) dechide fisierul f pentru scriere. In textul de
program de mai sus se observa ca apare de patru ori instructiunea de scriere in fisier.
Partea de instructiuni s-ar putea scrie mai scurt astfel
BEGIN
assing(f, fisier,int) ; rewrite(f)
read(a,b,c,d); write(f,a,b,c,d,)
END
adica , secventa de instructiuni write(f,a); write(f,b); write(f,c),write(f,d); este
echivalenta cu instructiunea write(f,a,b,c,d). deci, mai general, sintaxa instructiunii
write, pentru fisirele cu tip este
write(f,v1[,v2...])
unde v1, v2,sint variabile de tipul articolelor fisierului f.
Dupa fiecare scriere pointul de fisier isi mareste valoarea cu 1.
In general schemele pentru scrierea componentelor unui fisier folosind
varintele cu WHILE si REPEAT sint urmatoarele:
a) rewrite(f) ;

b) rewrite(f) ;

WHILE creare_fisier DO

REPEAT

BEGIN

{creare componenta}

{creare componenta}

write( f, componenta)

write( f, componenta)

UNTIL NOT creare_fisier;

END;
Intr-un caz concret, {cerare componenta}, se va inlocui cu un grup de
instructiuni prin care se determina componenta(varibila) care trebui scrisa in fisier.
Creare_fisier este conditia care trebuie sa fie adevarata tot timpul cit se creaza
fisierul si falsa cind crearea fisierului s-a terminat.

50

De obicei, conditia creare_fisier se poate realiza practic astfel. Se defineste o


variabila, de exemplu simbol de tip CHAR a carei valoare D(de la DA) se citeste de
la tastatura dupa fiecare scriere in fisier. Daca se tasteaza orice alt caracter in afara de
caracterul D atunci se paraseste ciclul. Deci, am putea avea schema :
PROGRAM p ;
VAR f :FILE OF INTEGR ; x :INTEGER ;simbol :CHAR ;
BEGIN
assigin(,fis);
rewrite(f)
REPEAT

readln(x);
write(f,x);
writeln(mai sunt date de intrare DA/NU?)
reardln(simbol)
UNTIL simbol<>D
.
END.
Se pot imagina si alte modalitati de a termina crearea unui fisier, de exemplu
de a da pentru un camp o valoare pe care stim sigur ca nu o poate lua niciodata.
Daca numarul de componente al fisierului este cunoscut atunci scrierea acestor
componente in fisierul s-ar putea face printr-o instructiune FOR, de exemplu,

rewrite(f)
FOR i :=1 TO 100 DO

51

BEGIN
k:=i*i
write(f,k)
END;
prin care se scriu patratele numerelor de la 1 la100 in fisierul f.

FISIERE FARA TIP


In fisierele cu tip(adica FILE OF) ,prezentate anterior,lungimea fiacarui
articol este fixa si este data de numarul de octeti rezervat variabilei avand tipul de
baza t al fisierului. De exemplu, pentru declararea
VAR f :FILE OF t ;
fiecare articol va avea o lungime de :
2octeti=16 biti daca t este INTEGER,
4 octeti=32 biti daca t este LONGINT
6 octeti=48 biti daca t este REAL
Daca t este
TYPE t= RECORD nume :STRING [20] ;varsta :BYTE END ;
VAR f :FILE OF t ;
atunci fiecare articol va avea o lungime de 20+1=21 octeti.
In afara de fisierele cu tip, limbajul TurboPascal(5.0-6.0) permite si definirea
fisierelor fara tip(FILE). Aceste fisiere sunt vazute de un program Turbo Pascal ca
fiind formate dintr-o multime de blocuri(articole), fiecare bloc avand o lungime fixa
(implicit -128 octeti), dar aceasta lungime a sa poate fi modificata de programator
prin intermediul procedurilor reset si rewrite.
Sintaxa declararii unei variabile f ca fisier fara tip este

52

VAR f:FILE

In legatura cu fisierele fara tip(FILE) se folosesc, ca si la fisierele cu tip,


procedurile assing, reset,rewrite, seek precum si functia FilePos ai caror parametrii
au semnificatiile cunoscute.
Am spus ca dimensiunile implicita a blocului(articolul) este 128 octeti. La
deschiderea fisierului cu procedurile reset sau rewrite aceasta dimensiue se poate
modifica folosind porcedurile respective cu sintaxa
reset(f,recsize)

sau

rewrite(f, recsize)

astfel
VAR f :FILE ;
recsize :WORD ;

BEGIN

recsize:=;
..
reset(f,recsize);
..
rewrite(f,recsize)

END.
unde recsize este o variabila sau constanta de tip WORD.
De exemplu, putem atribui lui recsize valoarea 256 prin
recsize:=256
caz in care blocurile vor fi interpretate ca avand o lungime de 256 octeti.

53

La crearea fisierului f articolele(blocurile) sunt numerotate incepand cu


0(zero). Acest fapt,precum si acela ca toate blocurile au aceeasi lungime, conduce la
posibilitatea accesului direct la articole,intocmai ca la fisierele cu tip, folosind pentru
aceasta functie FilePos si procedura seek(f,n).
Particularitatea fisierelor fara tip consta in aceea ca pentru crearea fisierului se
foloseste o procedura mai speciala de scriere a blocurilor, numita BlockWrite a carei
instructiune de apel are sintaxa :
blockwrite(f,Buf,Count[,Result])

unde :
f- este variabila fisier ;
Buf- este o variabila de tip arbitrar ;
Count-este o variabila sau constanta de tip WORD cu rolul de a preciza
numarul

maxim de blocuri ce urmeaza a fi scrise ;

Result este o variabila de tip WORD, optionala, cu rolul de aretine numarul


blocurilor scrise dupa executia procedurii. Pentru verificarea scrierii se poate afisa
continutul variabilei Result.
Observatie. Procedura utilizeaza variabila Buf de un tip arbitrar precizat de
utilizator,pentru furnizarea adresei de incept panrtu scrierea blocutilor, adica
blocurile sunt scrise unele dupa altele in fisierul f incepand cu adresa lui Buf.
Pentru consultarea (citirea) fisieruli f se foloseste procedura speciala Blok
Read a carei instructiune de apel are sintaxa.
blockwrite(f,Buf,Count[,Result])

parametrii avand o semnificatie asemanatoare. Aici insa Count specifica numarul


maxim de blocuri care se citesc.

54

Exemplu : Se citesc doua numere reale a, b si se calculeaza m, media


artimetica a celor doua numere. Cu numerele a, b,m se formeaza un fisier fara tip
care apoi se consulta valorile fisierului.
Programul este urmatorul :
PROGRAM medie ;
VAR a,b,m: REAL ; resl,res2,res3:WORD;
f:FILE;
BEGIN
assign(f,nume.1)
rewrite(f);
readln(a,b); m:=(a+b)/2;
blockwrite(f,a,1);blockwrite(f,b,1);blockwrite(f,m1);
reset(f);
blockread(f,a,1,res1);
writeln(a=,a:8:1,res1=,res1)
blockread(f,b,res1)
writeln(b=,b:8:1,res2=,res2)
blockread(f,m,res3)
writeln(,m=,m:8:1,res3=,res3)
END.
Insructiunea de apel blockwrite(f,a,1) produce scrierea unui bloc
(Count=1)incepand cu adresa data de valabila a, blocul avand o lungime de 128
octeti. Deci scrierea lui a in fisier se face pe 128 octeti si nu pe 6 cat e necesar pentru
variabilele de tip REAL (reset are doar parametru f). Daca se dorea scrierea
blocurilor de 10 octeti lungime,trebuie specificat reset(f,10). Analog pentru
rewrite(f,10).

55

In blockread(f,a,1,res1) am furnizat si f si adresa blocului si numarul de


blocuri maxim care se citest cat si res1- variabila in car se retine numarul blocurilor
citite efectiv.
Programul ar putea fi conceput si altfel :
PROGRAM medial ;
VAR f : FILE ;
a :ARRAY[13] OF REAL
result:WORD;i:INTEGER;
BEGIN
assign(f,top);
rewrite(f,6);
a[1]:=3.4; a[2]:=6.2;
a[3]:=(a[1]+ a[2])/2;
blockwrite(f,a,3,result);
writeln(result=,result);
reset(f,6);
blockwrite(f,a,3);
FOR i:=1 TO 3 DO write(a[i]:8:2)
END.
In aceasta varinta s-au declarat blocuri de lungime de 6

octeti(prin

rewrite(f,6)). Blockwrite (f,a,3,result) asigura scriarea in fisierul f si 3 blocuri de


lungime 6 octeti fiecare, incepand cu adresa lui a(adresa de inceput a vectorului a).
Programul va furniza urmatoarele date:
Result=3
3.40

6.20

4.80

56

FISIERE TEXT
Schimbul de informatii om-calculator realizat prin intermediul perifericelor
(tastatura, ecran, imprimanta) se face sub forma de sir de caractere. De exemplu,
pentru a transmite constanta 324 programului,utilizatorul transmite de fapt
delatastatura sirul de caractere3,2,4.
Deoarece terminalele au un anumit mod de constructie si functionare acest fapt
duce la subdivizarea informatiilor memorate pe ele sub forma de linii (linii de
tastatura, linii de ecran, linii de imprimare).
Pentru definirea fisierelor particulare constitue din caractere si subdivizate in
linii limbajul TurboPascal dispune de un tip de fisier predefinit numit TEXT si care
este folosit ca si cand ar fi fost declarat prin.
TYPE TEXT= FILE OF CHAR
Adica este un fisier cu articole de tip CHAR cu particularitatea ca este
subdivizat in linii. Declarate de mai sus nu trebuie sa apara in program.
Declararea unei variabile f ca fiind de tip TEXT se face in sectiunea VAR
astfel :
VAR f:TEXT

Fisierele de tip TEXT se incadreaza in teoria generala a fisierelor secventiale


cu tip(adica e un fisier de tip FILE OF CHAR), deci despre ele raman variabile cele
spuse acolo, insa particularitatea acestor fisiere de a subdivizate in linii implica
existenta uneimarci de sfarsit d linie(CR/LF). Aceasta marca de sfarsit de linie
este pusa in evidenta de o functie booleana eoln(f),(coln=End Of LiNe). In cazul

57

tastaturii aceasta marca e inregistrata odata cu apasareatastei Enter. Lungimea


fiecarui articol este de un caracter. Sfarsitul unui fisier TEXT este marcat de
caracterul (^Z).

58