Sunteți pe pagina 1din 18

8.

Algoritmi de prelucrare a fiierelor organizate indexat


Majoritatea aplicaiilor de gestiune economic utilizeaz fiiere de date n care articolele trebuie regsite dup valorile unui cmp de identificare, numit cheie. Problema corespondenei ntre chei i numerele relative ale articolelor din fiierul de date se poate rezolva prin intermediul unui fiier binar suplimentar, cu rol de tabel de indexuri. O astfel de organizare se numete indexat. Articolele fiierului tabel de indexuri au structura din figura 8.1. Indicator de Cheie Numr relativ (nr) stare (is) Fig. 8.1. Structura articolului din tabela de indexuri Indicatorul de stare (is) are rol identic cu cel prezentat n capitolul referitor la fiierele organizate relativ (capitolul 7). Cheie este un cmp n care se memoreaz valoarea cheii articolului existent logic n fiierul de date, al crui numr relativ corespunztor este memorat n cmpul nr. Articolele tabelei de indexuri sunt, n orice moment, sortate cresctor dup valorile cmpului cheie. Articolele din fiierul de date sunt memorate aleator i conin cmpurile de date ale utilizatorului (pot conine, redundant, pentru o eventual refacere dup incidente, i valorile cheii). O parte dintre acestea nu-i regsesc corespondent n tabela de indexuri, fiind considerate terse. Orice operaie de acces la articolele fiierului de date se realizeaz numai prin intermediul tabelei, gestionat automat de procedurile unui uniti specializate i care este netransparent utilizatorului.

8.1. Operaii de acces la nivel de fiier i articol


Operaiile de acces la nivel de fiier sunt: deschiderea i nchiderea fiierului de date. La rndul ei, deschiderea poate fi: pentru creare (ca fiier nou) sau pentru consultare i ntreinere (ca fiier vechi). Procedurile realizeaz, pe lng operaiile asupra fiierului de date i gestionarea automat a tabelei de indexuri: formarea numelui su extern, asignarea numelui fizic la numele logic, deschiderea ca fiier nou sau vechi, nchiderea. Operaiile de gestiune care se pot realiza cu fiierele de date astfel organizate sunt: Crearea n acces secvenial presupune furnizarea articolelor sortate strict cresctor dup valorile cmpului ales drept cheie. Articolele sunt scrise cu ajutorul procedurii de scriere n acces secvenial. Eroarea de cheie invalid poate aprea la tentativa de scriere a unui articol a crui cheie este mai mic sau egal dect ultima nscris n fiierul de date. Crearea n acces direct se realizeaz cu procedura de scriere n acces direct, articolele fiind furnizate n orice ordine. Eroarea de cheie invalid apare la

Algoritmi n programare. Aplicaii

tentativa de scriere a unui articol a crui cheie este egal cu una din cele prezente n fiier. Consultarea n acces secvenial presupune regsirea articolelor n ordinea strict cresctoare a valorilor cheii. Ea se realizeaz cu ajutorul procedurii de citire n acces secvenial, care detecteaz i sfritul fiierului de date. Consultarea n acces mixt permite selectarea unui grup de articole, memorate logic contiguu n fiier, selecie realizat pe baza valorilor cheii primului i ultimului articol din grupul dorit. Accesul mixt presupune poziionarea pe primul articol prin citirea n acces direct (sau poziionare i citire n acces secvenial), urmat de exploatarea n acces secvenial, pn la gsirea cheii ultimului articol dorit, sau pn la sfritul fiierului. Adugarea de articole se realizeaz utiliznd procedura de scriere n acces direct. Articolele pot fi furnizate n orice ordine a valorilor cheii. Eroarea de cheie invalid apare la tentativa de scriere a unui articol a crui cheie este egal cu una deja existent. Modificarea unor cmpuri din articol se realizeaz n urmtoarele etape: - citirea articolului de modificat (n acces secvenial sau direct); - modificarea, n zona articol corespunztoare, a cmpurilor dorite, cu excepia cmpului cheie; - rescrierea articolului, cu procedura de rescriere. Eroarea de cheie invalid apare n cazul tentativei de rescriere a unui articol a crui cheie este diferit de cea a articolului citit anterior. tergerea n acces secvenial elimin articolul curent din fiierul de date. n general, articolul trebuie mai nti identificat printr-o citire (n acces secvenial sau direct) sau prin poziionare. Procedura returneaz eroare n cazul tentativei de tergere dup ultimul articol existent. tergerea n acces direct elimin articolul a crui cheie este precizat. Operaia nu trebuie precedat de citirea articolului i returneaz eroare n cazul furnizrii unei chei inexistente n fiier. n aplicaii este preferabil tergerea n acces secvenial, deoarece permite (datorit citirii care o precede), vizualizarea articolului i luarea unei decizii n condiii de siguran. Unitatea indexate cuprinde o serie de proceduri (primitive), cu rol de instruciuni de intrare/ieire la nivel de fiier i articol, necesare realizrii algoritmilor de prelucrare specifici operaiilor de gestiune a fiierelor, cnd se utilizeaz corespondena intern ntre valorile unui anumit cmp din articole - numit cheie - i numerele relative ale acestora. Tabela de coresponden ntre chei i numerele relative este memorat ntr-un fiier cu tip, a crui gestiune este transferat integral procedurilor aparinnd unitii, astfel nct programele utilizatorului vor lucra exclusiv cu fiierul de date. Totui, utilizatorul trebuie s in cont de existena tabelei de indexuri n vederea asigurrii spaiului necesar pe disc i manipulrii concomitente a celor dou fiiere (salvare, restaurare, tergere etc.). n unitate sunt fcute publice urmtoarele tipuri: TipFis, pentru tipul fiierului de date; TipArt, pentru tipul articolului din fiierul de date; TipCheie, pentru tipul cheii.

