Algoritmi şi programe de prelucrare a fişierelor

2. PRELUCRAREA MASIVELOR MEMORATE ÎN FIŞIERE BINARE Una din aplicaţiile des întâlnite în lucrul cu fişiere este memorarea masivelor de date de dimensiuni foarte mari, care fac imposibilă aducerea lor integrală în memoria internă. Problema principală a prelucrării masivelor (vectori, matrice etc.) memorate în fişiere binare, o constituie determinarea poziţiei unui anumit element de masiv în cadrul fişierului. Indiferent de numărul de dimensiuni ale masivului şi de modalităţile de memorare a elementelor sale în cadrul fişierului, legătura între elementul de masiv care se referă şi numărul relativ al articolului care îl conţine se realizează pe baza funcţiei rang, similară celei implementate pentru datele de tip ARRAY. În cazul masivelor memorate în fişiere, prelucrarea acestora depinde de unele caracteristici particulare: • numărul de dimensiuni ale masivului; • ordinea de memorare în fişier (î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. Numărul relativ al articolului depinde de rangul elementului în cadrul vectorului, astfel: • nr_relativ = rang(xi) = i, pentru i=1,n, dacă articolul cu numărul relativ 0, fie nu este utilizat (caz în care dimensiunea vectorului este n = FileSize(f)-1), fie memorează numărul efectiv de componente ale vectorului (m < FileSize(f)); • nr_relativ = rang(xi)-1 = i-1, pentru i=1,n, dacă vectorul se memorează începând cu primul articol (caz în care dimensiunea vectorului este n = FileSize(f)). În exemplele care urmează se va citeti/scrie câte un element pe articol. Exerciţiul 1: Să se creeze un vector de dimensiune n, memorat într-un fişier binar. Dimensiunea şi valorile elementelor vectorului se citesc de la tastatură. program creare_vector; var vector:file of real; x:real; n,i:longint; nume:string; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); rewrite(vector); write('Dimensiunea vectorului: '); readln(n); writeln('Elementele vectorului:'); for i:=1 to n do begin write('(',i:4,')= '); readln(x); write(vector,x) end; close(vector) end.

Algoritmi şi programe de prelucrare a fişierelor

