Sunteți pe pagina 1din 17

Algoritmi !i programe de prelucrare a fi!

ierelor
2. PRELUCRAREA MASIVELOR MEMORATE
N FI!IERE BINARE
Una din aplica"iile des ntlnite 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(x
i
) = i, pentru i=$,n, dac# articolul cu num#rul relativ 0, fie nu este utilizat
(caz n care dimensiunea vectorului este n = FileSize(f)-$), fie memoreaz# num#rul efectiv de
componente ale vectorului (m < FileSize(f));
nr_relativ = rang(x
i
)-$ = i-$, pentru i=$,n, dac# vectorul se memoreaz# ncepnd cu primul
articol (caz n care dimensiunea vectorului este n = FileSize(f)).
n exemplele care urmeaz# se va citeti/scrie cte 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:=$ 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:$0: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,$);
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:$0:2,' Min = ',min:$0: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:=$ 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:=$ to n-$ do
begin
seek(vector,i-$); read(vector,x);
for j:=i+$ to n do
begin
seek(vector,j-$); read(vector,y);
if x>y then
begin
seek(vector,i-$); write(vector,y);
seek(vector,j-$); 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 cte 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
v$,v2,v3:file of real;
x,y:real; m,n:longint;
nume$,nume2,nume3:string;
const hv=$0e+6;
begin
write('Numele fisierului pentru vectorul $: '); readln(nume$);
assign(v$,nume$); reset(v$);
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(v$);
n:=filesize(v2);
read(v$,x); read(v2,y);
while (x<>hv) or (y<>hv) do
begin
if x<y then
begin
write(v3,x);
if eof(v$) then x:=hv else read(v$,x)
end
else
begin
write(v3,y);
if eof(v2) then y:=hv else read(v2,y)
end
end;
close(v$); 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 cte 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 $ elementul corespunz#tor din vectorul frecven"elor,
altfel se va construi un nou element n cei doi vectori de ie!ire.
program frecvente_$;
var
vector:file of real;
Algoritmi !i programe de prelucrare a fi!ierelor
nume:string;
j,k:word; x:real;
y:array[$..$000] of real;
f:array[$..$000] 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:=$;
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]:=$
end;
end;
close(vector);
writeln('Valorile distincte si frecventele lor de aparitie sunt:');
for k:=$ to j do writeln(y[k]:$0:2,' ',f[k]:4)
end.
Varianta 2: Se sorteaz# vectorul ini"ial de observa"ii statistice, ob"inndu-se astfel o grupare a
elementelor de aceea!i valoare. Se parcurge vectorul sortat, re"inndu-se n vectorul de observa"ii
distincte primul element dintr-o grup# de valori !i num#rndu-se apari"iile sale, dup# care se trece la
urm#toarea grup# !.a.m.d., pn# cnd se parcurge tot vectorul ini"ial.
program frecvente_2;
var
vector:file of real;
nume:string;
i,j,n:word; x:real;
y:array[$..$000] of real;
f:array[$..$000] of word;
begin
write('Numele fisierului: '); readln(nume);
assign(vector,nume); reset(vector);
n:=filesize(vector); read(vector,x);
i:=$; 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:=$ to j do writeln(y[i]:$0: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:=$ to n-$ do
begin
for j:=n+i-$ downto 2*i do
begin
seek(vector,j-$);
read(vector,x);
write(vector,x);
end;
seek(vector,2*i-$);
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 ntr-
un 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:=$;
while i<=n+k do
begin
seek(vector,i-$); read(vector,x);
if x<0 then
begin
for j:=n+k downto i do
begin
seek(vector,j-$); read(vector,x);
write(vector,x)
end;
seek(vector,i-$); write(vector,zero);
k:=k+$; i:=i+2;
end
else i:=i+$
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:=$;
while i<=n-k do
begin
seek(vector,i-$); read(vector,x);
if x=0 then
begin
for j:=i to n-k-$ do
begin
seek(vector,j);
read(vector,x);
seek(vector,j-$);
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:=$;
while i<=n-k do
begin
seek(vector,i-$); 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-$); write(vector,x)
end
end
else inc(i)
end;
seek(vector,n-k+$); truncate(vector);
close(vector)
end.
Exerci#iul 12: S# se realizeze reuniunea a dou# mul"imi de numere reale, memorate n cte 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
v$,v2,v3:file of real;
x,y:real;
nume$,nume2,nume3:string;
const hv=$0e+6;
begin
write('Numele fisierului pentru vectorul $: '); readln(nume$);
assign(v$,nume$); reset(v$);
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(v$,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(v$) then x:=hv else read(v$,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(v$) then x:=hv else read(v$,x)
end;
close(v$); close(v2); close(v3)
end.
Exerci#iul 13: S# se realizeze intersec"ia a dou# mul"imi de numere reale, memorate n cte 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
v$,v2,v3:file of real;
x,y:real; m,n,i,j:word;
nume$,nume2,nume3:string;
begin
write('Numele fisierului pentru vectorul $: '); readln(nume$);
assign(v$,nume$); reset(v$);
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(v$); n:=filesize(v2);
i:=$; j:=$;
read(v$,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(v$) then read(v$,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(v$) then read(v$,x)
end
end;
close(v$); close(v2); close(v3)
end.
Exerci#iul 14: S# se realizeze diferen"a dintre dou# mul"imi de numere reale, memorate n cte 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
v$,v2,v3:file of real;
x,y:real; m,n,i,j:word;
nume$,nume2,nume3:string;
begin
write('Numele fisierului pentru vectorul $: '); readln(nume$);
assign(v$,nume$); reset(v$);
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(v$); n:=filesize(v2);
for i:=$ to m do
begin
j:=$; seek(v2,0);
read(v$,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(v$); 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 a
ij
se determin# pe baza
func"iei rang, astfel:
rang(a
ij
)=(i-$)*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(a
ij
)=(j-$)*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 lng# elementele ei, !i:
Algoritmi !i programe de prelucrare a fi!ierelor
m (sau n), n cazul memor#rii dense. Cnd se memoreaz# m, n se determin# dup# rela"ia
FileSize(f) DIV m; cnd 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 determinndu-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
determinndu-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 dect 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:=$ to m do
for j:=$ 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)-$) div m;
Algoritmi !i programe de prelucrare a fi!ierelor
writeln('Matricea este:');
for i:=$ to m do
begin
for j:=$ to n do
begin
read(mat,a);
write(a:$0: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)-$) div m;
for i:=$ 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:$0: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,
utiliznd 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)-$) div m;
for i:=$ to m do
begin
seek(mat,i); read(mat,max);
for j:=2 to n do
begin
seek(mat,(j-$)*m+i); read(mat,a);
if a>max then max:=a
end;
writeln('maximul pe linia ',i,' = ',max:$0: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:
$. n acces secven"ial, utiliznd formula b(j,i)=a(i,j), caz n care fi!ierul de ie!ire este creat n
acces direct;
2. n acces direct, utiliznd 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
m$,m2:file of real;
a,b:real; m,n,i,j:word;
nume$,nume2:string;
begin
write('Numele fisierului pentru matricea initiala: ');
readln(nume$);
write('Numele fisierului pentru matricea transpusa: ');
readln(nume2);
assign(m$,nume$); reset(m$);
assign(m2,nume2); rewrite(m2);
read(m$,a);
m:=trunc(a);
n:=(filesize(m$)-$) div m;
a:=n; write(m2,a);
for i:=$ to n do
Algoritmi !i programe de prelucrare a fi!ierelor
for j:=$ to m do
begin
seek(m$,(j-$)*n+i);
read(m$,a);
write(m2,a)
end;
close(m$);
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
m$,m2,m3:file of real;
a,b,c:real; m,n,p,i,j,k:word;
nume$,nume2,nume3:string;
begin
write('Numele fisierului pentru matricea deinmultit: ');
readln(nume$);
write('Numele fisierului pentru matricea inmultitor: ');
readln(nume2);
write('Numele fisierului pentru matricea rezultat: ');
readln(nume3);
assign(m$,nume$); reset(m$);
assign(m2,nume2); reset(m2);
assign(m3,nume3); rewrite(m3);
read(m$,a);
m:=trunc(a);
write(m3,a);
n:=(filesize(m$)-$) div m;
p:=(filesize(m2)-$) div n;
for i:=$ to m do
for j:=$ to p do
begin
c:=0;
for k:=$ to n do
begin
seek(m$,(i-$)*n+k);
read(m$,a);
seek(m2,(k-$)*p+j);
read(m2,b);
c:=c+a*b
end;
write(m3,c)
end;
close(m$);
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"innd num#rul de
linii. Vectorul rezultat va fi memorat similar, ntr-un fi!ier binar.
program produs_vector_matrice;
var
mat,v$,v2:file of real;
x,y,a:real; m,n,i,j:word;
nume$,nume2,nume3:string;
begin
write('Numele fisierului pentru vectorul de intrare: ');
readln(nume$);
write('Numele fisierului pentru matrice: ');
readln(nume2);
write('Numele fisierului pentru vectorul de iesire: ');
readln(nume3);
assign(v$,nume$); reset(v$);
assign(mat,nume2); reset(mat);
assign(v2,nume3); rewrite(v2);
read(mat,a);
m:=trunc(a);
n:=(filesize(mat)-$) div m;
for j:=$ to n do
begin
seek(v$,0);
y:=0;
for i:=$ to m do
begin
read(v$,x);
seek(mat,(i-$)*n+j);
read(mat,a);
y:=y+x*a
end;
write(v2,y)
end;
close(v$); 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 n
2
.
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:=$ to n do
for j:=$ 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:=$ to n do
begin
seek(mat,(i-$)*n+i-$); read(mat,a); sdp:=sdp+a;
seek(mat,(n-$)*i); read(mat,a); sds:=sds+a;
end;
close(mat);
writeln('Suma pe diagonala principala = ',sdp:$0:2);
writeln('Suma pe diagonala secundara = ',sds:$0: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:=$ to n do
for j:=$ to i do
Algoritmi !i programe de prelucrare a fi!ierelor
begin
seek(mat,(i-$)*n+j-$); 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:$0:2)
end.