Algoritmi de prelucrare a fiierelor organizate indexat

Procedura de deschidere a unui fiier nou


OpenNew(VAR f:TipFis; VAR nume:STRING; VAR ivk:BOOLEAN)

F este fiierul de date i nume este identificatorul su extern. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac fiierul nu exist sau valoarea TRUE, dac fiierul exist deja pe disc. Procedura deschide, pentru creare, fiierul de date (ca fiier nou). Concomitent, se deschide i tabela de indexuri, al crei nume extern este identic cu al fiierului de date, dar cu extensia .IDX. Observaie: la deschiderea tabelei de indexuri ca fiier nou nu se verific existena acestuia n suport. Fiierul va fi ters i recreat. Procedura de deschidere a unui fiier existent
OpenOld(VAR f:TipFis; VAR nume:STRING; VAR ivk:BOOLEAN)

F este fiierul de date i nume este identificatorul su extern. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac ambele fiiere (de date i de indexuri) exist sau valoarea TRUE, dac unul din ele nu exist. Procedura deschide, pentru consultare sau actualizare, ambele fiiere. Procedura de nchidere a fiierului de date
CloseFile(VAR f:TipFis)

F este fiierul de date. Procedura nchide fiierul de date, precum i tabela de indexuri. Procedura de citire n acces secvenial
ReadSeqRec(VAR f:TipFis; VAR z:TipArt; VAR sf:BOOLEAN)

F este fiierul i z este zona n care se citete articolul prezent n fiier. Sf este un indicator de semnalare a atingerii sfritului fiierului de date 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 returneaz articolul curent din fiierul de date (articolul urmtor ultimului accesat printr-o operaie de intrare/ieire). Citirea unui articol din fiierul de date se realizeaz prin intermediul tabelei de indexuri. De fapt se citete un articol din tabel de la poziia indicat de pointerul curent i apoi se citete articolul cu numrul relativ y.nr din fiierul de date (y este zona articol a tabelei de indexuri). Dac pointerul indic marcatorul de sfrit al tabelei, parametrul sf va returna valoarea TRUE. Execuia repetat a acestei proceduri are ca efect furnizarea articolelor din fiierul de date n ordinea strict cresctoare a valorilor cheii.

Algoritmi n programare. Aplicaii

Procedura de citire n acces direct


ReadKeyRec(VAR f:TipFis; VAR z:TipArt; Key:TipCheie; VAR ivk:BOOLEAN)

F este fiierul de date i z este zona articol ataat lui. Key precizeaz valoarea cheii articolului care se citete. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost regsit sau valoarea TRUE, dac articolul este absent. Procedura caut, prin procedura Start, cheia cu valoarea key i dac o gsete, citete n z articolul cu numrul relativ y.nr i face ivk=FALSE; dac nu o gsete, face ivk:=TRUE. Procedura de scriere n acces secvenial
WriteSeqRec(VAR f:TipFis; VAR z:TipArt; VAR ivk:BOOLEAN)

