Sunteți pe pagina 1din 59

47

Aplicaii

lu
cr
u

4.
4 Lucru
ul cu fiiere

n
a memoriei
m
innterne, de aceeea joac
Fiierelle constituie o extensie nevolatil
un rol importannt n problem
mele prelucraare automat a datelor. nn timp ce fiierele binarre snt utilizaate pentru pstrarea datellor n vedereea prelucrriii n aplicaii,, fiierele
textt snt utilizatte ca rapoartte destinate utilizatorului
u
sau surse dee date de inttrare pentru diverse apliccaii. E posiibil i o com
mbinaie a ceelor dou roluri: transferuul datelor
ntrre aplicaii caare utilizeaz modaliti diferite de pstrare a dateelor binare (d
de exemplu prelucrarea datelor dintrr-o tabel MS
S Excel n caadrul unui prrogram C++)).
Exempllele din acesst capitol vorr prezenta urrmtoarele aspecte
a
ale prelucrrii
dateelor memoraate n fiiere:
preluarea daatelor de intrrare din fiiere text,
m
n fiiere
f
binaree (vectori i matrice),
m
prelucrarea masivelor memorate
nare de date organizate secvenial,
s
prelucrarea fiierelor bin
simularea oorganizrii reelative a fiieerelor binare de date,
ndexate a fiierelor binaree de date.
simularea oorganizrii in
Exempllele care urm
meaz au fostt scrise n mediul
m
Visuall Studio 20100, dar pot
fo
i n aalte medii dee programaree C++.
fi folosite

n
c

4.1. Utiliizarea fiiierelor texxt ca sursse de datee

4.1.1. Fie un fiier text n care


c
este mem
morat un vector cu elem
mente reale su
ub urmtoarrea form: tooate elementtele se afl pe acelai rndd, separate prin
p cte un spaiu
s
(fiierrul are un siingur rnd). Scriei un suubprogram care
c
preia veectorul din fiier
f
i l
plasseaz ntr-o zon alocat dinamic n memoria inntern, n vedderea prelucrrrii ulterioaare. (Se pressupune c maasivul are o dimensiune rezonabil pentru
p
a fi nncrcat n
mem
moria princippal.)

d
neecesar vectoorului preluaat, trebuie
Pentru a putea alocca memoria dinamic
cunnoscut nti dimensiuneaa lui. O soluie este efectuuarea unei paarcurgeri sup
plimentare a fiierului teext, cu numrarea elemenntelor, urmatt de alocareea memoriei i apoi o
nou
u parcurgeree, cu preluareea elementellor i plasarea lor n mem
moria intern..
Funciaa preluare_veector_1 rezolv problemaa enunat mai
m sus.

48

Prog
gramarea calcullatoarelor

n
c

lu
cr
u

// I - numele extern al fisierului


i, adresa unde
u
se va depune
d
lung
gimea
mas
sivului preluat
// E - adresa masivului alocat din
namic / NUL
LL in caz de
e eroare
oat* preluare_vector_1
1(char * nu
ume, int* n)
n
flo
{ float*
f
v,x;
F
FILE*
f;
v
v=NULL;
nume,"r+");
f
fopen_s(&f,
; //f=fopen
n(nume,"r");
i
if(f)
{ //determinare numar elemente in
i fisier
*n=0;
;
fscanf_s(f,"%f",&x);
while(!feof(f))
{ (*n)++;
_s(f,"%f",&x
x);
fscanf_
}
entru vecto
or
//alocare memorie pe
if(*n>0)
sizeof(floa
at)*(*n));
{ v=(float*)malloc(s
te din fisi
ier
//preluare element
rewind(f);
*n=0;
_s(f,"%f",&x
x);
fscanf_
while(!feof(f))
{ v[(*n)++]=x;
,&x);
fscanf_s(f,"%f",
}
}
fclose(f);
}
r
return
v;
}

Funciia de mai suss este scris innd cont de


