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
Forma b) cu parametrii formali, cu sintaxa
unde
-nume este un indentificator Pascal, unde si este numele procedurii;
-(l1:t1;;ln: tn) repreinta listele parametrilor formali si a tipurilor acestora,
daca multimea acestora nu e vida; li : ti, i!1,",,n sint separate prin
caracterul #i$( punct si vir%ula) 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 pro%ram diferit doar
prin antet (instructiunea de inceput).
PROCEDURE nume(&VAR' l1: t1; &VAR' l":t(; &VAR' ln: tn);
&sectiunea declaratiei'
BEGIN
&instructiunii'
END;
1
PROCEDURE nume;
&sectiunea declaratii'
BEGIN
& instructiuni'
END
") )ntr-o declaratie de procedura sunt obli%atorii doar antetul de procedura
si instructiunea compusa *+,)-.+-..
() Orice identificator folosit in ona 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 pro%ramul din
care face parte procedura in care ca variabila are valoare %loabla /dac aceiasi
variabila nu este declarata si in procedura
0) .aca un identificator cu acelas nume fi%ureaa si este declarat si in
pro%ramul principal si in subpro%ram(procedura functie), atunci semnificatiiele lui
sunt diferite in pro%ramul principal si subpro%ram


FUNCTII PASCAL
O functie 1urbo Pascal are o structura sintactica asemanatoare cu a unui
proceduri 1urbo Pascal. 2intaxa functiei este urmatoarea:
unde:
tip nume este valorii pe care o ia nume sip e care o va returna pro%ramului
apelat. +l poate fi : intre%, real, 3456, *OO7+5-, pointer, 216)-,. O functie
calculeaa o valoare ce se asociaa numelui functiei nume, prin urmare este necesara
"
F8-31)O- nume (&956' l1:t1;&var' l":t";;
&var' ln:tn):tip nume;
&sectiunea declaratii locale'
*+,)-
:..;
:-8<+ :!. ;; sectiunea instructiuni
:..;
+-.:
preciarea tipului numelui. .e asemenea este necesara, in cadrul sectiuni de
instructiuni, preenta numelui functiei: nume cel putin odata, in membrul stin% a unei
instructiuni de atribuire. 2pecificarea tipului de functie se face in antet. )n urma
executiei unei functii reultatul obtinut este atribuit numelui functiei, prin
intermediul caruia se face returnarea acestui reultat.
li:ti sint declaratori de tip aiparametrilor formali si au aceeai semnificatie ca
la proceduri. 7a functii lista parametrilorformali nu poate fi vida.
+xemplu. 2a se elaboree o functie 1urbo Pascal care sa calculee minimul a
doua numere reale.
Functia este urmatoarea :
FUNCTION min(,=:REAL) : REAL;
BEGIN
)F >?@
THEN min:!x
ELSE min:!=
END.
)n acest exemplu numele functia sint x si = tip 6+57 acest lucru fiind preciat
astfel:
FUNCTION min(..) :REAL;
Parametrii functiei sint x si = de tip 6+57 si sunt parametrii formali-
constante.
2e observa ca in caul functiei numele min apare de doua ori partea stan%a a
unei instructiuni de atribuire.
IF > ?@
THEN