F este fiierul de date i z este zona articol ataat lui. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost scris, sau valoarea TRUE, n caz contrar. Procedura adaug un articol n fiierul de date, concomitent cu extinderea tabelei de indexuri cu o nou nregistrare, a crei cheie este mai mare dect cele existente. n cazul n care cheia este mai mic sau egal cu a ultimului articol din tabel, se returneaz eroare (ivk=TRUE) i articolul nu se scrie. Procedura de scriere n acces direct
WriteKeyRec(VAR f:TipFis; VAR z:TipArt; Key:TipCheie; VAR ivk:BOOLEAN)

F este fiierul de date i z este zona articol ataat lui. Key precizeaz valoarea cheii articolului care se scrie. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost scris sau valoarea TRUE, n caz contrar. Procedura adaug un articol la sfritul fiierului de date. Cheia acestuia poate avea orice valoare, inexistent n tabela de indexuri. Iniial, tabela se extinde cu un nou articol i apoi se reordoneaz (pentru a satisface cerinele citirii secveniale). n cazul n care cheia furnizat de apelator se regsete n tabel, articolul nu se scrie i se returneaz eroare de cheie invalid (ivk=TRUE). Cutarea se face cu procedura Start. Procedura de rescriere
RewriteRec(VAR f:Tip VAR z:TipArt; VAR ivk:BOOLEAN)

F este fiierul de date i z este zona articol ataat lui. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost rescris sau valoarea TRUE, n caz contrar.

Algoritmi de prelucrare a fiierelor organizate indexat

Procedura transfer datele din z n fiierul de date, n aceeai poziie din care s-a citit anterior (printr-o operaie de citire n acces secvenial sau direct). Tabela de indexuri nu se modific. Procedura verific dac valoarea cheii s-a modificat fa de momentul citirii sale precedente, caz n care se semnaleaz eroare de cheie invalid (ivk=TRUE). Procedura de tergere n acces secvenial
DeleteSeqRec(VAR f:TipFis; VAR ivk:BOOLEAN)

F este fiierul de date, iar ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost ters sau valoarea TRUE, n caz contrar. Procedura terge logic articolul curent din fiierul de date. tergerea se realizeaz fizic n tabela de indexuri. Iniial se face y.is=0 i apoi se elimin articolul din tabel, prin procedura de sortare. Eroarea de cheie invalid (ivk=TRUE) este semnalat n cazul n care pointerul curent al tabelei de indexuri indic marcatorul de sfrit de fiier. Procedura de tergere n acces direct
DeleteKeyRec(VAR f:TipFis; Key:TipCheie; VAR ivk:BOOLEAN)

F este fiierul de date i key precizeaz valoarea cheii articolului care se terge. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul a fost ters sau valoarea TRUE, n caz contrar. Procedura terge logic din fiierul de date articolul a crui cheie este furnizat ca parametru. tergerea se realizeaz fizic n tabela de indexuri, analog tergerii n acces secvenial. Eroarea de cheie invalid (ivk=TRUE) este semnalat n cazul n care articolul respectiv nu se regsete n tabel. Cutarea se face cu procedura Start. Procedura de poziionare
Start(VAR f:TipFis; key:TipCheie; VAR ivk:BOOLEAN)

F este fiierul de date i key precizeaz valoarea cheii articolului pe care se face poziionarea. Ivk este indicator de eroare, care returneaz valoarea FALSE, dac articolul exist n fiier sau valoarea TRUE, n caz contrar. Procedura caut binar cheia cu valoarea key n tabela de indexuri i dac o gsete, face ivk=FALSE, iar dac nu o gsete, face ivk:=TRUE. Observaie: Unitatea Indexate include o procedur de sortare (Sort) care nu este public. Ea sorteaz tabela de indexuri i elimin articolul care are y.is=0.

Algoritmi n programare. Aplicaii

