Upload
codreanu-petru
View
214
Download
0
Embed Size (px)
Citation preview
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
1/17
Algoritmii programe de prelucrare a fiierelor
2. PRELUCRAREA MASIVELOR MEMORATEN FIIERE BINARE
Una din aplicaiile des ntlnite n lucrul cu fiiere este memorarea masivelor de date dedimensiuni foarte mari, care fac imposibil aducerea lor integral n memoria intern. Problema
principal a prelucrrii masivelor (vectori, matrice etc.) memorate n fiiere binare, o constituie
determinarea poziiei unui anumit element de masiv n cadrul fiierului. Indiferent de numrul dedimensiuni 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 serealizeaz pe baza funciei rang, similar celei implementate pentru datele de tip ARRAY.
n cazul masivelor memorate n fiiere, prelucrarea acestora depinde de unele caracteristiciparticulare:
numrul de dimensiuni ale masivului; ordinea de memorare n fiier (n ordine lexicografic sau invers lexicografic); modul de memorare (dens sau nedens); ordinea de parcurgere a masivului.
2.1. Prelucrarea vectorilor
De regul, vectorii se memoreaz dens. Numrul relativ al articolului depinde de rangulelementului n cadrul vectorului, astfel:
nr_relativ = rang(xi) = i, pentru i=1,n, dac articolul cu numrul relativ 0, fie nu este utilizat(caz n care dimensiunea vectorului este n = FileSize(f)-1), fie memoreaz numrul efectiv decomponente ale vectorului (m < FileSize(f));
nr_relativ = rang(xi)-1 = i-1, pentru i=1,n, dac vectorul se memoreaz ncepnd cu primularticol (caz n care dimensiunea vectorului este n = FileSize(f)).
n exemplele care urmeaz se va citeti/scrie cte un element pe articol.
Exerciiul 1: S se creeze un vector de dimensiune n, memorat ntr-un fiier binar. Dimensiunea ivalorile elementelor vectorului se citesc de la tastatur.
program creare_vector;var
vector:file of real;x:real; n,i:longint;nume:string;
beginwrite('Numele fisierului: '); readln(nume);
assign(vector,nume); rewrite(vector);write('Dimensiunea vectorului: '); readln(n);writeln('Elementele vectorului:');for i:=1 to n do
beginwrite('(',i:4,')= '); readln(x);write(vector,x)
end;close(vector)
end.
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
2/17
Algoritmii programe de prelucrare a fiierelor
Exerciiul 2: S se afieze pe monitor vectorul memorat ntr-un fiier binar.
program listare_vector;var
vector:file of real;x:real; i:longint;
nume:string;beginwrite('Numele fisierului: '); readln(nume);assign(vector,nume); reset(vector);if filesize(vector)=0 then writeln('Fisier vid!')
elsewhile not eof(vector) do
beginread(vector,x);writeln(x:10:2)
end;
close(vector)end.
Exerciiul 3: S se determine elementul minim i elementul maxim dintr-un vector memorat ntr-unfiier binar.
program maxim_minim_vector;var
vector:file of real;max,x:real; n,i:longint;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(vector,nume); reset(vector);n:=filesize(vector);read(vector,max);min:=max;seek(vector,1);for i:=2 to n do
beginread(vector,x);
if x>max then max=xelse if x
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
3/17
Algoritmii programe de prelucrare a fiierelor
vector:file of real;lista:text;valoare,x:real; n,i:longint;nume:string; vb:boolean;
beginwrite('Numele fisierului: '); readln(nume);
assign(vector,nume); reset(vector);assign(lista,'lista.txt'); rewrite(lista);write('Valoarea cautata: '); readln(valoare);n:=filesize(vector);vb:=false;for i:=1 to n do
beginread(vector,x);if x=valoare then
beginwriteln(lista,i:4);
vb:=trueend
end;close(vector); close(lista);if not vb then
beginwriteln('Valoare neregasita!'); erase(lista)end
end.Exerciiul 5: S se sorteze cresctor, prin metoda seleciei, elementele unui vector memorat ntr-unfiier binar.
program sortare_vector;var
vector:file of real;x,y:real; n,i,j:longint;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(vector,nume); reset(vector);n:=filesize(vector);
for i:=1 to n-1 dobeginseek(vector,i-1); read(vector,x);for j:=i+1 to n do
beginseek(vector,j-1); read(vector,y);if x>y then
beginseek(vector,i-1); write(vector,y);seek(vector,j-1); write(vector,x);x:=y
endendend;
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
4/17
Algoritmii programe de prelucrare a fiierelor
close(vector)end.
Exerciiul 6: S se interclaseze elementele a doi vectori, memorai n cte un fiier binar. Rezultatul vafi memorat ntr-un alt fiier binar.
Observaie: Vectorii iniiali trebuie s fie sortai.
program interclasare_vectori;var
v1,v2,v3:file of real;x,y:real; m,n:longint;nume1,nume2,nume3:string;
const hv=10e+6;begin
write('Numele fisierului pentru vectorul 1: '); readln(nume1);assign(v1,nume1); reset(v1);
write('Numele fisierului pentru vectorul 2: '); readln(nume2);assign(v2,nume2); reset(v2);write('Numele fisierului de iesire: '); readln(nume3);assign(v3,nume3); rewrite(v3);m:=filesize(v1);n:=filesize(v2);read(v1,x); read(v2,y);while (xhv) or (yhv) do
beginif x
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
5/17
Algoritmii programe de prelucrare a fiierelor
nume:string;j,k:word; x:real;y:array[1..1000] of real;f:array[1..1000] of word;
beginwrite('Numele fisierului: ');
readln(nume);assign(vector,nume);reset(vector);j:=0;
while not eof(vector) dobegin
read(vector,x);k:=1;while (k
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
6/17
Algoritmii programe de prelucrare a fiierelor
if i
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
7/17
Algoritmii programe de prelucrare a fiierelor
k:=0; i:=1;while i
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
8/17
Algoritmii programe de prelucrare a fiierelor
Exerciiul 11: S se compacteze un vector memorat ntr-un fiier binar, prin eliminarea dublurilor,pentru obinerea unui vector de elemente unice.Observaie: La limit, fiierul va avea cel puin un articol.
program compactare;var
vector:file of real;x,y:real; i,j,k,n:word;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(vector,nume); reset(vector);n:=filesize(vector);k:=0; i:=1;while i
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
9/17
Algoritmii programe de prelucrare a fiierelor
while (xhv) or (yhv) dobegin
if xy thenbegin
write(v3,y);if eof(v2) then y:=hv else read(v2,y)
endelse if eof(v1) then x:=hv else read(v1,x)
end;close(v1); close(v2); close(v3)
end.
Exerciiul 13: S se realizeze intersecia a dou mulimi de numere reale, memorate n cte un fiierbinar. Rezultatul va fi memorat ntr-un alt fiier binar.Observaie: Pentru a asigura mulimilor proprietatea de unicitate a elementelor, fiecare fiier de intrareva fi n prealabil sortat i apoi compactat. La limit, fiierul de ieire poate fi vid.
program intersectie;var
v1,v2,v3:file of real;x,y:real; m,n,i,j:word;nume1,nume2,nume3:string;
beginwrite('Numele fisierului pentru vectorul 1: '); readln(nume1);assign(v1,nume1); reset(v1);write('Numele fisierului pentru vectorul 2: '); readln(nume2);assign(v2,nume2); reset(v2);write('Numele fisierului de iesire: '); readln(nume3);assign(v3,nume3); rewrite(v3);m:=filesize(v1); n:=filesize(v2);i:=1; j:=1;read(v1,x); read(v2,y);while (i
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
10/17
Algoritmii programe de prelucrare a fiierelor
inc(i);if not eof(v1) then read(v1,x)
endend;
close(v1); close(v2); close(v3)end.
Exerciiul 14: S se realizeze diferena dintre dou mulimi de numere reale, memorate n cte unfiier binar. Rezultatul va fi memorat ntr-un alt fiier binar.Observaie: Pentru a asigura mulimilor proprietatea de unicitate a elementelor, fiecare fiier de intrareva fi n prealabil sortat i apoi compactat. La limit, fiierul de ieire poate fi vid.
program diferenta;var
v1,v2,v3:file of real;x,y:real; m,n,i,j:word;nume1,nume2,nume3:string;
beginwrite('Numele fisierului pentru vectorul 1: '); readln(nume1);assign(v1,nume1); reset(v1);write('Numele fisierului pentru vectorul 2: '); readln(nume2);assign(v2,nume2); reset(v2);write('Numele fisierului de iesire: '); readln(nume3);assign(v3,nume3); rewrite(v3);m:=filesize(v1); n:=filesize(v2);for i:=1 to m do
beginj:=1; seek(v2,0);read(v1,x); read(v2,y);while (xy) and (jn then write(v3,x)
end;close(v1); close(v2); close(v3)
end.
2.2. Prelucrarea matricelor
O matrice poate fi memorat ntr-un fiier binar nedens (similar memorrii n MP) sau dens, nordine lexicografic sau invers lexicografic. Numrul relativ al elementului aij se determin pe bazafunciei rang, astfel:
rang(aij)=(i-1)*nr_coloane+j, n cazul memorrii lexicografice, unde nr_coloane este fienumrul 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 fienumrul liniilor efective (populare dens), fie numrul liniilor rezervate (populare nedens).
Fie mi n numrul liniilor, respectiv coloanelor efective i mri nr numrul liniilor, respectiv
coloanelor rezervate (mri nr corespund elementelor dintr-o declaraie ARRAY). Pentru ca fiierul sconin informaii complete despre matrice, trebuie s memoreze, pe lng elementele ei, i:
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
11/17
Algoritmii programe de prelucrare a fiierelor
m (sau n), n cazul memorrii dense. Cnd se memoreaz m, n se determin dup relaiaFileSize(f) DIV m; cnd se memoreazn, m se determin dup relaia FileSize(f) DIV n. Funcia rangdepinde 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 relaiaFileSize(f) DIV nr, iarmr nu are relevan (el putea fi memorat n locul lui nr, acesta determinndu-sedup relaia FileSize(f) DIV mr). Funcia rang depinde de nr;
m i mr, n cazul memorrii nedense n ordine invers lexicografic. N se determin duprelaia FileSize(f) DIV mr, iar nr nu are relevan (el putea fi memorat n locul lui mr, acestadeterminndu-se dup relaia FileSize(f) DIV nr). Funcia rang depinde de mr.
Funcia rang se calculeazi se utilizeaz ca pointer n fiier numai dac problema de rezolvatimplic parcurgerea matricei n alt ordine dect cea n care este memorat n fiier.
Exerciiul 15: S se creeze o matrice dreptunghiular, memorat dens lexicografic ntr-un fiier binar.Primul articol va conine numrul de linii.Observaie: Numrul de coloane va putea fi dedus la prelucrrile ulterioare din dimensiunea fiieruluii numrul de linii citit n primul articol.
program creare_matrice_dreptunghiulara;
varmat:file of real;a:real; m,n,i,j:word;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(mat,nume); rewrite(mat);write('Dimensiunile matricei (m,n): ');readln(m,n);a:=m; write(mat,a);writeln('Elementele matricei:');for i:=1 to m do
for j:=1 to n dobegin
write('(',i:4,',',j:4,')= ');readln(a);write(mat,a)
end;close(mat)
end.
Exerciiul 16: S se afieze pe monitor o matrice dreptunghiular, memorat dens lexicografic ntr-unfiier binar. Primul articol conine numrul de linii.
program listare_matrice_dreptunghiulara;var
mat:file of real;a:real; m,n,i,j:word;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(mat,nume); reset(mat);
read(mat,a);m:=trunc(a);n:=(filesize(mat)-1) div m;
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
12/17
Algoritmii programe de prelucrare a fiierelor
writeln('Matricea este:');for i:=1 to m do
beginfor j:=1 to n do
beginread(mat,a);
write(a:10:2)end;writeln
end;close(mat)
end.
Exerciiul 17: S se determine elementul maxim de pe fiecare linie a unei matrice dreptunghiulare,memorat dens lexicografic ntr-un fiier binar. Primul articol conine numrul de linii. Maximele vorfi afiate pe monitor.Observaie: Deoarece matricea este memorat lexicografic, fiierul va fi parcurs secvenial.
program maxim_lexicografic;var
mat:file of real;a,max:real;m,n,i,j:word;nume:string;
beginwrite('Numele fisierului: ');readln(nume);assign(mat,nume);reset(mat);read(mat,a);m:=trunc(a);n:=(filesize(mat)-1) div m;for i:=1 to m do
beginread(mat,max);for j:=2 to n do
beginread(mat,a);
if a>max then max:=aend;writeln('maximul pe linia ',i,' = ',max:10:2)
end;close(mat)
end.
Exerciiul 18: S se determine elementul maxim de pe fiecare linie a unei matrice dreptunghiulare,memorat dens i invers lexicografic, ntr-un fiier binar. Primul articol conine numrul de linii.Maximele vor fi afiate pe monitor.Observaie: Deoarece matricea este memorat invers lexicografic, elementele vor fi accesate direct,
utiliznd funcia rang (j-1)*m+i.
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
13/17
Algoritmii programe de prelucrare a fiierelor
program maxim_invers_lexicografic;var
mat:file of real;a,max:real;m,n,i,j:word;nume:string;
begin write('Numele fisierului: ');readln(nume);assign(mat,nume);reset(mat);read(mat,a);m:=trunc(a);n:=(filesize(mat)-1) div m;for i:=1 to m do
beginseek(mat,i); read(mat,max);
for j:=2 to n dobegin
seek(mat,(j-1)*m+i); read(mat,a);if a>max then max:=a
end;writeln('maximul pe linia ',i,' = ',max:10:2)
end;close(mat)
end.
Exerciiul 19: S se determine transpusa unei matrice dreptunghiulare, memorat dens lexicograficntr-un fiier binar. Primul articol conine numrul de linii. Transpusa va fi memorat similar, ntr-unalt fiier binar.Observaie: Sunt dou posibiliti de parcurgere a fiierului iniial:
1. n acces secvenial, utiliznd formula b(j,i)=a(i,j), caz n care fiierul de ieire este creat nacces direct;
2. n acces direct, utiliznd formula b(i,j)=a(j,i), caz n care fiierul de ieire este creat n accessecvenial.
program transpusa_unei_matrice;var
m1,m2:file of real;
a,b:real; m,n,i,j:word;nume1,nume2:string;begin
write('Numele fisierului pentru matricea initiala: ');readln(nume1);write('Numele fisierului pentru matricea transpusa: ');readln(nume2);assign(m1,nume1); reset(m1);assign(m2,nume2); rewrite(m2);read(m1,a);m:=trunc(a);
n:=(filesize(m1)-1) div m;a:=n; write(m2,a);for i:=1 to n do
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
14/17
Algoritmii programe de prelucrare a fiierelor
for j:=1 to m dobegin
seek(m1,(j-1)*n+i);read(m1,a);write(m2,a)
end;
close(m1);close(m2)end.
Exerciiul 20: S se determine produsul a dou matrice dreptunghiulare, memorate dens lexicografic,fiecare ntr-un fiier binar. Primul articol conine numrul de linii. Matricea rezultat va fi memoratsimilar, ntr-un alt fiier binar.
program produs_de_matrice;var
m1,m2,m3:file of real;
a,b,c:real; m,n,p,i,j,k:word;nume1,nume2,nume3:string;
beginwrite('Numele fisierului pentru matricea deinmultit: ');readln(nume1);write('Numele fisierului pentru matricea inmultitor: ');readln(nume2);write('Numele fisierului pentru matricea rezultat: ');readln(nume3);assign(m1,nume1); reset(m1);assign(m2,nume2); reset(m2);assign(m3,nume3); rewrite(m3);read(m1,a);m:=trunc(a);write(m3,a);
n:=(filesize(m1)-1) div m;p:=(filesize(m2)-1) div n;for i:=1 to m dofor j:=1 to p do
beginc:=0;
for k:=1 to n dobeginseek(m1,(i-1)*n+k);read(m1,a);seek(m2,(k-1)*p+j);
read(m2,b);c:=c+a*b
end;write(m3,c)
end;close(m1);
close(m2);close(m3)end.
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
15/17
Algoritmii programe de prelucrare a fiierelor
Exerciiul 21: S se determine produsul ntre un vector, memorat ntr-un fiier binar i o matricedreptunghiular, memorat dens lexicografic ntr-un fiier binar, primul articol coninnd numrul delinii. Vectorul rezultat va fi memorat similar, ntr-un fiier binar.
program produs_vector_matrice;
var mat,v1,v2:file of real;x,y,a:real; m,n,i,j:word;nume1,nume2,nume3:string;
beginwrite('Numele fisierului pentru vectorul de intrare: ');readln(nume1);write('Numele fisierului pentru matrice: ');readln(nume2);write('Numele fisierului pentru vectorul de iesire: ');
readln(nume3);
assign(v1,nume1); reset(v1);assign(mat,nume2); reset(mat);assign(v2,nume3); rewrite(v2);read(mat,a);m:=trunc(a);n:=(filesize(mat)-1) div m;for j:=1 to n do
beginseek(v1,0);y:=0;for i:=1 to m do
beginread(v1,x);seek(mat,(i-1)*n+j);read(mat,a);y:=y+x*a
end;write(v2,y)
end;close(v1); close(mat); close(v2)
end.
Exerciiul 22: S se creeze o matrice ptrat, memorat dens lexicografic ntr-un fiier binar.Observaie: Dimensiunea matricei (n) nu se memoreaz, deoarece poate fi dedus din dimensiuneafiierului, egal cu n2.
program creare_matrice_patrata;var
mat:file of real;a:real; n,i,j:word;nume:string;
begin
write('Numele fisierului: ');readln(nume);assign(mat,nume);
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
16/17
Algoritmii programe de prelucrare a fiierelor
rewrite(mat);write('Dimensiunea matricei (n): ');readln(n);writeln('Elementele matricei:');for i:=1 to n do
for j:=1 to n do
beginwrite('(',i:4,',',j:4,')= ');readln(a);write(mat,a)
end;close(mat)
end.
Exerciiul 23: S se determine suma elementelor de pe diagonala principal, respectiv secundar aunei matrice ptrate, memorat dens lexicografic ntr-un fiier binar.
program sume_pe_diagonale;var
mat:file of real;a,sdp,sds:real; n,i:word; nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(mat,nume); reset(mat);n:=trunc(sqrt(filesize(mat)));sdp:=0; sds:=0;for i:=1 to n do
beginseek(mat,(i-1)*n+i-1); read(mat,a); sdp:=sdp+a;seek(mat,(n-1)*i); read(mat,a); sds:=sds+a;
end;close(mat);writeln('Suma pe diagonala principala = ',sdp:10:2);writeln('Suma pe diagonala secundara = ',sds:10:2)
end.
Exerciiul 24: S se determine media aritmetic a elementelor strict pozitive din triunghiul de subdiagonala principal (inclusiv diagonala), dintr-o matrice ptrat, memorat dens lexicografic ntr-un
fiier binar.program medie_elemente_pozitive_din_triunghiul_inferior;var
mat:file of real;a,med:real; n,i,j,k:word;nume:string;
beginwrite('Numele fisierului: '); readln(nume);assign(mat,nume); reset(mat);n:=trunc(sqrt(filesize(mat)));
med:=0; k:=0;for i:=1 to n dofor j:=1 to i do
8/8/2019 Prelucrarea Masivelor Memorate in Fisiere Binare
17/17
Algoritmii programe de prelucrare a fiierelor
beginseek(mat,(i-1)*n+j-1); read(mat,a);if a>0 then
beginmed:=med+a;inc(k)
endend;close(mat);if k = 0 then writeln('Nu exista elemente pozitive!')else writeln('Media = ',med/k:10:2)
end.