Algoritmi de prelucrare a fiierelor organizate relativ
Prelucrarea fiierelor binare care necesit actualizare trebuie s asigure posibilitatea tergerii articolelor i s elimine riscul de suprascriere a articolelor adugate. Pentru aceasta, trebuie proiectate structuri particulare de articole i concepute operaii de gestiune specifice. Organizarea fiierelor care asigur identificarea articolelor prin numrul lor relativ se numete organizare relativ. Fr a epuiza multitudinea soluiilor de rezolvare a problemelor de gestiune a fiierelor care necesit actualizare, n continuare se prezint cteva dintre ele. n orice situaie, limitrile de regsire prin acces secvenial sau relativ a articolelor n fiier reduc aria folosirii limbajului n problemele de gestiune. Marele inconvenient l constituie lipsa accesului dup cheie, cel care corespunde cel mai bine gestiunii n sistemele reale. Pentru a simula organizarea relativ n Pascal se poate utiliza o codificare extern a cheilor relative (numerelor relative) ale articolelor, prin utilizarea unui nomenclator de articole, care s conin numrul relativ al fiecruia dintre ele. Nomenclatorul este elaborat extern (automat sau neautomat). Orice operaie de regsire n acces direct presupune introducerea din exterior a numrului relativ. La crearea iniial, fiecare articol este nscris la numrul su relativ predefinit. Asigurarea tergerii i adugrii controlate poate fi fcut n mai multe moduri.
Extinderea articolelor logice cu un indicator de stare (un octet), ajungn- du-se la forma din figura 7.1.
Indicator de stare (is) Articol propriu-zis
Fig. 7.1. Structura articolului care include indicatorul de stare
Indicatorul de stare (notat is) va avea o valoare din dou posibile (de exemplu 0 pentru articol inactiv - inexistent sau ters - i 1 pentru articol prezent). Cu aceast structur, operaiile de acces la articole se realizeaz n urmtoarele condiii: scrierea n fiier este permis numai pentru articolele cu is=0; citirea din fiier este permis numai pentru articolele cu is=1. Preformarea presupune deschiderea fiierului ca nou i crearea unui numr de articole (la limit, zero) cu is=0. Includerea operaiei de preformare conduce la dispariia distinciei dintre populare i adugare. Datorit faptului c fiierul se deschide ca existent, orice operaie de scriere a unui nou articol se trateaz ca adugare. ntr-un sistem de programe, deschiderea cu Rewrite a unui fiier se realizeaz o singur dat, n procedura de preformare. Scrierea n acces direct presupune furnizarea numrului relativ (nr) al articolului. n funcie de valoarea lui nr se disting urmtoarele situaii: Algoritmi n programare. Aplicaii - dac nr<FileSize(f), se citete articolul respectiv din fiier i adugarea este permis numai dac is=0; - dac nrFileSize(f), are loc extinderea fiierului cu preformarea articolelor cu numerele relative cuprinse n domeniul FileSize(f)..nr-1. Noul articol se scrie pe poziia nr. Se remarc faptul c scrierea n acces direct permite preformarea iniial cu zero articole. Scrierea n acces secvenial se face fr verificare de inexisten. Scrierea are loc n poziia dat de pointerul curent. Procedura face is=1. Utilizarea ei se recomand numai la popularea dens. Citirea n acces direct presupune furnizarea numrului relativ (nr). Ea verific dac is=1. Citirea n acces secvenial analizeaz articolele ncepnd cu cel de la pointerul curent. Articolele cu is=0 sunt ignorate, pn la ntlnirea primului articol cu is=1 sau pn se ajunge la sfrit de fiier. tergerea se realizeaz n acces direct. Ea presupune citirea articolului i dac tergerea este permis (is=1), se modific indicatorul de stare (is=0) i se scrie articolul pe vechiul loc. Rescrierea realizeaz scrierea unui articol n poziia FilePos(f)-1, dac vechiul articol din aceast poziie are is=1.
Folosirea articolului zero ca tabel de ocupare n fiier. Fiecrui articol din fiier i corespunde cte un octet n primul articol: articolului cu numrul relativ i i corespunde octetul a[i]. Primul articol are structura a:ARRAY[1..max] OF BYTE, unde max este o constant care indic numrul maxim de articole pe care le poate avea fiierul pe durata existenei sale. Dac articolul i este prezent, a[i]=1; dac articolul i este inactiv (inexistent sau ters), a[i]=0. Cu aceast structur, operaiile de acces la articole se realizeaz n urmtoarele condiii: scrierea n fiier a articolului cu numrul relativ i este permis numai dac a[i]=0; citirea din fiier a articolului cu numrul relativ i este permis numai dac a[i]=1. tergerea articolului i presupune verificarea existenei sale (a[i]=1) i realiza- rea operaiei a[i]=0. Adugarea unui articol i presupune verificarea inexistenei lui (a[i]=0), nscrierea articolului i realizarea operaiei a[i]=1. Utilizarea acestei modaliti necesit ncrcarea iniial n memoria principal a articolului cu numrul relativ zero. n programele care realizeaz tergeri sau/i adugri, nainte de nchiderea fiierului trebuie renscris articolul zero. Pentru ca metoda s fie eficient, articolul zero trebuie s aib lungime cel mult egal cu lungimea articolelor de date. Se pot concepe algoritmi prin care, pentru tabela de ocupare n fiier, se aloc spaiu mai mic, fiecrui articol corespunzndu-i un bit, n loc de un octet.
Exerciiul 7.1. S se realizeze un program multifuncional pentru crearea i ntreinerea unui fiier referitor la angajaii unei organizaii economice, cu urmtoarea structur logic de articol: Algoritmi de prelucrare a fiierelor organizate relativ
Marc angajat Nume i prenume angajat Profesie Loc de munc Salariu de baz Word String[20] String[10] Byte Longint
Marca angajatului indic numrul relativ al articolului corespunztor n fiier. De aceea, se poate opta pentru metoda de organizare relativ, cheia relativ fiind marca angajatului i se va utiliza codificarea extern prin numere relative. Deoarece cheia relativ nu face parte din articolul memorat n fiier, structura fizic va fi urmtoarea:
Indicator de stare (is) Nume i prenume angajat Profesie Loc de munc Salariu de baz 0..1 String[20] String[10] Byte Longint
Observaii: 1. Programul ofer utilizatorului funciuni de Creare, Adugare, Modificare i tergere, realizate n acces direct dup cheia relativ. n meniul afiat pe ecran exist i funciunea de terminare a programului. 2. Funciunile de Creare i Adugare sunt identice, cu deosebirea c pentru prima fiierul se deschide ca nou (cu Rewrite), iar pentru cea de-a doua fiierul se deschide ca existent (cu Reset). 3. La opiunea de tergere s-a inclus o confirmare suplimentar din partea utilizatorului, pentru cazul n care cheia relativ introdus de la tastatur exist n fiier, dar nu aparine angajatului care se dorete a fi ters. 4. Funciunea de modificare prevede posibilitatea modificrii valorii oricrui cmp sau combinaie de cmpuri. Prin convenie, tastarea doar a lui <ENTER> semnific nemodificarea cmpului respectiv. 5. Fiecare funciune a programului prevede posibilitatea relurii ei n interior, fr a mai iei n meniul principal. Terminarea unei funciuni se realizeaz prin tastarea caracterului CTRL/Z n cmpul marca (sfrit standard al tastaturii). De aceea, la revenirea n meniul principal i la apelul unei noi funciuni, tastatura (fiier TEXT standard de intrare) trebuie deschis cu procedura Reset(Input).
program actualizare_fisier_relativ; uses crt; type art=record is:0..1; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; Algoritmi n programare. Aplicaii var f:file of art; x:art; opt,r:char; marca,i,err:word; aux:string[20]; procedure meniu; begin reset(input); clrscr; gotoxy(30,7); write('Functiunile programului'); gotoxy(36,9); write('1. Creare'); gotoxy(36,10); write('2. Adaugare'); gotoxy(36,11); write('3. Modificare'); gotoxy(36,12); write('4. Stergere'); gotoxy(36,13); write('5. Terminare'); gotoxy(30,16); write('Functia aleasa:'); gotoxy(46,16); readln(opt) end; procedure citire_campuri; begin write('Nume si prenume: '); readln(x.nume); write('Profesie: '); readln(x.prof); write('Loc de munca: '); readln(x.loc); write('Salariu: '); readln(x.sal); x.is:=1 end; procedure preformare; begin seek(f,filesize(f)); x.is:=0; for i:=filesize(f) to marca-1 do write(f,x) end; procedure creare; begin reset(input); assign(f,'pers.dat'); if opt='1' then rewrite(f) else reset(f); checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); if marca<filesize(f) then begin seek(f,marca); read(f,x); if is=0 then begin citire_campuri; seek(f,marca); write(f,x) end else writeln('Marca alocata !') end Algoritmi de prelucrare a fiierelor organizate relativ else begin preformare; citire_campuri; write(f,x) end; write('Marca (sau ^Z): ') end end; close(f) end; procedure stergere; begin reset(input); assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); if marca<filesize(f) then begin seek(f,marca); read(f,x); if is=1 then begin writeln(nume,' ',loc,' ',prof); write('Confirmati stergerea ? (d/n): '); readln(r); if upcase(r)='D' then begin is:=0; seek(f,marca); write(f,x) end end else writeln('Angajat inexistent in fisier !') end else writeln('Marca eronata !'); write('Marca (sau ^Z): ') end end; close(f) end; procedure modif_campuri; begin with x do begin write('Nume si prenume: ',nume,' '); readln(aux); if aux<>'' then nume:=aux; write('Profesie: ',prof,' '); readln(aux); if length(aux)<>0 then prof:=aux; write('Loc de munca: ',loc,' '); readln(aux); Algoritmi n programare. Aplicaii if aux[0]<>#0 then val(aux,loc,err); write('Salariu: ',sal,' '); readln(aux); if aux[0]<>#0 then val(aux,sal,err); seek(f,marca); write(f,x) end end; procedure modificare; begin reset(input); assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); if marca<filesize(f) then begin seek(f,marca); read(f,x); if is=1 then modif_campuri else writeln('Angajat inexistent in fisier !') end else writeln('Marca eronata !'); write('Marca (sau ^Z): ') end end; close(f) end; {programul principal} begin meniu; while opt<>'5' do begin case opt of '1','2': creare; '3': modificare; '4': stergere else begin gotoxy(25,23); write('Functie inexistenta !',#7) end end; meniu end end.
Exerciiul 7.2. S se realizeze programul pentru afiarea pe monitor a informaiilor existente despre acei angajai ale cror mrci se introduc de la tastatur. Se va utiliza fiierul creat la exerciiul 7.1. Observaie: Sfritul introducerii de la tastatur va fi marcat standard (CTRL/Z n cmpul marca). Programul codific un algoritm de consultare n acces direct dup cheia relativ. Algoritmi de prelucrare a fiierelor organizate relativ program vizualizare_angajat; uses crt; type art=record is:0..1; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; var f:file of art; x:art; marca:word; vb:boolean; begin assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin gotoxy(30,10); write('Marca: '); while not eof do begin readln(marca); if marca<filesize(f) then begin seek(f,marca); read(f,x); if is=1 then begin gotoxy(25,15); writeln(nume,' ',prof,' ',loc,' ',sal) end else begin gotoxy(30,12); writeln('Angajat inexistent!',#7) end end else begin gotoxy(30,12); writeln('Marca eronata !',#7) end; readln; clrscr; gotoxy(30,10); write('Marca(sau ^Z): ') end end; close(f) end. Algoritmi n programare. Aplicaii Exerciiul 7.3. S se realizeze programul pentru afiarea pe monitor a informaiilor existente (marc, nume i prenume, loc de munc i salariu) pentru acei angajai a cror profesie este identic cu o valoare introdus de la tastatur. Se va utiliza fiierul creat la exerciiul 7.1. Observaie: Programul prevede posibilitatea relurii procesului pentru o nou profesie, fie pentru c se dorete un nou tabel, fie pentru c profesia introdus a fost eronat (nu exist nici un angajat cu profesia cerut). Sfritul introducerii de la tastatur va fi marcat standard (CTRL/Z n cmpul prof). Programul codific un algoritm de consultare n acces secvenial cu selecie dubl: dup indicatorul de stare i dup profesie. Pentru fiecare profesie, fiierul va fi consultat de la primul la ultimul articol.
program vizualizare_profesie; uses crt; type art=record is:0..1; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; var f:file of art; x:art; prof_t:string[10]; aux:string[20]; vb,sw:boolean; i:byte; begin assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; i:=0; with x do begin write('Profesia: '); while not eof do begin readln(prof_t); seek(f,0); sw:=true; i:=0; vb:=false; while not eof(f) do begin read(f,x); if (is=1) and (prof=prof_t) then begin if sw then begin {prima scriere in tabel} gotoxy(20,10); writeln('Marca Nume si prenume Loc Salariu'); sw:=false end; inc(i); gotoxy(20,12+i); fillchar(aux,21,' '); aux:=nume; aux[0]:=#20; writeln((filepos(f)-1):5,' ',aux,' ',loc:3, ' ',sal:7); vb:=true end end; Algoritmi de prelucrare a fiierelor organizate relativ if not vb then begin gotoxy(30,15); writeln('Profesie inexistenta !',#7) end; readln; clrscr; write('Profesia (sau ^Z): ') end {while} end {with}; close(f) end.
Exerciiul 7.4. S se realizeze programul pentru afiarea informaiilor existente despre toi angajaii, n ordine alfabetic a numelui i grupai pe profesii. Se va utiliza fiierul creat la exerciiul 7.1. Observaii: 1. Pentru a obine lista dorit, fiierul de date trebuie sortat dup dou chei. Cheia principal este profesia, iar cheia secundar este numele i prenumele. 2. Pentru a nu afecta organizarea relativ, sortarea se va realiza ntr-un fiier de manevr, organizat secvenial, cu memorare dens. Structura articolului asociat manevrei este structura logic a fiierului de date. Valorile cmpului marca sunt date de poziia curent a articolului n fiierul iniial. La sfritul programului, fiierul de manevr va fi ters din director. 3. Pentru a obine lista pe mediu magnetic (pentru imprimri ulterioare), n program se va modifica afiarea pe ecran cu scrierea ntr-un fiier TEXT magnetic.
program sortare_dupa_doua_campuri; uses crt; type artf=record is:0..1; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; artm=record marca:word; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; var f:file of artf; m:file of artm; z:artf; x,y:artm; Algoritmi n programare. Aplicaii n,i,j:word; aux1:string[10]; aux2:string[20]; procedure creare_manevra; begin assign(f,'pers.dat'); reset(f); assign(m,'manevra.tmp'); rewrite(m); while not eof(f) do begin read(f,z); if z.is=1 then begin x.marca:=filepos(f)-1; x.nume:=z.nume; x.prof:=z.prof; x.loc:=z.loc; x.sal:=z.sal; write(m,x) end end; close(f) end; procedure sortare_manevra; begin n:=filesize(m); for i:=1 to n-1 do begin seek(m,i-1); read(m,x); for j:=i+1 to n do begin seek(m,j-1); read(m,y); if x.prof>y.prof then begin seek(m,i-1); write(m,y); seek(m,j-1); write(m,x); x:=y end else if x.prof=y.prof then if x.nume>y.nume then begin seek(m,i-1); write(m,y); seek(m,j-1); write(m,x); x:=y end end end end;
Algoritmi de prelucrare a fiierelor organizate relativ procedure listare_manevra; begin with x do begin seek(m,0); i:=0; clrscr; gotoxy(25,2); writeln('Tabel cu angajatii pe profesii'); gotoxy(17,4); writeln(' PROFESIE MARCA NUME SI PRENUME LOC', ' SALARIU'); while not eof(m) do begin read(m,x); fillchar(aux1,11,#32); aux1:=prof; aux1[0]:=#10; fillchar(aux2,21,#32); aux2:=nume; aux2[0]:=#20; gotoxy(17,6+i); inc(i); writeln(aux1,' ',marca:4,' ',aux2, ' ',loc:3,' ',sal:7) end end; close(m); erase(m) end; {programul principal} begin creare_manevra; sortare_manevra; listare_manevra end.
Exerciiul 7.5. S se realizeze programul pentru indexarea salariului tuturor angajailor existeni n fiier, cu un procent introdus de la tastatur. Se va utiliza fiierul creat la exerciiul 7.1. Observaie: Programul codific un algoritm de modificare n acces secvenial.
program modificare_secventiala; uses crt; type art=record is:0..1; nume:string[20]; prof:string[10]; loc:byte; sal:longint end; var f:file of art; x:art; indice:real; begin assign(f,'pers.dat'); reset(f); with x do begin write('Indicele de crestere (%): '); readln(indice); Algoritmi n programare. Aplicaii while not eof(f) do begin read(f,x); if is=1 then begin sal:=trunc(sal*(1+indice/100)); seek(f,filepos(f)-1); write(f,x) end end end; close(f) end.
Programele din exerciiile 7.1-7.5, care codific algoritmi de prelucrare a fiierelor organizate relativ, includ explicit gestionarea indicatorului de stare n toate cazurile, fapt ce constituie un efort suplimentar din partea programatorului. n continuare, se prezint o unitate Pascal (relativ), n care sunt incluse o serie de proceduri (primitive), care gestioneaz prelucrarea fiierelor organizate relativ, degrevnd astfel programatorul de prelucrri suplimentare. Primitivele pot fi folosite n orice program al utilizatorului, schimbndu-se doar tipul fiier i tipul articol. Unitatea cuprinde primitive pentru urmtoarele operaii de gestiune: preformare, scriere n acces direct, scriere n acces secvenial, citire n acces direct, citire n acces secvenial, tergere n acces direct i rescriere. n afara procedurii Preformare, care este o operaie la nivel de fiier, toate celelalte sunt operaii de acces la articole i presupun fiierul deschis corespunztor (cu Reset). n unitate sunt fcute publice dou tipuri: tipf, pentru tipul fiierului i tipa, pentru tipul articolului. Programele apelatoare lucreaz numai cu cmpurile articolului propriu-zis, gestiunea indicatorului de stare fcndu-se integral n unitate. Unitatea ar putea fi perfecionat, astfel nct programele apelatoare s descrie numai articolul propriu-zis, procedurile atand fizic octetul de stare. n felul acesta, programele apelatoare lucreaz cu un tip de articol (logic) i procedurile asigur conversia la/de la un alt tip de articol (fizic). Articolul fizic difer de cel logic prin indicatorul is.
Procedura de preformare
OpenNew(VAR f:tipf;VAR nume:STRING; n:WORD; VAR ivk:BOOLEAN)
F este fiierul, nume este identificatorul su extern, iar n este numrul relativ al ultimului articol preformat. Ivk este indicator de eroare i are valorile: FALSE, dac fiierul se poate deschide ca nou (nu exist n directorul precizat, implicit sau explicit, prin identificatorul extern) sau TRUE, dac fiierul nu se poate deschide ca nou (exist n directorul precizat prin identificatorul extern). Procedura deschide ca nou un fiier inexistent i scrie articolele cu numerele relative cuprinse n domeniul 0..n, fcnd, pentru ele, is=0. Algoritmi de prelucrare a fiierelor organizate relativ Procedura de scriere n acces direct
WriteD(VAR f:tipf; VAR z:tipa; nr:WORD; VAR ivk:BOOLEAN)
F este fiierul, z este articolul care se scrie n poziia relativ nr. Ivk este indicator de eroare i are valorile: FALSE, dac articolul s-a putut scrie sau TRUE, dac articolul nu s-a putut scrie (este prezent n fiier). Procedura verific inexistena articolului i realizeaz nscrierea lui n fiier. Dac nr<FileSize(f), se citete articolul din poziia nr, ntr-o zon z1 i dac z1.is=0, se scrie articolul z n poziia nr i se face ivk:=FALSE, iar dac z1.is=1 se face ivk:=TRUE. Citirea se face n zona z1, pentru a nu se distruge articolul care este constituit n z, pentru adugare. Dac nrFileSize(f), se preformeaz articolele cu numerele relative cuprinse n intervalul FileSize(f)..nr-1, se scrie articolul z n poziia nr i se face ivk:=FALSE.
Procedura de scriere n acces secvenial
WriteS(VAR f:tipf; VAR z:tipa)
F este fiierul, iar z este zona din care se preia articolul care se scrie. Scrierea se face fr nici o verificare. De aceea, procedura se folosete numai la popularea iniial a fiierului sau la adugarea compact de articole la sfritul lui. Pentru articolul scris se face z.is=1. Dup scriere, pointerul indic urmtorul articol din fiier.
Procedura de citire n acces direct
ReadD(VAR f:tipf; VAR z:tipa; nr:WORD; VAR ivk:BOOLEAN)
F este fiierul, z este zona n care se transfer articolul i nr este numrul su relativ. Ivk este indicator de eroare i are valorile: FALSE, dac articolul s-a citit (este prezent n fiier) sau TRUE, dac articolul nu s-a citit logic (este absent din fiier). Procedura verific existena articolului i realizeaz citirea lui din fiier. Dac nr<FileSize(f), se citete articolul i dac z.is=1, se face ivk:=FALSE, iar dac z.is=0, se face ivk:=TRUE. Dac nrFilesize(f), se face ivk:=TRUE.
Procedura de citire n acces secvenial
ReadS(VAR f:tipf; VAR z:tipa; VAR sf:BOOLEAN)
F este fiierul, iar z este zona n care se citete primul articol prezent n fiier, ncepnd de la pointerul curent. Sf este un indicator de semnalare a atingerii sfritului de fiier i are valorile: FALSE, dac articolul s-a citit (i nu este sfrit de fiier) sau TRUE, dac s-a ajuns la sfrit de fiier. Procedura citete secvenial, ncepnd de la pointerul curent pn la primul articol care are z.is=1 sau pn se ajunge la sfrit de Algoritmi n programare. Aplicaii fiier. Dup citirea articolului, pointerul indic urmtorul articol fizic din fiier (prezent sau nu logic).
Procedura de tergere n acces direct
DeleteD(VAR f:tipf; nr:WORD; VAR ivk:BOOLEAN)
F este fiierul i nr este numrul relativ al articolului care urmeaz s se tearg. Ivk este indicator de eroare i are valorile: FALSE, dac articolul s-a ters (este prezent n fiier) sau TRUE, dac articolul nu s-a ters (este absent din fiier). Procedura realizeaz verificri asemntoare procedurii ReadD. Cnd articolul este prezent, se face z.is:=0 i se rescrie n poziia nr.
Procedura de rescriere
RewriteS(VAR f:tipf; VAR z:tipa; VAR ivk:BOOLEAN)
F este fiierul, iar z este articolul care se scrie n poziia FilePos(f)-1. Ivk este indicator de eroare i are valorile: FALSE, dac articolul se poate rescrie (articolul din poziia FilePos(f)-1 este prezent n fiier) sau TRUE, dac articolul nu se poate rescrie (articolul din poziia FilePos(f)-1 este absent). Procedura presupune execuia anterioar a unei citiri (cu ReadD sau ReadS). Ea rescrie un articol n poziia anterioar pointerului curent, dac acesta are cmpul is=1 i dac FilePos(f)-1<FileSize(f).
unit relativ; INTERFACE type tipa=record is:byte; np:string[20]; prof:string[10]; loc:byte; sal:longint end; tipf=file of tipa; procedure opennew(var f:tipf; var nume:string; n:word; var ivk:boolean); procedure writed(var f:tipf; var z:tipa; nr:word; var ivk: boolean); procedure writes(var f:tipf; var z:tipa); procedure readd(var f:tipf; var z:tipa; nr:word; var ivk:boolean); procedure reads(var f:tipf; var z:tipa; var sf:boolean); procedure deleted(var f:tipf; nr:word; var ivk:boolean); procedure rewrites(var f:tipf; var z:tipa; var ivk:boolean);
Algoritmi de prelucrare a fiierelor organizate relativ IMPLEMENTATION procedure opennew; var i:word; z1:tipa; begin ivk:=false; assign(f,nume); {$i-} reset(f); {$i+} if ioresult <>0 then begin rewrite(f); z1.is:=0; for i:= 0 to n do write(f,z1); close(f) end else ivk:=true end; procedure writed; var z1:tipa; i:word; begin ivk:=false; if nr < filesize(f) then begin seek(f,nr); read(f,z1); if z1.is=0 then begin z.is:=1; seek (f,nr); write (f,z) end else ivk:=true end else begin seek(f,filesize(f)); z1.is:=0; for i:=filesize(f) to nr-1 do write(f,z1); z.is:=1; write(f,z) end end; procedure writes; begin z.is:=1; write(f,z) end; Algoritmi n programare. Aplicaii procedure readd; begin ivk:=false; if nr < filesize(f) then begin seek(f,nr); read(f,z); if z.is=0 then ivk:=true end else ivk:=true end; procedure reads; begin sf:=false; repeat {$i-} read(f,z); {$i+} if ioresult <>0 then sf:=true until (z.is=1) or sf end; procedure deleted; var z1: tipa; begin ivk:=false; if nr < filesize(f) then begin seek(f,nr); read(f,z1); if z1.is=0 then ivk:=true else begin z1.is:=0; seek(f,nr); write(f,z1) end end else ivk:=true end; procedure rewrites; var z1:tipa; begin ivk:=false; if (filepos(f)-1) < filesize(f) then begin seek(f,filepos(f)-1); read(f,z1); if z1.is=0 Algoritmi de prelucrare a fiierelor organizate relativ then ivk:=true else begin seek(f,filepos(f)-1); z.is:=1; write(f,z) end end else ivk:=true end end.
Exerciiul 7.6. S se realizeze programul pentru afiarea informaiilor existente n fiier despre acei angajai ale cror coduri se introduc de la tastatur. Se va utiliza fiierul creat la exerciiul 7.1. Observaii: 1. Sfritul introducerii va fi marcat standard (CTRL/Z n cmpul marca). 2. Se va utiliza primitiva de citire n acces direct din unitatea relativ.
program vizualizare_persoana; uses crt,relativ; var f:tipf; x:tipa; marca:word; ivk:boolean; begin assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin gotoxy(30,10); write('Marca: '); while not eof do begin readln(marca); readD(f,x,marca,ivk); if not ivk then begin gotoxy(25,15); writeln(np,' ',prof,' ',loc,' ',sal) end else begin gotoxy(30,12); writeln('Angajat inexistent!') end; readln; clrscr; gotoxy(30,10); write('Marca(sau ^Z): ') end end; close(f) end. Algoritmi n programare. Aplicaii Exerciiul 7.7. S se realizeze programul pentru afiarea informaiilor existente n fiier despre angajaii dintr-un anumit loc de munc, al crui cod se introduce de la tastatur. Se va utiliza fiierul creat la exerciiul 7.1. Observaii: 1. Se va asigura posibilitatea relurii introducerii de coduri pentru mai multe locuri de munc. Sfritul introducerii va fi marcat standard (CTRL/Z n cmpul loc de munc). 2. Se va utiliza primitiva de citire n acces secvenial din unitatea relativ. 3. Algoritmul codificat n program este bazat pe varianta schemei logice de prelucrare cu fiier conductor cu o citire iniial i o citire curent, la sfritul modulului Prelucrare.
program vizualizare_loc_de_munca; uses crt,relativ; var f:tipf; x:tipa; loc_t,i:byte; aux:string[20]; vb,sw,sf:boolean; begin assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin write('Loc de munca: '); while not eof do {repetitiva dupa sfarsit de tastatura} begin readln(loc_t); seek(f,0); sw:=true; i:=0; vb:=false; sf:=false; readS(f,x,sf); while not sf do {repetitiva dupa sfarsit fisier magnetic} begin if (is=1) and (loc=loc_t) then begin if sw then begin {prima scriere in tabel} gotoxy(20,10); writeln('Marca Nume si prenume Loc Salariu'); sw:=false end; {scriere rand curent in tabel} inc(i); gotoxy(20,12+i); fillchar(aux,21,' '); aux:=np; aux[0]:=#20; writeln((filepos(f)-1):5,' ',aux,' ',loc:3, ' ',sal:7); vb:=true end; readS(f,x,sf) end; Algoritmi de prelucrare a fiierelor organizate relativ if not vb then begin gotoxy(30,15); writeln('Loc de munca eronat !',#7) end {while dupa sf}; readln; clrscr; write('Loc de munca (sau ^Z): ') end {dupa eof} end {with}; close(f) end.
Exerciiul 7.8. S se realizeze programul multifuncional pentru realizarea operaiilor de creare, adugare, modificare i tergere, pentru un fiier cu articole avnd structura similar celui de la exerciiul 7.1. Observaii: Operaiile sunt similare exerciiului 7.1, cu deosebirea c sunt utilizate primitive din unitatea relativ: preformare (deschidere fiier nou), citire n acces direct, scriere n acces direct, tergere n acces direct, rescriere.
program actualizare_fisier_relativ; uses crt,relativ; var f:tipf; x:tipa; opt,r:char; ivk:boolean; marca,i,err:word; aux:string[20]; const numefis:string='pers.dat'; procedure meniu; begin reset(input); clrscr; gotoxy(30,7); write('Functiile programului'); gotoxy(36,9); write('1. Creare'); gotoxy(36,10); write('2. Adaugare'); gotoxy(36,11); write('3. Modificare'); gotoxy(36,12); write('4. Stergere'); gotoxy(36,13); write('5. Terminare'); gotoxy(30,16); write('Functia aleasa:'); gotoxy(46,16); readln(opt) end; procedure citire_campuri; begin write('Nume si prenume: '); readln(x.np); write('Profesie: '); readln(x.prof); Algoritmi n programare. Aplicaii write('Loc de munca: '); readln(x.loc); write('Salariu: '); readln(x.sal) end; procedure creare; begin reset(input); if opt='1' then openNew(f,numefis,2500,ivk) else begin assign(f,'pers.dat'); reset(f) end; checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); readD(f,x,marca,ivk); if ivk then begin citire_campuri; writeD(f,x,marca,ivk) end else writeln('Marca alocata altui angajat !'); write('Marca (sau ^Z): ') end {while} end {with}; close(f); end; procedure stergere; begin reset(input); assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); readD(f,x,marca,ivk); if not ivk then begin writeln(np,' ',loc,' ',prof); write('Confirmati stergerea ? (d/n): '); Algoritmi de prelucrare a fiierelor organizate relativ readln(r); if upcase(r)='D' then deleteD(f,marca,ivk) end else writeln('Angajat inexistent in fisier !'); write('Marca (sau ^Z): ') end {while} end {with}; close(f); end; procedure modif_campuri; begin with x do begin write('Nume si prenume: ',np,' '); readln(aux); if aux<>'' then np:=aux; write('Profesie: ',prof,' '); readln(aux); if length(aux)<>0 then prof:=aux; write('Loc de munca: ',loc,' '); readln(aux); if aux[0]<>#0 then val(aux,loc,err); write('Salariu: ',sal,' '); readln(aux); if aux[0]<>#0 then val(aux,sal,err); rewrites(f,x,ivk) end end; procedure modificare; begin reset(input); assign(f,'pers.dat'); reset(f); checkeof:=true; clrscr; with x do begin write('Marca: '); while not eof do begin readln(marca); readd(f,x,marca,ivk); if not ivk then modif_campuri else writeln('Angajat inexistent in fisier !'); write('Marca (sau ^Z): ') end {while} end {with}; close(f); end;
Algoritmi n programare. Aplicaii {programul principal} begin meniu; while opt<>'5' do begin case opt of '1','2': creare; '3' : modificare; '4' : stergere else begin gotoxy(25,23); write('Functie inexistenta !',#7) end end; meniu end end.