unit indexate; INTERFACE type tipcheie= word; tipart=record nrm:tipcheie; nume:string[25]; grupa:word; nrd:1..20; nota:array[1..20] of 0..10 end; tipfis=file of tipart; procedure opennew(var f:tipfis; var nume_fis:string; var ivk:boolean); procedure openold(var f:tipfis; var nume_fis:string; var ivk:boolean); procedure closefile(var f:tipfis); procedure readseqrec(var f:tipfis; var z:tipart; var sf:boolean); procedure readkeyrec(var f:tipfis; var z:tipart; key:tipcheie; var ivk:boolean); procedure writeseqrec(var f:tipfis; var z:tipart; var ivk:boolean); procedure writekeyrec(var f:tipfis; var z:tipart; key:tipcheie; var ivk:boolean); procedure rewriterec(var f:tipfis; var z:tipart; var ivk:boolean); procedure deleteseqrec(var f:tipfis; var ivk:boolean); procedure deletekeyrec(var f:tipfis; key:tipcheie; var ivk:boolean); procedure start(var f:tipfis; key:tipcheie; var ivk:boolean); IMPLEMENTATION type tipindex=record is:0..1; cheie:tipcheie; nr:word end; tabela=file of tipindex; var g:tabela; y:tipindex; procedure sort(var g:tabela); var h:tabela; a,b:tipindex; i,j:word; begin assign(h,'temp.dat'); rewrite(h); seek(g,0); for i:=1 to filesize(g) do begin read(g,a);

Algoritmi de prelucrare a fiierelor organizate indexat

if a.is = 1 then write(h,a) end; close(g); seek(h,0); for i:=1 to filesize(h)-1 do begin seek(h,i-1); read(h,a); for j:=i+1 to filesize(h) do begin seek(h,j-1); read(h,b); if a.cheie > b.cheie then begin seek(h,i-1); write(h,b); seek(h,j-1); write(h,a); a:=b end end end; rewrite(g); seek(h,0); for i:=1 to filesize(h) do begin read(h,a); write(g,a) end; close(h); erase(h) end; procedure opennew; begin assign(f,nume_fis); {$i-} reset(f) {$i+} ; if ioresult <> 0 then begin ivk:=false; rewrite(f); assign(g,copy(nume_fis,1, length(nume_fis)-4)+'.idx'); rewrite(g) end else ivk:=true end; procedure openold; begin assign(f,nume_fis); {$i-} reset(f) {$i+} ; if ioresult = 0 then begin ivk:=false; assign(g,copy(nume_fis,1, length(nume_fis)-4)+'.idx'); {$i-} reset(g) {$i+}; if ioresult <> 0 then ivk:=true end else ivk:=true end;

Algoritmi n programare. Aplicaii

procedure closefile; begin close(f); close(g) end; procedure readseqrec; begin sf:=false; {$i-} read(g,y) {$i+}; if ioresult <> 0 then sf:=true; if not sf then begin seek(g,filepos(g)-1); read(g,y); seek(f,y.nr); read(f,z) end end; procedure readkeyrec; begin start(f,key,ivk); if not ivk then begin seek(g,filepos(g)-1); read(g,y); seek(f,y.nr); read(f,z) end end; procedure writeseqrec; begin ivk:=false; if filepos(g) > 0 then begin seek(g,filesize(g)-1); read(g,y); if y.cheie >= z.nrm then ivk:=true end; if not ivk then begin y.is:=1; y.cheie:=z.nrm; y.nr:=filesize(f); write(g,y); seek(f,filesize(f)); write(f,z) end end;

Algoritmi de prelucrare a fiierelor organizate indexat

procedure writekeyrec; begin start(f,key,ivk); if ivk then begin y.is:=1; y.cheie:=z.nrm; y.nr:=filesize(f); seek(g,filesize(g)); write(g,y); seek(f,filesize(f)); write(f,z); sort(g); ivk:=false end else ivk:=true end; procedure rewriterec; begin start(f,z.nrm,ivk); if not ivk then begin seek(f,filepos(f)-1); write(f,z) end end; procedure deleteseqrec; begin if filepos(g) <= filesize(g) then begin ivk:=false; seek(g,filepos(g)-1); y.is:=0; write(g,y); sort(g) end else ivk:=true end; procedure deletekeyrec; begin start(f,key,ivk); if not ivk then deleteseqrec(f,ivk) end; procedure start; var i,ld,ls:word; vb:boolean; begin ivk:=false; vb:=false; ls:=1; ld:=filesize(g); while not vb and (ld>=ls) do begin i:=(ls+ld) div 2; seek(g,i-1); read(g,y); if y.cheie = key then vb:=true else if y.cheie < key then ls:=i+1 else ld:=i-1 end; if not vb then ivk:=true end; end.

