proceduri si functii - proceduri pascal

80
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) reprezinta listele parametrilor formali si a tipurilor acestora, daca multimea acestora nu e vida; li : ti, i=1,2,…,n sint PROCEDURE nume([VAR] l1: t1; [VAR] l2:t3…; [VAR] ln: tn); [sectiunea declaratiei] BEGIN [instructiunii] END; 1 PROCEDURE nume; [sectiunea declaratii] BEGIN

Upload: maxim-melnic

Post on 01-Jan-2016

2.841 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Proceduri Si Functii - Proceduri Pascal

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) 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).

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

1

PROCEDURE nume; [sectiunea declaratii]BEGIN [ instructiuni]END

Page 2: Proceduri Si Functii - Proceduri Pascal

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:

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

2

FUNCTION nume ([VAR] l1:t1;[var] l2:t2;…;[var] ln:tn):tip nume;[sectiunea declaratii locale]BEGIN{……..}{NUME :=…. ;} sectiunea instructiuni{……..}END:

Page 3: Proceduri Si Functii - Proceduri Pascal

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

THEN

ELSE

3

min :=x

Page 4: Proceduri Si Functii - Proceduri Pascal

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 ;

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}

4

min :=y

FUNCTIONmin(x,y:REAL):REAL;BEGINIF x<yTHEN min:=xELSE min:=yEND;

Page 5: Proceduri Si Functii - Proceduri Pascal

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

p=<a,b>= 2 lx= 2

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

5

Page 6: Proceduri Si Functii - Proceduri Pascal

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;

6

Page 7: Proceduri Si Functii - Proceduri Pascal

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

cuvantul’’identic’’sau’’diferit’’,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.

7

Page 8: Proceduri Si Functii - Proceduri Pascal

Citirea se va face atat timp cat utilizator apasa tasta’D’

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. notata║A║ 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│

1≤i≥m 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.

8

Page 9: Proceduri Si Functii - Proceduri Pascal

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

n

Vi=∑│aij│, i= l,….,m si ║A║=max Vi

j=1 1≤i≥m

(a11 …..a1n)→v1

. . .

. . .

. . .

(ai1……ain)→vi

. . .

. . .

. . .

START

CITIRE A TIPAR A NORMA

MAXIM

A=A/║A║

TIPAR A

STOP

9

Page 10: Proceduri Si Functii - Proceduri Pascal

(am1…amn) →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;

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

VAR v : vector; s:REAL;

FUNCTION maxim(v : vector) : REAL;

VAR max : REAL;

BEGIN

10

Page 11: Proceduri Si Functii - Proceduri Pascal

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)

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).

11

Page 12: Proceduri Si Functii - Proceduri Pascal

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 :

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

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

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

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

VAR f1,f2:nume_functie; sub1, sub2: nume-procedura;

12

Page 13: Proceduri Si Functii - Proceduri Pascal

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

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.

13

Page 14: Proceduri Si Functii - Proceduri Pascal

Sa presupunem ca avem de calculat urmatoarele sume

s1= s2= s3=

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

suma=

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.

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;

14

Page 15: Proceduri Si Functii - Proceduri Pascal

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;

BEGIN

s:= 0;

FOR i:= m TO n DO s:= s+f(i);

suma:= s

END;

BEGIN

15

Page 16: Proceduri Si Functii - Proceduri Pascal

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;

BEGIN

s:= 0;

FOR i:= m TO n DO s:= s+f(i);

suma:= s

END;

BEGIN

16

Page 17: Proceduri Si Functii - Proceduri Pascal

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 q ;

PROCEDURE pl ;

BEGIN

END,

BEGIN

PROCEDURE p;

BEGIN…pl;END.

PROCEDURE pl;BEGIN…END;

17

Page 18: Proceduri Si Functii - Proceduri Pascal

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

║A║1=max ∑│aij│,

1≤i≥m j=1

m

║A║2=max ∑│aij│,

1≤i≥n j=1

Rezolvare. In prima definbitie a normei se va calcula mai intii un vector v = (v1), i

n

=1,2,..,m, unde vi =∑ │aij│,iar║A║1= maxi(vi)i=1,2,..,m,iar in cazul al doilea se

va

j=1 n

calcula un vector w-(w), j=1,2,..,n, unde wj==∑ │aij│,iar║A║2=max(wj), j=

1,2,..n.In

i=1

18

Page 19: Proceduri Si Functii - Proceduri Pascal

programul principal vom folosi urmatoarele functii. Functia normal care calculeaza

norma dupa formula ║A║1 , care va apela functia vector 1 declarata local in normal.

Functia norma 2 calculeaza norma matricei dupa formula ║A║2, 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

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

19

Page 20: Proceduri Si Functii - Proceduri Pascal

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;

norma2:=vector2(w)

END

BEGIN

writeln;

writeln( ‘ dati matrice de ‘,m’linii si ‘,n,’ coloane’);

writeln;

20

Page 21: Proceduri Si Functii - Proceduri Pascal

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;

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];

21

Page 22: Proceduri Si Functii - Proceduri Pascal

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

END;

norma2:= maxim(w)

END

BEGIN

writeln;

writeln( ‘ dati matrice de ‘,n’linii si ‘,n,’ col’);

