Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
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
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
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;
n
c
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>
lu
cr
u
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
atorului ri
ind din fisierul text
//preluarea urma
f);
fgets(rind,MAX,f
}
fclose(g);
}
fclose(f);
}
_
_getch();
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
n
c
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.
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>
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();
}
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
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.
n
c
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
n
c
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
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.
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
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>
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]
68
Prog
gramarea calcullatoarelor
#in
nclude <stdio.h>
#in
nclude <conio.h>
lu
cr
u
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
#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;
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();
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
71
Aplicaii
#include <stdio.h>
#include <conio.h>
#include <string.h>
lu
cr
u
void main()
{ FILE *f;
CAMION x;
char r;
char nr[8];
char nume_f[20];
int gasit;
n
c
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();
}
Nr. discipline
int
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>
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
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>
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;
n
c
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
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
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
n
c
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;
}
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;
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
#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"
80
Prog
gramarea calcullatoarelor
long dim;
l
c
char
nume_f[20];
COLABORATOR
d
dim=sizeof(
R);
n
c
lu
cr
u
#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
n
c
82
Prog
gramarea calcullatoarelor
fclose(f);
}
p
printf("\nA
Apasa o tast
ta!");
_
_getch();
}
Nume clientt
char [30]
lu
cr
u
Nr. produse
intt
Valoare prooduse
1
2
50
flooat float
float
#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"
n
c
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();
}
n
c
Denumire
produs
char[30]
U.M.
Pre
P unitar
char[5]
float
1
int
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"
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
4.4.5. Fie un fiier organizat relativ, cu articole avnd urmtoarea structur logic:
Denumire
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
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
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);
An de studiu
char [30]
chaar
Grrupa
Nr. discipline
innt
char
Note obiinute
1
2 15
char char
char
#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"
n
c
d
dim=sizeof(
STUDENT);
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
#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"
88
Prog
gramarea calcullatoarelor
d
dim=sizeof(
STUDENT);
lu
cr
u
n
c
#in
nclude <stdio.h>
#in
nclude <conio.h>
#in
nclude "Relative.cpp"
89
Aplicaii
i
int
nrm,er,a,b;
d
dim=sizeof(
STUDENT);
lu
cr
u
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
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
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
91
Aplicaii
TARTICOL x;
char nume[20],numed[20],numei[20];
TFISIER f;
TFISIER ind;
lu
cr
u
n
c
92
Programarea calculatoarelor
n
c
lu
cr
u
93
Aplicaii
lu
cr
u
n
c
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
95
Aplicaii
lu
cr
u
n
c
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
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();
}
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
();
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
#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();
#in
nclude "indexat.cpp"
#in
nclude <conio.h>
103
Aplicaii
#include <stdlib.h>
void main()
{ int i,n;
lu
cr
u
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
();