ELSE
(
min :!x

END.
5pelul functiei se face prin numele sau, urmat in parantea de lista
parametrilor actuali, nume ce apare in cadrul unei expresii. )n apelul functiei
parametrii actuali nume ce apare in cadrul unei expresii de acelasi tip cu parametrul
formal corespunator. 3a si la apelul procedurilor parametri actuali trebuie sa se
corespunda cu parametrii formali in numar, ordine si tip.
5plicatia 1. 2e citesc in pro%ramul principal n parecAi de numere reale (a,b)si
se cere sa se calculee si sa se afisee pentru fiecare perecAe citita tripletul
(a,bmin(a,b)) pentur calculul lui min (a,b) folosind o functie.
Pro%ramul este urmatorul :
PROGRAM minim ;
VAR ,a,b, :REAL ; i, n :INTEGER ;
BEGIN
write(Bdati n:C);readln(n);
FOR i :!1 1O n .O
BEGIN
write(Bdati a si b:C) readln(a,b)
:!min (a,): :apel functie;
0
min :!=
FUNCTIONmin(x,=:REAL):REAL;
BEGIN
)F x?=
THEN min:!x
ELSE min:!=
END;
write (a:D:", b:D:",Cmin!C, :D:").
END
END.
)n pro%ram era posibila ca in loc de
:!min(a,b);
write(a:D:", b:D:",Cmin!C, :D:").
sa scriem doar
write(a: D:", b:D:",Cmin!C,min!(a,b):D:").
APLICATIA 2. 2a se scrie un pro%ram Pascal care sa citeasca doi vectori
reali a,b de dimensiuni n si care sa calculee produsul scalar al celor doi vectori,
precum si a lun%imii fiecarui vector, folosind in aceste scopuri o sin%ura functie. 2e
va afisa valoarea produsului scalar precum si valorile lun%imilor celor doi vectori .
6eolvare . Pentru calculul produsului scalar a doi vectori a! (ai), b!(bi) si a
lun%imii unui vector x!(xi) se folosesc formulele
p!?a,bE!

n
i
b a
1
" , 1
"
l
x
!

n
i
x
1
"
Pro%ramul este urmatul :
PROGRAM vectori :
CONST n!1F
TYPE vector ! ARRAY &1..n' OF 6+57;
VAR ) :INTEGER: a,b: vector; la, lb, REAL;
FUNCTION produs(x,= : vector) :6+57;
VAR s :REAL ;
BEGIN
s:!F
FOR i:!1 TO n DO s:!sGx&i'H =&i'
produs:! s
I
END;
BEGIN
FOR i:!1 1O n .O
BEGIN
write(Ba&B,i,C'!C); readln(a&i')
END;
writen
FOR i:!1 1O n .O
BEGIN
write(Bb&B,i,C'!C); readln(b&i')
END;
writen;
p:!produs(a,b); writen(Bprodus scalar!C,p:1F:();
la:!produs(a,a); la:!!"rt(la)
writen(Blun%imea vectorului a !C,la :1F :() ;
lb :! produs(b,b) ;lb :!!"rt(lb) ;
writen(Blun%imea vectorului b!C,lb :1F :()
END
Pentru obtinerea produsului s-a folosit in functie variabila locala s. )n functie
nu este corecta folosirea formei, de exemplu,
produs:! F
FOR i:! 1 TO n DO produs:! produsG x&i'H=&i';
.eoarece numele functiei produs fi%urand si in dreapta semnalul:! ar aprecia
un apel recursive al functiei, teAnicace este permisa in 1urbo Pascal, dar intr-o forma
ce va fi preciata ulterior.
Parametrii formali din antet nu pot fi datio astfel
F8-31)O- produs(x,=:5665@&1.n' OF 6+57): 6+57;
D
.eoarece acestea se dau in forma li:ti unde li sunt parametric formali, iar ti
sunt identificatori de tip ce apar in sectiunea 1@P+ sau sunt predefiniti.
5plicatia (. 2a se citeasca in pro%ramul principal perecAi de caractere (c1,c")
si sa se preciee daca cele doua caractere sunt identice sJau distincte, folosind in
acest scop o functie. )n pro%amul se va afisa perKecAe citita
cuvantulCCidenticCCsauCCdiferitCC,dupa ca, impreuna cu perecAea de caracter.
6eolvare. Functia o vom denumi e%alitate. +a este o functie de tip
*OO7+5- avand parametrii(a%umentele fictive) de tip 3456.
Pro%ramul este urmatorul:
PROGRAM test;
VAR c1,c",s=mbol:CHAR;
FUNCTION e%alitate(c,d:CHAR):BOOLEAN
BEGIN
e%alitate;!c!d
END:
BEGIN
REPEAT
write(Bdati caracterele c1,c":C)
re#$n (c1,c");
IF e%alitate(c1,c")
THEN writen(c1,C C,c" ,C identiceC)
ELSE writen(c1,C C,c",C diferite);
writen;
writen (Balte caractereL (.aM-uC);
re#$n(simbol)
UNTIL simbol?EC.C
END.
N
3itirea se va face atat timp cat utiliator apasa tastaC.C
)n acest pro%ram apelul functiei este e%alatate(c1,c") ce apare in expresia
booleana din cadrul instructiunii IF.
IF e%alitate (c1,c") THEN..ELSE..
5 se mai observa forma foarte nsimpla a in structiunii de atribuire din functie
e%alitatea :!c!d
fata de o alta varianta posibila ca
IF c!d
THEN e%alitate :!TRUE
ELSE e%#it#te:! FALSE
5plicatia 0. se citeste o matrice reala 5!(aiO) de tip mxn care se afiseaa. 2e
cere sa se calculee noema matricei 5. notataP5P care se afiseaa si apoi se
construieste o alta matrice notata tot 5 , dar ale carei elemente sunt insa aiOM P5P. 2e
afisaea noua matrice.
6eolvae. )n cadrul pro%ramului se vor executa urmatoarele :
-citirea matricei 5 se va face folosind o procedura numita citire ;
-afisarea matricei 5 si a matricei 5-modificate se face cu o procedura tipar ;
-calculul normei se face intr-o functie cu numele norma, folosind formula
n
P5P!max QRaiOR
1SiTm O!1
3alculul 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.
3alcuul noii matrici se va face in pro%ramul principal. 2cAema lo%ica a
pro%ramului principal este urmatorul.
U
Pentru determinarea normei P5P se va folosi un vector v!(vi), unde
n
9i!QRaiOR, i! l,.,m si P5P!max 9i
O!1 1SiTm

,
_

amn
ain
n a
am
ai
a
.
.
.
.
.
.
1
... 1
.
.
.
... 1
.
.
.
... 11
(a11 ..a1n)Vv1

. . .
. . .
21561
3)1)6+ 5 1)P56 5
-O6<5
<5>)<
5!5MP
5P
1)P56 5
21OP
W
. . .
(ai1ain)Vvi
. . .
. . .
. . .
(am1amn) Vvm
Pro%ramul este urmatorul :
PROGRAM norme ;
CONST m!1F ; n! 1I ;
TYPE matrice! ARRAY&1..m, 1..n' OF REAL ;
VAR a : matrice ; ), O : INTEGER;nn :REAL;
PROCEDURE citrice; (VAR a : matrice);
BEGIN
FOR ) :! 1 1O m .O
FOR O :! 1 1O n .O read (a&), O')
END;
PRODUCERE tipar(a : matrice);
BEGIN
writen;
FOR ) :! &TO m DO
BEGIN
FOR O :! 1 1O n .O Krite(a&),O',C B);
writen
END
END;
FUNCTION norma(a: matrice) :REAL;
1F
TYPE v : ARRY&1..m' OF REAL
VAR v : vector; s:6+57;
FUNCTION maxim(v : vector) : REAL;
VAR max : 6+57;
BEGIN
max :!v &1'
FOR i :! " 1O m .O
IF max ?v&i' THEN max :! v&i';
maxim:!max
END;
BEGIN
FOR i :!1 1O m .O
BEGIN
2:!F
FOR O :! 1 TO n DO s :! sG abs (a&i,O');
9&i' :!s
END;
norma:!maxim(v)
END;
BEGIN
writen;
citire(a) ; tipar(a) ; nn :!norma(a)
writen(Bnorma! B,nn :1F:");
FOR i '(&TO m DO
FOR i :! 1 1O m .O a&i,O' :! a &i,O'Mnn;
writen;
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. 5pelul ei s-a facut prin
norma :! maxim(v).
TIPURILE FUNCTION SI PROCEDURE
)n afara de tipurile simple si structurate preente in capitolele anterioare
se pot declara alte tipuri de date si anumite tipul F8-31)O- si tipul
P6O3+.86+ si care au urmatoarele sintaxe :
unde :
tipXreultat este un tip: intre%,real, BOOLEAN,CHAR, STRING sau
pointer, li:ti cu i !1,", n sunt declatori de tip ai parametrilor.
5vand declarate tipurile FUNCTION !#)PROCEDURE, variabilele de
tip FUNCTION sau PROCEDURE se declara in VAR, de E*EMPLU

8nde s-au declarat f1,f" ca functii,iar sub1,sub" ca proceduri.

TYPE
numeXfunctie!FUNCTION(l1:t1;ln:tn): tipXreutat;
numeXprocedura! PROCEDURE(l1:t1;ln:tn);
VAR f1,f":numeXfunctie; sub1, sub": nume-procedura;
1"
FUNCTII SI PROCEDURI CA PARAMETRII FORMALI

)n lista parametrilor formali ai unei proceduri sau functii pot fi%ura si nume
de functii sau proceduri. .aca un parametru formal este un nume de functie sau
procedura, atunci parametrul actul corespunator actual corespunator, in apel,
trebuie sa fie de asemenea un nume de functie sau procedura.
)n implementarea 1urbo Pascal, trebuie procedat astfel :
1) 2e declara tipul FUNCTION sau PROCEDURE, ca la para%raful procent
prin TYPE
numeXfunctie!F8-31)O-(par,,par:tip) : tipXfunctie;
numeXprocedura!P6O3+.86+(par,par,..:tip:);
") )nainte de compilare directiva YF din optiuni se pune pe #ON$ adica se
activeaa:YFG;, dupa care se trece la compilarea pro%ramului.
+xemplu :
TYPE+ fun! FUNCTION(x : REAL) :REAL ;

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


