Documente Academic
Documente Profesional
Documente Cultură
Popularea fiierelor se realizeaz prin preluarea datelor fie din alte fiiere,
fie de la tastatur (popularea interactiv). n ultimul caz, cel mai des ntlnit n
practic, fiierul conductor corespunde mulimii datelor introduse de la tastatur.
Articolele sunt preluate cmp cu cmp, neexistnd posibilitatea citirii unei variabile de
tip articol i, n plus, introducerea unei date este adesea nsoit de proceduri de
validare specifice, cu reintroducerea ei n cazul unei erori.
Sfritul introducerii datelor de la tastatur (i implicit a procesului de
populare a fiierului) poate fi:
- De tip chestionar, prin consultarea utilizatorului, privind continuarea sau nu
a introducerii articolelor. Pentru un volum mare de date, varianta prezint dezavan-
tajul mririi timpului de prelucrare.
- Convenional, prin introducerea pentru primul cmp din articol a unei valori
prestabilite, cu semnificaie de sfrit de prelucrare.
- Standard, prin tastarea caracterului CTRL/Z, cu rol de sfrit de fiier
TEXT, caz n care variabilei standard CheckEof (definit n unitatea standard CRT)
trebuie s i se atribuie n program valoarea TRUE.
O alt problem a populrii fiierelor binare o reprezint aezarea articolelor
pe suportul extern. Din acest punct de vedere se ntlnesc dou modaliti:
Populare dens, prin care articolele se scriu unul dup altul, n ordinea n
care au fost furnizate, fr a se lsa locuri libere (acces secvenial). Pentru fiierele
care nu necesit actualizare acesta este tipul recomandat.
Populare aleatoare, prin care articolele sunt scrise pe poziiile al cror
numr relativ este furnizat explicit de programator (acces direct). Scrierea unui articol
se realizeaz dup poziionarea pe numrul relativ dorit, cu procedura
Seek(f,nr_relativ). La populare, nr_relativ nu este limitat dect de spaiul existent pe
suportul extern.
Metoda are dezavantajul c necesit evidena "articolelor vide". n cazul
fiierelor care nu necesit actualizare, popularea aleatoare se recomand numai dac,
dup creare, fiierul este dens.
Algoritmi n programare. Aplicaii
Exerciiul 6.1. S se realizeze programul pentru crearea unui fiier secvenial care
memoreaz datele referitoare la facturile emise de ctre o societate comercial,
ntr-un anumit an. Structura articolului este urmtoarea:
Program Creare;
Uses crt;
Type
data = record
luna:1..12;
zi:1..31
end;
art_fact = record
nr_fact:string[10];
data_emit:data;
den_benef:string[20];
cod_fiscal:longint;
valoare,tva:real
end;
Var
f:file of art_fact; factura:art_fact;
Begin
Assign(f,'facturi.dat'); Rewrite(f);
checkeof:=true; clrscr;
With factura do begin
Gotoxy(15,10); Write('Nr. factura: '); Gotoxy(40,10);
While not eof do
begin
Readln(nr_fact);
Gotoxy(15,11); Writeln('Data emiterii');
Gotoxy(22,12); Writeln('luna:');
Gotoxy(40,12); Readln(data_emit.luna);
Gotoxy(22,13); Writeln('ziua:');
Gotoxy(40,13); Readln(data_emit.zi);
Gotoxy(15,14); Writeln('Denumire benef.:');
Gotoxy(40,14); Readln(den_benef);
Gotoxy(15,15); Writeln('Cod fiscal:');
Gotoxy(40,15); Readln(cod_fiscal);
Gotoxy(15,16); Writeln('Valoare facturata:');
Gotoxy(40,16); Readln(valoare);
Gotoxy(15,17); Writeln('TVA facturat:');
Algoritmi de prelucrare a fiierelor organizate secvenial
Gotoxy(40,17); Readln(tva);
Write(f,factura);
clrscr; Gotoxy(15,9); Write('Nr. factura: ');
Gotoxy(40,9)
End {while};
Close(f)
End {with}
End.
1
Figurile 15.2 - 15.6, capitolul Algoritmi de prelucrare a fiierelor binare din lucrarea
Algoritmi n programare, B. Ghilic-Micu (coord.), Ed. ASE, Bucureti 2002, pag. 235-238
Algoritmi n programare. Aplicaii
Raportul final este listat la imprimant, fie direct, ca fiier de ieire, fie creat
pe suport magnetic, ca fiier TEXT, n vederea imprimrii ulterioare. Structura unei
pagini a raportului i controlul trecerii la o nou pagin trebuie asigurate de
programator.
n continuare se prezint structura de principiu2 a unui program de obinere a
unui raport final, cu control dup dou caracteristici i trei grade de total, unde
camp_1 i camp_2 sunt caracteristicile de control (cmpuri din articol), v1 i v2 sunt
variabile de lucru pentru salvarea caracteristicilor, iar totg, tot1 i tot2 sunt
variabile pentru calculul gradelor de total. Analog, se poate extinde pentru oricte
caracteristici i grade de total.
procedure inceput;
begin
(* citire nume fisiere externe *)
assign(f,nume_fisier);reset(f); assign(g,lista); rewrite(g);
sf:=false; totg:=0;
(* scriere in lista a antetului si capului de tabel *)
read(f,x);
end;
procedure inceput_1;
begin
tot1:=0; v1:=x.camp_1
end;
procedure inceput_2;
begin
tot2:=0; v2:=x.camp_2
end;
procedure sfarsit_1;
begin
writeln('total 1 = ',tot1); totg:=totg+tot1
end;
procedure sfarsit_2;
begin
writeln('total 2 = ',tot2); tot1:=tot1+tot2
end;
procedure sfarsit;
begin
writeln('total general = ',totg);
close(f); close(g)
end;
procedure prel_art_x;
begin
(* prelucrarea articolului x *)
if eof(f) then sf:=true else read(f,x)
end;
2
n exemple, comentariile incluse ntre perechile de caractere (* i *) sugereaz existena
unei secvene de program, iar cele incluse ntre caracterele { } sunt comentarii propriu-zise.
Algoritmi de prelucrare a fiierelor organizate secvenial
procedure prel_2;
begin
inceput_2;
while (v1=x.camp_1) and (v2=x.camp_2) and not sf
do prel_art_x;
sfarsit_2
end;
procedure prel_1;
begin
inceput_1;
while (v1=x.camp_1) and not sf do prel_2;
sfarsit_1
end;
{programul principal}
begin
inceput;
while not sf do prel_1;
sfarsit
end.
CONSULTARE
Facturi.dat Tabel.txt
1 2 3
Manevra.tmp
Program Consultare;
Uses crt;
Type data = record
luna:1..12;
zi:1..31
end;
art_fact = record
nr_fact:string[10];
data_emit:data;
den_benef:string[20];
cod_fiscal:longint;
valoare,tva:real
end;
art_man = record
data_emit:data;
den_benef:string[20];
valoare,tva:real
end;
Var f:file of art_fact;
factura:art_fact;
manevra:file of art_man;
aux:art_man;
lista:text;
Procedure Creare_manevra;
Begin
Assign(f,'facturi.dat'); Reset(f);
Assign(manevra,'manevra.tmp'); Rewrite(manevra);
While not eof(f) do
begin
Read(f,factura);
aux.data_emit:=factura.data_emit;
aux.den_benef:=factura.den_benef;
aux.valoare:=factura.valoare;
aux.tva:=factura.tva;
Write(manevra,aux)
end;
Close(f);
Close(manevra)
End;
Procedure Sortare_manevra;
Var
art1,art2:art_man;
i,j:word;
Begin
Assign(manevra,'manevra.tmp'); Reset(manevra);
For i:=1 to filesize(manevra)-1 do
Begin
Seek(manevra,i-1); Read(manevra,art1);
For j:=i+1 to filesize(manevra) do
Begin
Algoritmi de prelucrare a fiierelor organizate secvenial
Seek(manevra,j-1); Read(manevra,art2);
If art1.den_benef > art2.den_benef then
Begin
Seek(manevra,i-1); Write(manevra,art2);
Seek(manevra,j-1); Write(manevra,art1);
art1:=art2
End
End
End;
Close(manevra)
End;
Procedure Listare;
Var
sf:boolean; i:1..12;
c:string[20];
tot_val,tot_tva:array[1..12] of real;
Const
luni:array[1..12] of string[3]=
('Ian','Feb','Mar','Apr','Mai','Iun','Iul','Aug','Sep','Oct',
'Nov','Dec');
Begin
Assign(manevra,'manevra.tmp'); Reset(manevra);
Assign(lista,'tabel.txt'); Rewrite(lista);
sf:=false;
Writeln(lista,
'Tabel cu valorile facturate lunar, pe beneficiari');
Writeln(lista);
Writeln(lista,Valoare TVA);
With aux do begin
Read(manevra,aux);
While not sf do
begin
c:=den_benef;
for i:=1 to 12 do begin
tot_val[i]:=0;
tot_tva[i]:=0
end;
While (c=den_benef) and not sf do
begin
tot_val[data_emit.luna]:=
tot_val[data_emit.luna]+valoare;
tot_tva[data_emit.luna]:=
tot_tva[data_emit.luna]+tva;
{$I-} Read(manevra,aux); {$I+}
If IOresult <> 0 then sf:=true
end;
Writeln(lista,c);
for i:=1 to 12 do Writeln(lista,
' ':5,luni[i],':',tot_val[i]:12:0,tot_tva[i]:10:0)
end;
Algoritmi n programare. Aplicaii
Close(manevra);
Erase(manevra);
Close(lista)
end
End;
{programul principal}
Begin
Creare_manevra;
Sortare_manevra;
Listare
End.
Exemplu:
begin
(* citire nume fisier extern *)
checkeof:=true;
assign(f,nume_fisier);
reset(f);
write('nr. relativ: ');
while not eof do
begin
readln(r); {citire numar relativ}
seek(f,r);
{$i-} read(f,art); {$i+} {citire articol in acces direct}
if ioresult = 0 then (* prelucrare articol *)
else writeln('Articol inexistent !');
write('Nr. relativ (sau ctrl-z): ')
end;
close(f)
end.
Exemplu:
begin
(* citire nume fisier extern *)
assign(f,nume_fisier);
reset(f);
write('limita inferioara: ');
readln(li); { citirea nr. relativ al primului articol }
write('limita superioara: ');
readln(ls); { citirea nr. relativ al ultimului articol }
if (0<=li) and (li<=ls) and (ls<filesize(f)) then
begin
seek(f,li);
for i:=li to ls do
begin
read(f,art);
(* prelucrare articol *)
end
end
else
writeln('>> Nu este indeplinita conditia de limite');
close(f)
end.
Exemplu:
begin
(* citire nume fisier extern *)
assign(f,nume_fisier); reset(f);
{pozitionare dupa ultimul articol scris}
seek(f,filesize(f));
checkeof:=true;
write('camp 1: ');
while not eof do
begin
readln(art.camp_1);
(* preluare de la tastatura a celorlalte
campuri din articol *)
write(f,art);
write('camp 1 (sau ctrl-z): ')
end;
close(f)
end.
Algoritmi n programare. Aplicaii
Exemplu:
{articolele sunt in ordinea crescatoare a valorii campului 1}
begin
(* citire nume fisier extern *)
assign(f,nume_fisier);
reset(f);
checkeof:=true;
write('camp 1: ');
while not eof do {se pot adauga mai multe articole}
begin
{introducerea campului dupa care sunt sortate articolele}
readln(art_nou.camp_1);
(* preluare de la tastatura a celorlalte
campuri din articolul de adaugat *)
{cautarea pozitiei in care se va insera articolul}
seek(f,0); { pozitionare pe inceput de fisier }
sf:=false;
read(f,art_existent);
while not sf and (art_existent.camp_1<art_nou.camp_1) do
begin
{$I+} read(f,art_existent); {$I-}
if ioresult <> 0 then sf:=true
end;
if not sf then begin
k:=filepos(f)-1;{articolul se va insera in pozitia k }
for i:=filesize(f)-1 downto k do
begin
seek(f,i);
read(f,art_existent);
write(f,art_existent)
end
end
else k:=filesize(f); {articolul se adauga la sfarsit}
seek(f,k);
write(f,art_nou);
write('camp 1: ')
end;
close(f)
end.
Algoritmi de prelucrare a fiierelor organizate secvenial
Exemplu:
(* cautare articol de modificat *)
read(f,art);
write('Codul: ',art.cod,' '); {afisare vechea valoare}
readln(cods); {citire noua valoare; cods este de tip string}
if length(cods)<>0 then
val(cods,art.cod,err); {conversie din ASCII in binar}
write('Denumire: ',art.den,' '); {afisare vechea valoare}
readln (dens); {citire noua valoare}
if length(dens) <> 0 then
art.den:=dens; {atribuire noua valoare}
(* introducerea celorlalte campuri din articol *)
seek(f,filepos(f)-1); {repozitionare pe articol}
write(f,art) {rescriere articol modificat }
O alt variant se poate realiza prin folosirea unei machete de ecran n care se
afieaz valorile actuale ale fiecrui cmp de modificat, se poziioneaz succesiv
cursorul la nceputul fiecrui cmp, cu dou rspunsuri posibile ale utilizatorului:
<ENTER>, caz n care se menine actuala valoare, respectiv o tast diferit de
<ENTER>, reprezentnd primul caracter al noii valori.
program creare_fisier_secvential;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
er:boolean;
i,l:byte;
s:string[100];
const
alfabet=['A'..'Z','a'..'z',' '];
procedure eroare;
begin
er:=true; gotoxy(10,25);
write(s,' tastati <ENTER>',#7);
repeat until readkey=#13;
gotoxy(10,25); clreol;
end;
procedure cit_cod;
begin
repeat
er:=false; gotoxy(38,5);
{$i-}; readln(art.cod); {$i+};
if ioresult <> 0 then
begin
s:='Valoare nenumerica !';
eroare; gotoxy(38,5);
clreol
end
until not er
end;
Algoritmi de prelucrare a fiierelor organizate secvenial
procedure cit_den;
begin
repeat
er:=false; gotoxy(38,6); clreol;
readln(art.den); l:=length(art.den);
for i:=1 to l do
if not (art.den[i] in alfabet) then er:=true;
if er then
begin
s:='Caractere nealfabetice !';
eroare
end
until not er
end;
procedure cit_dep;
begin
repeat
er:=false; gotoxy(38,7); clreol;
readln(art.dep);
if not (upcase(art.dep)in ['A'..'Z']) then
begin
s:='Cod depozit eronat !';
eroare
end
until not er
end;
procedure cit_pret;
begin
repeat
er:=false; gotoxy(38,8); clreol;
{$i-} readln(art.pu); {$i+}
if ioresult<>0 then
begin
s:='Caractere nenumerice !';
eroare
end
else if art.pu < 100 then
begin
s:='Pret < 100 !';
eroare
end
until not er
end;
procedure cit_cant;
begin
repeat
er:=false; gotoxy(38,i+8); clreol;
{$i-} readln(art.cant[i]); {$i+}
if ioresult<>0 then
begin
Algoritmi n programare. Aplicaii
program consultare_dupa_camp_cu_valoare_unica;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
vb:boolean;
cod_t,i:byte;
v:real;
begin
assign(f,'produse.dat'); reset(f);
clrscr; checkeof:=true; gotoxy(27,5);
write('Codul produsului: ');
while not eof do
begin
gotoxy(50,5); readln(cod_t);
seek(f,0);
vb:=false;
while not vb and not eof(f) do
begin
read(f,art);
if art.cod = cod_t then
begin
v:=0;
for i:=1 to 12 do v:=v+art.cant[i];
v:=v*art.pu;
gotoxy(27,12);
writeln('Denumire',' ':10,'Valoare');
gotoxy(25,15);
writeln(art.den,' ':5,v:10:0,' lei');
readln; vb:=true
end
end;
if not vb then
begin
gotoxy(30,15);
writeln('Cod produs eronat !',#7)
end;
clrscr; gotoxy(27,5);
write('Codul produsului (sau ^Z): ')
end;
close(f)
end.
Algoritmi n programare. Aplicaii
program consultare_dupa_camp_cu_valoare_duplicata;
uses crt;
type
produs=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
art:produs;
f:file of produs;
sir:string[30];
dep_t:char;
i,k:byte;
v:real;
begin
assign(f,'produse.dat'); reset(f);
clrscr; checkeof:=true;
gotoxy(27,5);
write('Codul depozitului: ');
while not eof do
begin
gotoxy(50,5); readln(dep_t);
seek(f,0);
k:=0;
while not eof(f) do
begin
fillchar(sir,31,' ');
read(f,art);
if art.dep=dep_t then
begin
inc(k); v:=0;
for i:=1 to 12 do v:=v+art.cant[i];
v:=v*art.pu;
gotoxy(10,12);
Algoritmi de prelucrare a fiierelor organizate secvenial
writeln('Cod',' ':10,'Denumire',
' ':25,'Valoare');
gotoxy(10,14+k);
sir:=art.den; sir[0]:=#30;
writeln(art.cod:3,' ':10,sir,' ',
v:10:0,' lei')
end
end;
if k=0 then
begin
gotoxy(30,15);
writeln('Cod depozit eronat !',#7)
end;
readln; clrscr; gotoxy(27,5);
write('Codul depozitului (sau ^Z): ')
end;
close(f)
end.
program consultare_cu_control_dupa_caracteristica;
uses crt;
type
artf=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
artm=record
depm:char;
v:real
end;
var
z:artf; x,y:artm; f:file of artf; m:file of artm;
i,j:byte; totgen,totdep:real;
vb,sf:boolean; c:char;
Algoritmi n programare. Aplicaii
procedure copiere;
begin
assign(f,'produse.dat'); reset(f);
assign(m,'manevra.tmp'); rewrite(m);
with z,x do
begin
while not eof(f) do
begin
read(f,z);
v:=0;
for i:=1 to 12 do v:=v+cant[i];
v:=v*pu;
depm:=dep;
write(m,x)
end
end;
close(f)
end;
procedure sortare;
begin
repeat
vb:=false;
for i:=1 to filesize(m)-1 do
begin
seek(m,i-1); read(m,x,y);
if x.depm>y.depm then
begin
seek(m,i-1);
write(m,y,x);
vb:=true
end
end
until not vb
end;
procedure afisare;
begin
seek(m,0); sf:=false; totgen:=0; i:=0; clrscr;
gotoxy(5,3); writeln('Stocul valoric pe depozite');
gotoxy(9,6); writeln('Depozit Stoc');
read(m,x);
while not sf do
begin
totdep:=0;
c:=x.depm;
while (x.depm=c) and not sf do
begin
totdep:=totdep+x.v;
if eof(m) then sf:=true
else read(m,x)
end;
Algoritmi de prelucrare a fiierelor organizate secvenial
inc(i);
gotoxy(12,7+i);
writeln(c,' ':5,totdep:10:0,' lei');
totgen:=totgen+totdep
end;
gotoxy(9,9+i);
writeln('Total = ',totgen:10:0,' lei');
close(m)
end;
{programul principal}
begin
copiere;
sortare;
afisare
end.
program afisare_integrala;
uses crt;
type
art=record
cod:byte;
den:string[30];
dep:char;
pu:longint;
cant:array[1..12] of word
end;
var
z:art;
f:file of art;
l:text;
linie:string[76];
d:string[30];
cant_tot:longint;
valoare:real;
i:byte;
begin
clrscr;
assign(f,'produse.dat'); reset(f);
assign(l,'lista.txt'); rewrite(l);
with z do begin
fillchar(linie,77,'='); linie[0]:=#76;
writeln(l,' ':25,'TABEL CU STOCURILE DE PRODUSE');
Algoritmi n programare. Aplicaii