Sunteți pe pagina 1din 10

Seminar 6 Fisiere organizate relativ

1. S se scrie programul care creeaz un fiier organizat relativ cu date despre realizarea produselor
pe luni in cadrul unei societati comerciale. Informatiile retinute despre produse sunt: denumirea,
pret, cantitate (maxim 12). Cheia relativ a fiierului este codul produsului. Datele se preiau de la
tastatur, sfritul introducerii fiind marcat standard.

Exemplu de rulare:

Dupa rulare, conform exemplului, langa fisierul sursa trebuie sa apara fisierul binar FisBinRel.dat.

1
Cazul in care doua produse sunt introduse cu acelasi cod Mesaj de atentionare !

Indicatii:

-biblioteci
-definire structura
-functie pentru calcul numar de articole din fisier: int nrart(FILE *f, int l) {...}
- in functia main
{
- declarare variabile
- deschidere fisier (cu wb+, preformare)
- se citeste un cod de produs de la tastatura ( indica pozitia relativa in fisier)
- cat timp nu este sfarsit de introducere date de la tastatura (stdin)
{ - preformare fisier cu un numar de articole ce pot fi scrise in raport cu codul introdus de la tastatura.
Indicele de stare IS=0 pentru toate.
-pozitionare in fisier pe articolul aflat pe pozitia egala cu codul introdus de la tastatura ( cu fseek());
-se citeste un articol (cu fread());
-daca IS=1 pentru pozitia respectiva, atunci acticolul nu poate fi scris. Se poate scrie doar daca IS=0.
-daca IS=0:
{ - pozitionare in fisier pe articolul de la pozitia egala cu codul introdus;
-se citesc campurile produsului, campul p.is se va face 1;
-se scrie variabila p in fisierul f
}
- se citeste un nou cod de la tastatura
}
- se inchide fisierul
}

2
2. S se scrie programul care listeaz, ntr-un fiier text, produsele cu cea mai mare valoare pe an.