BEGIN
,
END-
,
)n acest exemplu, se poate folosi in subpro%ram
FUNCTION suma(m,n : INTEGER ; f : fun) : REAL;
parametrul formal-constanta f de tip fun , deoarece s-a definit fun anterior. 7ucrurile
sint asemanatoare formali de tip 566@ sau alte tipuri structurate sau nu. 3ert este ca
1(
nu puteam folosi un parametru formal formal par, functia sau procedura, cu o
declaratie in antet astfel
FUNCTION nume(par : tip ; FUNCTIONMPROCEDURE par) : tip ;
O functie sau o procedura fl se foloseste ca parametru formal intr-o procedura
sau functie f" daca in momentul executiei luii f" trebuie calculat f1 ca un ca
particular.
2a presupunem ca avem de calculat urmatoarele sume
s
1
!

1FF
1 i
i
s
"
!

IF
(
" H
i
i
s
(
!

+
1F0
I"I
1
i
i
i
2a observam ca aici avem de a face cu o suma mai %enerala si anume
suma!

n
m i
i f ) (
unde f(i) este respectiv i, i", iM(iG1).
Pentru calculul lui suma pe forma %enerala am putea construi un subpro%ram,, de
exemplu.
FUNCTION suma(m,n : INTEGER ; f :ff) : real ;
VAR ) : INTEGER: s :REAL;
BEGIN
2 :!F
FOR i :!m TO n DO s :! sGf(i);
suma:a!s
END;
iar tipul ff trebuie declarat anterior ca functie reala de ar%ument intre%, astfel
1@P+ ff ! F8-31)O-(> : )-1+,+6) : 6+57.
10
.e exemplu, pentru calculul lui s( va trebui preciata functia f(i)! iM(iG1).
Pentru aceasta vom scrie un alt subpro%ram functia astfel
FUNCTION f( (Z : INTEGER) : REAL;
BEGIN
F(:! ZHZ
END;
)n cadrul pro%ramului, pentru calculul sumei s( , se poate folosi instructiunea
s( :! suma ("I,1F0,f().
Pentru calculul sumei s" va trebui preciata functia f(i) ! i" prin subpro%ramul
FUNCTION f"(Z:INTEGER): REAL;
BEGIN
f":! ZHZ
END;
iar apelul subpro%ramului %eneral suma se va face, de exemplu, prin
s" :!suma ((.IF.f").
5semanator pentru calculul lui s1.
Pro%ramul complet pentru calculul s( va arata astfel :
:YFG;
PROGRAM sume ;
TYPE ff! FUNCTION (x :INTEGER) : REAL ;
VAR ss :REAL;
FUNCTION f( (Z:INTEGER) : REAL;
BEGIN
f( :! AM(ZG1)
END
FIUNCTION suma (m,n :INTEGER; f: ff) REAL;
VAR ) :INTEGER ; s :REAL;
1I
BEGIN
s:! F;
FOR i:! m TO n DO s:! sGf(i);
suma:! s
END;
BEGIN
ss:!suma ("I,1F0,f();
write. Bs(!C,ss)
END.
)n instructiunea ss :!suma("I,1F0,f(),f( este un parametru actual, nume de
functie si aceasta functi este declarata in sectiunea declaratii a pro%ramului, in mod
complet.
)n momentul apelului suma prin ss :!suma ("I,1F0,f(), m vafi inlocuit cu "I,
n cu 1F0, iar f( cu expresia iM(iG1) si se va calcula s(. Pentru calculul lui s1 avem
nevoie de functia f1, subpro%ramul suma ramanind nescAimbat. Pro%ramul este
urmatorul .
:YFG;
PROGRAM sume ;
TYPE ff! FUNCTION (x :INTEGER) : REAL ;
VAR ss :REAL;
FUNCTION f1 (Z:INTEGER) : REAL;
BEGIN
F1 :!Z
END
FIUNCTION suma (m,n :INTEGER; f: ff) REAL;
VAR ) :INTEGER ; s :REAL;
1D
BEGIN
s:! F;
FOR i:! m 1O n .O s:! sGf(i);
suma:! s
END;
BEGIN
ss:!suma (1,1FF,f1);
write( Bs1!C,ss)
END.
2e observa ca, pentru o suma particulara, trebuie modificat numai
subpro%ramul functie ce precieaa functia particulara f1,f" sau f( si functia din
apelul respectiv.
PROCEDURI SI FUNCTII
PROGRAM pro% ;

PROCEDURE J ;
PROCEDUR+ pl ;
PROCEDURE p;

BEGIN

pl;
END.
PROCEDURE pl;
BEGIN

END;
1N
BEGIN

END-
BEGIN

Jl;

END;
BEGIN

p;J
END.
Procedura pl este descAisa in procedura J, este deci locala pentru J si nu
poate fi apelata decat din p. la fel procedura Jl fiind declarata in J are, la fel, caracter
local pentru J si nu poate fi apelata decat din J. 2a urmarim unrmatoarea aplicatie.
APLICATIE. 2e citeste o matrice 5 reala, de tip m x n si se cere sa se
calculee si sa se afisee urmatoarele norme ale matricei 5 definite astfel
n
P5P1!max QRaiOR,
1SiTm O!1
m
P5P"!max QRaiOR,
1SiTn O!1
6eolvare. )n prima definbitie a normei se va calcula mai intii un vector v ! (v1), i
n
1U
!1,",..,m, unde vi !Q RaiOR,iarP5P1! maxi(vi)i!1,",..,m,iar in caul al doilea se
va
O!1 n
calcula un vector K-(K), O!1,",..,n, unde KO!!Q RaiOR,iarP5P"!max(KO), O!
1,",..n.)n
i!1
pro%ramul principal vom folosi urmatoarele functii. Functia normal care calculeaa
norma dupa formula P5P1 , care va apela functia vector 1 declarata local in normal.
Functia norma " calculeaa norma matricei dupa formula P5P", care va apela
functia vector " declarata local in norma ".
Pro%ramul principal va apela normal si norma 1 va afisa aceste norme.
Pro%ramul este urmatorul :
PROGRAM norme ;
CONST m ! 1F ; n! U ;
TYPE matrice ! ARRY&1.. m , 1..n' OF REAL :
VAR a : matrice; n1,n" :REAL;
i,O: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 :! m#/
1W
END;
BEGIN
FOR i:! 1 1O m .O
BEGIN
s :! F;
FOR O :! 1 TO n DO s:!sGabs (a&i,O';v&i':!s
END;
norma1:!(v)
END;
FUNCTION norma "(a: matrice): REAL;
TYPE vector!ARRAY &1.m' OF REAL
VAR s :REAL; K : vector;
FUNCTION vector" (K : vector): REAL;
VAR max :REAL;
BEGIN
max :! K&1';
FOR O :! 1 TO n DO
IF m#/ ?K&O' THEN max :!K&O';
vector":!max
END;
BEGIN
FOR O:!1 1O n .O
BEGIN
s :!F
FOR i :!1 1O n DO s:!sGabs (a&i,O')
K&O':! s
END;
"F
norma":!vector"(K)
END
BEGIN
writen;
writen( B dati matrice de B,mClinii si B,n,C coloaneC);
writen;
FOR i :!1 1O n .O
BEGIN
FOR O :! 11O n .O read (a&),O');
re#$n
END
n1 :! norma 1(a); n" :!norma "(a);
writen; (B norma1!C,n1 :1F :") ;
writen ;(B norma"!C,n" :1F :")
END.
.aca matricea si atunci 5 ar fi de ordinal n atunci declaratiile de tip
TYPE vector !ARRAY &1..m' OF REAL din FUNCTION norma1() ;
TYPE vector !ARRA@ &1..n' OF REAL din FUNCTION norma1() ;
ar coincide si atunci FUNTION vector1 si FUNCTION vector " coincid si sub o
denumire comuna, de exemplu FUNCTION maxim s-ar putea scoate si declara la
nivel s
PROGRAM normat ;
CONST n ! 1F ;
TYPE matrice ! ARRY&1.. m , 1..n' OF REAL :
vector ! ARRY&1..n' OF REAL :
VAR a : matrice; n1,n" :REAL;
i,O:INTEGER; v : vector;
"1
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 :! F;
FOR O :! 1 TO n DO s:!sGabs (a&i,O');
v&i' :! s
END;
norma1:!maxim(v)
END;
FUNCTION norma "(a: matrice): REA7;
VAR s :REAL; K : vector;
BEGIN
FOR O :! 1 1O n .O
BEGIN
s :!F
FOR i :!1 TO n DO s:!sGabs (a&i,O');
K&O':! s
""
END;
norma":! maxim(K)
END
BEGIN
writen;
writen( B dati matrice de B,nClinii si B,n,C colC);
writen;
FOR i :! 1TO n DO
BEGIN
FOR O :! 1TO n DO re#$ (a&i,O');
re#$n
END
n1 :! norma 1(a);
n" :!norma "(a);
writen (B norma1 !C,n1:1F:();
write(B norma" !C,n":1F:()
END

PROCEDURI SI FUNCTII RECURSIVE
2-a arata in sectiunile anterioare ca in Pascal exista posibilitaeta ca procedurile
si functiile sa se poata apela intre ele in caul in care ele sint descries la un acelasi
nivel. 5ceasta posibilitate este lar%ita in asa fel icit o proceduraM functie sa se poata
autoapela .
O procedura care se poate apela pe ea insasi se numeste recursiva.
"(
+xemplu :
PORGRAM recursiv ;
PROCEDURE p ;
BEGIN
,
END;
PROCEDURE J;
BEGIN

";

END;
BEGIN

p;
J;

END.
)n acest exemplu procedura J are in corpul sau un autoapel. +a este recursive.
2crierea ei trebuie realiata intr-un anume fel care va fi preentat in aceasta sectiune.
+xista clase intre%i de probleme care se reolva mult mai ele%ant prin teAnica
"0
procedurilorM functilor, recursive. .e exemplu, problemele de sortare, de parcur%ere
a arborilor binari.
O rei[olvare a unei probleme se ice ca este recursive daca ea se exprima in
termanii reolvarii unei variante mai simple a aceleiasi probleme si cu folosirea
instructiunilor particulare pentru versiunea cea mai simpla a problemei.
3u aceasta notiune ne-am intilnit in scoala, de exemplu in le%atura cu sirurile
recursive.
+xemple :
1. 2irul
a
F
! " ; a
n
!
a + "
n-1,
n1;
)n care termenul a n,fiind definit in functie de termenul precedent anX1, este
definit recursiv, caul particular aici este a
F
! " ;
". 8n alt sir cunoscut este sirul Fibonacci, definit astfel
f(F)!1 ;
f(1)!1 ;
f(n)!f(n-1)Gf(n-"),nE" ;
)n acest exemplu termenul f(n)este definit in functie de precedentii f(nX1) si
f(n-"). 3aurile particulare sint f(F)!1 si f(F)!1.
(. Fie suma s(Z)!1H"G"H"G.GZ
"
G.. 5ceasta suma se poate scrie
s(Z)!

;

'

> +

F , " H ) 1 (
F , F
k k k s
k
3aul particular fiind s(F) !F
0. Produsul p!1x".O se poate scrie recursiv astfel
p(O)!

'

>

1 ), 1 (
1 , 1
j j jp
i
3aul particular fiind p(1)!1.
"I
9om arata modalitatea de folosire a functiilor si procedurilor recursive pe
urmatoarea.
A0i1#tie. 2a se calculee suma patratelor primelor n numere naturale.
9om preenta mai multe variante de reolvare.
1. )ntr-o formula simpla, aceasta suma se poate calcula folosind formula
s!1
"
G"
"
GGn
"
!
D
) 1 " )( 1 ( + + n n n
2i pro%ramul este urmatorul:
P6O,65< sumal;
956 n,s:)-1+,+6;
*+,)-
readln(n)
s:!nH(nG1)H("HnG1)MD;
Krite(Bsuma!C,s)
+-.
5ceasta este de altfel matoda cea mai rapida.
". 2e va folosi o functie pentru calculul iterativ al sumei punand
s :!F
s :!sGiH",i!1,",..,n
Pro%ramul este urmatorul :
PROGRAM suma" ;
VAR n, total: INTEGER;
FUNCTION s(n:INTEGER):INTEGER;
VAR t,i:INTEGER
BEGIN
t:!F
"D
FOR i:!1 TO n DO t:!tGiHi
s:! t
END;
BEGIN
re#$n(n)
total:!s(n)
write(,suma!C,total)
END.
(. 2e foloseste varianta de reolvare su functie recursive, baa pe faptul ca suma
se scrie , as cum am mai spus, astfel
s(Z)!

'

n k k k s
k
,...., " , 1 , " H ) 1 (
F , F
Pro%ramul se scrie astfel :
PROGRAM suma( ;
VARn, total : INTEGER ;
BEGIN
re#$n(n) ;
total :!s(n) ; :apelul functiei;
write(Bsuma!C,total)
END.
5pelul recursive este redat aici prin instructiunea
s :!s(Z-1)GZHZ
FUNCTION s(Z:INTEGER): INTEGER;
BEGIN
)F Z-F
THEN s:!F
ELSE s:!(Z-1)GZHZ:#0e) re1)r!i23
END;
"N
care fi%ureaa in parte ELSE a instructiunii IFTHENELSE si in
partea stan%a a insructiunii de atributie trebuie sa fi%uree numai numele functiei s,
fara parametru, adica nu este corecta forma.
IF..THEN..ELSE s(Z):!s(Z-1)GZHZ
.eaorece s(Z) nu este o variabila sau nume de functie. 3aul particular este redat in
partea THEN a instructiunii IF, adica
IF Z!F THEN s:!F
0. )n loc de functie recursive se poate folosi varianta cu procedura recursive
baata pe aceeasi definitie recursive a sumei. Pro%ramul este urmatorul:
PROGRAM suma0;
VAR n,sum:INTEGER;
BEGIN
re#$n(n);
ss(n,sum4;5#0e) 0r6$e$)rii !!3
write(Bsuma!C,sum)
END.
2a urmarim cum se delureaa operatiile pentru n!0.
)n corpul pro%ramului exista instructiunea de apel ss(n,sum); adica pentru n!0
acela este
!!.7-!)m4.
PROCEDURE ss(Z: INTEGER; VAR
s:INTEGER)
BEGIN
)F Z!F THEN s:!F
ELSE
BEGIN
ss(Z-1,s);:#0e) re1)r!i23
s:!sGZHZ
END
END;
"U
)n urma apelului procedurii, parametrul Z din procedura in valoarea 0 si se
executa partea ELSE a instructiunii IF din corpul procedurii,prin urmare trebuie
executate instructiunile
BEGIN
ss((,s);
s:!sG0H0
END.
)nsa instructinea s:!sG0H0; nu poate fi executata deoarece ea este precedata de apelul
ss((,s), prin urmare executia sa ramana deocamdata suspendata. 2e executa de apelul
de procedura
ss((,s) ;
cu Z!( si cum ZEF se executa partea +72+ a instructiunii )F adica
BEGIN
ss(",s);
s:!sG(H(
END.
+xecutia instructiunii s:!sG(H( nu poate avea loc, ramanad suspendata,
deorece se executa apel
ss(1,Z)
cu Z!1 si cum Z.EF se executa iarasi partea +72+ a instructiunii )F, adica
BEGIN
ss(F,s);
s:!sG1H1
END.
"W
+xecutia s:!sG1H1 ramane suspendata,executandu-se mai inatai apelul
ss(F,s);
cu Z!F, executandu-se de aceasta dat parte THEN ainstructiunii IF, adica se executa
instructiunea
s:!F;
si in continuare, in ordine inverse suspendarii, se executa instructiunile suspendate.
.e fapt de executa instructiunile
s:!F
s:!sG1H1
s:!sG"H"
s:!sG(H(
s:!sG0H0
reultand in final suma
s!1H"G"H"G(H"G0H"
.e obsevat aOun%erea in final la executia insctructiunii s:!F din partea 14+- a
instructiunii )F. +a asi%ura iesirea din recursie, astfel pro%rammul ar lucra, teoretic
indefinit.
Pentru executie pro%rammul foloseste o stiva. 2cAematiat functionarea ei ar
putea fi redata astfel.
(F

Observatii:
1. Ori de cate ori se foloseste o structura cu proceduri cu proceduriMfunctii recursive
trebuie asi%urata iesirea din recursivitate. .in acest motiv apelul recursive al unei
proceduriMfunctii p trebuie plasat in una din urmatoarele structuri de control
IF.THEN. p;
8HILEDO.p;
REPEAT..0..UNTIL..
". .atorita 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 avantaOe claritatii si ele%antei.
Pro%ram
principal
2s(Z,s)
2s(Z,s) 2s(Z,s) 2s(Z,s) 2s(Z,s)
Pro%ram
principal
2s(0,s)
2s((,s) 2s(",s)
2s(1,s)
2s(F,s)
2:!sG0H0 2:!sG(H( 2:!sG"H" 2:!sG1H1
2:!F
(1
Preentam in continuare o functie recursiva care consuma foarte mult timp datorita
apelurilor incrucisate. 5cesta este functia 5Zerman-preenta frecvent in teoria
complexitatii al%oritmilor.
5(m,n)!

'



+
)) 1 , ( ), 1 (
F ), 1 , 1 (
F , 1
n m A m A
n m A
m n
in rest
unde m,n sunt numeroase naturale. Pro%ramul este urmatorul:
PROGRAM 5Zerman;
VAR m,n,a:INTEGER;
FUNCTION 5cZ(),O:INTEGER):INTEGER;
BEGIN
IFi!F
THEN acZ:!OGi
ELSE
IF O!F
THEN 5cZ:!5cZ(i-1,1)
ELSE 5cZ:!5cZ(i-1,5cZ(i,O-1))
END;
BEGIN;
re#$n(m,n)
a:!A19(m,n)
write(Bvaloare!Ca)
END.


ALTE FUNCTII SI PROCEDURI DEFINITE
("

3apitolul N se ocupa de descrierea structurilor functiilor si procedurilor create
de utiliator pentru necesitatile sale de pro%ramare. Pe parcursul descrierii diferitelor
obiecte si actiuni din 1urbo Pascal s-au preentat o serie de functii si proceduri care
sunt predefinite, folosindu-se fre%vent in aplicatii. 3itim citeva din aceste functii si
proceduri:
1. Functiile de conversie Or$,C:r,R6)n$,Tr)n1.
". Functii aritmetice: A;!-Ar1T#n,C6!,E/0,Fr#1,Int,Ln,Pi,Sin,S"r,S"rt
(. Functii de ordonare:O$$,Pre$,S)11.
0. Proceduri si functii de intrareMiesire pentru fisiere:A!!i%n, C6!e, Re!et, Rewrite,
E6<, Re#$, Re#$n, 8rite, 8riten, E6n, See9E6<- See9E6n- See9- FieP6!
s.a
I. Proceuri si functii de %estionare dinamica a memoriei.
)n acest para%raf continuam sa preentam si alte functii si proceduri predefinite
folosite in pro%ramele T)r;6 P#!1#.
)n le%atura cu variabilele de tip STRING preentam urmatoarele functii si proceduri.
1. Procedura .elete cu sintaxa
P6O3+.86+ delete (956 s :216)-, ; )ndex, n :)-1+,+6)
+ste apelata prin instructiunea.
+xecutia procedurii are ca efect ster%ea din sirul s a n caractere incapand de
la poitia specificata prin index. .aca valoarea lui index e mai mare decat lun%imea
sirul nu se stre%e nici un cAaracter. .aca 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.
.elete(s,intex,n)
((
+xemplu :
PROGRAM ster%ere ;
VAR s :STRING&1"' ;
BEGIN
s:!C1"(0IDNUWFabC;
Deete(s,",D);writen(s);:s!C1UWFab ;
Deete(s,F,0);writen(s);:s!CFab ;
writen
END.
". 6pocedura )nsert are ca scop inserarea unui cuvint(sursa )intr-un sir dat. 2intaxa
sa este
PROCEDURE in!ert (sursa : STRING ; VAR s :STRING ; index : INTEGER)
si este apelata prin
in!ert(sursa, s, index)
unde :
sursa este cuvintul ce trebuie inserat;
s este sirul in care este inserat cuvintul ;
index este poitia din sirul s incepind cu care se insereaa cuvintul.
)n urma inserarii sirul reultat nu trebuie sa depaseaca "II se pierd. .aca
index este mai mare decit lun%imea s, sursa va fi alaturat lui s.
+xemplu :
PROGRAM inserare ;
VAR s,x : STRING&"F' ;
BEGIN
s :C581O<O*)7C;
x :!C 378*87C;
(0
)nsert (x,s,11); :s!C581O<O*)7 378*87C;
Krite(Bsirul nou!C,s)
END.
(. Procedura Str converteste o valoare numerica intr-un sir de caractere.
2intaxa sa este
PROCEDURE !tr(x& :lun%& :ecimale') ;VAR s :STRING)
unde:
x-este o variabila reala sau intrea%a a carei valoare se converteste intre% sirul
lun%-apare daca dorim sa preciam dimensiunea in caractere a sirului numeric
%enerat. \erourile nesemnificative se vor inlocui cu spatii. .aca sirul numeric
%enerat e mai mare decit lun%, atunci s va contine reultatul corect ;
ecimalele daca este present precieaa, in caul valorilor reale, lun%imea
partii ecimale;
s este o variabila 216)-, ce contine sirul de caractere obtinut dupa executia
procedurii. 2irul s obtinut va fi aliniat la dreapta.
.aca lun% lipseste sau este prea mic, atunci x va fi repreentat pe atitea caractere
cite sint necesare.
+xemplu :
PROGRAM siruri;
VAR x : INTEGER; = :REAL; sir : STRING;
BECIN
x:!"0NU;
str(x,sir); Kriteln(sir); :sir!C"0NUC;
= :!-1".IW;
str (= : 1F : ", sir);
Kriteln(sir) :sir!C -1".IWC;
END.
(I
)n urma executiei procedurii 2tr valoarea intre%a "0NU a variabilei x va fi
transformata in sirul B"0NUC iar valoarea reala-1".IW a caribilei = va fi transformata in
sirul B -1".IW.
0. Procedura V# 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: tipX numeric; VAR cod :
INTEGER);
unde
s este expresia de tip 216)-,;
v este variabila reala sau intrea%a in care se depune reultatul transformarii;
cod contine, in urma pelului procedurii, in codul de eroare care este de erori,
cod
!F . Propcedura i%nora blancurile conducatoare din sir.
)nstructiunea de appel are sintaxa
2#(s,v,cod)
unde s,v ,cod au semificatiile de mai sus.
+xemple :
PROGRAM conversie ;
VAR sir STRING ; v, cod :INTEGER ;
BEGIN
sir :!C1"INWC;
val(sir,v,cod);: v!1"INW-numar intre%;
Krite(Bv!C,v,CC,cod)
END.
I. Functia 3oncat concateneaa intr-un sin%ur sir o suita de siruri. 2intaxa sa
este
FUNCTION concat(s1 &,s"..' : STRING):STRING
(D
unde s1,s",sint constantate sau varibile STRING.
2irul obtinut nu trebuie sa depaseasca "II caractere. 3aracterele cu numar de
ordine peste "II se pierd.
+xemplu :
PROGRAM unire ;
VAR s1,s",s( : STRING&U' ;s :STRING&"F';
BEGIN
s1 :!C3+7 B;s" :!C<)63+5C; s( :!C*516)-C.
s :!contact(",s1,s();
write(s)
END.
Pro%ramul va afisa textul B <)63+5 3+7 *516)-C;
5ceasta functie se poate inlocui cu operatorulCC GCC, deci
s: !s"Gs1Gs(
are acelasi effect cu s :!3oncat(s",s1,s().
1) Functia C60= se foloseste pentru a extra%e un subsir dint-un sir de
caractere.
2intaxa functiei este
FUNCTION cop=(s : STRING ; index, n : INTEGER): STRING
8nde:
s este o variabila sau constanta de tip STRING din care se extra%e un cuvint
(subsir) ;
index e o variabila sau constanta intra%a ce precieaa numarul de ordine
de la care incepe extra%erea cuvintului ;
n repreinta numarul de caractere extras din sir.
(N
.aca n este mai mare decat lun%imea sirului atunci nu se extra%e nici un
cuvant. .aca n este mai mar decat numarul de caractere ramase dupa index atunci
numai aceste caractere vor fi returnate.
+xemplu :
PROGRAM extra%ere ;
CONST sir!,8-)9+62)151+5 .)- 1)<)2O565C
VAR cuvant :216)-,&1(' ;
BEGIN
cuvant :!cop=(sir,1,1() ;:cuvant!C8-)9+62)151+C;
writen(cuvant) ;
cuvant :!cop=(sir,1I,() ;:cuvant!C.)-C;
writen(cuvant)
END.
") Functia 7en%At furnieaa lun%imea actuala a unui sir de caractere. +a are
sintaxa
FUNCTION len%tA(s:STRING):INTEGER;
unde s este o variabila de tip 216)-,.
+xemplu :
PROGRAM lun%;
CONST sir!CBARBAROASAC;
956 lu:INREGER;
BEGIN
lu:!len%tA(sir); Krite(Blun%imea!,lu)
END.
() Functia P6! furniea poitia unui cuvant intr-un sir. 2intaxa functiei este
FUNCTION pos(cuvant,s:STRING):BYTE
unde
(U
cuvantul este subsirul cautat in sir;
s este sirul in care se cauta.
.aca cuvantul nu se %aseste in sirul s atunci valoarea functiei este ero.
+xemplu:
PROGRAM poitie;
CONST s!C-5*83O.O-O2O6C;
VAR cuvint :STRING ; p : BYTE
BEGIN
cuvant!C.O-C
p:!pos(cuvant,s)
write(Bpoitia!C,p)
END.
W) Procedura Fill3Aar initialieaa o ona de memorie cu acelasi caracter.
2intaxa ei este
PROCEDURE <i1:#r(VAR x,n:8ORD;car: tipXordinal)
unde:
x-este o variabila de la a carei adresa incape ona de memorie de
initialiat;
n-este lun%imea in octeti a onei de initialiat ;
car-este o expresie de tipXordinal,FSord(car)S"II. 3u acest caracter va fi
initialiat fiecare octet al onei definite.
+xemplu :
PROGRAM incarcare ;
TYPE litere!CAC..C>C ;
V#r car : litere ; i :INTEGER;
vector: ARRAY&1.1F' OF CHAR;
BEGIN
(W
car:!C@C;fillcAar(vctor,1F,car);
FO6 i:!1 1O 1F .O Krite(car)
+-..
.upa executia pro%ramului fiecare octet in vector va fi incarcat cuC@C si se va afisa
@@@@@@@@@.

TIPUL FILE
NOTIUNE DE FISIER
.upa cum este cunoscuta una din componentele de baa ale unui sistem de
calcul este memoria centrala sau operativa(RAM) cu rolul de a stoca pro%ramul,
informatiile prelucrate de aceasta, reultatele intermediare si finale. +a este foarte
rapida dar de capacitate nu prea mare. 7a 3alculatoarele Personale aceasta este de
obicei de D0F Zocteti. 7a locatiile memoriei RAM, pro%ramul era acces direct fie
pntru inre%istrarea, fie pentru etra%erea informatilor. 5cest tip de memorie este
volatila asu nepermamenta, adica continutul ei se distru%e la intreruperea
alimentatiei electrice. .aca 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. -u este posibil nici transportul de la o localitate la
alta daca informatia ar fi stocata in memoria RAM
)n afara de memoria operativa sistemele de calcul mai dispun si de o memorie
auxiliara sau interna realiata pe suporturi externe de informatii e obicei acestea
fiind suporturi ma%netice (discuri si beni) care se caracterieaa prin aceea ca pot
retine cantitati foarte mari de informatii(de ordinul ecilor sau sutelor de
<e%aocteti ; 1<o!1F
D
octeti), nu sunt volatile si permit transportul si perlucrarea pe
alte sisteme de calcul compatibile.
0F
2cAimbul de informatii om-calculator se face totdeauna prin intermediul
ispoitivelor periferice : claviatura, ecran, imprimanta etc. )ntotdeauna si extra%erea
informatiilor in si din calculator se face prin intermediul instructiunilor de
intrareMiesire( citiraMscriere).
Pentru inre%istrarea(scriere) informatilor pe un support extern precum si
consultarea(citirea) lor inn vaderea prelucrarii, limbaOului 1urboPascal dispune de un
concept foarte %eneral numit fisier(file in limba en%lea).
De<initie. 8n fisier este o colectie, or%aniata de obicei pe un suport extern,
de date numite componente(sau articole), toate componentele avand aceeasi structura
si acelasi tip.
3omponenta (articolul) este unitatea lo%ica cea mai mica care e accesata in
operatiile de citireMscriere. -umarul de componante al fisierului nu e cunoscut
dinainte, iar compomentele nu au indici ca la tablouri. 3omponentele sunt
inre%istrate in fisier una dupa alta. 2punem ca fisierul este o or%aniat secvential. )n
1urbo Pascal exista mai multe tipuri de fisiere care pot fi definite. )n toate tipurile de
fisiere 1urbo Pascal la fiecare componenta a fisierului se poate aOun%e numai daca s-
au parcurs toate componentele acestuia care o preced. )n acest ca spunem ca
accesul la componenta este secvential. Pentru anumite tipuri de fisier este permis si
accesul direct la o componenta.
+xemple de fisiere.
1. )nformatiile despre studentii unui an de studiu inre%istrate pe un disc
ma%netic, fiecare componenta a fisierului retinand informatiile despre un
student.
". )nformatiile despre persoanele unei intreprinderi si adresele lor aparut pe
un ecran 19 etc, fiecare articol continand informatiile despre o persoana
di adresa sa
Proprietati.
01
1. 2uportul fiic al fisierului este extern : imprimanta, disc sau banda ma%netica,
ecran 19,claviatura( dispoitive periferice). Oricarui dispoitiv periferic ii este
asociata o structura de fisier, adica o or%aniareCClo%icaCC a infornatiilor ce
corespunde unei animute teAnici de aranOare a acestor date.
". .eoarece, in %eneral, numarul componentelor unui fisier nu se cunoaste
dinainte este necesara punerea in evidenta a sfarsitului de fisier. 5cesta se face
printr-un caracter special numit marca de sfarsitului de fisier, notata +OF(de la
+nd Of File! sfarsit de fisier). Pentru fisiere 1+>1,aceasta este caracterul ]\.
daca un fisier nu are inre%israta nici o componenta atunci el se numeste vid

5) fisier nevid *) fisier vid
(. 8n pro%ram 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. 7a un moment dat pro%ramul nu poate avea
acces decat la o sin%ura componenta a fisierului si aceasta nu direct ci prin
intermediul unei one de memorie centrala de aceeasi marime si structura cu
componentele fisierului numit ona tampon(buffer), creata automat de sistem
compilarii variabilei de tip fisier.
0. 5supra fisierelor pot fi efectuate urmatarele operatii:
a) Operatia de creare(scriere) a fiierului prin care continutul onei de memorie
care stocAeaa o variabila de tip dat este inre%istrata ca o componenta a fisierului
prin intermediul onei tampon, dupa care fisierul avanseaa cu o poitie.
articol
<arca +OF
0"
b) Operatia de consultare(citire) a fisierului prin care continutul unei
componente(articol) al fisierului este transferat im memoria centrala in ona unde
este stocata o variabila, tot prin intermediul onei tampon, dupa care fisierul
avnseaa o poitie. Prin citire continutul nu se modifica.

)n exploararea fisierelor, odata cu initierea operatiilor de citireMscriere, se
asciaa 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 ero. )n urma fiacarei citiri sau screri, pointerul de fisier va fi
marit cu 1(unu).
I.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 deCCdecAidereCC
a fisierului. .ar daca un fisier este decAis pentru citire acelasi fisier este incAis pentru
scriere si invers.
fisier
citire scriere
<emorie
centrala
7ocaliarea fiica a
variabilei fisier in
memoria centrala
0(
Prin urmare, un fisier nu poate fi simultan descAis si pentru scriere si pentru citire. 7a
descAiderea fisieruluipointerul de fisier se plaseaa totdeauna pe prima componenta a
fisierului(daca fisierul nu e vid) sau pe marca EOF(daca fisierul e vid). 7a fiecare
executia a unei operatii asupra fisierului pointerul de fisier e marit automat cu 1. 7a
fiecare operatie de citire, laun moment dat, acest pointer va aOun%e pe marca EOF,
pentru fisierul f consultat. 5cest moment este pus in evidenta de o functie booleana
e6<.<4 care intoarce reultatul TRUE si FALSE daca nu s-a atins marca EOF.
)ncAiderea unui fisier se face automat la iesirea din blocul in care s-a folosit
fisierul(pro%ram principal sau subpro%ram) sau prin apelul unei proceduri speciale de
incAidere numita CLOSE.
Orice fisier este precedat de anumite informatii scrise de sistem prin care se
identifica numele sau, dupa care urmeaa informatia utila(componentele) urmate de
marca EOF.
D.Fisierele 1urbo Pascal sunt %estionate prin anumite procedeuri si functii
dintre care preentam pe urmatoarele, unde f va desemna o variabila fisier.
a) Re!et(f) /descAide fisierul pentru citire (consultare). +xecutia procedurii are
ca efect poitionarea pointeruli d fisier pe prima componenta a fisierului si
copierea acesteia in ona tampon a acesuia. 9aloara lui e6<.f) va fi FALSE
daca fisierul nu e vid, in ca contrar valoarea sa va fi TRUE.
)naite de re!et(f).
00
b) 6eKrite(f)-descAide fisierul pentru scriere(creare) . volorile fisierului f sunt
distruse, marca +OF fiind plasata la inceputul fisierului, pointerul de fisier
fiind plastat la nivelul componentei ero. 9aloarea lui eof(f) este 168+.
Observatie. 1rebuie avut %riOa pentru a nu da un rewrite(f) accidental care sa
stear%a continutul unui fisier <.
c) 3lose(f)-procedura a carei appel are ca efect incAiderea lo%ica si fiica a
fisierului f.
d) A!!i%n- ataseaa un fisier lo%ic unui fisier fiic. Prin assi%n se precieaa
dispoitivul periferic unde va fi stocat fisierul fiic. )n momentul compilarii
unei variabile de un anume tip , altul decit fisierul , se determina locul unde
acesta este stocata inmemorie. )n caul variabelelor de tip fisier acest loc de
stocare al variabilei nu va fi determinat in timpul compilarii ci in timpul
f
pointer +OF
.upa reset(f)
f
pointer
transfer
buffer
pointer
+OF
f
0I
executiei, prin procedura assin% . in timpul compilarii, pentru variabile de tip
fisier vor fi reervate one in care se retin informatii necesare exploatarii
fisierului informati ce vor fi luate din fisierul fiic la descAiderea acestuia.
)nstrctiuni de appel de procedura asi%n are sintaxa ;
#!!i%n(f,Cnume^)
sau
!ir :!CnumeC
#!!i%n(f,sir);
unde:
f-este numele variabilei fisier,
nume-este un sir de cel mult "ID caractere ce contin numele fisierului fiic
cu care se pune in corespondenta fisierul f.
1ipul lui sir este 216)-,. -umele fisierului fiic poate fi cel obosnuit
xxxxxxxx.===
format din numele xxxxxxxx, de 1-U caractere ; urmat de un punct si de axtensia
===, de 1-( carctere.
+xemplu :
ssi%n(f,Cbu%et.W").
-ume poate fi si numele unei unitati standard :
CON-pentru consola,
LPT&(!PRN), LPT2, LPT(- pentru imprimante,
?BD(_= *or.)-pentru tastatura, fiind admisa numai citirea, s.a.
5pelul procedurii assi%n este obli%atoriu la orice utiliare a fisierelor. 2int
necesare atitea instructiuni de appel assi%n cite fisiere exista in pro%ram.
)n 1urbo Pascal exista urmatoarele structuri de tip fisier :
-fisier cu tip,
-fisier TE*T ;
0D
-fisier fara tiparire.

FISIERE CU TIP
Fisierul cu tip este o structura de date in care fiecare componenta (articol) are acelasi
tip numit ti0) $e ;#@# # 16m06nente6r. .eclaraera sa se face in sectiune TYPE
si are urmatoarea sintaxa.
TYPE
tipXbaa!
nume! FILE OF tip baa
unde tip- baa poate fi orice tip, exceptind tipul fisier.
+xemplu :
TYPE
int!1..1FF;
fisint !FILE OF int;
complex! RECORD x,= : REAL END;
fiscomplex!FILE OF complex;
mul! SET OF mul;
txt ! FILE OF CHAR.
)n acest exemplu s-au definit tipurile: fisint-care este un tip fisier de intre%i
intre 1si1FF, fiscomplex-un tip fisier de numere complexe definite ca 6+3O6.,
fismul- un tip fisier de multimi si txt-ca fisier de caractere.
De<inire# )nei 2#ri#;ie < de tip fisier se face in sectiune VAR cu sintaxa
0N
TYPE fisier! FILE OF t ;
VAR f : fisier ;
3a in care s-a definit tipul anterior in sectiune TYPE sau direct prin
VAR < ' FILE OF t;
unde t este tipul de baa al componentelor.
Oservatie : declararea unei variabile f de tip fisier are drept consecinta
declararea implicita a unei variabile notata cu
<
&
!#) <
A
de acelasi tip cu componentele fisierului f si care defineste ona tampon asociata
(buffer). )n limvaOul Pascal standard aceasta varibila este folosita in procedurile P81
si GET care in T)r;6 P#!1# nu exista explicit.
.upa apelul procedurilor #!!i%n(f) , re!et(f), rewrite(f)varibila f va contine
informatii referitoare la fisierul fiic atasat.
CREAREA FISIERULUI
2crierea informatiei intr-un fisier cu tip se face prin apelul procedurii Krite, cu
sintaxa:
write.<-24
unde f este variabila ce desemneaa fisierul, descAis pentru scriere, iar v este o
variabila de tipul de baa al componentelor.
.aca inainte de executia lui write(f,v) situatia in fisier era
0U
dupa executia lui Krite(f,v) situatia in fisier este
valoarea variabilei v fiind copiata in componenta fisierului f.
Observatie. .e fiecare data marca +OF se afla ultima componenta
(articol)scrisa.
APLICATIE. 2a se intocmeasca pro%ramul 1urbo Pascal prin care se citesc
de la claviatura patru numere, pentru variabile intre%i a,b,c,d si cu aceste numere sa
se construiasca un fisier.
Pro%ram 1urbo Pascal este urmatorul :
PROGRAM numere;
516n!tr)ire# )n)i <i!ier $e n)mere intre%i3
VAR a,b,c d :INTEGER ; f : FILE OF INTEGER ;
BEGIN
#!!i%n. f ,Cfisier. int);
rewrite(f);
re#$(a) ; write( f, a);
re#$(b) ; write( f, b);
re#$(c) ; write( f, c);
re#$(d) ; write( f, d);
END.
f
v
f
v
0W
2e observa ca s-a declaram f ca un fisier de intre%i. )nstructiuni de apel de
procedura assi%n(f,Cfisier,intC) ataseaa un periferic fisierului f, numele fisierului
fiic fiind Bfisir.intC. procedura reKrite(f) decAide fisierul f pentru scriere. )n textul de
pro%ram 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
#!!in%(f, Bfisier,intC) ; rewrite(f)
re#$(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
ecAivalenta cu instructiunea write(f,a,b,c,d). deci, mai %eneral, sintaxa instructiunii
Krite, pentru fisirele cu tip este
write(f,v
1
&,v
"
...')
unde v
1,
v
"
,sint variabile de tipul articolelor fisierului f.
.upa fiecare scriere pointul de fisier isi mareste valoarea cu 1.
)n %eneral scAemele pentru scrierea componentelor unui fisier folosind
varintele cu 8HILE si REPEAT sint urmatoarele:
a) rewrite(f) ; b) rewrite(f) ;
8HILE creareXfisier DO REPEAT
BEGIN 51re#re 16m06nent#3
51re#re 16m06nent#3 write( f, componenta)
write( f, componenta) UNTIL NOT creareXfisier;
END;
)ntr-un ca concret, :cerare componenta;, se va inlocui cu un %rup de
instructiuni prin care se determina componenta(varibila) care trebui scrisa in fisier.
3reareXfisier este conditia care trebuie sa fie adevarata tot timpul cit se creaa
fisierul si falsa cind crearea fisierului s-a terminat.
IF
.e obicei, conditia creareXfisier se poate realia practic astfel. 2e defineste o
variabila, de exemplu simbol de tip 3456 a carei valoare B.C(de la .5) se citeste de
la tastatura dupa fiecare scriere in fisier. .aca se tasteaa orice alt caracter in afara de
caracterul B.C atunci se paraseste ciclul. .eci, am putea avea scAema :
PROGRAM p ;
VAR f :FILE OF INTEGR ; x :INTEGER ;simbol :CHAR ;
BEGIN
#!!i%in(,CfisC);
rewrite(f)
REPEAT

