Sunteți pe pagina 1din 0

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
stare (is)
Cheie Numr relativ (nr)
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, memo-
rate 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 excep-
ia 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 indi-
cator 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 indi-
cator 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 valoa-
rea FALSE, dac articolul a fost ters sau valoarea TRUE, n caz contrar.
Procedura terge logic articolul curent din fiierul de date. tergerea se reali-
zeaz 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:

Note obinute: Numr
matricol
Nume i
prenume
Grupa
Numr
discipline (n)
1 2 n
Word String[25] Word 1..20 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
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)
end.

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.

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