Exemplu de rulare:
- se introduce numele fisierului relativ (fisierul binar creat la problema Pb. 1 se va afla in directorul in
care se afla sursa problemei
- se introduce numele fisierului text in care se vor lista rezultatele. Acest fisier text va aparea in
directorul fisierului sursa.

Rulare

Fisierul text rezultat

Indicatii

-biblioteci: stdio.h
-definire structura vezi Pb 1
- in functia main
{ - declarare variabile: f, g de tip fisier; char nume[20]; PRODUS p; max, val de tip real; i, cod de tip intreg;
-preluare nume de fisier de la tastatura ( gets(nume);)
-daca (!(f=fopen(nume,"rb"))) measj ("\nFisierul %s nu poate fi deschis",nume);
altfel
{ -preia numele fisierului text de la tastatura ( gets(nume); )
-deschide fisier text pentru scriere ( g=fopen(nume,"w"); )

max=0;
cod=0;

-// se afiseaza in fisierul text g mesajul Produsele sunt: ( fprintf(g,"\n Produsele sunt:"); )
-se citeste un articol din fisierul binar f (fread(&p,sizeof(PRODUS), 1, f); )
-atat timp cat (!feof(f))
{
daca (p.is)

3
{
val=0;
for(i=0;i<12;i++) val+=p.cant[i]*p.pret;
daca (val>max)
{
fclose(g);
g=fopen(nume,"w");
max=val;
fprintf(g,"\n Produsele cu valoarea %5.2f sunt:", max);
}
if(val = = max)
fprintf(g,"\n%4d %-30s",cod, p.denumire);
}
cod++;
fread(&p,sizeof(PRODUS), 1, f);
}
-inchide fisierul g
-inchide fisierul f
}
}

3. S se scrie programul pentru stergerea produselor care au inregistrat productie zero n cel puin trei
luni.

Exemplu de rulare

Fisier FisBinRel_3.dat creat utilizand Pb.1 caz in care sunt 3 luni cu productie 3 (produsul TV)

4
Fisierul FisBinRel_3.dat va fi utilizat ca input pentru problem curenta (3).
Tema se se scrie un program care sa listeze intr-un fisier text continutul fisierului FisBinRel_3.dat dupa
stergerea produsului TV care indeplineste conditia de a avea 0 pentru cel putin 3 luni.

Indicatii

-biblioteci: stdio.h
-definire structura vezi Pb 1
- in functia main
{
- declarare variabile: f de tip fisier; char nume[20]; p de tip PRODUS; intregi i, e, n;
- preluare nume fisier de la tastatura: printf("\nFisier: "); gets(nume);
- daca (!(f=fopen(nume,"rb+"))) mesaj ("\nFisierul %s nu poate fi deschis",nume);
altfel
{
n=0;
fread(&p,sizeof(PRODUS), 1, f);
atat timp cat (!feof(f))
{
if(p.is)
{
e=0;
for(i=0;i<12 && e<3;i++) if(p.cant[i]==0) e++;
if(e>=3)
{
printf("\n%-30s",p.denumire);
fseek(f,ftell(f)-sizeof(PRODUS),SEEK_SET);
p.is=0; fwrite(&p,sizeof(PRODUS), 1, f);
fseek(f,0,1);
n++;
}
}
fread(&p,sizeof(PRODUS), 1, f);
}
fclose(f);
mesaj ("\nAu fost sterse %d produse",n);
}
}

TEMA
5
1. Fie un fiier organizat relativ, cu date despre facturile emise de o societate
comercial. Articolele au urmtoarea structur logic:

Nume client Data facturrii Nr. produse Valoare produse

zi luna an 1 2 50
char [30] int floa floa floa
char char int
t t t

Cheia relativ a fiierului este numrul facturii.

S se scrie programul C pentru listarea ntr-un fiier text a facturilor din anul trecut a cror valoare
depete o limit dat. Se vor preciza numr factur, clienti valoare.

2. Fie un fiier organizat relativ, cu articole avnd urmtoarea structur logic:

Denumire Data achiziiei Valoare


Tip fond fix Gestionar
fond fix an lun zi inventar

cha
char[30] char[20] int char float char[30]
r

Numrul de inventar indic numrul relativ al articolului n fiier.

S se scrie programul C pentru afiarea fondurilor fixe ale cror numere de inventar se introduc de la
tastatur. Sfritul introducerii datelor este marcat standard.

3. Fie un fiier organizat relativ, cu articole de urmtoarea structur:

An de Note obinute
Nume i prenume Grupa Nr. discipline
studiu

1 2 15
char [30] char int char cha cha cha
r r r

Numrul matricol indic numrul relativ al articolului n fiier.

Scriei un program C pentru nscrierea interactiv n fiier a notelor obinute n urma susinerii unor
examene. Fiecare materie are asociat o anumit poziie n vectorul de note. Sfritul introducerii datelor este
marcat standard.

6
4.Fie fisierul descris in problema 3 (din sectiunea TEMA). Scrieti programul C pentru exmatricularea
studentilor cu mai mult de 5 restante.

5.Fie fisierul descris la problema 3(din sectiunea TEMA). Scrieti programul C pentru modificarea anului de
studiu (se va trece in anul 1) pentru studentii cu numarul matricol cuprins intre doua valori date de la tastatura
(a,b). Se pesupune ca exista un student cu numarul matricol a.

6. Pentru toate fisierele relative create in cadrul acestui seminar scrieti programe multifunctionale care
realizeaza toate operatiunile de gestiune necesare (adaugare, modificare, stergere, listare, etc.)

7. S se scrie programul care modific o cantitate pentru produsele ale cror coduri se introduc de la
tastatur. De la tastatur se va introduce luna (1-12) pentru care se modifica cantitatea (Structura este cea de
la pb 1 din suportul de seminar) .

8. S se scrie programul care listeaz ntr-un fiier text produsele realizate de societatea comercial,
ordonate cresctor dup denumire (Structura este cea de la pb 1 din suportul de seminar).

9. S se scrie programul care listeaz ntr-un fiier text produsele care inregistrat o producie
cresctoare pe intreaga perioada analizata (Structura este cea de la pb 1 din suportul de seminar).

7
ANEXA 1
Functii pentru:
o calcul numar total de spatii in fisier (nr. articole fizice)
o pozitia curenta din fisier
o preformare fisier
o pozitionare in fisier
o citire in acces secvential, urmatorul articol
o citire in acces direct
o scriere articol in acces direct
o suprascriere articol in vederea modiciarii, in acces direct
o stergere articol cu cheie data

Obs:
void *memcpy(void *str1, const void *str2, size_t n)

unde:
str1 sursa
str2 destinatie

n numar de octeti copiat


#include<stdio.h> int Pozitia(FILE* f, long dim)
#include<malloc.h> { int nr;
#include<string.h> nr=-1;
if(f)
// numar total spatii in fisier (nr. nr=ftell(f)/(dim+1);
articole fizice) return nr;
// I - fisierul, dimensiunea unui }
articol logic
// E - nr. articole fizice (-1 daca // preformare fisier
fisierul nu e deschis) // I - fisierul, dim. art., nr. art.
int NrSpatii(FILE* f, long dim) pentru preformare/extindere
{ long p; // E - cod eroare: 0 - succes, 1 -
int nr; fisierul era inchis
nr=-1; int Preformare(FILE* f, long dim,
if(f) int nr)
{ p=ftell(f); { int i,er;
fseek(f,0,SEEK_END); char *art;
nr=ftell(f)/(dim+1); er=1;
fseek(f,p,SEEK_SET); if(f)
} { fseek(f,0,SEEK_END);
return nr; art=(char*)malloc(dim+1);
} art[0]=0;
for(i=0;i<nr;i++)
// pozitia curenta in fisier fwrite(art,dim+1,1,f);
// I - fisierul, dimensiunea unui er=0;
articol logic free(art);
// E - pozitia curenta, in nr. de }
articole, -1 daca fisierul e inchis return er;
8
} // 2 - cheie invalida
int CitestePozitia(FILE* f, long dim,
int poz, void* adresa)
// pozitionare { char* art;
// I - fisierul, dim. art., pozitia int er;
dorita in nr. relativ articol er=Pozitionare(f, dim, poz);
// E - cod eroare, 0 - succes, 1 - if(!er)
pozitia prea mare, 2 - fis. inchis { art=(char*)malloc(dim+1);
int Pozitionare(FILE* f, long dim, fread(art,dim+1,1,f);
int p) if(art[0]==0)
{ int er; er=2;
er=2; else
if(f) { er=0;
if(p<NrSpatii(f,dim)) memcpy(adresa, art+1, dim);
{ fseek(f,p*(dim+1),SEEK_SET); }
er=0; free(art);
} }
else return er;
er=1; }
return er;
} // scriere articol in acces direct
// I - fisierul, dim. art., adresa
// citire in acces secvential, articolului, cheia articolului
urmatorul articol // E - cod eroare, 0 - succes, 1 - fis.
// I - fisierul, dim. art., adresa la inchis, 2 - cheie invalida
care se depune articolul citit int ScriePozitia(FILE* f, long dim,
// E - cod eroare, 0 - art. citit, 1 - void* adresa, int poz)
fis. inchis, 2 - sfirsit fisier { char* art;
int CitesteUrmatorul(FILE* f, long int n,er=1;
dim, void* adresa)
{ char* art; if(f)
int er=1; { n=NrSpatii(f,dim);
if(f) if(poz>=n)
{ art=(char*)malloc(dim+1); Preformare(f,dim,poz-n+1);
fread(art,dim+1,1,f); art=(char*)malloc(dim+1);
while((!feof(f)) && (er==1)) Pozitionare(f,dim,poz);
{ if(art[0]) fread(art,dim+1,1,f);
{ er=0; if(art[0]==1)
memcpy(adresa,art+1,dim); er=2;
} else
else { er=0;
fread(art,dim+1,1,f); memcpy(art+1,adresa,dim);
} art[0]=1;
if(er==1) er=2; Pozitionare(f,dim,poz);
free(art); fwrite(art,dim+1,1,f);
} }
return er; free(art);
} }
return er;
// citire in acces direct }
// I - fisierul, dim. art., cheia art.,
adresa unde se depune articolul // suprascriere articol in vederea
// E - cod eroare, 0 - art. citit, 1 - modificarii, in acces direct
fis. inchis sau poz. prea mare,
9
// I - fisierul, dim. art., adresa // I - fisierul, dimensiunea unui
articolului, cheia articolului articol, cheia articolului de sters
// E - cod eroare: 0 - succes, 1 - fis. // E - cod eroare, 0 - succes, 1 - fis.
inchis, 2 - pozitia e prea mare inchis sau pozitie prea mare, 2 -
int RescriePozitia(FILE* f, long dim, cheie invalida (spatiu gol),
void* adresa, int poz) int Sterge(FILE*f, long dim, int poz)
{ char* art; {char* art;
int n,er=1; int er;
er=Pozitionare(f,dim,poz);
if(f) if(!er)
{ n=NrSpatii(f,dim); { art=(char*)malloc(dim+1);
if(poz>=n) fread(art,dim+1,1,f);
er=2; if(art[0]==0)
else er=2;
{ art=(char*)malloc(dim+1); else
Pozitionare(f,dim,poz); { er=0;
er=0; art[0]=0;
memcpy(art+1,adresa,dim); Pozitionare(f,dim,poz);
fwrite(art,dim+1,1,f); fwrite(art,dim+1,1,f);
} }
free(art); free(art);
} }
return er; return er;
} }

// sterge articolul cu cheia data

10

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