Algoritmi n programare. Aplicaii

8.2. Exerciii de prelucrare a fiierelor indexate


Exerciiul 8.1. S se realizeze un program pentru crearea n acces direct a unui fiier indexat referitor la situaia colar a studenilor unei faculti, cu articole avnd urmtoarea structur: Numr matricol Word Nume i prenume String[25] Grupa Word Numr discipline (n) 1..20 Note obinute: 1 2 n 0..10 0..10 0..10

Cheia este cmpul numr matricol. Datele se introduc de la tastatur, asigurndu-se urmtoarele validri: - cmpul numr matricol: s fie numeric; - cmpul nume i prenume: s fie alfabetic (s fie compus numai din litere mari, litere mici i spaiu); - cmpul grupa: s fie numeric; - cmpul numr discipline: s fie numeric; - cmpurile note obinute: s fie numerice. n cazul n care valoarea introdus nu corespunde cerinelor impuse, se semnaleaz eroare i se reia introducerea. Sfritul introducerii datelor se va marca standard (CTRL/Z n cmpul numr matricol). Observaie: Fiierul va fi deschis ca nou, cu primitiva OpenNew. n cazul n care exist n director un fiier cu acelai specificator, se semnaleaz eroare i se reia introducerea numelui de fiier. Dac nu exist, se va crea eticheta fiierului de date cu specificatorul furnizat de ctre utilizator i, concomitent, se va crea eticheta fiierului de indexuri. Scrierea n fiierul indexat se va realiza cu primitiva de scriere n acces direct (WriteKeyRec). Pentru a nu citi inutil, de la tastatur, cmpurile din articol, n cazul n care valoarea cheii exist deja n tabela de indexuri (eroarea fiind semnalat doar la sfritul introducerii articolului), s-a optat pentru urmtoarea variant: - se citete de la tastatur valoarea cheii (numrul matricol); - se verific existena n fiier a vreunui articol cu aceeai valoare a cheii, cu ajutorul primitivei de poziionare (Start); - dac exist un astfel de articol, se semnaleaz eroare i se reia introducerea valorii pentru cheie; - dac nu exist articolul, se citesc de la tastatur celelalte cmpuri i se scrie articolul n fiier.
program creare_fisier_indexat; uses crt,indexate; var art:tipart; f:tipfis; er,ivk,ivk1:boolean; i,l:byte; s:string[100]; nume_fis:string;

Algoritmi de prelucrare a fiierelor organizate indexat

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 citire_nrm; begin repeat er:=false; gotoxy(38,5); {$i-}; readln(art.nrm); {$i+}; if ioresult <> 0 then begin s:='Valoare nenumerica !'; eroare; gotoxy(38,5); clreol end until not er end; procedure citire_nume; begin repeat er:=false; gotoxy(38,6); clreol; readln(art.nume); l:=length(art.nume); for i:=1 to l do if not (art.nume[i] in alfabet) then er:=true; if er then begin s:='Caractere nealfabetice !'; eroare end until not er end; procedure citire_grupa; begin repeat er:=false; gotoxy(38,7); clreol; {$i-}; readln(art.grupa); {$i+}; if ioresult <> 0 then begin s:='Valoare nenumerica !'; eroare; clreol end until not er end;

Algoritmi n programare. Aplicaii

procedure citire_nrd; begin repeat er:=false; gotoxy(38,8); clreol; {$i-} readln(art.nrd); {$i+} if ioresult<>0 then begin s:='Caractere nenumerice !'; eroare end until not er end; procedure citire_note; begin for i:=1 to art.nrd do begin gotoxy(20,i+8); write('Nota ',i:2,' : '); repeat er:=false; gotoxy(38,i+8); clreol; {$i-} readln(art.nota[i]); {$i+} if ioresult<>0 then begin s:='Caractere nenumerice !'; eroare end until not er end end; procedure inceput; begin textbackground(blue); textcolor(yellow); clrscr; repeat write('Numele fisierului: '); readln(nume_fis); opennew(f,nume_fis,ivk) until not ivk; clrscr; checkeof:=true; gotoxy(20,5); write('Nr. matricol: '); gotoxy(20,6); write('Nume si prenume: '); gotoxy(20,7); write('Grupa: '); gotoxy(20,8); write('Nr. discipline: '); gotoxy(38,5) end; procedure prelucrare; begin citire_nrm; start(f,art.nrm,ivk); if ivk then begin