re#$n(x);
write(f,x);
writen(Bmai sunt date de intrare .5M-8LC)
re#r$n(simbol)
UNTIL simbol?EC.C
.
END.
2e pot ima%ina si alte modalitati de a termina crearea unui fisier, de exemplu
de a da pentru un camp o valoare pe care stim si%ur ca nu o poate lua niciodata.
.aca numarul de componente al fisierului este cunoscut atunci scrierea acestor
componente in fisierul s-ar putea face printr-o instructiune FO6, de exemplu,
,
rewrite(f)
FOR i :!1 TO &BB DO
I1
BEGIN
Z:!iHi
write(f,Z)
END;
prin care se scriu patratele numerelor de la 1 la1FF in fisierul f.

FISIERE FARA TIP
)n fisierele cu tip(adica FILE OF) ,preentate anterior,lun%imea fiacarui
articol este fixa si este data de numarul de octeti reervat variabilei avand tipul de
baa t al fisierului. .e exemplu, pentru declararea
VAR f :FILE OF t ;
fiecare articol va avea o lun%ime de :
"octeti!1D biti daca t este INTEGER,
0 octeti!(" biti daca t este LONGINT
D octeti!0U biti daca t este REAL
.aca t este
TYPE t! RECORD nume 'STRING &"F' ;varsta :BYTE END ;
VAR f :FILE OF t ;
atunci fiecare articol va avea o lun%ime de "FG1!"1 octeti.
)n afara de fisierele cu tip, limbaOul 1urboPascal(I.F-D.F) permite si definirea
fisierelor fara tip(F)7+). 5ceste fisiere sunt vaute de un pro%ram 1urbo Pascal ca
fiind formate dintr-o multime de blocuri(articole), fiecare bloc avand o lun%ime fixa
(implicit -1"U octeti), dar aceasta lun%ime a sa poate fi modificata de pro%ramator
prin intermediul procedurilor re!et si rewrite.
2intaxa declararii unei variabile f ca fisier fara tip este
I"
)n le%atura cu fisierele fara tip(FILE) se folosesc, ca si la fisierele cu tip,
procedurile #!!in%- re!et-rewrite- !ee9 precum si functia FieP6! ai caror parametrii
au semnificatiile cunoscute.
5m spus ca dimensiunile implicita a blocului(articolul) este 1"U octeti. 7a
descAiderea fisierului cu procedurile re!et sau rewrite aceasta dimensiue se poate
modifica folosind porcedurile respective cu sintaxa
astfel
VAR < 'FILE ;
recsie :8ORD ;