Exerciţiul 2: Să se afişeze pe monitor vectorul memorat într-un fişier binar. program listare_vector; var vector:file of real; x:real; i:longint; nume:string; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); if filesize(vector)=0 then writeln('Fisier vid!') else while not eof(vector) do begin read(vector,x); writeln(x:10:2) end; close(vector) end. Exerciţiul 3: Să se determine elementul minim şi elementul maxim dintr-un vector memorat într-un fişier binar. program maxim_minim_vector; var vector:file of real; max,x:real; n,i:longint; nume:string; begin write('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 begin read(vector,x); if x>max then max=x else if x <min then min:=x end; writeln('Max = ',max:10:2,' Min = ',min:10:2); close(vector) end. Exerciţiul 4: Să se determine poziţia tuturor apariţiilor unei valori date, într-un vector memorat într-un fişier binar. Poziţiile vor fi memorate într-un fişier TEXT. În cazul în care valoarea nu se regăseşte printre elementele vectorului, se va afişa un mesaj corespunzător şi fişierul TEXT se va şterge din director. program maxim_minim_vector; var

Algoritmi şi programe de prelucrare a fişierelor

vector:file of real; lista:text; valoare,x:real; n,i:longint; nume:string; vb:boolean; begin write('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 begin read(vector,x); if x=valoare then begin writeln(lista,i:4); vb:=true end end; close(vector); close(lista); if not vb then begin writeln('Valoare neregasita!'); erase(lista) end end. Exerciţiul 5: Să se sorteze crescător, prin metoda selecţiei, elementele unui vector memorat într-un fişier binar. program sortare_vector; var vector:file of real; x,y:real; n,i,j:longint; nume:string; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector); for i:=1 to n-1 do begin seek(vector,i-1); read(vector,x); for j:=i+1 to n do begin seek(vector,j-1); read(vector,y); if x>y then begin seek(vector,i-1); write(vector,y); seek(vector,j-1); write(vector,x); x:=y end end end;

Algoritmi şi programe de prelucrare a fişierelor

close(vector) end. Exerciţiul 6: Să se interclaseze elementele a doi vectori, memoraţi în câte un fişier binar. Rezultatul va fi memorat într-un alt fişier binar. Observaţie: Vectorii iniţiali trebuie să fie sortaţi. 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 (x<>hv) or (y<>hv) do begin if x<y then begin write(v3,x); if eof(v1) then x:=hv else read(v1,x) end else begin write(v3,y); if eof(v2) then y:=hv else read(v2,y) end end; close(v1); close(v2); close(v3) end. Exerciţiul 7: Să se determine elementele distincte, precum şi frecvenţa lor de apariţie, dintr-un şir de observaţii statistice (vector) memorat într-un fişier binar. Observaţie: Valorile distincte şi frecvenţele de apariţie vor fi reţinute în memoria principală, în câte un vector. Varianta 1: Pentru fiecare observaţie iniţială se va verifica dacă aceasta există în vectorul de observaţii distincte. În caz afirmativ, se va incrementa cu 1 elementul corespunzător din vectorul frecvenţelor, altfel se va construi un nou element în cei doi vectori de ieşire. program frecvente_1; var vector:file of real;

Algoritmi şi programe de prelucrare a fişierelor

nume:string; j,k:word; x:real; y:array[1..1000] of real; f:array[1..1000] of word; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); j:=0; while not eof(vector) do begin read(vector,x); k:=1; while (k<=j) and (x<>y[k]) do inc(k); if k<=j then inc(f[k]) else begin inc(j); y[j]:=x; f[j]:=1 end; end; close(vector); writeln('Valorile distincte si frecventele lor de aparitie sunt:'); for k:=1 to j do writeln(y[k]:10:2,' ',f[k]:4) end. Varianta 2: Se sortează vectorul iniţial de observaţii statistice, obţinându-se astfel o grupare a elementelor de aceeaşi valoare. Se parcurge vectorul sortat, reţinându-se în vectorul de observaţii distincte primul element dintr-o grupă de valori şi numărându-se apariţiile sale, după care se trece la următoarea grupă ş.a.m.d., până când se parcurge tot vectorul iniţial. program frecvente_2; var vector:file of real; nume:string; i,j,n:word; x:real; y:array[1..1000] of real; f:array[1..1000] of word; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector); read(vector,x); i:=1; j:=0; while i<=n do begin inc(j); y[j]:=x; f[j]:=0; while (y[j]=x) and (i<=n) do begin inc(f[j]); inc(i);

Algoritmi şi programe de prelucrare a fişierelor

if i<=n then read(vector,x) end end; close(vector); writeln('Valorile distincte si frecventele lor de aparitie sunt:'); for i:=1 to j do writeln(y[i]:10:2,' ',f[i]:4) end. Exerciţiul 8: Să se insereze valoarea zero între oricare două elemente ale unui vector memorat într-un fişier binar. Observaţie: Inserarea se va realiza prin extinderea fişierului iniţial, cu un număr cunoscut de articole (inserare fixă). program inserare_elemente_in_vector; var vector:file of real; x:real; n,i,j:word; nume:string; const zero:real=0.0; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector); for i:=1 to n-1 do begin for j:=n+i-1 downto 2*i do begin seek(vector,j-1); read(vector,x); write(vector,x); end; seek(vector,2*i-1); write(vector,zero) end; close(vector); end. Exerciţiul 9: Să se insereze valoarea zero în faţa oricărui element negativ al unui vector memorat întrun fişier binar. Observaţie: Inserarea se va realiza prin extinderea fişierului iniţial, cu un număr necunoscut de articole (inserare mobilă). program inserare_mobila; var vector:file of real; x:real; n,i,j,k:word; nume:string; const zero:real=0.0; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector);

Algoritmi şi programe de prelucrare a fişierelor