Algoritmi de prelucrare a fiierelor organizate indexat

citire_nume; citire_grupa; citire_nrd; citire_note; writekeyrec(f,art,art.nrm,ivk1) end; if not ivk or ivk1 then begin s:='Articol existent !'; eroare end; for i:=5 to 8 do begin gotoxy(38,i); clreol end; for i:=9 to 24 do begin gotoxy(20,i); clreol end; gotoxy(38,5); end; procedure sfarsit; begin closefile(f); end; {programul principal} begin inceput; while not eof do prelucrare; sfarsit end.

Exerciiul 8.2. S se realizeze programul pentru afiarea informaiilor (nume i prenume, grupa i notele obinute) existente n fiierul indexat creat la exerciiul 8.1, pentru studenii ale cror numere matricol se citesc de la tastatur. Observaii: Fiierul se va deschide pentru consultare, ca fiier existent, cu primitiva OpenOld. n cazul n care nu exist un fiier cu specificatorul furnizat de ctre utilizator, se reia introducerea specificatorului pn cnd este citit unul valid. Citirea articolului se va realiza n acces direct dup cheia furnizat, cu ajutorul primitivei ReadKeyRec.
program consultare_acces_direct; uses crt,indexate; var x:tipart; f:tipfis; nrm,i:word; ivk:boolean; nume_fis:string; begin clrscr; repeat write('Numele fisierului: '); readln(nume_fis); openold(f,nume_fis,ivk) until not ivk; clrscr; checkeof:=true; with x do begin gotoxy(10,5);

Algoritmi n programare. Aplicaii

end.

