Sunteți pe pagina 1din 12

5.

Masive memorate n fiiere


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(xi)=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(xi)-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 aij se determin pe baza funciei rang, astfel:
rang(aij)=(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(aij)=(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 n2). 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.