k:=0; i:=1; while i<=n+k do begin seek(vector,i-1); read(vector,x); if x<0 then begin for j:=n+k downto i do begin seek(vector,j-1); read(vector,x); write(vector,x) end; seek(vector,i-1); write(vector,zero); k:=k+1; i:=i+2; end else i:=i+1 end; close(vector); end. Exerciţiul 10: Să se elimine elementele de valoare zero ale unui vector memorat într-un fişier binar. Observaţie: Eliminarea se va realiza prin compactarea fişierului iniţial. La limită, fişierul rezultat poate fi vid. program eliminare_elemente_din_vector; var vector:file of real; x:real; n,i,j,k:word; nume:string; const zero:real=0.0; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector); k:=0; i:=1; while i<=n-k do begin seek(vector,i-1); read(vector,x); if x=0 then begin for j:=i to n-k-1 do begin seek(vector,j); read(vector,x); seek(vector,j-1); write(vector,x) end; inc(k) end else inc(i) end; seek(vector,n-k); truncate(vector); close(vector) end.

Algoritmi şi programe de prelucrare a fişierelor

Exerciţiul 11: Să se compacteze un vector memorat într-un fişier binar, prin eliminarea dublurilor, pentru obţinerea unui vector de elemente unice. Observaţie: La limită, fişierul va avea cel puţin un articol. program compactare; var vector:file of real; x,y:real; i,j,k,n:word; nume:string; begin write('Numele fisierului: '); readln(nume); assign(vector,nume); reset(vector); n:=filesize(vector); k:=0; i:=1; while i<=n-k do begin seek(vector,i-1); read(vector,x,y); if x=y then begin inc(k); for j:=i to n-k do begin seek(vector,j); read(vector,x); seek(vector,j-1); write(vector,x) end end else inc(i) end; seek(vector,n-k+1); truncate(vector); close(vector) end. Exerciţiul 12: Să se realizeze reuniunea a două mulţimi de numere reale, memorate în câte un fişier binar. Rezultatul va fi memorat într-un alt fişier binar. Observaţie: Pentru a asigura mulţimilor proprietatea de unicitate a elementelor, fiecare fişier de intrare va fi în prealabil sortat şi apoi compactat. program reuniune; var v1,v2,v3:file of real; x,y:real; 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); read(v1,x); read(v2,y);

Algoritmi şi programe de prelucrare a fişierelor

while (x<>hv) or (y<>hv) do begin if x<y then begin write(v3,x); if eof(v1) then x:=hv else read(v1,x) end else if x>y then begin write(v3,y); if eof(v2) then y:=hv else read(v2,y) end else if eof(v1) then x:=hv else read(v1,x) end; close(v1); close(v2); close(v3) end. Exerciţiul 13: Să se realizeze intersecţia a două mulţimi de numere reale, memorate în câte un fişier binar. Rezultatul va fi memorat într-un alt fişier binar. Observaţie: Pentru a asigura mulţimilor proprietatea de unicitate a elementelor, fiecare fişier de intrare va fi în prealabil sortat şi apoi compactat. La limită, fişierul de ieşire poate fi vid. program intersectie; var v1,v2,v3:file of real; x,y:real; m,n,i,j:word; nume1,nume2,nume3:string; 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); i:=1; j:=1; read(v1,x); read(v2,y); while (i<=m) and (j<=n) do begin if x=y then begin write(v3,x); inc(i); if not eof(v1) then read(v1,x) end else if x>y then begin inc(j); if not eof(v2) then read(v2,y) end else begin

Algoritmi şi programe de prelucrare a fişierelor