d descriereaa teoretic a structurii
de datte fiier text i este corecct chiar dac fiierul este gol (rezulttatul va fi
NULL
L). Totui, fiiierele text utilizate n practic nu respect nttotdeauna
aceeast structurr: se poate nntmpla ca laa sfritul fiiierului text s
s nu existe caracterul
c
EO
OF (cod ASCIII 27), care marcheaz
m
sffritul fiieruului text, i nici
n mcar marcatorul
m
de sfrit
s
de liniie (perechea CR/LF, coduuri ASCII 133 i 10).
Astfel dde fiiere, fr CR/LF duup ultima valoare, pot fi obinute cu
u editoare
precum Notepad, Notepad+
++, MS Visuaal Studio 10, WordPad (ddac nu se appas tasta
ma valoare) sau create prrin secvene de program asemntoarre acesteEntter dup ultim
ia:
f=fopen("test.txt","w"
f
");
f
for(i=1;i<1
0;i++)
fprintf(f,"%5.2f ",(float)i);
f
fclose(f);

49

Aplicaii

n cazul
c
editoruului MS Word
d 2010, chiarr dac nu se apas tasta Enter
E
dup ultima
u
valoarre, la salvareea fiierului n format text (cu opiunnile implicitee) se adaug automat
perrechea CR/LF
F dup ultim
ma valoare.

lu
cr
u

Dac fiiierul din caare se preiauu datele nu conine


c
mcaar perechea CR/LF
C
la
sfrritul liniei, atunci
a
funciia de mai suss nu o s incclud ultimuul element n
n vectorul
connstruit.

p
tor_1:
Exempluu de utilizaree a funciei preluare_vec

float *a;
f
i
int
i,l;
a
a=preluare_
_vector_1("v
vector lini
ie.txt",&l);
i
if(!a)
//actiuni in cazul esecului
e
pr
reluarii
rea unui me
esaj
//de exemplu, afisar
printf("\n\nNu s-a putut
p
desch
hide fisier
rul sau nu sint elemen
nte");
e
else
{ //prelucrarea vector
rului
//pentru verificarea
a functiei,
, poate fi afisat pe ecran
e
l preluat are
a
%d elem
mente: \n",l);
printf("\n\nVectorul
for(i=0;i<l;i++)
printf("%5.2f ",a[i]);
free(a);
}

n
c

4.1.2. Fie un fiier text n care


c
este mem
morat un vector cu elem
mente reale su
ub urmtoarrea form: ffiecare element se afl pe
p un rnd separat
s
(nu exist
e
rndurri goale).
Scrriei un subprrogram care preia vectorrul din fiierr i l plaseazz ntr-o zon
n alocat
dinamic n mem
moria intern, n vederea prelucrrii ulterioare.
u
(S
Se presupune c masi memoria principal.)
p
vul are o dimennsiune rezonaabil pentru a fi ncrcat n
d implemenntare n C++ a funciilor care preiau date nuDatoritt modului de
merice din fiiere teext (inclusivv stdin), rezollvarea este aceeai ca la exemplul
e
anterioor, cu aceleaai observaiii privind struuctura fiierrului text din
n care se
preiau datele.
4.1.3. Fie un fiiier text n care
c
este meemorat o matrice
m
cu eleemente reale. Fiierul
estee organizat aastfel: pe priimul rnd se afl numruul de linii i numrul de coloane,
sep
parate printr--un spaiu. Pe
P fiecare dinn rndurile urmtoare
u
see afl elemenntele cte
uneei linii din m
matrice, separate prin cte un spaiu (m
matricea este complet - corespunc
de dimensiunilo
d
or din prima linie a fiierrului). Scrieii un subproggram care preeia matriceaa din fiier ii o plaseaz ntr-o zon alocat
a
dinam
mic din mem
moria intern n vederea prelucrrii uulterioare. (S
Se presupunee c masivul are o dimensiune rezonaabil pentru a fi ncrcat n memoria principal ii c fiierul nu
n este gol.)

50

Prog
gramarea calcullatoarelor

ma enunat mai
m sus.
Funcia ppreluare_maatrice_1 rezoolv problem

lu
cr
u

// I - numele fisierului
i, adresele
e unde se depun dimensiunile mat
tricei
pre
eluate
// E - adresa matricei alocate
a
din
namic
flo
oat** preluare_matrice
e_1(char* nume,
n
int* m, int* n)
{ float
f
**x;
i
int
i,j;
F
FILE*
f;
x
x=NULL;
f
fopen_s(&f,
nume,"r+");
; //f=fopen
n(nume,"r");
i
if(f)
{ //preluare dimensiun
ni matrice
fscanf_s(f,"%d",m);
fscanf_s(f,"%d",n);
//alocare memorie pe
entru matri
ice
izeof(float
t*)*(*m));
x=(float**)malloc(si
for(i=0;i<*m;i++)
oc(sizeof(f
float)*(*n));
x[i]=(float*)mallo
//preluare elemente matrice
for(i=0;i<*m;i++)
for(j=0;j<*n;j++)
,&x[i][j]);
;
fscanf_s(f,"%f",
fclose(f);
}
r
return
x;
}

n
c

Deoarrece fiierul conine


c
dimeensiunile exaacte ale matrricei, se pot folosi
f
bucle cuu numr cun
noscut de paai, nefiind nevoie de detectarea
d
ex
xplicit a
sfrituului de fiierr. Ca urmaree, aceast fun
ncie nu este afectat de aspectele
vind sfritull de fiier preezentate la puunctul 4.1.1.
priv

Exempllu de utilizarre a funciei ppreluare_maatrice_1:

float **a;
f
i
int
l,c,i,j;
a
a=preluare_
_matrice_1("
"matrice cu
u dimensiun
ni.txt",&l,&
&c);
i
if(!a)
e
afi
isare mesaj
//actiuni in caz de esec, de exemplu
tut fi desc
chis fisier
rul");
printf("\n\nNu a put
e
else
cei preluat
te, de exem
mplu afisare
e pe ecran
//prelucrarea matric
ce cu %d li
inii si %d coloane:\n",l,c);
{ printf("\n\nMatric
for(i=0;i<l;i++)

51

Aplicaii

{ for(j=0;j<c;j++)
)
printf("%6.2f",a
a[i][j]);
printf("\n");
}
for(i=0;i<l;i++)
free(a[i]);
free(a);

lu
cr
u

4.1.4. Fie un fiiier text n care


c
este meemorat o matrice
m
cu eleemente reale. Fiierul
estee organizat aastfel: pe fieccare rnd se aafl elementtele cte uneii linii din maatrice, separrate prin cte un spaiu (m
matricea estee complet toate rnduurile au acelaai numr
de elemente). D
Dimensiunilee matricei nuu snt memoorate n fiieer. Scriei unn subprogram care preiaa matricea diin fiier i o plaseaz ntr-o zon alocat dinamicc din memoria intern n vederea prelucrrii ultterioare. (See presupune c masivul are o dimennsiune rezonnabil pentru a fi ncrcatt n memoriaa principal.)

n
c

Pentru a putea alocaa memoria dinamic neceesar matricei, trebuie nnti determin
nate dimensiiunile acesteiia numrul de linii i numrul
n
de coloane.
c
n condiiile
c
enuunului, numrul de linii ale
a matricei este
e egal cu numrul
n
de rnduri
r
din fiiier, deci
e suuficient num
mrarea rnduurilor din fiierul text. Deoarece
D
toatte rndurile au
a acelai
num
mr de elemeente confo
orm enunuluui este sufiicient numrarea valorilor de pe
oriccare rnd penntru a afla nu
umrul de colloane.
Deoarece rndurile snt
s separatee prin perecheea CR/LF, nuumrarea lorr se poate
realliza prin citiiri repetate (de
( exemplu cu funcia fgets).
f
Aceasst variant are
a dezavanntajul c trebbuie alocat sp
paiu de mem
morie suficient pentru texxtul citit. n exemplul
e
de mai
m jos se vaa presupune c
c snt suficiiente 1000 caaractere.
Funciaa preluare_m
matrice_2 rezzolv cerina problemei, cu restricia anterioar:
#de
efine MAX 1000
// I - numele fisierului
i, adresele
e unde se depun dimensiunile mat
tricei
pre
eluate
// E - adresa matricei alocate
a
din
namic
flo
oat** preluare_matrice
e_2(char* nume,
n
int* m, int* n)
{ float
f
**x;
i
int
i,j;
F
FILE*
f;
c
char*
rind;
x
x=NULL;
f
fopen_s(&f,
; //f=fopen
n(nume,"r");
nume,"r+");
i
if(f)
{ //numarare rinduri
MAX);
rind=(char*)malloc(M
fgets(rind,MAX,f);
*m=0;

52

Prog
gramarea calcullatoarelor

lu
cr
u

while(!feof(f))
{ (*m)++;
;
fgets(rind,MAX,f);
}
d - ultimul
l citit
//numarare elemente pe un rind
i plus 1
//=numarul de spatii
j=strlen(rind);
*n=1;
for(i=0;i<j;i++)
if(rind[i]==' ')
(*n)++;
free(rind);
ntru matric
ce
//alocare spatiu pen
izeof(float
t*)*(*m));
x=(float**)malloc(si
for(i=0;i<*m;i++)
oc(sizeof(f
float)*(*n));
x[i]=(float*)mallo
//preluare elemente matrice
rewind(f);
for(i=0;i<*m;i++)
for(j=0;j<*n;j++)
,&x[i][j]);
;
fscanf_s(f,"%f",
fclose(f);
}
r
return
x;

Funciaa se utilizeaz la fel ca ceea din exempplul 4.1.3.

n
c

narea numruului de linii din


d fiier (i implicit a numrului
n
Deoareece determin
de liniii ale matriceei) se bazeazz pe detectaarea sfrituluui de fiier, i
funcia
preluarre_matrice_2
2 depinde de structura fizic
f
a fiieerului prelucrrat. Dac
mcar CR/LF dup ultimuul element, attunci ultima linie nu va fi
f luat n
aceesta nu are m
connsiderare, la ffel ca n cazuul exempluluui 4.1.1.
4.1.5. Fie un fiier text n format
f
.CSV (valorile de pe fiecare rnd
r
snt sepaarate prin
caraacterul virguul), exportaat din MS Excel.
E
Fiecarre rnd coniine urmtoarrele date:
num
me i prenum
me student (m
maxim 30 caractere), an
nul de studii,, grupa i 200 de note
(un
nele dintre ele pot fi 0, cu
u semnificaiia c n poziia respectiv nu exist (nc)
(
not. Scriei un prrogram care preia acestee date i le memoreaz
m
nntr-un fiier binar organnizat secvenial n vedereea prelucrrillor ulterioaree cte o nreegistrare penntru fiecare student.
s
Fiecare nregistraarea va avea urmtoarea structur:
Nume
N
i prenume

An
n

Grupa

char[31]

chaar

int

Noote
nota 1
charr

ota 20
no
char

53

Aplicaii

#in
nclude
#in
nclude
#in
nclude
#in
nclude

<stdio.h>
<conio.h>
<string.h>
<stdlib.h>

efine MAX 200


#de
#de
efine NUME1 "Studenti.csv"
#de
efine NUME2 "Studenti.dat"

lu
cr
u

F dup fiecaare rnd, incluusiv ultiDeoarece MS Excel adaug auttomat CR/LF


mul, nu vor apaare problemeele legate de detectarea sfritului
s
de fiier prezenntate mai
sus. Programul care rezolv cerina este urmtorul:

voi
id main ()
{ FILE
F
*f, *g;
t
typedef
struct{ char nume[31];
n
char an;
a
int gr
rupa;
char note[20];
n
} STUDEN
NT;
S
STUDENT
x;
c
char
rind[200];
c
char
mc[23][31];
i
int
n,i,j,k;

n
c

fopen_s(&f,NUME1,"r");
f
;
i
if(!f)
l %s nu poa
ate fi deschis",NUME1);
printf("\n\nFisierul
e
else
{ fopen_s(&
&g,NUME2,"wb
b");
if(!g)
printf("\n\nFisier
rul %s nu poate
p
fi de
eschis",NUME2);
else
{ //preluarea primul
lui rind di
in fisierul
l text
;
fgets(rind,MAX,f);
eluat un ri
ind
//cit timp s-a pre
while(!feof(f))
{ n=strlen(rind);
nte din lin
nia curenta,
//separare cuvin
e cuvinte mc,
m
1 pe li
inie
//in vectorul de
i=j=0;
)
for(k=0;k<n;k++)
,')
{ if(rind[k]==',
0'; //s-a terminat cu
uvintul cur
rent
{ mc[i][j]='\0
ul urmator
//trec la cuvintu
i++;
i cuvintul
l urmator, inca
//nici o litera in
j=0;
}

54

Prog
gramarea calcullatoarelor

else
{ mc[i][j]=rin
nd[k];
j++;
}
}

//litera crt
c
se adau
uga la cuvl crt
//inca o litera
l
in c
cuvintul curent

lu
cr
u

d cuvinte se preiau datele pent


tru student
tul
//din vectorul de
nversie und
de e nevoie
e
//curent, cu con
,mc[0]);
strcpy_s(x.nume,
);
x.an=atoi(mc[1])
x.grupa=atoi(mc[2]);
+)
for(i=0;i<20;i++
i(mc[i+3]);
;
x.note[i]=atoi
ol in fisie
erul binar
//scriere artico
f(STUDENT),
,1,g);
fwrite(&x,sizeof

atorului ri
ind din fisierul text
//preluarea urma
f);
fgets(rind,MAX,f
}
fclose(g);
}
fclose(f);
}
_
_getch();

Pentru vverificare, cooninutul fiiierului text ar


a putea fi vizzualizat, ntrr-un fiier
d program:
textt nou, folosinnd urmtoareea secven de

n
c

fopen_s(&f,NUME2,"r");
f
;
i
if(f)
{ fopen_s(&
&g,"Verifica
are.txt","w
w");
frea
ad(&x,sizeo
of(STUDENT),1,f);
while(!feof(f))
0s %2d %4d ",x.nume,x
x.an,x.grupa
a);
{ fprintf(g,"\n\n%30
or(i=0;i<20
0;i++)
fo
fprintf(g,"%2d ",x.note[i]
"
]);
fr
read(&x,siz
zeof(STUDENT),1,f);
}
intf(g,"\n");
fpri
fclo
ose(g);
fclo
ose(f);
}

Temee

55

Aplicaii

lu
cr
u

1. Pentru exemplul 4.1.1. scriei o variant carre s funciooneze corect i pentru


fiierelee care nu au CR/LF dup ultima valoare.
2. Pentru exemplul 4.11.1. gsii o alt
a rezolvaree, care s nu execute o paarcurgere
suplimeentar a fiieerului pentru determinareea numruluii de elementee ale vectorului.
3. Reluai exemplul 4.1.3.
4
incluznd o verificcare a matriccei dac fiiierul nu
coninee toate elemeentele, conforrm dimensiuunilor din priimul rnd, prrelucrarea
se abanndoneaz iar pointerul obinut trebuie s aib valooarea NULL.
4. Pentru exemplul 4.1.4. rezolvarrea prezentatt este supuss unei restriicii (maul text nu se ncadreaz n
aceast
xim 10000 caractere pe un rnd). Dac fiieru
restriciie, rezultatele vor fi eronnate. Gsii o variant dee rezolvare care s nu
depind de aceast restricie.
r
5. Pentru exemplul 4..1.4 gsii o metod de rezolvare caare s nu deepind de
structurra fizic a fiierului preluucrat.
6. Pentru exemplul 4..1.4. gsii o metod dee rezolvare care
c
s nu necesite
n
o
parcurggere suplimentar a fiieerului pentru determinareea dimensiun
nilor matricei.
7. Reluai exemplul 4.1.4.
4
incluzznd o verificare a matricei dac nu toate
d elemente, prelucrarea
p
s abandoneaaz.
se
rndurille conin acelai numr de
8. Fie un fiier text n
n format .CSSV. Scriei un
u program care
c
creeaz un fiier
text nouu n care snnt trecute urm
mtoarele infformaii: num
mrul total de
d rnduri
din fiieerul iniial, numrul
n
maxxim de cuvinnte pe un rnd i numrull rndului
respectiiv (primul rnd are numrul 1), lunggimea celui mai
m lung rn
nd, lungimea cellui mai scurtt i a celui mai
m lung cuvnt (n caracttere) un cu
uvnt este
consideerat irul cupprins ntre doi separatori consecutivi
c
d acelai rnnd.
din

n
c

4.2. Massive memoorate n fiiiere binaare


care este memorat unn vector cu elemente
e
realle (de tip
Fie un fiier binar n
floa
at). Fiecare eelement constituie un arrticol al fiieerului. Vectoorul are o dim
mensiune
prea mare pentrru a fi ncrccat n memoorie. Fiierelee folosite n exemplele urmtoare
u
vorr avea aceast structur.
4.2.1. Scriei unn program caare determin elementul maxim din fiier
f
i toatee poziiile
pe care
c apare ell (poziiile reelative n fiier).

Deoarecee numrul dee apariii alee maximului poate fi foaarte mare, pooziiile pe
nute ca vectoor cu elemennte de tip int memorat nttr-un fiicaree apare acestta vor fi rein
er binar.
b
#in
nclude <stdio.h>
#in
nclude <conio.h>

56

Prog
gramarea calcullatoarelor

#de
efine NUME "Vector.dat
t"
#de
efine NUME2 "Pozitii.d
dat"

lu
cr
u

voi
id main()
{ FILE
F
*f, *g;
f
float
x, max;
i
int
poz;

n
c

fopen_s(&f,NUME,"rb");
f
;
i
if(!f)
l %s nu poa
ate fi deschis",NUME);
printf("\n\nFisierul
e
else
{ fopen_s(&
&g,NUME2,"wb
b");
fread(&x,sizeof(floa
at),1,f);
max=x;
while(!feof(f))
{ if(max<x)
{ max=x;
fclose(g);
2,"wb");
fopen_s(&g,NUME2
zeof(float)
)-1;
poz=ftell(f)/siz
eof(int),1,
,g);
fwrite(&poz,size
}
else
if(max==x)
sizeof(floa
at)-1;
{ poz=ftell(f)/s
izeof(int),
,1,g);
fwrite(&poz,si
}
&x,sizeof(fl
loat),1,f);
;
fread(&
}
fclose(g);
fclose(f);
f iar pozit
tiile se afla in fisie
erul %s
printf("\n\nMaximul este %5.2f
inar, int)\n",max,NUME
E2);
(bi
}
_
_getch();
}

Tem
Scriei un program
m pentru vizzualizarea fiierului cu ppoziiile de apariie
a
a
maxim
mului.

4.2.2. Scriei unn subprogram


m care sorteaz cresctor fiierul.

n subproogramul urm
mtor sortareaa este realizaat prin metooda bulelor.
//s
sortare vector float memorat
m
in fisier bin
nar

57

Aplicaii

// I - nume fisier
// E - cod succes: 1- su
ucces, 0 - eroare la deschidere fisier
t Sortare(char* nume)
int
{ FILE
F
*f;
i
int
n,i,gata;
f
float
x,y;
i
int
er;

n
c

lu
cr
u

er=0;
e
nume,"rb+")
f
fopen_s(&f,
);
i
if(f)
{ er=1;
fseek(f,0,SEEK_END);
;
loat);
n=ftell(f)/sizeof(fl
if(n>1)
{ gata=0;
while(!gata)
{ gata=1;
++)
for(i=0;i<n-1;i+
eof(float),
,SEEK_SET);
{ fseek(f,i*size
of(float),1
1,f);
fread(&x,sizeo
of(float),1
1,f);
fread(&y,sizeo
if(x>y)
izeof(float
t),SEEK_SET
T);
{ fseek(f,i*si
izeof(float
t),1,f);
fwrite(&y,si
izeof(float
t),1,f);
fwrite(&x,si
gata=0;
}
}
}
}
fclose(f);
}
r
return
er;

4.2.3. Scriei unn program caare interclaseeaz dou fiiere care coonin vectori. Ambele
fiiere snt deja sortate crescctor.

#in
nclude <stdio.h>
#in
nclude <conio.h>

efine NUME "Vector.dat


t"
#de
#de
efine NUME2 "Vector2.d
dat"
#de
efine NUME3 "Vector_r.dat"
id main()
voi

58

Prog
gramarea calcullatoarelor

n
c

lu
cr
u

{
//4
4.2.3
F
FILE
*f, *g,*h;
f
float
x,y;
f
fopen_s(&f,
;
NUME,"rb");
i
if(!f)
printf_s("\n\nFisier
rul %s nu poate
p
fi de
eschis\n",NU
UME);
e
else
{ fopen_s(&
&g,NUME2,"rb
b");
if(!g)
rul %s nu poate
p
fi de
eschis\n",NU
UME2);
printf("\n\nFisier
else
"wb");
{ fopen_s(&h,NUME3,"
&x,sizeof(fl
loat),1,f);
;
fread(&
fread(&
&y,sizeof(fl
loat),1,g);
;
while((!feof(f)) &&
& (!feof(g
g)))
if(x<y)
eof(float),
,1,h);
{ fwrite(&x,size
of(float),1
1,f);
fread(&x,sizeo
}
else
eof(float),
,1,h);
{ fwrite(&y,size
of(float),1
1,g);
fread(&y,sizeo
}
while(!feof(f))
f(float),1,
,h);
{ fwrite(&x,sizeof
f);
fread(&x,sizeof(float),1,f
}
while(!feof(g))
f(float),1,
,h);
{ fwrite(&y,sizeof
g);
fread(&y,sizeof(float),1,g
}
fclose(h);
fclose(g);
fclose(f);
}
}
_
_getch();
}

4.2.4. Scriei unn subprogram


m care eliminn dintr-un fiier
f
valorile cuprinse nntr-un interv
val dat [a,b].

o
seecvenial,
Deoarecee nu este deffinit operaia de tergeree din fiiere organizate
rezoolvarea neceesit un artifiiciu: toate vaalorile care see afl n afarra intervaluluui dat vor
fi copiate
c
ntr-uun fiier nou, apoi fiieruul iniial se terge

iar num
mele su estte atribuit
nou
ului fiier creeat. Este posiibil ca noul fiier
f
s nu coonin nici un
u element.

59

Aplicaii

//e
eliminare valori din [a,b]
// I - nume fisier, cape
ete interva
al
erul
// E - cod de succes: 1 - succes, 0 - nu s-a putut deschide fisie
t Elimina(char* nume, float a, float
f
b)
int
{ int
i
er;
F
FILE
*f,*g;
f
float
x;

lu
cr
u

er=0;
e
f
fopen_s(&f,
;
nume,"rb");
i
if(f)
{ fopen_s(&
&g,"temp.dat
t","wb");
fread(&x,sizeof(floa
at),1,f);
while(!feof(f))
{ if((x<a)||(b<x))
f(float),1,
,g);
fwrite(&x,sizeof
&x,sizeof(fl
loat),1,f);
;
fread(&
}
fclose(g);
fclose(f);
remove(nume);
ume);
rename("temp.dat",nu
er=1;
}
r
return
er;

n
c

4.2.5. Fie un fiiier binar nn care este memorat


m
o matrice
m
cu elemente
e
realle (de tip
floa
at). La ncepputul fiieruluui snt mem
morate numrrul de linii ii numrul dee coloane
ale matricei, suub form de numr
n
ntregg (de tip int); n continuaare se afl ellementele
mattricei, n orddine lexicograafic. Scrieii un subprogrram care determin indiccii liniilor
caree au elementtele n ordinee strict cresctoare.

int
t Indici(char* nume, char*
c
nume2
2)
{ int
i
er,este,m,n,i,j;
F
FILE
*f, *g;
f
float
x,y;
er=0;
e
nume,"rb");
f
fopen_s(&f,
;
i
if(f)
{ er=1;
&g,nume2,"wb
b");
fopen_s(&
fread(&m,sizeof(int)
),1,f);
),1,f);
fread(&n,sizeof(int)
for(i=0;i<m;i++)
{ este=1;

60

Prog
gramarea calcullatoarelor

}
fclose(g);
fclose(f);
}
r
return
er;
}

lu
cr
u

fseek(f,2*sizeof(i
int)+i*n*si
izeof(float
t),SEEK_SET);
fread(&
&x,sizeof(fl
loat),1,f);
;
for(j=1;(j<n)&&est
te;j++)
eof(int)+(i
i*n+j)*size
eof(float),S
SEEK_SET);
{ //fseek(f,2*size
f);
fread(&y,sizeof(float),1,f
if(x>=y)
este=0;
else
x=y;
}
if(este)
f(int),1,g)
);
fwrite(&i,sizeof

Fie un fiier
f
binar n
care este memorat
m
o matrice cu elemente
e
reale (de tip
floa
at). La nceputul fiierulu
ui este memoorat numrull de linii al matricei,
m
sub form de
num
mr ntreg (dde tip int); n
n continuare se afl elem
mentele matriicei, n ordinne lexicografic. Fiierelle folosite n exemplele urmtoare
u
vo
or avea aceast structur.

4.2.6. Scriei unn subprogram


m care determ
min coloaneele din matriccea aflat n fiier care au
a elementelee n ordine cresctoare.

n
c

// I - nume fisier, nume


e fisier re
ezultat
s
0 - nu s-a pu
utut deschid
de fisierul
l cu ma// E - cod succes: 1 - succes,
icea
tri
int
t Indici2(char* nume, char* nume
e2)
{ int
i
er,este;
F
FILE
*f,*g;
f
float
x,y;
i
int
m,n,i,j;
er=0;
e
nume,"rb");
f
fopen_s(&f,
;
i
if(f)
{ er=1;
fopen_s(&
&g,nume2,"wb
b");
fread(&m,sizeof(int)
),1,f);
fseek(f,0,SEEK_END);
;
n=(ftell(f)-sizeof(i
int))/(size
eof(float)*m);
for(j=0;j<n;j++)
{ este=1;
fseek(f,sizeof(int
t)+j*sizeof
f(float),SEEK_SET);

61

Aplicaii

}
fclose(f);
fclose(g);
}
r
return
er;
}

lu
cr
u

fread(&
&x,sizeof(fl
loat),1,f);
;
for(i=1;(i<m)&&est
te;i++)
int)+(i*n+j
j)*sizeof(f
float),SEEK_
_SET);
{ fseek(f,sizeof(i
f);
fread(&y,sizeof(float),1,f
if(x>=y)
este=0;
else
x=y;
}
if(este)
f(int),1,g)
);
fwrite(&j,sizeof

4.2.7. Scriei unn subprogram


m care determ
min suma elementelor
e
d pe diagon
de
nala principaal i suma eelementelor de pe diagonnala secundaar a matricei aflate n fiier, dac
mattricea e ptraat.

n
c

// I - nume fisier, adre


esele unde se depun cele 2 sume
s
1 - nu s-a pu
utut deschid
de fisierul
l, 2 // E - cod eroare: 0 - succes,
tricea nu e patrata
mat
int
t SumeDiagonale(char * nume, flo
oat *sp, fl
loat* ss)
{ int
i
er;
F
FILE
*f;
f
float
x;
i
int
m,n,i;
er=1;
e
f
fopen_s(&f,
nume,"rb");
;
i
if(f)
{ fread(&m,sizeof(int)
),1,f);
;
fseek(f,0,SEEK_END);
int))/(size
eof(float)*m);
n=(ftell(f)-sizeof(i
if(m!=n)
er=2;
else
{ er=0;
*sp=0;
*ss=0;
for(i=0;i<m;i++)
int)+(i*m+i
i)*sizeof(f
float),SEEK_
_SET);
{ fseek(f,sizeof(i
f);
fread(&x,sizeof(float),1,f
*sp+=x;

62

Prog
gramarea calcullatoarelor

fseek(f,sizeof(i
int)+(i*m+n
n-i-1)*size
eof(float),S
SEEK_SET);
fread(&x,sizeof(float),1,f
f);
*ss+=x;
}
}
fclose(f);
}
r
return
er;

lu
cr
u

4.2.8. Scriei unn subprogram


m care determ
min produsuul a dou maatrice memorrate n fiierre binare.

// I - numele celor doua


a fisiere, numele fisierului rezulat
s
1 - nu s-a pu
utut deschid
de primul fisier
f
// E - cod eroare: 0 - succes,
2 - nu
n s-a putu
ut deschide
e al doilea fisier
//
3 - dimensiuni
d
nepotrivit
te pentru inmultire
//
t Produs(char* nume1, char* nume
e2, char* nume3)
n
int
{ int
i
er;
F
FILE
*f,*g,*h;
f
float
x,y,z;
i
int
m,n,p,q,i,j,k;

n
c

fopen_s(&f,nume1,"rb")
f
);
i
if(!f)
er=1;
e
else
{ fopen_s(&
&g,nume2,"rb
b");
if(!g)
er=2;
else
&m,sizeof(in
nt),1,f);
{ fread(&
fseek(f,0,SEEK_END
D);
n=(ftell(f)-sizeof
f(int))/(m*
*sizeof(flo
oat));
&p,sizeof(in
nt),1,g);
fread(&
if(n!=p)
er=3;
else
{ er=0;
END);
fseek(g,0,SEEK_E
eof(int))/(
(p*sizeof(f
float));
q=(ftell(g)-size
3,"wb");
fopen_s(&h,nume3
f(int),1,h)
);
fwrite(&m,sizeof
)
for(i=0;i<m;i++)
++)
for(j=0;j<q;j+
{ z=0;
eof(int)+i*
*m*sizeof(f
float),SEEK_
_SET);
fseek(f,size

63

Aplicaii

}
fclose(h);
}
fclose(g);
}
fclose(f);
}
r
return
er;
}

3.

n
c

4.

Temee
1. Scriei un
n program caare creeaz un
u fiier cu sttructura desccris pentru exxemplul 4.2.1. i un prrogram care permite vizzualizare conninutului
unui asttfel de fiier (ntr-un fiieer text).
Scriei un program care creeaz un fiier cuu structura descris
d
penttru exemplul 4.22.5. i un proogram care permite
p
vizuaalizare coninnutului unui astfel de
fiier (ntr-un fiier text).
Scriei un program care creeaz un fiier cuu structura descris
d
penttru exemp
vizuaalizare coninnutului unui astfel de
plul 4.22.5. i un proogram care permite
fiier (ntr-un fiier text).
Scriei un subprogrram care caalculeaz proodusul dintree un vector memorat
ntr-un fiier binar (cu
( structura descris maai sus) i o matrice
m
memo
orat ntrmplul 4.2.6.).
un fiieer binar (cu sttructura desccris la exem
Scriei un subprograam care deteermin dac o matrice memorat ntr-un fiier
binar (ccu una din sttructurile descrise mai suus) este supeerior triunghiular. n
caz afirrmativ, se va calcula i deeterminantul acestei matrrice.
Scriei un program care adaug un vector memorat
m
ntr--un fiier binnar ca ultima cooloan a uneii matrice mem
morate ntr-uun fiier binaar (cu una din
n structurile descrise mai suss), dac dimeensiunea estee potrivit.

2.

lu
cr
u

for(k=0;k<n;
;k++)
{ fread(&x,s
sizeof(floa
at),1,f);
fseek(g,si
izeof(int)+
+(k*p+j)*si
izeof(float),SEEK_SET)
);
fread(&y,s
sizeof(floa
at),1,g);
z+=x*y;
}
izeof(float
t),1,h);
fwrite(&z,si

5.
6.

4.3. Fiieere binaree de date,, organiza


ate secven
nial

Exerciiiile urmtoarre vor exempplifica realizzarea operaiunilor de gestiune de


bazz asupra fiiierelor binaree de date.
4.3.1. Fie un fiier organizaat secvenial, cu date desspre studeniii unei facultti. Articoleele au urmttoarea structuur:

64

Prog
gramarea calcullatoarelor

N
Nume
i prenuume
char [30]

An dee studiu

G
Grupa

chhar

int

Nr. discipline
d
char

1
chhar

Note obinnute
2
15
char
char

#in
nclude <stdio.h>
#in
nclude <conio.h>

lu
cr
u

Scriei uun program C pentru adugarea de arrticole n aceest fiier.

pedef struct { char nu


ume[30];
typ
char an
n;
int gru
upa;
char nr
rd;
char no
ote[15];
} STUDENT
T;
id main()
voi
{ FILE
F
*f;
S
STUDENT
x;
c
char
nume_f[20];
i
int
i;

printf("\nNume fisier: ");


p
g
gets(nume_f
);
f
fopen_s(&f,
+");
nume_f,"rb+

n
c

if(!f)
i
% nu poate
e fi deschi
is");
printf("\nFisierul %s
e
else
{ fseek(f,0,SEEK_END);
;
renume (sau
u CTRL-Z): ");
printf("\nNume si pr
fflush(stdin);
gets(x.nume);
while(!feof(stdin))
: ")
);
{ printf("An
;
scanf("%d",&x.an);
: ")
);
printf("Grupa
pa);
scanf("%d",&x.grup
cipline: ")
);
printf("Numar disc
);
scanf("%d",&x.nrd)
++)
for(i=0;i<x.nrd;i+
%
",i);
{ printf("\tNota %2d:
ote[i]);
scanf("%d",&x.no
}
STUDENT),1,
,f);
fwrite(&x,sizeof(S
sau CTRL-Z): ");
printf("\nNume si prenume (s
fflush(stdin);

65

Aplicaii

gets(x.nume);
}
fclose(f);
}
p
printf("\n\
nat");
nAdaugarea s-a termin
p
printf("\nA
Apasa o tast
ta");
_
_getch();

lu
cr
u

4.3.2. Fie fiierrul prezentat n exerciiull anterior. Sccriei un proogram C penttru sortarea datelor din fiier
f
dup annul de studiuu i grup, prrin metoda buulelor.

#in
nclude <stdio.h>
#in
nclude <conio.h>

typ
pedef struct { char nu
ume[30];
char an
n;
int grupa;
rd;
char nr
char no
ote[15];
} STUDENT
T;

id main()
voi
{ FILE
F
*f;
S
STUDENT
x;
c
char
nume_f[20];
i
int
i,n,j,gata;
S
STUDENT
y;

n
c

fopen_s(&f,nume_f,"rb+
f
+");
i
if(!f)
% nu poate
e fi deschi
is");
printf("\nFisierul %s
e
else
{ fseek(f,0,SEEK_END);
;
TUDENT);
n=ftell(f)/sizeof(ST
gata=0;
while(!gata)
{ gata=1;
)
for(i=0;i<n-1;i++)
f(STUDENT),
,SEEK_SET);
{ fseek(f,i*sizeof
1,f);
fread(&x,sizeof(STUDENT),1
1,f);
fread(&y,sizeof(STUDENT),1
==y.an)&&(x
x.grupa>y.grupa)) )
if( (x.an>y.an) || ((x.an=
{ gata=0;
eof(STUDENT
T),SEEK_SET
T);
fseek(f,i*size
eof(STUDENT
T),1,f);
fwrite(&y,size
eof(STUDENT
T),1,f);
fwrite(&x,size

66

Prog
gramarea calcullatoarelor

}
}

lu
cr
u

}
fclose(f);
% a fost sortat
s
crescator dupa an si grup
pa",
printf("\nFisierul %s
me_f);
num
}
p
printf("\nA
Apasa o tast
ta");
_
_getch();
}

4.3.3. Fie fiierrul prezentat n exerciiul 4.3.1. Consiidernd c fiierul este soortat dup
anuul de studiu i grup, scriiei un progrram C care genereaz
g
nttr-un fiier teext o list
cu mediile
m
studdenilor, media fiecrei grrupe, media fiecrui an dde studiu i media
m
generral.

#in
nclude <stdio.h>
#in
nclude <conio.h>

pedef struct { char nu


ume[30];
typ
char an
n;
int gru
upa;
char nr
rd;
char no
ote[15];
} STUDENT
T;

n
c

id main()
voi
{ FILE
F
*f,*g;
S
STUDENT
x;
c
char
nume_f[20];
i
int
i;
c
char
can;
i
int
cgr,na,nf,ng;
f
float
mf,ma,mg,s;

fopen_s(&f,nume_f,"rb+
f
+");
i
if(!f)
% nu poate
e fi deschi
is");
printf("\nFisierul %s
e
else
{ //operatii initiale la nivel de
d fisier
&g,"Lista me
edii.txt","
"w");
fopen_s(&
fprintf(g,"Lista med
diilor stud
dentilor, grupelor
g
si anilor\n\n
n");
mf=0;
nf=0;
DENT),1,f);
;
fread(&x,sizeof(STUD
while(!feof(f))
le la nivel
l de an
{ //operatii initial

67

Aplicaii

lu
cr
u

can=x.an;
ma=0;
na=0;
fprintf(g,"\n\nAnul: %2d",can);
while((can==x.an)&&(!feof(f)))
{ //operatii initiale la nivel de grupa
cgr=x.grupa;
mg=0;
ng=0;
fprintf(g,"\n\n\tGrupa: %4d",cgr);
while((can==x.an)&&(cgr==x.grupa)&&(!feof(f)))
{ //prelucrare articol
s=0;
for(i=0;i<x.nrd;i++)
s+=x.note[i];
s=s/x.nrd;
mg+=s;
ng++;
fprintf(g,"\n\t\t%-30s %5.2f",x.nume,s);
fread(&x,sizeof(STUDENT),1,f);
}
//operatii finale la nivel de grupa
mg/=ng;
fprintf(g,"\n\tMedia grupei %4d este %5.2f",cgr,mg);
ma+=mg;
na++;
}
//operatii finale la nivel de an
ma/=na;
fprintf(g,"\nMedia anului %2d este %5.2f",can,ma);
mf+=ma;
nf++;

n
c

}
//operatii finale la nivel de fisier
mf/=nf;
fprintf(g,"\nMedia generala este %5.2f",mf);
fclose(f);
fclose(g);
printf("\nLista se afla in fisierul \"Lista medii.txt\"");

}
printf("\nApasa o tasta");
_getch();

4.3.4. Fie 2 fiiere organizate secvenial, cu date despre impozitele datorate statului
pe raza a 2 administraii financiare. Articolele au urmtoarea structur:
CNP
contribuabil
char [14]

Nume i
prenume
char [30]

Adresa
char [50]

Impozit anual pe cldiri Impozit anual pe cldiri


i terenuri, calculat
i terenuri, pltit
float
float

68

Prog
gramarea calcullatoarelor

#in
nclude <stdio.h>
#in
nclude <conio.h>

lu
cr
u

Consideernd fiiereele sortate crresctor dupp valoarea impozitului calculat,


scriiei un prograam C pentru interclasarea celor 2 fiiiere.

typ
pedef struct { char cn
np[14];
char nu
ume[30];
char ad
dresa[50];
float ic,ip;
i
} CONTRIB
BUABIL;
id main()
voi
{ FILE
F
*f,*g,*h;
L x,y;
C
CONTRIBUABI
c
char
nume_f[20];

n
c

printf("\nPrimul fisie
p
er: ");
g
gets(nume_f
);
nume_f,"rb"
f
fopen_s(&f,
");
i
if(!f)
% nu poate
e fi deschi
is",nume_f);
printf("\nFisierul %s
e
else
{ printf("\nAl doilea fisier: ")
);
fflush(stdin);
gets(nume_f);
&g,nume_f,"r
rb");
fopen_s(&
if(!g)
l %s nu poa
ate fi deschis",nume_f
f);
printf("\nFisierul
else
r
"
",nume_f);
{ printf("\nFisier rezultat:
fflush(stdin);
gets(nume_f);
,"wb");
fopen_s(&h,nume_f,
&x,sizeof(CO
ONTRIBUABIL
L),1,f);
fread(&
fread(&
&y,sizeof(CO
ONTRIBUABIL
L),1,g);
while((!feof(f)) &&
& (!feof(g
g)))
if(x.ic<y.ic)
eof(CONTRIB
BUABIL),1,h
h);
{ fwrite(&x,size
of(CONTRIBU
UABIL),1,f);
fread(&x,sizeo
}
else
eof(CONTRIB
BUABIL),1,h
h);
{ fwrite(&y,size
of(CONTRIBU
UABIL),1,f);
fread(&y,sizeo
}

69

Aplicaii

}
fclose(f);

lu
cr
u

while(!feof(f))
{ fwrite(&x,sizeof
f(CONTRIBUA
ABIL),1,h);
BIL),1,f);
fread(&x,sizeof(CONTRIBUAB
}
while(!feof(g))
f(CONTRIBUA
ABIL),1,h);
{ fwrite(&y,sizeof
BIL),1,f);
fread(&y,sizeof(CONTRIBUAB
}
fclose(h);
fclose(g);

}
ata, apasa o tasta");
p
printf("\nG
;
_
_getch();
}

4.3.5. Fie fiierrul prezentat n exerciiull anterior. Sccriei un proggram C care genereaz ntr-un

fiierr text o list cu contribuaabilii (contribbuabilul) cu cea mai marre datorie


neaachitat ctree stat.

#in
nclude <stdio.h>
#in
nclude <conio.h>

n
c

typ
pedef struct { char cn
np[14];
char nu
ume[30];
char ad
dresa[50];
float ic,ip;
i
} CONTRIB
BUABIL;
id main()
voi
{ FILE*
F
f,*g,*h;
L x;
C
CONTRIBUABI
f
float
max;
c
char
nume_f[20];
i
int
poz;

printf("\nNume fisier: ");


p
g
gets(nume_f
);
f
fopen_s(&f,
");
nume_f,"rb"
i
if(!f)
printf("\nFisierul %s
% nu poate
e fi deschi
is",nume_f);
e
else
{ fopen_s(&
&g,"temp.dat
t","wb");
fread(&x,sizeof(CONT
TRIBUABIL),
,1,f);
max=0;
while(!feof(f))

70

Prog
gramarea calcullatoarelor

lu
cr
u

{ if(max<x.ic-x.ip)
{ max=x.ic-x.ip;
zeof(CONTRI
IBUABIL) - 1;
poz=ftell(f)/siz
fclose(g);
p.dat","wb"
");
fopen_s(&g,"temp
eof(int),1,
,g);
fwrite(&poz,size
}
else
p)
if(max=x.ic-x.ip
sizeof(CONT
TRIBUABIL) - 1;
{ poz=ftell(f)/s
izeof(int),
,1,g);
fwrite(&poz,si
}
&x,sizeof(CO
ONTRIBUABIL
L),1,f);
fread(&
}
rewind(g);
&h,"Lista.tx
xt","w");
fopen_s(&
fprintf(h,"Lista cu cele mai mari
m
datori
ii neplatite
e:\n\n");
fprintf(h,"\nDatoria
a maxima es
ste %8.2 le
ei, max);
ata de urma
atorii:\n);
fprintf(h, neachita
fread(&poz,sizeof(in
nt),1,g);
while(!feof(g))
f(CONTRIBUA
ABIL),SEEK_
_SET);
{ fseek(f,poz*sizeof
&x,sizeof(CO
ONTRIBUABIL
L),1,f);
fread(&
fprintf(h,"\n%14s %30s %50s"
",x.cnp,x.n
nume,x.adresa);
fread(&
&poz,sizeof(int),1,g);
;
}
fclose(g);
fclose(h);
a
in fis
sierul List
ta.txt");
printf("\nLista se afla
remove("temp.dat");
fclose(f);

n
c

}
p
printf("\nG
;
ata, apasa o tasta");
_
_getch();

4.3.6. Fie un fiier organizaat secvenial, cu date desp


pre flota de camioane
c
a unei
u societi de transporrt. Articolelee au urmtoarea structur:
Numr de
nmatriculare

char [8]

Dat achhiziie

zi lun
n
char chaar

an
int

km
m parcuri
float

Capacitatte
transporrt
mc
t
float
flloat

n curs/n garaj
c
char

Scriei uun program C care nregiistreaz plecarea n curs a unor autoovehicule.


Sfrritul introduucerii datelorr este marcat standard.

71

Aplicaii

#include <stdio.h>
#include <conio.h>
#include <string.h>

typedef struct { float mc;


float t;
} CAPACITATE;

lu
cr
u

typedef struct { char zi;


char luna;
int an;
} DATA;

typedef struct { char nr[8];


DATA data;
float km;
CAPACITATE cap;
char inc;
// 1 - in cursa; 0 - in garaj
} CAMION;

void main()
{ FILE *f;
CAMION x;
char r;
char nr[8];
char nume_f[20];
int gasit;

n
c

printf("\nNume fisier: ");


gets(nume_f);
fopen_s(&f,nume_f,"rb+");
if(!f)
printf("\nFisierul %s nu poate fi deschis");
else
{ printf("\nNr inmatriculare (sau CTRL+Z): ");
fflush(stdin);
gets(nr);
while(!feof(stdin))
{ rewind(f);
gasit=0;
fread(&x,sizeof(CAMION),1,f);
while((!feof(f)) && (!gasit))
{ if(strcmp(nr,x.nr)==0)
{ gasit=1;
printf("\nVehiculul cu nr. %s ",x.nr);
if(x.inc==1)
printf("se afla deja in cursa!");
else
{ printf("pleaca acum in cursa? (D/N)");
r=_getch();

72

Prog
gramarea calcullatoarelor

if((r=='D') || (r=='d'
'))
{ x.inc=1;
tell(f)-siz
zeof(CAMION
N),SEEK_SET);
fseek(f,ft
fwrite(&x,
,sizeof(CAM
MION),1,f);
}
}
}
,f);
fread(&x,sizeof(CAMION),1,

}
fclose(f);

lu
cr
u

}
triculare (sau
(
CTRL+Z
Z): ");
printf("\nNr inmat
fflush(stdin);
gets(nr);

}
p
printf("\nG
;
ata, apasa o tasta");
_
_getch();
}

4.3.7. Fie un fiier organizaat secvenial, cu articole de


d urmtoareea structur:
Grup

Nr. discipline

int

char

Nr.. matri- Numee i prenume


An
col
student
int
c
char[30]
char

Note obinutee:
1
2

20
char cchar char
char

S se sccrie program
mul C pentru realizarea unnei liste cu studenilor
s
in
ntegraliti
(nttr-un fiier teext).

n
c

#in
nclude <stdio.h>
#in
nclude <conio.h>

pedef struct { int nrm


mat;
typ
char nu
ume[30];
char an
n;
int gru
upa;
char nr
rd;
char no
ote[20];
} STUDENT
T;
id main()
voi
{ FILE
F
*f,*g;
S
STUDENT
x;
c
char
nume_f[20];
i
int
nr,i,restante;

printf("\nNume fisier: ");


p
g
gets(nume_f
);

73

Aplicaii

lu
cr
u

fopen_s(&f,nume_f,"rb"
f
");
i
if(!f)
% nu poate
e fi deschi
is");
printf("\nFisierul %s
e
else
{ fopen_s(&
&g,"Lista.tx
xt","w");
fprintf(g,"Lista stu
udentilor integralist
i
ti\n\n");
fprintf(g,"\n Nr. %-30s An Gru
upa Note","Nume");
nr=0;
DENT),1,f);
;
fread(&x,sizeof(STUD
while(!feof(f))
{ restante=0;
++)
for(i=0;i<x.nrd;i+
if(x.note[i]<5)
restante=1;
if(!restante)
{ nr++;
d %-30s %2d
d %5d ",nr,x.nume,x.an,x.grupa);
;
fprintf(g,"\n%4d
;i++)
for(i=0;i<x.nrd;
te[i]);
fprintf(g,"%5.2f ",x.not
}
&x,sizeof(ST
TUDENT),1,f
f);
fread(&
}
if(!nr)
ista nici un
u student integralist
t");
printf("\n\nNu exi
else
n fisierul Lista.txt");
printf("\n\nLista se afla in
fclose(g);
fclose(f);
}
p
printf("\nG
;
ata, apasa o tasta");
_
_getch();

n
c

4.3.8. Fie un fiier organizaat secvenial, cu articole de


d urmtoareea structur:
Nr.
N nmatriculare
char[8]

Maarca
charr[20]

An fabricaie
int

Nr. km
long

Valloare
float

S se realizeze proogramul C pentru listareaa ntr-un fiier text a autooturismelor mai vechi dee 10 ani i cuu peste 3000000 km.

#in
nclude <stdio.h>
#in
nclude <conio.h>

pedef struct { char nr


rm[8];
typ
char ma
arca[20];
int anf
f;

74

Programarea calculatoarelor

void main()
{ FILE *f,*g;
VEHICUL x;
int an,ani,nr;
long km;
char nume_f[20];

lu
cr
u

long km;
float val;
} VEHICUL;

printf("\nNume fisier: ");


gets(nume_f);
fopen_s(&f,nume_f,"rb");
if(!f)
printf("\nFisierul %s nu poate fi deschis");
else
{ fopen_s(&g,"Lista.txt","w");
printf("\nAnul curent: ");
scanf("%d",&an);
//anul curent poate fi preluat si automat din data calculatorului
printf("\nLimita nr. kilometri: ");
scanf("%d",&km);
printf("\nVechime minima (ani): ");
scanf("%d",&ani);

n
c

fprintf(g,"Lista vehiculelor mai vechi de %d ani si cu mai mult de


%d kilometri\n\n",ani,km);
fprintf(g,"\n Nr. %-20s An
Km
Valoare","Marca");
nr=0;
fread(&x,sizeof(VEHICUL),1,f);
while(!feof(f))
{ if((an-x.anf>ani) && (x.km>km))
{ nr++;
fprintf(g,"\n%4d %-20s %4d %6d
%10.2f",nr,x.marca,x.anf,x.km,x.val);
}
fread(&x,sizeof(VEHICUL),1,f);
}
if(!nr)
printf("\nNici un vehicul nu indeplineste conditiile date");
else
printf("\nLista se afla in fisierul Lista.txt");
fclose(g);
fclose(f);
}
printf("\nGata, apasa o tasta");
_getch();
}

75

Aplicaii

Temee
1. Pentru toate fiierele organizate secvenial descrise mai suus, scriei
progrrame multifuuncionale caare realizeazz toate opeeraiunile de gestiune
necesarre.

lu
cr
u

4.4. Simu
ularea organizrii relative a fiiereloor binare
p
d gestiune a fiierelor binare
de
b
de datte organiPentru rrezolvarea problemelor
zatee relativ fie sse implemennteaz pas cu pas operaiile de gestiunne de baz (o
ori de cte
ori e nevoie), fie se scriu funcii caree simuleaz operaiile de
d gestiune de baz,
ascunznd gestiiunea indicattorului de staare n interioorul lor. Acesste funcii auu un grad
de generalitate ridicat; nefiiind legate dee structura arrticolelor fiiierelor prelucrate, ele
pot fi utilizate ppentru orice problem
p
de acest tip.
n continuare se prrezint un exxemplu de im
mplementaree a acestor operaiuni
o
n subprogram
me.
prin

n
c

Relative.cpp conine funcciile care im


mplementeaz operaiunille de gesFiierul R
tiun
ne de baz pentru fiierele organizatee relativ. Inddicatorul de stare
s
este adugat autom
mat articoleloor logice, obinnd articollele fizice alee fiierului. Indicatorul
I
de stare se
afl n primul ooctet al artico
olelor fizice.. Deoarece inndicatorul dee stare rmn
ne ascuns
n interiorul
i
funnciilor, proggramul care le utilizeaz trebuie s declare
d
i s utilizeze
doaar structura ccorespunztoare articoluluui logic.
Se pressupune c fiierele cu carre se lucreazz n exemplele urmtoarre au fost
creaate folosind aceste funciii (adic au aceeai
a
structtur fizic a articolelor, cu
c indicatoru
ul de stare nn primul octtet); aceast limitare a grradului de geeneralitate al subprogramelor este uun compromis acceptabil.
#in
nclude <stdio.h>
#in
nclude <malloc.h>
#in
nclude <string.h>

n fisier (n
nr. articol
le fizice)
// numar total spatii in
iunea unui articol lo
ogic
// I - fisierul, dimensi
ice (-1 dac
ca fisierul
l nu e deschis)
// E - nr. articole fizi
t NrSpatii(FILE* f, lo
ong dim)
int
{ long
l
p;
i
int
nr;
n
nr=-1;
i
if(f)
{ p=ftell(f);
;
fseek(f,0,SEEK_END);
;
nr=ftell(f)/(dim+1);
;
fseek(f,p,SEEK_SET);
}

76

Programarea calculatoarelor

return nr;
}

lu
cr
u

// pozitia curenta in fisier


// I - fisierul, dimensiunea unui articol logic
// E - pozitia curenta, in nr. de articole, -1 daca fisierul e inchis
int Pozitia(FILE* f, long dim)
{ int nr;
nr=-1;
if(f)
nr=ftell(f)/(dim+1);
return nr;
}

n
c

// preformare fisier
// I - fisierul, dim. art., nr. art. pentru preformare/extindere
// E - cod eroare: 0 - succes, 1 - fisierul era inchis
int Preformare(FILE* f, long dim, int nr)
{ int i,er;
char *art;
er=1;
if(f)
{ fseek(f,0,SEEK_END);
art=(char*)malloc(dim+1);
art[0]=0;
for(i=0;i<nr;i++)
fwrite(art,dim+1,1,f);
er=0;
free(art);
}
return er;
}

// pozitionare
// I - fisierul, dim. art., pozitia dorita in nr. relativ articol
// E - cod eroare, 0 - succes, 1 - pozitia prea mare, 2 fis. inchis
int Pozitionare(FILE* f, long dim, int p)
{ int er;
er=2;
if(f)
if(p<NrSpatii(f,dim))
{ fseek(f,p*(dim+1),SEEK_SET);
er=0;
}
else
er=1;
return er;
}
// citire in acces secvential, urmatorul articol

77

Aplicaii

lu
cr
u

// I - fisierul, dim. art., adresa la care se depune articolul citit


// E - cod eroare, 0 art. citit, 1 fis. inchis, 2 - sfirsit fisier
int CitesteUrmatorul(FILE* f, long dim, void* adresa)
{ char* art;
int er=1;
if(f)
{ art=(char*)malloc(dim+1);
fread(art,dim+1,1,f);
while((!feof(f)) && (er==1))
{ if(art[0])
{ er=0;
memcpy(adresa,art+1,dim);
}
else
fread(art,dim+1,1,f);
}
if(er==1) er=2;
free(art);
}
return er;
}

n
c

// citire in acces direct


// I - fisierul, dim. art., cheia art., adresa unde se depune articolul
// E - cod eroare, 0 art. citit, 1 fis. inchis sau poz. prea mare,
//
2 - cheie invalida
int CitestePozitia(FILE* f, long dim, int poz, void* adresa)
{ char* art;
int er;
er=Pozitionare(f, dim, poz);
if(!er)
{ art=(char*)malloc(dim+1);
fread(art,dim+1,1,f);
if(art[0]==0)
er=2;
else
{ er=0;
memcpy(adresa, art+1, dim);
}
free(art);
}
return er;
}
// scriere articol in acces direct
// I - fisierul, dim. art., adresa articolului, cheia articolului
// E - cod eroare, 0 - succes, 1 fis. inchis, 2 - cheie invalida
int ScriePozitia(FILE* f, long dim, void* adresa, int poz)
{ char* art;
int n,er=1;

78

Programarea calculatoarelor

lu
cr
u

if(f)
{ n=NrSpatii(f,dim);
if(poz>=n)
Preformare(f,dim,poz-n+1);
art=(char*)malloc(dim+1);
Pozitionare(f,dim,poz);
fread(art,dim+1,1,f);
if(art[0]==1)
er=2;
else
{ er=0;
memcpy(art+1,adresa,dim);
art[0]=1;
Pozitionare(f,dim,poz);
fwrite(art,dim+1,1,f);
}
free(art);
}
return er;
}

// suprascriere articol in vederea modificarii, in acces direct


// I - fisierul, dim. art., adresa articolului, cheia articolului
// E - cod eroare: 0 - succes, 1 fis. inchis, 2 - pozitia e prea mare
int RescriePozitia(FILE* f, long dim, void* adresa, int poz)
{ char* art;
int n,er=1;

n
c

if(f)
{ n=NrSpatii(f,dim);
if(poz>=n)
er=2;
else
{ art=(char*)malloc(dim+1);
Pozitionare(f,dim,poz);
er=0;
memcpy(art+1,adresa,dim);
fwrite(art,dim+1,1,f);
}
free(art);
}
return er;

// sterge articolul cu cheia data


// I - fisierul, dimensiunea unui articol, cheia articolului de sters
// E - cod eroare, 0 - succes, 1 fis. inchis sau pozitie prea mare,
//
2 - cheie invalida (spatiu gol),
int Sterge(FILE*f, long dim, int poz)

79
{ c
char* art;
i
int
er;
e
er=Pozition
are(f,dim,p
poz);
i
if(!er)
{ art=(char*)malloc(di
im+1);
);
fread(art,dim+1,1,f)
if(art[0]==0)
er=2;
else
{ er=0;
art[0]=0;
,poz);
Pozitionare(f,dim,
1,f);
fwrite(art,dim+1,1
}
free(art);
}
r
return
er;
}

lu
cr
u

Aplicaii

4.4.1. Fie un fiier organizaat relativ, cu date despre colaboratoriii unei societi de colecttare a materiialelor refolo
osibile. Fiecaare colaborato
or pred un ssingur tip dee material
refo
olosibil. Dateele se refer la un an callendaristic. Articolele
A
au urmtoarea structur
logic:
Cantitaate predat lunnar
5
6
7
8
9
int int int intt int

Tip
Num
me/denumire
material
m
coolaborator
1
char
c
char
[20]
i
int

2
int

3
int

4
int

10
int

11
int

12
int

n
c

Cheia rellativ a fiierrului este coddul colaboratorului.


S se scrrie programuul C pentru adugarea de noi articole n fiier. Sf
fritul introd
ducerii dateloor de la tastaatur este maarcat standardd.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

pedef struct { char ti


ipm;
typ
char nume[20];
int cant[12];
c
} COLAB
BORATOR;
id main()
voi
{ FILE*
F
f;
C
COLABORATOR
x;
u
unsigned
int codc;
i
int
i,er,n;

80

Prog
gramarea calcullatoarelor

long dim;
l
c
char
nume_f[20];
COLABORATOR
d
dim=sizeof(
R);

n
c

lu
cr
u

printf("\nNume fisier colaborato


p
ori: ");
_f);
g
gets_s(nume
i
if(fopen_s(
"wb+"))
&f,nume_f,"
% nu a put
tut fi deschis", nume_
_f);
printf("\nFisierul %s
e
else
{ printf_s("\nCod cola
aborator no
ou: ");
;
scanf_s("%d",&codc);
while(!feof(stdin))
c,&x);
{ er=CitestePozitia(f,dim,codc
if(er==2)
a
de
eja altui co
olaborator"
");
printf("\nCodul introdus apartine
else
denumire co
olaborator: ");
{ printf("\nNume/d
fflush(stdin);
gets(x.nume);
erial (H/S/
/A/F): ");
printf("Tip mate
ipm);
scanf("%c",&x.ti
if(x.tipm<'a')
+'a'-'A';
x.tipm=x.tipm+
tile se ini
itializeaza cu 0");
printf("Cantitat
+)
for(i=0;i<12;i++
x.cant[i]=0;
dim,&x,codc
c);
ScriePozitia(f,d
}
_s("\n\nCod colaborato
or nou: ");
printf_
scanf_s("%d",&codc
c);
}
fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();

4.4.2. Fie fiierrul descris n


n exerciiul anterior.
a
S se scrie progrramul C penntru afiarea colaboratoruului (colaborratorilor) carre au predat cantiti anuuale maximee dintr-un
material refolosibil (introodus de la taastatur). Se vor preciza cod, nuanuumit tip de m
me//denumire i cantitate tottal.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

81

Aplicaii

void main()
{ FILE* f;
COLABORATOR x;
unsigned int codc;
int er,n;
long dim;
char nume_f[20],mat;
int cod_max[50],nr,max,s,i;
dim=sizeof(COLABORATOR);

lu
cr
u

typedef struct { char tipm;


char nume[20];
int cant[12];
} COLABORATOR;

n
c

printf("\nNume fisier colaboratori: ");


gets_s(nume_f);
if(fopen_s(&f,nume_f,"rb+"))
printf("\nFisierul %s nu a putut fi deschis", nume_f);
else
{ nr=0;
max=0;
printf("Tip material (H/S/A/F): ");
scanf("%c",&mat);
if(mat<'a')
mat=mat+'a'-'A';
er=CitesteUrmatorul(f,dim,&x);
while(!er)
{ if(x.tipm==mat)
{ s=0;
for(i=0;i<12;i++)
s+=x.cant[i];
if(s>max)
{ nr=1;
max=s;
cod_max[0]=Pozitia(f,dim)-1;
}
else
if(s==max)
cod_max[nr++]=Pozitia(f,dim)-1;
}
er=CitesteUrmatorul(f,dim,&x);
}
printf("\nCantitatea maxima anual de <%c> este %d si a fost primita
de la\n");
for(i=0;i<nr;i++)
{ CitestePozitia(f,dim,cod_max[i],&x);
printf("\n%6d %-30s",cod_max[i],x.nume);
}

82

Prog
gramarea calcullatoarelor

fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();
}

Nume clientt
char [30]

lu
cr
u

4.4.3. Fie un fiier organizaat relativ, cu date despre facturile em


mise de o sociietate comerrcial. Articoolele au urmtoarea strucctur logic:
Dataa facturrii
zi
luna
an
char char
int

Nr. produse
intt

Valoare prooduse
1
2

50
flooat float
float

Cheia relativ a fiierului este numrul factuurii.


S se sccrie program
mul C pentru listarea ntr--un fiier text a facturilorr din anul
treccut a cror valoare depete o limit dat. Se voor preciza nuumr factur,, client i
valooare.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

n
c

pedef struct { char nu


ume[30];
typ
char zi
i;
char lu
una;
int an;
;
int nr;
;
int val
l[50];
} FACTURA
A;
id main()
voi
{ FILE*
F
f,*g;
F
FACTURA
x;
l
long
dim;
c
char
nume_f[20];
i
int
codf,val_lim,an,er
r,s,i;
d
dim=sizeof(
FACTURA);

printf("\nNume fisier: ");


p
g
gets(nume_f
);
e
er=fopen_s(
"rb");
&f,nume_f,"
i
if(er)
te deschide
e fisierul %s",nume_f);
printf("\nNu se poat
e
else
{ printf("\nNume fisie
er lista: ");
"

83

Aplicaii

lu
cr
u

fflush(stdin);
gets(nume_f);
&g,nume_f,"w
w");
fopen_s(&
printf("\nAnul cauta
at: ");
scanf("%d",&an);
inima: ");
printf("\nValoare mi
scanf("%d",&val_lim)
);
cturilor cu
u valoarea mai mare de
ecit %d din
n anul
fprintf(g,"Lista fac
\n\n",val_lim,an);
%d\
fprintf(g,"\nNr.fact
t %-30s Val
loare","Num
me / denumire client")
);
er=CitesteUrmatorul(f,dim,&x);
;
while(!er)
{ if(x.an==an)
{ s=0;
for(i=0;i<x.nr;i
i++)
s+=x.val[i];
if(s>=val_lim)
%7d %-30s %6d",Poziti
%
ia(f,dim)-1,x.nume,s);
;
fprintf(g,"\n%
}
ul(f,dim,&x
x);
er=CitesteUrmatoru
}
fclose(f);
fclose(g);
a
in fis
sierul %s",nume_f);
printf("\nLista se afla

}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();
}

4.4.4. Fie un fiier organizaat relativ, cu articole


a
avnnd urmtoareaa structur lo
ogic:

n
c

Denumire
produs
char[30]

U.M.

Pre
P unitar

char[5]

float

1
int

Caantiti vndutte lunar:


2

int

12
int

Codul produsului
p
inndic numruul relativ al articolului
a
n fiier.
S se sccrie program
mul C pentru tergerea prooduselor ale cror codurii se introducc de la tastatuur. Sfritul introducerii datelor de laa tastatur esste marcat staandard.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

pedef struct { char de


enumire[30]
];
typ
char um
m[5];
float pretu;
p

84

Programarea calculatoarelor

void main()
{ FILE* f,*g;
PRODUS x;
long dim;
char nume_f[20],r;
int codp,er;
dim=sizeof(PRODUS);

lu
cr
u

int cant[12];
} PRODUS;

n
c

printf("\nNume fisier: ");


gets(nume_f);
er=fopen_s(&f,nume_f,"rb");
if(er)
printf("\nNu se poate deschide fisierul %s",nume_f);
else
{ printf("\Cod produs: ");
scanf("%d",&codp);
while(!feof(f))
{ er=CitestePozitia(f,dim,codp,&x);
if(er)
printf("\nCodul %d nu crespunde unui produs",codp);
else
{ printf("\nCodul %d corespunde produsului:\n",codp);
printf("\nDenumire: %s, unitate de masura: %s, pret unitar:
%8.2f",x.denumire,x.um,x.pretu);
printf("\nConfirmati stergerea? (D/N): ");
r=_getche();
if(r!='D')
printf("\nStergere abandonata");
else
{ Sterge(f,dim,codp);
printf("\nProdusul cu codul %d a fost sters",codp);
}
}
printf("\nCod produs: ");
scanf("%d",&codp);
}
fclose(f);
}
printf("\nApasa o tasta!");
_getch();
}

4.4.5. Fie un fiier organizat relativ, cu articole avnd urmtoarea structur logic:
Denumire
fond fix

Tip fond fix

Data achiziiei
an
lun
zi

Valoare
inventar

Gestionar

85

Aplicaii

char[30]

char[220]

int

char

chaar

float

char[3
30]

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

lu
cr
u

Numruul de inventaar indic num


mrul relativ al articoluluii n fiier.
S se sccrie program
mul C pentruu afiarea fonndurilor fixee ale cror nuumere de
inventar se introoduc de la taastatur. Sfritul introduccerii datelor eeste marcat standard.
s

pedef struct { char de


enumire[30]
];
typ
char ti
ip[20];
int an;
;
char lu
una;
char zi
i;
float val_inv;
v
char ge
est[30];
} FOND_FI
IX;

id main()
voi
{ FILE*
F
f,*g;
F
FOND_FIX
x;
l
long
dim;
c
char
nume_f[20];
i
int
nri,er;

d
dim=sizeof(
FOND_FIX);

n
c

printf("\nNume fisier: ");


p
);
g
gets(nume_f
e
er=fopen_s(
"rb");
&f,nume_f,"
i
if(er)
printf("\nNu se poat
te deschide
e fisierul %s",nume_f);
e
else
{ printf("\Numar inven
ntar: ");
scanf("%d",&nri);
while(!feof(f))
,&x);
{ er=CitestePozitia(f,dim,nri,
if(er)
l de invent
tar %d nu crespunde unui fond
printf("\Numarul
x",nri);
fix
else
l de invent
tar %d core
espunde fond
dului
{ printf("\Numarul
x:\n",nri);
fix
ire: %s \nT
Tip: %s \ndata achizit
tiei:
printf("\nDenumi
%d.%d.%d",x.denumire,x.t
tip,x.zi,x.
.luna,x.an);
re inventar
r: %8.2f",x
x.val_inv);
printf("\nValoar

86

Prog
gramarea calcullatoarelor

printf("\nGestio
onar: %s",x
x.gest);
}
nventar: ")
);
printf("\nNumar in
scanf("%d",&nri);

}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();
}

lu
cr
u

}
fclose(f);

4.4.6. Fie un fiier organizaat relativ, cu articole


a
de urmtoarea sttructur:
Nume i prenum
me

An de studiu

char [30]

chaar

Grrupa

Nr. discipline

innt

char

Note obiinute
1
2 15
char char
char

Numruul matricol inndic numruul relativ al articolului


a
nn fiier.
Scriei uun program C pentru nsscrierea interractiv n fiier a notelorr obinute
n urma
u
susineerii unor exaamene. Fiecaare materie are
a asociat o anumit poziie
p
n
vecctorul de notee. Sfritul inntroducerii daatelor este marcat
m
standarrd.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

n
c

pedef struct { char nu


ume[30];
typ
char an
n;
int gru
upa;
char nr
rd;
char no
ote[15];
} STUDENT
T;
id main()
voi
{ FILE*
F
f;
S
STUDENT
x;
l
long
dim;
c
char
nume_f[20];
i
int
nrm,er,i,n;

d
dim=sizeof(
STUDENT);

printf("\nNume fisier: ");


p
g
gets(nume_f
);
e
er=fopen_s(
"rb");
&f,nume_f,"
i
if(er)
printf("\nNu se poat
te deschide
e fisierul %s",nume_f);

87

Aplicaii

lu
cr
u

else
e
{ printf("\Numar matri
icol: ");
scanf("%d",&nrm);
while(!feof(f))
,&x);
{ er=CitestePozitia(f,dim,nrm,
if(er)
l matricol %d nu crespunde unui student",n
nrm);
printf("\Numarul
else
l matricol %d corespu
unde student
tului:\n",n
nrm);
{ printf("\Numarul
me);
printf("\nNume: %s ",x.num
d Grupa: ",
,x.an,x.gru
upa);
printf("\nAn: %d
m
(1-%d): ",x.n
nrd);
printf("Indice materie
scanf("%d",&i);
printf("\nNota: ");
scanf("%d",&n);
x.note[i]=n;
f,dim,&x,nr
rm);
RescriePozitia(f
}
atricol: ")
);
printf("\nNumar ma
scanf("%d",&nrm);
}
fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();

n
c

4.4.7. Fie fiierrul descris n


n exerciiul anterior.
a
Scriei un prograam C pentru exmatrim de 5 resttane.
culaarea studeniilor cu mai mult

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

pedef struct { char nu


ume[30];
typ
char an
n;
int gru
upa;
char nr
rd;
char no
ote[15];
} STUDENT
T;
id main()
voi
{ FILE*
F
f;
S
STUDENT
x;
l
long
dim;
c
char
nume_f[20];
i
int
nrm,er,i,n;

88

Prog
gramarea calcullatoarelor

d
dim=sizeof(
STUDENT);

lu
cr
u

printf("\nNume fisier: ");


p
);
g
gets(nume_f
&f,nume_f,"
e
er=fopen_s(
"rb");
i
if(er)
te deschide
e fisierul %s",nume_f);
printf("\nNu se poat
e
else
{ er=CitesteUrmatorul(f,dim,&x);
;
while(!er)
{ n=0;
++)
for(i=0;i<x.nrd;i+
if(x.note[i]<5)
n++;
if(n>5)
zitia(f,dim
m)-1);
Sterge(f,dim,Poz
ul(f,dim,&x
x);
er=CitesteUrmatoru
}
ea s-a inch
heiat");
printf("\nPrelucrare
fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();

n
c

4.4.8. Fie fiierrul descris n


n exerciiul 4.4.6. Scriei un
u program C pentru mo
odificarea
uprins nanuului de studiuu (se va trecee anul 1) penntru studeniii cu numruul matricol cu
tre dou valori date de la tastatur (a, b)). Se presupu
une c exist un student cu
c numrul matricol a.

#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"

pedef struct { char nu


ume[30];
typ
char an
n;
int gru
upa;
char nr
rd;
char no
ote[15];
} STUDENT
T;
voi
id main()
{ FILE*
F
f;
S
STUDENT
x;
l
long
dim;
c
char
nume_f[20];

89

Aplicaii

i
int
nrm,er,a,b;
d
dim=sizeof(
STUDENT);

lu
cr
u

printf("\nNume fisier: ");


p
g
gets(nume_f
);
e
er=fopen_s(
"rb");
&f,nume_f,"
i
if(er)
te deschide
e fisierul %s",nume_f);
printf("\nNu se poat
e
else
{ printf("\nPrimul num
mar matrico
ol: ");
scanf("%d",&a);
,dim,a,&x);
;
er=CitestePozitia(f,
if(er)
% nu corespunde unui student",a
a);
printf("\nNumarul matricol %d
else
itia(f,dim)
)<=b+1))
{ while((!er)&&(Pozi
{ x.an=1;
f,dim,&x,Po
ozitia(f,di
im)-1);
RescriePozitia(f
orul(f,dim,
,&x);
er=CitesteUrmato
}
}
ea s-a inch
heiat");
printf("\nPrelucrare
fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();

n
c

Temee
1. Se observ
v c toate funciile
fu
impllementate mai
m sus pentru
u simularea opperaiunilor de gestiune de baz folo
osesc ca paraametri fiier i
dimensiune aarticol logic. Se poate evvita transmitterea lor expplicit, dac funciile
respectiive au accees direct laa aceste varriabile. Resccriei acestee funcii,
incluznndu-le mpreeun cu cele dou variabbile ntr-o strructur de date unic
(struct)).
2. Pentru ttoate fiierelle relative deescrise mai su
us, scriei prrograme multtifuncionale carre realizeaz toate operaiunile de gesstiune necesaare.

4.5. Simu
ularea organizrii indexate a fiierelor binaree

mtoarea prooblem: n cadrul


c
unei organizaii
o
d nvmnnt trebuie
de
Fie urm
gesstionate urmtoarele datee referitoare la studeni: cod matricool, nume i prenume,
p
gru
upa de studiuu, anul de stuudiu, note obbinute (maxxim 20). Se dorete ca accesul
a
la
datee s se fac prin intermeediul coduluui matricol, care
c
este o seecven alfan
numeric
de 10 caractere acesta va constitui
c
cheeia indexat. Se cere s see scrie progrrame care

90

Prog
gramarea calcullatoarelor

s realizeze
r
urm
mtoarele op
peraiuni de gestiune:
g
poppularea iniiaal a fiierullui, adugarrea de noi stuudeni, vizuaalizarea datellor despre unn student, vizzualizarea daatelor despree studenii uunei grupe, nscrierea

unnei note penttru un studeent, nscrierea notelor


penntru o grup de studeni, eliminarea unui studennt (exmatricuulare, absolvvire etc.).
Pen
ntru toate opeeraiile datelle se preiau de
d la tastatur i se asigurr repetarea prelucrrii pn
p la apsaarea combinaaiei de taste CTRL-Z.

lu
cr
u

Pentru a simplifica gestiunea fiierelor organnizate indexaat se pot realliza funcii care
c
implem
menteaz operraiile de gesstiune de bazz. Acestea vor
v fi utilizaate pentru
imp
plementarea operaiilor enunate
e
maii sus. n exeemplul urmtor este prezzentat o
modalitate de im
mplementaree a acestor opperaii.

Fiierul Tipuri.h connine declaraiile tipurilorr de date utiilizate att peentru immentarea operaiilor de baz
b
ct i pentru rezolvarrea problemeelor enunatee.
plem
//t
tipul fisier
#de
efine TFISIER FILE*
tipul cheii
//t
typ
pedef char TCHEIE[11];
;

//t
tipul articol din tabe
ela index
typ
pedef struct{ char is;
;
TCHEIE cheie;
c
long nr_
_rel;
} TART_IND
DEX;

n
c

tipul articol din fisi


ierul de da
ate
//t
typ
pedef struct{ TCHEIE cheie;
c
char num
me[35];
int grup
pa;
int an;
e[20];
int note
} TARTICOL
L;

Fiierul IIndexat.cpp conine funccii care impllementeaz operaiile


o
dee gestiune
b
pentru fiierul orgaanizat indexaat i variabilee asociate unnui fiier orgaanizat inde baz
dexxat: fiierul dde date, tabeela index, unn articol, num
mele extern al
a fiierului organizat
o
indexat (fr exxtensie) din
n acesta se obin
o
numelee celor dou fiiere fizicee (de date
i in
ndex) prin addugarea exttensiilor resppective.
#in
nclude <stdio.h>
#in
nclude <string.h>
#in
nclude "tipuri.cpp"

91

Aplicaii

TARTICOL x;
char nume[20],numed[20],numei[20];
TFISIER f;
TFISIER ind;

lu
cr
u

// Extindere nume prin adaugarea extensiilor


void Extinde()
{ strcpy(numei,nume);
strcat(numei,".idx");
strcpy(numed,nume);
strcat(numed,".dat");
}

// Sortarea tabelei index si eliminarea inregistrarilor sterse


// I // E void Sort()
{ TART_INDEX a,b;
TFISIER ind1;
long i,j;

//copierea tabelei index intr-un fisier temporar (numai art. valide)


ind1=fopen("temp.idx","wb+");
rewind(ind);
fread(&a,sizeof(a),1,ind);
while(!feof(ind))
{ if(a.is) fwrite(&a,sizeof(a),1,ind1);
fread(&a,sizeof(a),1,ind);
}
fclose(ind);

n
c

//sortarea fisierului temporar


fseek(ind1,0,SEEK_END);
long n=ftell(ind1)/sizeof(a);
for(i=0;i<n-1;i++)
{ fseek(ind1,i*sizeof(a),SEEK_SET);
fread(&a,sizeof(a),1,ind1);
for(j=i+1;j<n;j++)
{ fseek(ind1,j*sizeof(a),SEEK_SET);
fread(&b,sizeof(a),1,ind1);
if(strcmp(a.cheie,b.cheie)>0)
{ fseek(ind1,i*sizeof(a),SEEK_SET);
fwrite(&b,sizeof(a),1,ind1);
fseek(ind1,j*sizeof(a),SEEK_SET);
fwrite(&a,sizeof(a),1,ind1);
}
}
}
fclose(ind1);

92

Programarea calculatoarelor

//inlocuirea tabelei index cu fisierul sortat


remove(numei);
rename("temp.idx",numei);
ind=fopen(numei,"rb+");
}

n
c

lu
cr
u

/* Cautarea articolului cu cheia Key si plasarea pointerului de fisier


in tabela de indexuri pe articolul respectiv*/
// I - cheia cautata
// E - cod succes: 1 - a fost gasit articolul; 0 - nu a fost gasit articolul
int SeekKey(char *Key)
{ long ls=0, ld, m, n;
TART_INDEX a;
int gasit=0;
fseek(ind,0,SEEK_END);
n=ftell(ind)/sizeof(TART_INDEX);
ld=n-1;
while((ls<=ld)&&(!gasit))
{ m=(ls+ld)/2;
fseek(ind,m*sizeof(a),SEEK_SET);
fread(&a,sizeof(a),1,ind);
if(strcmp(a.cheie,Key)==0)
gasit=1;
else
if(strcmp(a.cheie,Key)>0)
ld=m-1;
else
ls=m+1;
}
if(gasit)
fseek(ind,m*sizeof(a),SEEK_SET);
return gasit;
}
// Crearea unui fisier indexat nou
// I // E void New_index()
{ f=fopen(numed,"wb+");
ind=fopen(numei,"wb+");
}
// Deschiderea unui fisier indexat existent
// I // E void Open_index()
{ f=fopen(numed,"rb+");
ind=fopen(numei,"rb+");
}

93

Aplicaii

lu
cr
u

// Inchiderea tabelei index


// I // E void Close_index()
{ fclose(ind);
fclose(f);
}

// Citirea urmatorului articol in acces secvential


// I - adresa unde se depune articolul citit
// E - cod de succes: 1 - a fost citit; 0 - nu a fost gasit nici un articol
int ReadSec(TARTICOL *a)
{ TART_INDEX a1;
int r;
fread(&a1,sizeof(a1),1,ind);
if(feof(ind))
r=0;
else
{ fseek(f,a1.nr_rel*sizeof(*a),SEEK_SET);
fread(a,sizeof(*a),1,f);
r=1;
}
return r;
}

n
c

// Citirea articolului cu o cheie data, in acces direct


// I - adresa unde se depune articolul citit, cheia articolului cautat
// E - cod de succes: 1 - a fost citit; 0 - nu a fost gasit nici un articol
int ReadKey(TARTICOL *a,char *Key)
{ TART_INDEX a1;
int r;
if(SeekKey(Key))
{ fread(&a1,sizeof(a1),1,ind);
fseek(f,a1.nr_rel*sizeof(*a),SEEK_SET);
fread(a,sizeof(*a),1,f);
r=1;
}
else
r=0;
return r;
}
// Scrierea unui articol in acces secvential
// I - articolul care trebuie scris
// E - cod de succes: 1 - a fost scris; 0 - nu a fost scris articolul
int WriteSec(TARTICOL a)
{ TART_INDEX a1, ai;

94

Programarea calculatoarelor

long n, n1;
int r,r1;
r=0;
fseek(ind,0,SEEK_END);
n=ftell(ind)/sizeof(a1);

lu
cr
u

if(n>0)
{ fseek(ind,(n-1)*sizeof(a1),SEEK_SET);
fread(&a1,sizeof(a1),1,ind);
if(strcmp(a1.cheie,a.cheie)>=0) r1=0;
else r1=1;
}
if((n==0)||(r1==1))
{ ai.is=1;
strcpy(ai.cheie,a.cheie);
fseek(f,0,SEEK_END);
n1=ftell(f)/sizeof(a);
ai.nr_rel=n1;
fseek(ind,0,SEEK_END);
fwrite(&ai,sizeof(ai),1,ind);
fwrite(&a,sizeof(a),1,f);
r=1;
}
return r;

n
c

//scrierea unui articol in acces direct


// I - fisierul de date, articolul care trebuie scris (contine cheia)
// E - cod de succes: 1 - a fost scris; 0 - nu a fost scris articolul
int WriteKey(TARTICOL a)
{ char Key[7];
TART_INDEX a1;
long n;
int r;
strcpy(Key,a.cheie);
if(SeekKey(Key))
r=0;
else
{ a1.is=1;
strcpy(a1.cheie,a.cheie);
fseek(f,0,SEEK_END);
n=ftell(f)/sizeof(a);
a1.nr_rel=n;
fwrite(&a,sizeof(a),1,f);
fseek(ind,0,SEEK_END);
fwrite(&a1,sizeof(a1),1,ind);
Sort();
r=1;
}
return r;

95

Aplicaii

lu
cr
u

// Stergerea urmatorului articol, in acces secvential


// I // E - cod de succes: 1 - a fost sters; 0 - nu a fost sters articolul
int DeleteSec()
{ TART_INDEX a1;
int r;
long pos=ftell(ind);
fread(&a1,sizeof(a1),1,ind);
if(feof(ind))
r=0;
else
{ fseek(ind,pos,SEEK_SET);
a1.is=0;
fwrite(&a1,sizeof(a1),1,ind);
Sort();
r=1;
}
return r;
}

n
c

// Stergerea articolului cu o anumita cheie, in acces direct


// I - cheia articolului care trebuie sters
// E - cod de succes: 1 - a fost scris; 0 - nu a fost scris articolul
int DeleteKey(char *Key)
{ int r;
if(SeekKey(Key))
r=DeleteSec();
else
r=0;
return r;
}
// Suprascrierea ultimului articol citit, cu scopul modificarii
// I - articolului care trebuie suprascris
// E - cod de succes: 1 - suprascrierea a reusit, 0 - suprascrierea a
esuat
// esec daca ultima cheie citita difera de a noului articol
int RewriteKey(TARTICOL a)
{ int r;
long p;
TART_INDEX ai;
r=0;
p=ftell(ind)/sizeof(TART_INDEX);
if(p>0)
{ fseek(ind,(p-1)*sizeof(TART_INDEX),0);
fread(&ai,sizeof(TART_INDEX),1,ind);
if(strcmp(ai.cheie,a.cheie)==0) r=1;
}

96

Prog
gramarea calcullatoarelor

if(r)
i
{ fseek(f,ai.nr_rel*si
izeof(TARTI
ICOL),0);
RTICOL),1,f
f);
fwrite(&a,sizeof(TAR
}
r
return
r;
}

id main()
voi
{ int
i
i,n;

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>

lu
cr
u

4.5.1. Popularrea iniial a fiierului se realizeaz prin


p adugareea repetat dee nregistrrri, dup crearrea unui fiieer nou. La addugarea de noi
n studeni singura diferren fa
de popularea
p
inniial este c lucreaz cuu un fiier ex
xistent. Ca urrmare, cele dou
d
problem
me de preluccrare pot fi reezolvate cu aacelai progrram: dac fiierul de datee nu exist, va
v fi nti creeat. n mod normal,
n
la poopularea iniial a fiieruului datele see introduc
n ordinea
o
crescctoare a cheeilor, deci see folosete operaia de addugare n acces
a
secvennial. La aduugarea ulterioar de articcole se foloseete operaia de adugaree n acces
direect.
n contiinuare snt prrezentate am
mbele variantee de adugarre.

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);

n
c

Extinde();
E
O
Open_index(
);
i
if(f==NULL)
{ printf("\nFisierul va
v fi creat
t");
New_index();
}

// 4.5.1.a. POPULARE / ADAUGARE


A
in
n acces dir
rect
printf("\nA
p
Adaugarea in
n acces dir
rect dupa cheie\n");
p
printf("\nC
od matricol
l: ");
f
fflush(stdi
n);
e);
g
gets(x.chei
w
while(!feof
(stdin))
{ printf("Nume si pren
nume: ");
fflush(stdin);
gets(x.nume);
printf("Grupa: ");
);
scanf("%d",&x.grupa)

97

Aplicaii

}
C
Close_index
();
printf("\nA
p
Apasa o tast
ta");
g
getch();

lu
cr
u

printf("A
An: ");
scanf("%d",&x.an);
for(i=0;i<20;i++)
x.note[i]=0;
: ");
printf("Numar note (maxim 20):
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("Nota %2d: ",i);
e[i]);
scanf("%d",&x.note
}
if(WriteKey(x))
ul a fost adaugat\n")
a
;
printf("\nArticolu
e invalida\
\n");
else printf("\nCheie
getch();
col: ");
printf("\nCod matric
fflush(stdin);
gets(x.cheie);

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>

n
c

id main()
voi
{ int
i
i,n;

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);
Extinde();
E
O
Open_index(
);
i
if(f==NULL)
{ printf("\nFisierul va
v fi creat
t");
New_index();
}

A
in
n acces secvential
// 4.5.1.b. POPULARE / ADAUGARE
printf("\nA
p
Adaugarea in
n acces dir
rect dupa cheie\n");
p
printf("\nC
od matricol
l: ");
f
fflush(stdi
n);

98

Prog
gramarea calcullatoarelor

lu
cr
u

gets(x.cheie);
g
(stdin))
w
while(!feof
{ printf("Nume si pren
nume: ");
fflush(stdin);
gets(x.nume);
printf("Grupa: ");
);
scanf("%d",&x.grupa)
An: ");
printf("A
scanf("%d",&x.an);
for(i=0;i<20;i++)
x.note[i]=0;
: ");
printf("Numar note (maxim 20):
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("Nota %2d: ",i);
e[i]);
scanf("%d",&x.note
}
if(WriteSec(x))
ul a fost adaugat\n")
a
;
printf("\nArticolu
e invalida\
\n");
else printf("\nCheie
getch();
col: ");
printf("\nCod matric
fflush(stdin);
gets(x.cheie);
}
C
Close_index
();
printf("\nA
p
Apasa o tast
ta");
g
getch();
}

Vizualiizarea tuturorr datelor din fiier: se va genera o listt ntr-un fiiier text.

n
c

4.5.2.

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>
id main()
voi
{ int
i
i,n;

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);
Extinde();
E
O
Open_index(
);
i
if(f==NULL)
{ printf("\nFisierul poate
p
fi de
eschis");

99

Aplicaii

return;
}

printf("\nA
p
Apasa o tast
ta");
g
getch();
}

lu
cr
u

TFISIER g;
T
g
g=fopen("Cu
rsanti.txt"
","w");
r
rewind(ind)
;
\n%20c List
f
fprintf(g,"
ta cursanti
ilor inregi
istrati\n\n",' ');
f
fprintf(g,"
\n%-10s %-3
35s Grupa An
A Note\n","Cod matr.","Nume si prenume"
");
R
ReadSec(&x)
;
w
while(!feof
(ind))
{ fprintf(g,"\n%10s %3
35s %5d %2d
d ",x.cheie
e, x.nume, x.grupa,
x
x.
.an);
for(i=0;(i<20)&&(x.n
note[i]);i+
++)
x.note[i]);
;
fprintf(g,"%2d ",x
ReadSec(&
&x);
}
f
fclose(g);
p
printf("\nL
ntilor se afla
a
in fisierul Cursa
anti.txt");
;
ista cursan
C
Close_index
();

4.5.3. Vizualiizarea datelor despre un student: studdentul este iddentificat pe baza codului matricol introdus de laa tastatur.

n
c

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>
id main()
voi
{ int
i
i,n;

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);
Extinde();
E
);
O
Open_index(
i
if(f==NULL)
{ printf("\nFisierul poate
p
fi de
eschis");
return;
}
TCHEIE c;
T
p
printf("\nC
od matricol
l: ");

100

Prog
gramarea calcullatoarelor

printf("\nA
p
Apasa o tast
ta");
g
getch();
}

lu
cr
u

gets(c);
g
w
while(!feof
(stdin))
{ if(SeekKey(c))
{ ReadSec(&x);
t studentul
l:\n");
printf("\nAm gasit
: %-35
5s",x.nume);
printf("\nNume
ricol: %-10
0s",x.cheie
e);
printf("\nCod matr
rupa : %2d / %4d",x.an,x.grupa);
printf("\nAn si gr
: ");
printf("\nNote
x.note[i]);
;i++)
for(i=0;(i<20)&&(x
printf("%2d ",x.note[i]);
printf("\n");
}
else
registrat un
u cursant cu acest co
od matricol
l.\n");
printf("\nNu e inr
ricol: ");
printf("\n\nCod matr
gets(c);
}
C
Close_index
();

4.5.4. Vizualiizarea dateloor despre studdenii unei grupe:


g
de la tastatur se va introducce numrul ggrupei iar lista cu datele studenilor vaa fi generat ntr-un fiierr text.

n
c

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>
id main()
voi
{ int
i
i,n;

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);
Extinde();
E
);
O
Open_index(
i
if(f==NULL)
{ printf("\nFisierul poate
p
fi de
eschis");
return;
}
TFISIER g;
T
i
int
gr;

101
1

Aplicaii

lu
cr
u

char num[20];
c
rupa: ");
p
printf("\nG
s
scanf("%d",
&gr);
w
while(!feof
(stdin))
{ sprintf(num,"%d.txt"
",gr);
g=fopen(num,"w");
rewind(ind);
ista cursan
ntilor inre
egistrati pe
entru grupa
a
fprintf(g,"\n%20c Li
\n\n",' ',gr);
%d\
fprintf(g,"\n%-10s %-35s
%
An No
ote\n","Cod matr.","Nume si pren
nume");
&x);
ReadSec(&
while(!feof(ind))
{ if(x.grupa==gr)
0s %35s %2d
d ",x.cheie
e, x.nume, x.an);
x
{ fprintf(g,"\n%10
for(i=0;(i<20)&&
&(x.note[i]
]);i++)
d ",x.note[
[i]);
fprintf(g,"%2d
}
ReadSec(&x);
}
fclose(g);
santilor gr
rupei %d se
e afla in fisierul
printf("\nLista curs
",gr,num);
%s"
printf("\nGrupa: ");
;
scanf("%d",&gr);
}
C
Close_index
();
printf("\nA
p
Apasa o tast
ta");
g
getch();
}

n
c

4.5.5. nscrierrea unei notee pentru un student: stuudentul este identificat


i
prin interota va fi aduugat la sfritul vectorullui de note, dac
d
nu smeddiul codului matricol. No
a deepit lungim
mea maxim..

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>
voi
id main()
{ int
i
i,n;

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);
E
Extinde();

102

Prog
gramarea calcullatoarelor

Open_index();
O
i
if(f==NULL)
{ printf("\nFisierul poate
p
fi de
eschis");
return;
}

n
c

lu
cr
u

TCHEIE c;
T
i
int
nr;
p
printf("\nC
od matricol
l: ");
g
gets(c);
w
while(!feof
(stdin))
{ if(SeekKey(c))
{ ReadSec(&x);
t studentul
l:\n");
printf("\nAm gasit
printf("\nNume
: %-35
5s",x.nume);
rupa : %2d / %4d",x.an,x.grupa);
printf("\nAn si gr
: ");
printf("\nNote
x.note[i]);
;i++)
for(i=0;(i<20)&&(x
printf("%2d ",x.note[i]);
if(i<20)
n
");
{ printf("\nNoua nota:
ote[i]);
scanf("%d",&x.no
RewriteKey(x);
daugat nota
a");
printf("\nS-a ad
}
else
ntul are de
eja destule
e note");
printf("\nStuden
printf("\n");
}
else
registrat un
u cursant cu acest co
od matricol
l.\n");
printf("\nNu e inr
ricol: ");
printf("\n\nCod matr
gets(c);
}
C
Close_index
();
printf("\nA
p
Apasa o tast
ta");
g
getch();

4.5.6. nscrierrea notelor pentru


p
o grupp de studeni: de la tastaatur se intro
oduce numrrul grupei, appoi, pentru fiecare
f
student se afieazz numele i se cere notaa. Dac n
vecctorul de notee nu mai estte loc pentru nc una, see va afia unn mesaj coresspunztor
i se va trece la urmtorul sttudent.

#in
nclude "indexat.cpp"
#in
nclude <conio.h>

103

Aplicaii

#include <stdlib.h>
void main()
{ int i,n;

lu
cr
u

printf("\nNumele fisierului indexat:");


fflush(stdin);
gets(nume);
Extinde();
Open_index();
if(f==NULL)
{ printf("\nFisierul poate fi deschis");
return;
}

n
c

int gr;
printf("\nGrupa: ");
scanf("%d",&gr);
while(!feof(stdin))
{ rewind(ind);
ReadSec(&x);
while(!feof(ind))
{ if(x.grupa==gr)
{ printf("\nAm gasit studentul:\n");
printf("\nNume
: %-35s",x.nume);
printf("\nAn si grupa : %2d / %4d",x.an,x.grupa);
printf("\nNote
: ");
for(i=0;(i<20)&&(x.note[i]);i++)
printf("%2d ",x.note[i]);
if(i<20)
{ printf("\nNoua nota: ");
scanf("%d",&x.note[i]);
RewriteKey(x);
printf("\nS-a adaugat nota");
}
else
printf("\nStudentul are deja destule note, se trece la
urmatorul");
printf("\n");
}
ReadSec(&x);
}
printf("\nGrupa: ");
scanf("%d",&gr);
}
Close_index();
printf("\nApasa o tasta");
getch();

104

Prog
gramarea calcullatoarelor

#in
nclude "indexat.cpp"
#in
nclude <conio.h>
#in
nclude <stdlib.h>
id main()
voi
{ int
i
i,n;

lu
cr
u

4.5.7. Eliminaarea unui stuudent (exmattriculare, abssolvire etc.): studentul esste identificaat prin codull matricol. Pe
P ecran se va
v afia numele su i see va cere connfirmarea
expplicit a eliminrii.

printf("\nNumele fisie
p
erului inde
exat:");
f
fflush(stdi
n);
g
gets(nume);

Extinde();
E
);
O
Open_index(
i
if(f==NULL)
{ printf("\nFisierul poate
p
fi de
eschis");
return;
}

n
c

TCHEIE c;
T
i
int
nr;
c
char
r;
p
printf("\nC
od matricol
l: ");
g
gets(c);
w
while(!feof
(stdin))
{ if(SeekKey(c))
{ ReadSec(&x);
t studentul
l:\n");
printf("\nAm gasit
: %-35
5s",x.nume);
printf("\nNume
rupa : %2d / %4d",x.an,x.grupa);
printf("\nAn si gr
: ");
printf("\nNote
x.note[i]);
;i++)
for(i=0;(i<20)&&(x
printf("%2d ",x.note[i]);
ati sterger
rea? (D / N):
N
");
printf("\nConfirma
r=getch();
if((r=='D')||(r=='d'))
{ DeleteKey(c);
ntul a fost
t eliminat");
printf("\nCursan
}
else
re, cursant
tul ramine inregistrat
t");
printf("\nAnular
printf("\n");

105
5

Aplicaii

}
else
registrat un
u cursant cu acest co
od matricol
l.\n");
printf("\nNu e inr
ricol: ");
printf("\n\nCod matr
gets(c);

printf("\nA
p
Apasa o tast
ta");
g
getch();
}

3.
4.

n
c

5.

Temee
1. Scriei prrogramul carre realizeaz operaiunea de transferaare a unui
studeent de la o gruup la alta, nn contextul de
d mai sus.
Scriei programul care realizeazz operaiuneea de transfeerare a tuturoor studenilor dinntr-o grup ctre
c
o alt grrup.
Enunai o problem
m de gestiunne a datelor care s se preteze
p
la org
ganizarea
indexatt a acestora..
Scriei un program
m multifunciional care s realizeze toate
t
operaiunile de
gestiune pentru probblema enunaat anterior.
Proiectaai o modalittate mai bunn (mai geneeral) de impplementare a operaiilor de ggestiune de baz,
b
eliminnd restriciile incluse n exemplul dee mai sus.
Sugestiie: folosii modelul
m
de simulare a orgganizrii relaative din sub
bcapitolul
anteriorr i tema 1 diin acelai subbcapitol.

2.

lu
cr
u

}
C
Close_index
();

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