Sunteți pe pagina 1din 9

Seminar 7 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 de rulare, langa fisierul sursa trebuie creat fisierul binar FisBinRel.dat.

Cazul cand 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 in 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. 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

char [30]

Data facturrii
zi

luna

an

char

char

int

Nr. produse

int

Valoare produse
1

floa
t

floa
t

50
floa
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
Tip fond fix

fond fix
char[30]

char[20]

Valoare
Gestionar

an

lun

zi

inventar

int

char

cha
r

float

char[30]

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:

Nume i prenume

char [30]

An de
studiu

char

Grupa

Note obinute

Nr. discipline

int

char

cha
r

cha
r

15
cha
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.

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).

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

#include<stdio.h>
#include<malloc.h>
#include<string.h>
// numar total spatii in fisier (nr.
articole fizice)

// I - fisierul, dimensiunea unui


articol logic
// E - nr. articole fizice (-1 daca
fisierul nu e deschis)
int NrSpatii(FILE* f, long dim)
{ long p;
int nr;
7

nr=-1;
if(f)
{ p=ftell(f);
fseek(f,0,SEEK_END);
nr=ftell(f)/(dim+1);
fseek(f,p,SEEK_SET);
}
return nr;
}
// 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;
}
// 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
// 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;
}
// 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;
8

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;
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;
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)
{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;
art[0]=0;
Pozitionare(f,dim,poz);
fwrite(art,dim+1,1,f);
}
free(art);
}
return er;
}