Una din aplicaiile des ntlnite n lucrul cu fiiere este memorarea masivelor de date de dimensiuni mari, care fac imposibil aducerea integral a lor n memoria intern. Problema principal a prelucrrii masivelor (vectori, matrice etc.) memorate n fiiere binare o constituie determinarea poziiei unui anumit element din masiv n cadrul fiierului. Indiferent de numrul de dimensiuni ale masivului i de modalitile de memorare a elementelor sale n cadrul fiierului, legtura ntre elementul de masiv care se refer i numrul relativ al articolului care l conine se realizeaz pe baza funciei rang, similar celei implementate pentru datele de tip ARRAY. n cazul masivelor memorate n fiiere, prelucrarea acestora depinde de unele caracteristici particulare: numrul de dimensiuni ale masivului; ordinea de memorare n fiier (lexicografic sau invers lexicografic); modul de memorare (dens sau nedens); ordinea de parcurgere a masivului.
5.1. Prelucrarea vectorilor
De regul, vectorii se memoreaz dens. Numrul relativ al articolului depinde de rangul elementului n cadrul vectorului, astfel: nr_relativ=rang(x i )=i, pentru i=1..n, dac articolul cu numrul relativ 0 nu este utilizat, caz n care dimensiunea vectorului este n=FileSize(f)-1, sau memoreaz numrul efectiv de componente ale vectorului (n<FileSize(f)); nr_relativ=rang(x i )-1=i-1, pentru i=1..n, dac vectorul se memoreaz ncepnd cu primul articol (caz n care dimensiunea vectorului este n=FileSize(f)). Pentru exemplificarea prelucrrii vectorilor de mari dimensiuni memorai n fiiere s-a construit unitatea Pascal Unit_vec, care conine urmtoarele proceduri de prelucrare a vectorilor memorai dens, ncepnd de la poziia 0: Creare_vector realizeaz crearea n acces secvenial a unui fiier binar ale crui articole, de tip REAL, memoreaz elementele vectorului. Listare_vector afieaz pe ecran coninutul fiierului (vectorului), printr-o parcurgere secvenial. Procedura poate fi folosit de ctre utilizator, n special pentru verificarea corectitudinii rezultatelor. Sortare_vector realizeaz sortarea fiierului prin metoda seleciei, prin interschimbarea fizic a elementelor vectorului (articolelor), utiliznd accesul direct. Min_max_vector determin elementul minim, respectiv maxim din vector, printr-o singur parcurgere secvenial a fiierului. Interclasare realizeaz interclasarea a doi vectori de dimensiuni diferite, memorai n cte un fiier binar. Procedura asigur sortarea lor nainte de interclasarea propriu-zis. Rezultatul va fi memorat ntr-un fiier binar, similar vectorilor iniiali. Produs_vectorial determin produsul vectorial dintre doi vectori, memorai consecutiv n acelai fiier. Rezultatul va fi memorat mpreun cu vectorii iniiali, ca extindere a fiierului de intrare, a crui dimensiune la ieire va fi 3n. Algoritmi n programare. Aplicaii unit unit_vec; INTERFACE uses crt; type tipfis=file of real; procedure creare_vector(var f:tipfis; var nume:string); procedure listare_vector(var f:tipfis; var nume:string); procedure sortare_vector(var f:tipfis; var nume:string); procedure min_max_vector(var f:tipfis; var nume:string; var min,max:real); procedure interclasare(var f,g,h:tipfis; var nume1,nume2,nume3: string); procedure produs_vectorial(var f:tipfis; var nume:string); IMPLEMENTATION var n,i,j:word; x,y,z,hv:real; procedure creare_vector; begin clrscr; assign(f,nume); rewrite(f); write('Dimensiune vector: '); readln(n); for i:=1 to n do begin write('x(',i:2,') = '); readln(x); write(f,x) end; close(f) end; procedure listare_vector; begin clrscr; assign(f,nume); reset(f); for i:=1 to filesize(f) do begin read(f,x); writeln('x(',i:2,') = ',x:10:2) end; close(f) end; procedure sortare_vector; begin clrscr; assign(f,nume); reset(f); n:=filesize(f); for i:=1 to n-1 do begin seek(f,i-1); read(f,x); for j:=i+1 to n do begin seek(f,j-1); read(f,y); if x>y then begin seek(f,i-1); write(f,y); seek(f,j-1); write(f,x); x:=y end end end; close(f) end; Masive memorate n fiiere procedure min_max_vector; begin assign(f,nume); reset(f); read(f,max); min:=max; for i:=2 to filesize(f) do begin read(f,x); if x>max then max:=x else if x<min then min:=x end; close(f) end; procedure interclasare; begin hv:=1000000; sortare_vector(f,nume1); sortare_vector(g,nume2); reset(f); reset(g); assign(h,nume3); rewrite(h); read(f,x); read(g,y); while (x<>hv) or (y<>hv) do if x<y then begin write(h,x); if eof(f) then x:=hv else read(f,x) end else begin write(h,y); if eof(g) then y:=hv else read(g,y) end; close(f); close(g); close(h) end; procedure produs_vectorial; begin assign(f,nume); reset(f); n:=filesize(f) div 2; for i:=1 to n do begin seek(f,i-1); read(f,x); seek(f,n+i-1); read(f,y); z:=x*y; seek(f,2*n+i-1); write(f,z) end; close(f); end; end. Algoritmi n programare. Aplicaii 5.2. Prelucrarea matricelor
O matrice poate fi memorat ntr-un fiier binar nedens (similar memorrii n memoria principal) sau dens, n ordine lexicografic sau invers lexicografic. Numrul relativ al elementului a ij se determin pe baza funciei rang, astfel: rang(a ij )=(i-1)nr_coloane+j, n cazul memorrii lexicografice, unde nr_coloane este fie numrul coloanelor efective (populare dens), fie numrul coloanelor rezervate (populare nedens); rang(a ij )=(j-1)nr_linii+i, n cazul memorrii invers lexicografice, unde nr_linii este fie numrul liniilor efective (populare dens), fie numrul liniilor rezervate (populare nedens). Fie m i n numrul liniilor, respectiv coloanelor efective i mr i nr numrul liniilor, respectiv coloanelor rezervate (mr i nr corespund elementelor din declaraia ARRAY). Pentru ca fiierul s conin informaii complete despre matrice trebuie s memoreze pe lng elementele ei i alte informaii cu privire la dimensiuni: m (sau n), n cazul memorrii dense. Cnd se memoreaz m, n se determin dup relaia FileSize(f) DIV m; cnd se memoreaz n, m se determin dup relaia FileSize(f) DIV n. Funcia rang depinde de m sau n, dup cum matricea este memorat invers lexicografic sau lexicografic; n i nr, n cazul memorrii nedense n ordine lexicografic; m se determin dup relaia FileSize(f) DIV nr, iar mr nu are relevan (el putea fi memorat n locul lui nr, acesta determinndu-se dup relaia FileSize(f) DIV mr). Funcia rang depinde de nr; m i mr, n cazul memorrii nedense n ordine invers lexicografic; n se determin dup relaia FileSize(f) DIV mr, iar nr nu are relevan (el putea fi memorat n locul lui mr, acesta determinndu-se dup relaia FileSize(f) DIV nr). Funcia rang depinde de mr. Funcia rang se calculeaz i se utilizeaz numai dac problema de rezolvat implic parcurgerea matricei n alt ordine dect cea n care este memorat n fiier (consultarea acestuia se realizeaz n acces direct).
1. Pentru exemplificarea prelucrrii matricelor dreptunghiulare, memorate dens i lexicografic s-a construit unitatea Unit_mat. Se presupune c matricea are dimensiunea maxim 100x100. Unitatea conine urmtoarele proceduri: Creare_matrice realizeaz crearea n acces secvenial a unui fiier binar, care va conine n primul articol numrul de linii, iar n celelalte elementele matricei. Listare_matrice afieaz pe ecran o matrice dreptunghiular, sub form tabelar, prin parcurgerea secvenial a fiierului care o memoreaz. Maxime_pe_coloane determin elementul maxim de pe fiecare coloan a unei matrice dreptunghiulare, memorat ntr-un fiier binar. Elementele matricei sunt accesate direct, pe baza funciei rang. Rezultatul se depune ntr-un vector, memorat n memoria principal. Determinare_linii selecteaz liniile cu elemente constante ale unei matrice dreptunghiulare, memorat ntr-un fiier binar. Primul element al fiecrei Masive memorate n fiiere linii este accesat direct pe baza funciei rang, celelalte elemente fiind accesate secvenial. Rezultatul se depune ntr-un vector, memorat n memoria principal. Transpusa determin transpusa unei matrice dreptunghiulare, memorat ntr-un fiier binar. Rezultatul este depus ntr-un alt fiier binar, cu structur similar fiierului iniial. Fiierul de intrare este parcurs n acces direct, iar cel de ieire este creat n acces secvenial. Adunare_matrice determin suma a dou matrice dreptunghiulare, memorate n cte un fiier binar. Rezultatul este memorat similar, ntr-un alt fiier binar. Fiierele de intrare, precum i cel de ieire, sunt parcurse secvenial. Produs_matrice realizeaz nmulirea a dou matrice dreptunghiulare, memorate n cte un fiier binar. Rezultatul este memorat similar, ntr-un alt fiier binar. Fiierele de intrare sunt parcurse n acces direct, iar cel de ieire este creat n acces secvenial. Coloane_progr_aritm determin coloanele cu elemente n progresie aritmetic ale unei matrice dreptunghiulare, memorat ntr-un fiier binar. Fiierul de intrare se parcurge n acces direct, iar rezultatul de depune ntr-un vector, memorat n memoria principal. Pentru ca problema s aib sens, matricea trebuie s aib minim trei linii.
unit unit_mat; INTERFACE uses crt; type art=record case boolean of false:(dim:word); true:(a:real) end; tipfis=file of art; vector=array[1..100] of real; procedure creare_matrice(var f:tipfis; var nume:string); procedure listare_matrice(var f:tipfis; var nume:string); procedure maxime_pe_coloane(var f:tipfis; var nume:string; var nrc:word; var max:vector); procedure determinare_linii(var f:tipfis; var nume:string; var k:word; var v:vector); procedure coloane_progr_aritm(var f:tipfis; var nume:string; var k:word; var v:vector); procedure transpusa(var f,g:tipfis; var nume1,nume2:string); procedure adunare_matrice(var f,g,h:tipfis; var nume1,nume2, nume3 :string); procedure produs_matrice(var f,g,h:tipfis; var nume1,nume2, nume3 :string); IMPLEMENTATION var m,n,p,i,j,k:word; x,y,z:art; vb:boolean; r:real; Algoritmi n programare. Aplicaii procedure creare_matrice; begin clrscr; assign(f,nume); rewrite(f); write('Nr. linii: '); readln(m); write('Nr. coloane: '); readln(n); x.dim:=m; write(f,x); for i:=1 to m do for j:=1 to n do begin write('a(',i,',',j,') = '); readln(x.a); write(f,x) end; close(f) end; procedure listare_matrice; begin clrscr; assign(f,nume); reset(f); read(f,x); m:=x.dim; n:=(filesize(f)-1) div m; for i:=1 to m do begin for j:=1 to n do begin read(f,x); write(x.a:5:2,' ') end; writeln end; close(f) end; procedure maxime_pe_coloane; begin assign(f,nume); reset(f); read(f,x); m:=x.dim; nrc:=(filesize(f)-1) div m; for j:=1 to nrc do begin seek(f,j); read(f,x); max[j]:=x.a; for i:=2 to m do begin seek(f,(i-1)*nrc+j); read(f,x); if x.a>max[j] then max[j]:=x.a end end end; procedure determinare_linii; begin assign(f,nume); reset(f); read(f,x); m:=x.dim; n:=(filesize(f)-1) div m; k:=0; for i:=1 to m do Masive memorate n fiiere begin j:=1; vb:=false; seek(f,(i-1)*n+1); read(f,x); while (j<=n-1) and not vb do begin read(f,y); if x.a<>y.a then vb:=true else inc(j) end; if j=n then begin inc(k); v[k]:=i end end end; procedure transpusa; Begin assign(f,nume1); assign(g,nume2); reset(f); rewrite(g); read(f,x); m:=x.dim; n:=(Filesize(f)-1) div m; x.dim:=n; Write(g,x); for i:=1 to n do for j:=1 to m do begin seek(f,(j-1)*n+i); read(f,x); write(g,x) end; close(f); close(g) end; procedure adunare_matrice; begin assign(f,nume1); assign(g,nume2); assign(h,nume3); reset(f); reset(g); rewrite(h); read(f,x); m:=x.dim; n:=(Filesize(f)-1) div m; seek(g,1); write (h,x); for i:=1 to m do for j:=1 to n do begin read(f,x); read(g,y); z.a:=x.a+y.a; write(h,z) end; close(f); close(g); close(h) end; procedure produs_matrice; begin assign(f,nume1); assign(g,nume2); assign(h,nume3); reset(f); reset(g); rewrite(h); read(f,x); m:=x.dim; read(g,y); n:=y.dim; p:=(Filesize(g)-1) div n; write(h,x); for i:=1 to m do for j:=1 to p do begin Algoritmi n programare. Aplicaii z.a:=0; for k:=1 to n do begin seek(f,(i-1)*n+k); Read(f,x); seek(g,(k-1)*p+j); read(g,y); z.a:=z.a+x.a*y.a end; write(h,z) end; close(f); close(g); close(h) end; procedure coloane_progr_aritm; begin assign(f,nume); reset(f); read(f,x); m:=x.dim; n:=(Filesize(f)-1) div m; k:=0; for j:=1 to n do begin vb:=false; for i:=1 to m-2 do begin seek(f,i*n+j); read(f,x); seek(f,(i-1)*n+j); read(f,y); seek(f,(i+1)*n+j); read(f,z); if 2*x.a<>(y.a+z.a) then vb:=true end; if not vb then begin k:=k+1; v[k]:=j end end; close(f) end end.
2. Pentru exemplificarea prelucrrii matricelor ptrate, memorate dens i lexicografic s-a construit unitatea Unit_m2, care include o serie de proceduri i funcii specifice. Numrul de linii i de coloane ale matricei nu este memorat n fiier, ci va fi calculat pe baza dimensiunii fiierului (presupus n 2 ). Numrul relativ al elementului n fiier este dat de rangul elementului a(i,j) minus 1, deoarece matricea se memoreaz n fiier ncepnd de la poziia 0. Procedurile Creare_mat_real i Creare_mat_intreg realizeaz crearea n acces secvenial a unui fiier binar, care va conine matricea cu elemente reale, respectiv ntregi. Procedurile Listare_mat_real i Listare_mat_intreg afieaz pe ecran o matrice ptrat cu elemente reale, respectiv ntregi, sub form tabelar, prin parcurgerea secvenial a fiierului care o memoreaz. Masive memorate n fiiere Funcia Medie_a determin media aritmetic a elementelor din triunghiul de deasupra diagonalei principale, inclusiv diagonala, dintr-o matrice ptrat cu elemente reale. Media se calculeaz numai dac exist cel puin dou elemente. Funcia Medie_g determin media geometric a elementelor strict pozitive de pe diagonala secundar a unei matrice ptrate cu elemente reale. Media se calculeaz numai dac exist cel puin dou elemente, fiierul fiind parcurs n acces direct. Funcia Urma calculeaz urma unei matrice ptrate cu elemente reale (suma elementelor de pe diagonala principal). Fiierul este parcurs n acces direct. Funcia Numar determin numrul de elemente divizibile cu 3 din triunghiul de sub diagonala secundar dintr-o matrice ptrat cu elemente naturale.
unit unit_m2; INTERFACE uses crt; type tipfis=file of real; tipfisi=file of word; vector=array[1..100] of real; procedure creare_mat_real(var f:tipfis; var nume:string); procedure creare_mat_intreg(var f:tipfisi; var nume:string); procedure listare_mat_real(var f:tipfis; var nume:string); procedure listare_mat_intreg(var f:tipfisi; var nume:string); function medie_a(var f:tipfis; var nume:string):real; function medie_g(var f:tipfis; var nume:string):real; function urma(var f:tipfis; var nume:string):real; function numar(var f:tipfisi; var nume:string):word; IMPLEMENTATION var n,i,j,k,x:word; a,med,tr:real; procedure creare_mat_real; begin clrscr; assign(f,nume); rewrite(f); write('Nr.linii/coloane: '); readln(n); for i:=1 to n do for j:=1 to n do begin write('a(',i,',',j,')='); readln(a); write(f,a) end; close(f) end; procedure creare_mat_intreg; begin clrscr; assign(f,nume); rewrite(f); write('Nr.linii/coloane: '); readln(n); for i:=1 to n do for j:=1 to n do begin write('a(',i,',',j,')='); readln(x); write(f,x) end; close(f) end; Algoritmi n programare. Aplicaii procedure listare_mat_real; begin clrscr; assign(f,nume); reset(f); n:=trunc(sqrt(filesize(f))); for i:=1 to n do begin for j:=1 to n do begin read(f,a); write(a:5:2,' ') end; writeln end; close(f) end; procedure listare_mat_intreg; begin clrscr; assign(f,nume); reset(f); n:=trunc(sqrt(filesize(f))); for i:=1 to n do begin for j:=1 to n do begin read(f,x); write(x,' ') end; writeln end; close(f) end; function medie_a; begin assign (f,nume); reset (f); n:=trunc(sqrt(filesize(f))); med:=0; k:=0; for i:=1 to n do for j:=i to n do begin seek (f,(i-1)*n+j-1); read (f,a); med:=med+a; k:=k+1 end; if k>=2 then medie_a:=med/k; close (f) end; function medie_g; begin assign(f,nume); reset(f); n:=trunc(sqrt(filesize(f))); med:=1; k:=0; for i:=1 to n do begin seek(f,i*(n-1)); read(f,a); if a>0 then begin med:=med*a; k:=k+1 end end; if k>=2 then medie_g:=exp(ln(med)/k); close (f) end; Masive memorate n fiiere function urma; begin assign (f,nume); reset (f); n:=trunc(sqrt(filesize(f))); tr:=0; for i:=1 to n do for j:=1 to n do begin seek (f,(j-1)*n+j-1); read (f,a); tr:=tr+a end; urma:=tr; close (f) end; function numar; begin assign (f,nume); reset (f); n:=trunc(sqrt(filesize(f))); k:=0; for j:=2 to n do for i:=n-j+2 to n do begin seek (f,(i-1)*n+j-1); read (f,x); if (x mod 3)=0 then inc(k) end; numar:=k; close (f) end end.
5.3. Matrice memorate nedens
S se determine elementul maxim de pe fiecare coloan a unei matrice de dimensiuni mn (n<=1000), memorat nedens ntr-un fiier binar, n ordine lexicografic. Primul articol conine numrul de coloane efective. Numrul rezervat de coloane este 1000. Pot fi elaborate variante n care se ncarc n memoria intern o ntreag linie a matricei. Din aceast categorie de rezolvri sunt prezentate dou variante: cu parcurgerea integral de n ori a fiierului i cu o singur parcurgere.
Varianta 1 - fiierul se parcurge integral de n ori. type vector=array[1..1000] of real; var matrice:file of vector; max,linie:vector; m,n,i,j:longint; Algoritmi n programare. Aplicaii begin assign(matrice,'matrice.dat'); reset(matrice); read(matrice,linie); {citirea numarului de coloane} n:=trunc(linie[1]); m:=filesize(matrice)-1; for j:=1 to n do begin seek(matrice,1); {pozitionare pe prima linie} read(matrice,linie); max[j]:=linie[j]; for i:=2 to m do begin read(matrice,linie); if linie[j] > max[j] then max[j]:=linie[j] end end; writeln('Maximele pe fiecare coloana sunt:'); for j:=1 to n do writeln('Coloana ',j,' = ',max[j]:10:2); close(matrice) end.
Varianta 2 - fiierul se parcurge o singur dat. type vector=array[1..1000] of real; var matrice:file of vector; max,linie:vector; m,n,i,j:longint; begin assign(matrice,'matrice.dat'); reset(matrice); read(matrice,linie); {citirea numarului de coloane} n:=trunc(linie[1]); m:=filesize(matrice)-1; read(matrice,linie); {initializare maxime cu primul element de pe coloana j} for j:=1 to n do max[j]:=linie[j]; for i:=2 to m do begin read(matrice,linie); for j:=1 to n do if linie[j] > max[j] then max[j]:=linie[j] end; writeln('Maximele pe fiecare coloana sunt:'); for j:=1 to n do writeln('Coloana ',j,' = ',max[j]:10:2); close(matrice) end.