BEGIN

recsie:!;
..
re!et(f,recsie);
..
rewrite(f,recsie)

END.
unde recsie este o variabila sau constanta de tip 8ORD.
.e exemplu, putem atribui lui recsie valoarea "ID prin
recsie:!"ID
ca in care blocurile vor fi interpretate ca avand o lun%ime de "ID octeti.
VAR <'FILE
re!et(f,recsie) sau rewrite(f, recsie)
I(
7a crearea fisierului < articolele(blocurile) sunt numerotate incepand cu
F(ero). 5cest fapt,precum si acela ca toate blocurile au aceeasi lun%ime, conduce la
posibilitatea accesului direct la articole,intocmai ca la fisierele cu tip, folosind pentru
aceasta functie FieP6! si procedura !ee9(f,n).
Particularitatea fisierelor fara tip consta in aceea ca pentru crearea fisierului se
foloseste o procedura mai speciala de scriere a blocurilor, numita B6198rite a carei
instructiune de apel are sintaxa :

unde :
f- este variabila fisier ;
*uf- este o variabila de tip arbitrar ;
3ount-este o variabila sau constanta de tip `O6. cu rolul de a precia
numarul maxim de blocuri ce urmeaa a fi scrise ;
6esult / este o variabila de tip `O6., optionala, cu rolul de aretine numarul
blocurilor scrise dupa executia procedurii. Pentru verificarea scrierii se poate afisa
continutul variabilei 6esult.
Observatie. Procedura utilieaa variabila *uf de un tip arbitrar preciat de
utiliator,pentru furniarea adresei de incept panrtu scrierea blocutilor, adica
blocurile sunt scrise unele dupa altele in fisierul f incepand cu adresa lui *uf.
Pentru consultarea (citirea) fisieruli f se foloseste procedura speciala B69
Re#$ a carei instructiune de apel are sintaxa.

parametrii avand o semnificatie asemanatoare. 5ici insa 3ount specifica numarul
maxim de blocuri care se citesc.
;619write(f,*uf,3ount&,6esult')
I0
;619write(f,*uf,3ount&,6esult')
+xemplu : 2e citesc doua numere reale a, b si se calculeaa m, media
artimetica a celor doua numere. 3u numerele a, b,m se formeaa un fisier fara tip
care apoi se consulta valorile fisierului.
Pro%ramul este urmatorul :
PROGRAM medie ;
VAR a,b,m: REAL ; resl,res",res(:8ORD;
f:FILE;
BEGIN
#!!i%n(f,Cnume.1C)
rewrite(f);
re#$n(a,b); m:!(aGb)M";
;619write(f,a,1);;619write(f,b,1);;619write(f,m1);
re!et(f);
;619re#$(f,a,1,res1);
writen(Ba!C,a:U:1,Cres1!C,res1)
;619re#$(f,b,res1)
writen(Bb!C,b:U:1,Cres"!C,res")
;619re#$(f,m,res()
writen(B,m!C,m:U:1,Cres(!C,res()
END.
)nsructiunea de apel ;619write(f,a,1) produce scrierea unui bloc
(3ount!1)incepand cu adresa data de valabila a, blocul avand o lun%ime de 1"U
octeti. .eci scrierea lui a in fisier se face pe 1"U octeti si nu pe D cat e necesar pentru
variabilele de tip REAL (re!et are doar parametru f). .aca se dorea scrierea
blocurilor de 1F octeti lun%ime,trebuie specificat re!et(f,1F). 5nalo% pentru
rewrite(f,1F).
II
)n ;619re#$(f,a,1,res1) am furniat 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.
Pro%ramul ar putea fi conceput si altfel :
PROGRAM medial ;
VAR < ' FILE ;
a :ARRAYC&,,,DE OF REAL
result:8ORD;i'INTEGER;
BEGIN
#!!i%n.<-+t604;
reKrite(f,D);
a&1':!(.0; a&"':!D.";
a&(':!(a&1'G a&"')M";
;619write(f,a,(,result);
writen(Bresult!C,result);
re!et(f,D);
;619write(f,a,();
FOR i:!1 1O ( .O Krite(a&i':U:")
END.
)n aceasta varinta s-au declarat blocuri de lun%ime de D octeti(prin
rewrite(f,D)). B619write (f,a,(,result) asi%ura scriarea in fisierul f si ( blocuri de
lun%ime D octeti fiecare, incepand cu adresa lui a(adresa de inceput a vectorului a).
Pro%ramul va furnia urmatoarele date:
6esult!(
(.0F D."F 0.UF
ID
FISIERE TE*T
2cAimbul de informatii om-calculator realiat prin intermediul perifericelor
(tastatura, ecran, imprimanta) se face sub forma de sir de caractere. .e exemplu,
pentru a transmite constanta ("0 pro%ramului,utiliatorul transmite de fapt
delatastatura sirul de caractereC(C,C"C,C0C.
.eoarece terminalele au un anumit mod de constructie si functionare acest fapt
duce la subdiviarea 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 subdiviate in
linii limbaOul 1urboPascal dispune de un tip de fisier predefinit numit 1+>1 si care
este folosit ca si cand ar fi fost declarat prin.

TYPE TE*T( FILE OF CHAR
5dica este un fisier cu articole de tip 3456 cu particularitatea ca este
subdiviat in linii. .eclarate de mai sus nu trebuie sa apara in pro%ram.
.eclararea unei variabile f ca fiind de tip 1+>1 se face in sectiunea 956
astfel :

Fisierele de tip TE*T se incadreaa in teoria %enerala 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 subdiviate in linii implica
existenta uneiCCmarci de sfarsit d linieCC(36M7F). 5ceasta marca de sfarsit de linie
este pusa in evidenta de o functie booleana eoln(f),(coln!+nd Of 7i-e). )n caul
956 f:1+>1
IN
tastaturii aceasta marca e inre%istrata odata cu apasareatastei +nter. 7un%imea
fiecarui articol este de un caracter. 2farsitul unui fisier TE*T este marcat de
caracterul (]\).
IU