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 î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 î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:=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);

S-ar putea să vă placă și