Prelucrarea Masivelor Memorate in Fisiere Binare

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.