inc(i); if not eof(v1) then read(v1,x) end end; close(v1); close(v2); close(v3) end. Exerciţiul 14: Să se realizeze diferenţa dintre două mulţimi de numere reale, memorate în câte un fişier binar. Rezultatul va fi memorat într-un alt fişier binar. Observaţie: Pentru a asigura mulţimilor proprietatea de unicitate a elementelor, fiecare fişier de intrare va fi în prealabil sortat şi apoi compactat. La limită, fişierul de ieşire poate fi vid. program diferenta; var v1,v2,v3:file of real; x,y:real; m,n,i,j:word; nume1,nume2,nume3:string; 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); for i:=1 to m do begin j:=1; seek(v2,0); read(v1,x); read(v2,y); while (x<>y) and (j<=n) do begin inc(j); if not eof(v2) then read(v2,y) end; if j>n then write(v3,x) end; close(v1); close(v2); close(v3) end. 2.2. Prelucrarea matricelor O matrice poate fi memorată într-un fişier binar nedens (similar memorării în MP) sau dens, în ordine lexicografică sau invers lexicografică. Numărul relativ al elementului aij se determină pe baza funcţiei rang, astfel: • rang(aij)=(i-1)*nr_coloane+j, în cazul memorării lexicografice, unde nr_coloane este fie numărul coloanelor efective (populare densă), fie numărul coloanelor rezervate (populare nedensă); • rang(aij)=(j-1)*nr_linii+i, în cazul memorării invers lexicografice, unde nr_linii este fie numărul liniilor efective (populare densă), fie numărul liniilor rezervate (populare nedensă). Fie m şi n numărul liniilor, respectiv coloanelor efective şi mr şi nr numărul liniilor, respectiv coloanelor rezervate (mr şi nr corespund elementelor dintr-o declaraţie ARRAY). Pentru ca fişierul să conţină informaţii complete despre matrice, trebuie să memoreze, pe lângă elementele ei, şi:

Algoritmi şi programe de prelucrare a fişierelor