write('Numar matricol:'); while not eof do begin gotoxy(35,5); readln(nrm); readkeyrec(f,x,nrm,ivk); if not ivk then begin gotoxy(15,8); write(nume); gotoxy(10,11); write('Grupa ',grupa); gotoxy(10,13); write('Note obtinute:'); for i:=1 to nrd do begin gotoxy(10,14+i); write('Nota ',i:2,': ',nota[i]:2) end end else begin gotoxy(10,10); write('Articol inexistent !',#7) end; readln; clrscr; gotoxy(10,5); write('Numar matricol:') end end {with}; closefile(f)

Exerciiul 8.3. S se realizeze programul pentru afiarea unor informaii (numr curent, numr matricol, nume i prenume) pentru studenii din grupele ale cror valori se citesc de la tastatur. Fiierul indexat este cel creat la exerciiul 8.1. Observaii: Programul codific un algoritm de consultare secvenial cu selecie simpl (dup cmpul grupa), similar schemei generale de prelucrare cu o citire iniial i o citire curent, la sfritul modulului prelucrare. Pentru fiecare nou grup introdus de la tastatur, fiierul se parcurge de la primul la ultimul articol. De aceea, de fiecare dat, fiierul de date se va deschide (pentru consultare, cu primitiva OpenOld) nainte de prima citire i se va nchide (cu primitiva CloseFile) dup ultima citire. n cazul n care nu exist un fiier cu specificatorul furnizat de ctre utilizator se va semnala eroare de sistem i se va ntrerupe execuia programului. Citirea articolului se va realiza n acces secvenial, cu ajutorul primitivei ReadSeqRec.
program consultare_grupa; uses crt,indexate; var x:tipart; f:tipfis; gr,i:word; sf,vb,ivk:boolean; nume_fis:string;

Algoritmi de prelucrare a fiierelor organizate indexat

begin clrscr; write('Numele fisierului: '); readln(nume_fis); clrscr; checkeof:=true; with x do begin gotoxy(10,1); write('Grupa (sau ^Z):'); while not eof do begin openold(f,nume_fis,ivk); gotoxy(27,1); readln(gr); sf:=false; vb:=false; i:=0; readseqrec(f,x,sf); while not sf do begin if grupa=gr then begin inc(i); gotoxy(10,2+i); write(i:2,'. ',nrm:4,' ',nume); vb:=true end; readseqrec(f,x,sf) end; if not vb then begin gotoxy(25,10); write('Numar grupa eronat !',#7) end; readln; clrscr; closefile(f); gotoxy(10,1); write('Grupa (sau ^Z): ') end end {with} end.

Exerciiul 8.4. S se realizeze programul pentru actualizarea fiierului referitor la studeni, creat la exerciiul 8.1. Observaii: 1. Programul ofer utilizatorului funciuni de Adaugare, Modificare i Stergere, realizate n acces direct dup cheie. n meniul afiat pe ecran exist i funcia de terminare a programului. 2. Funcia de Adaugare este similar crerii, cu deosebirea c verificarea existenei sau nonexistenei articolului n fiier se realizeaz cu primitiva de citire n acces direct ReadKeyRec. 3. Opiunea de Stergere prevede citirea n acces direct a articolului, afiarea acestuia pe monitor, confirmarea tergerii i, n caz afirmativ, tergerea n acces secvenial cu primitiva DeleteSeqRec.

Algoritmi n programare. Aplicaii

4. Opiunea de Modificare prevede posibilitatea modificrii valorii oricrui cmp sau combinaie de cmpuri. Prin convenie, tastarea doar a lui <ENTER> semnific nemodificarea cmpului respectiv. Modificarea se realizeaz n urmtorii pai: citirea articolului n acces direct, modificarea cmpurilor dorite i rescrierea articolului cu primitiva RewriteRec. 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 numr matricol (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_indexat; uses crt,indexate; var f:tipfis; x:tipart; t:text; opt,r:char; ivk:boolean; nrm,i,err:word; aux:string[25]; numefis:string; procedure meniu; begin clrscr; reset(input); gotoxy(30,8); write('Functiunile programului'); gotoxy(36,10); write('1. Adaugare'); gotoxy(36,11); write('2. Modificare'); gotoxy(36,12); write('3. Stergere'); gotoxy(36,13); write('4. 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('Grupa: '); readln(x.grupa); write('Nr. discipline: '); readln(x.nrd); for i:=1 to x.nrd do begin write('Nota ',i,': '); readln(x.nota[i]) end end;

Algoritmi de prelucrare a fiierelor organizate indexat

procedure adaugare; begin reset(input); checkeof:=true; clrscr; with x do begin write('Nr. matricol: '); while not eof do begin readln(nrm); readkeyrec(f,x,nrm,ivk); if ivk then begin citire_campuri; writekeyrec(f,x,nrm,ivk) end else writeln('Numarul matricol exista in fisier !'); write('Nr. matricol (sau ^Z): ') end end end; procedure stergere; begin reset(input); checkeof:=true; clrscr; with x do begin write('Nr. matricol: '); while not eof do begin readln(nrm); readkeyrec(f,x,nrm,ivk); if not ivk then begin writeln(nume,' ',grupa); write('Confirmati stergerea ? (d/n): '); readln(r); if upcase(r)='D' then deleteseqrec(f,ivk) end else writeln('Student inexistent in fisier !'); write('Nr. matricol (sau ^Z): ') end end end; procedure modif_campuri; begin with x do begin write('Nume si prenume: ',nume,' '); readln(aux); if aux<>'' then nume:=aux; write('Grupa: ',grupa,' '); readln(aux); if length(aux)<>0 then val(aux,grupa,err); write('Nr. discipline: ',nrd,' '); readln(aux); if aux[0]<>#0 then val(aux,nrd,err);

Algoritmi n programare. Aplicaii

for i:=1 to nrd do begin write('Nota ',i,': ',nota[i],' '); readln(aux); if aux<>'' then val(aux,nota[i],err) end; rewriterec(f,x,ivk) end end; procedure modificare; begin checkeof:=true; clrscr; reset(input); with x do begin write('Nr. matricol: '); while not eof do begin readln(nrm); readkeyrec(f,x,nrm,ivk); if not ivk then modif_campuri else writeln('Student inexistent in fisier !'); write('Nr. matricol (sau ^Z): ') end end; end; {programul principal} begin clrscr; assign(t,'con'); repeat write('Numele fisierului: '); readln(numefis); openold(f,numefis,ivk) until not ivk; meniu; while opt<>'4' do begin case opt of '1': adaugare; '2': modificare; '3': stergere else begin gotoxy(25,23); write('Functie inexistenta !',#7) end end; meniu end end.