22

Page 23: Proceduri Si Functii - Proceduri Pascal

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.

Exemplu :

23

Page 24: Proceduri Si Functii - Proceduri Pascal

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

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.

24

Page 25: Proceduri Si Functii - Proceduri Pascal

Exemple :

1. Sirul

a0=  ; an= 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

s(k)=

Cazul particular fiind s(0) =0

4. Produsul p=1x2…….j…… se poate scrie recursiv astfel

p(j)=

Cazul particular fiind p(1)=1.

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=

Si programul este urmatorul:

PROGRAM sumal;

VAR n,s:INTEGER;

25

Page 26: Proceduri Si Functii - Proceduri Pascal

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

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

26

Page 27: Proceduri Si Functii - Proceduri Pascal

s(k)=

Programul se scrie astfel :

PROGRAM suma3 ;

VARn, total : INTEGER ;

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

care figureaza in parte ELSE a instructiunii IF…………THEN………ELSE 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;

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

27

Page 28: Proceduri Si Functii - Proceduri Pascal

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).

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) ;

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 ENDEND;

28

Page 29: Proceduri Si Functii - Proceduri Pascal

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.

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

29

Page 30: Proceduri Si Functii - Proceduri Pascal

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.

Observatii:

Program principal

Ss(k,s)

Ss(k,s) Ss(k,s) Ss(k,s) Ss(k,s)

Program principal

Ss(4,s)

Ss(3,s) Ss(2,s)Ss(1,s)

Ss(0,s)

S:=s+4*4 S:=s+3*3 S:=s+2*2 S:=s+1*1

S:=0

30

Page 31: Proceduri Si Functii - Proceduri Pascal

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;

WHILE……DO…….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.

Prezentam in continuare o functie recursiva care consuma foarte mult timp datorita

apelurilor incrucisate. Acesta este functia Akerman-prezenta frecvent in teoria

complexitatii algoritmilor.

A(m,n)= 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)

31

Page 32: Proceduri Si Functii - Proceduri Pascal

a:=Ack(m,n)

write(‘valoare=’a)

END.

ALTE FUNCTII SI PROCEDURI DEFINITE

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.

32

Page 33: Proceduri Si Functii - Proceduri Pascal

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.

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.

Delete(s,intex,n)

33

Page 34: Proceduri Si Functii - Proceduri Pascal

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’;

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;

34

Page 35: Proceduri Si Functii - Proceduri Pascal

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.

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 ;

35

Page 36: Proceduri Si Functii - Proceduri Pascal

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

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

36

Page 37: Proceduri Si Functii - Proceduri Pascal

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.

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’;

37

Page 38: Proceduri Si Functii - Proceduri Pascal

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

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 ;

38

Page 39: Proceduri Si Functii - Proceduri Pascal

car-este o expresie de tip_ordinal,0≤ord(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

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 cu’Y’ 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

39

Page 40: Proceduri Si Functii - Proceduri Pascal

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.

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 al fisierului nu e cunoscut

dinainte, iar 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 s-

au 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.

40

Page 41: Proceduri Si Functii - Proceduri Pascal

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.

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 organizare’’logica’’ 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

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

articolMarca EOF

41

Page 42: Proceduri Si Functii - Proceduri Pascal

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.

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.

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

fisier

citire scriere

Memorie centrala

Localizarea fizica a variabilei fisier in memoria centrala

42

Page 43: Proceduri Si Functii - Proceduri Pascal

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 de’’dechidere’’

a fisierului. Dar daca un fisier este dechis pentru citire acelasi fisier este inchis pentru

scriere si invers.

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).

43

Page 44: Proceduri Si Functii - Proceduri Pascal

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.

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

f

pointer EOF

Dupa reset(f)

fpointer

transfer

buffer

pointer

EOF

f

44

Page 45: Proceduri Si Functii - Proceduri Pascal

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 ;

45

Page 46: Proceduri Si Functii - Proceduri Pascal

-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

46

Page 47: Proceduri Si Functii - Proceduri Pascal

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

47

Page 48: Proceduri Si Functii - Proceduri Pascal

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

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.

f

v

f

v

48

Page 49: Proceduri Si Functii - Proceduri Pascal

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.

49

Page 50: Proceduri Si Functii - Proceduri Pascal

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

50

Page 51: Proceduri Si Functii - Proceduri Pascal

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

51

Page 52: Proceduri Si Functii - Proceduri Pascal

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

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.

VAR f:FILE

reset(f,recsize) sau rewrite(f, recsize)

52

Page 53: Proceduri Si Functii - Proceduri Pascal

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 :

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.

parametrii avand o semnificatie asemanatoare. Aici insa Count specifica numarul

maxim de blocuri care se citesc.

blockwrite(f,Buf,Count[,Result])

53

blockwrite(f,Buf,Count[,Result])

Page 54: Proceduri Si Functii - Proceduri Pascal

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).

54

Page 55: Proceduri Si Functii - Proceduri Pascal

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[1………3] 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

55

Page 56: Proceduri Si Functii - Proceduri Pascal

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 caractere’3’,’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 :

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 unei’’marci 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

VAR f:TEXT

56

Page 57: Proceduri Si Functii - Proceduri Pascal

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).

57