• m (sau n), în cazul memorării dense. Când se memorează m, n se determină după relaţia FileSize(f) DIV m; când se memorează n, m se determină după relaţia FileSize(f) DIV n. Funcţia rang depinde de m sau n, după cum matricea este memorată invers lexicografic sau lexicografic; • n şi nr, în cazul memorării nedense în ordine lexicografică. M se determină după relaţia FileSize(f) DIV nr, iar mr nu are relevanţă (el putea fi memorat în locul lui nr, acesta determinându-se după relaţia FileSize(f) DIV mr). Funcţia rang depinde de nr; • m şi mr, în cazul memorării nedense în ordine invers lexicografică. N se determină după relaţia FileSize(f) DIV mr, iar nr nu are relevanţă (el putea fi memorat în locul lui mr, acesta determinându-se după relaţia FileSize(f) DIV nr). Funcţia rang depinde de mr. Funcţia rang se calculează şi se utilizează ca pointer în fişier numai dacă problema de rezolvat implică parcurgerea matricei în altă ordine decât cea în care este memorată în fişier. Exerciţiul 15: Să se creeze o matrice dreptunghiulară, memorată dens lexicografic într-un fişier binar. Primul articol va conţine numărul de linii. Observaţie: Numărul de coloane va putea fi dedus la prelucrările ulterioare din dimensiunea fişierului şi numărul de linii citit în primul articol. program creare_matrice_dreptunghiulara; var mat:file of real; a:real; m,n,i,j:word; nume:string; begin write('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 do begin write('(',i:4,',',j:4,')= '); readln(a); write(mat,a) end; close(mat) end. Exerciţiul 16: Să se afişeze pe monitor o matrice dreptunghiulară, memorată dens lexicografic într-un fişier binar. Primul articol conţine numărul de linii. program listare_matrice_dreptunghiulara; var mat:file of real; a: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;

Algoritmi şi programe de prelucrare a fişierelor

writeln('Matricea este:'); for i:=1 to m do begin for j:=1 to n do begin read(mat,a); write(a:10:2) end; writeln end; close(mat) end. Exerciţiul 17: Să se determine elementul maxim de pe fiecare linie a unei matrice dreptunghiulare, memorată dens lexicografic într-un fişier binar. Primul articol conţine numărul de linii. Maximele vor fi afişate pe monitor. Observaţie: Deoarece matricea este memorată lexicografic, fişierul va fi parcurs secvenţial. program maxim_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 begin read(mat,max); for j:=2 to n do begin read(mat,a); if a>max then max:=a end; writeln('maximul pe linia ',i,' = ',max:10:2) end; close(mat) end. Exerciţiul 18: Să se determine elementul maxim de pe fiecare linie a unei matrice dreptunghiulare, memorată dens şi invers lexicografic, într-un fişier binar. Primul articol conţine numărul de linii. Maximele vor fi afişate pe monitor. Observaţie: Deoarece matricea este memorată invers lexicografic, elementele vor fi accesate direct, utilizând funcţia rang (j-1)*m+i.

Algoritmi şi programe de prelucrare a fişierelor

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 begin seek(mat,i); read(mat,max); for j:=2 to n do begin 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. Exerciţiul 19: Să se determine transpusa unei matrice dreptunghiulare, memorată dens lexicografic într-un fişier binar. Primul articol conţine numărul de linii. Transpusa va fi memorată similar, într-un alt fişier binar. Observaţie: Sunt două posibilităţi de parcurgere a fişierului iniţial: 1. în acces secvenţial, utilizând formula b(j,i)=a(i,j), caz în care fişierul de ieşire este creat în acces direct; 2. în acces direct, utilizând formula b(i,j)=a(j,i), caz în care fişierul de ieşire este creat în acces secvenţial. 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

Algoritmi şi programe de prelucrare a fişierelor

for j:=1 to m do begin seek(m1,(j-1)*n+i); read(m1,a); write(m2,a) end; close(m1); close(m2) end. Exerciţiul 20: Să se determine produsul a două matrice dreptunghiulare, memorate dens lexicografic, fiecare într-un fişier binar. Primul articol conţine numărul de linii. Matricea rezultat va fi memorată similar, într-un alt fişier 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; begin write('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 do for j:=1 to p do begin c:=0; for k:=1 to n do begin seek(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.

Algoritmi şi programe de prelucrare a fişierelor

Exerciţiul 21: Să se determine produsul între un vector, memorat într-un fişier binar şi o matrice dreptunghiulară, memorată dens lexicografic într-un fişier binar, primul articol conţinând numărul de linii. Vectorul rezultat va fi memorat similar, într-un fişier 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; begin write('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 begin seek(v1,0); y:=0; for i:=1 to m do begin read(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. Exerciţiul 22: Să se creeze o matrice pătrată, memorată dens lexicografic într-un fişier binar. Observaţie: Dimensiunea matricei (n) nu se memorează, deoarece poate fi dedusă din dimensiunea fişierului, 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);

Algoritmi şi programe de prelucrare a fişierelor

rewrite(mat); write('Dimensiunea matricei (n): '); readln(n); writeln('Elementele matricei:'); for i:=1 to n do for j:=1 to n do begin write('(',i:4,',',j:4,')= '); readln(a); write(mat,a) end; close(mat) end. Exerciţiul 23: Să se determine suma elementelor de pe diagonala principală, respectiv secundară a unei matrice pătrate, memorată dens lexicografic într-un fişier binar. program sume_pe_diagonale; var mat:file of real; a,sdp,sds:real; n,i:word; nume:string; begin write('Numele fisierului: '); readln(nume); assign(mat,nume); reset(mat); n:=trunc(sqrt(filesize(mat))); sdp:=0; sds:=0; for i:=1 to n do begin seek(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. Exerciţiul 24: Să se determine media aritmetică a elementelor strict pozitive din triunghiul de sub diagonala principală (inclusiv diagonala), dintr-o matrice pătrată, memorată dens lexicografic într-un fişier binar. program medie_elemente_pozitive_din_triunghiul_inferior; var mat:file of real; a,med:real; n,i,j,k:word; nume:string; begin write('Numele fisierului: '); readln(nume); assign(mat,nume); reset(mat); n:=trunc(sqrt(filesize(mat))); med:=0; k:=0; for i:=1 to n do for j:=1 to i do

Algoritmi şi programe de prelucrare a fişierelor

begin seek(mat,(i-1)*n+j-1); read(mat,a); if a>0 then begin med:=med+a; inc(k) end end; close(mat); if k = 0 then writeln('Nu exista elemente pozitive!') else writeln('Media = ',med/k:10:2) end.

Sign up to vote on this title
UsefulNot useful