Documente Academic
Documente Profesional
Documente Cultură
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
{
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
TEMA
5
char [30]
Data facturrii
zi
luna
an
char
char
int
Nr. produse
int
Valoare produse
1
floa
t
floa
t
50
floa
t
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]
Nume i prenume
char [30]
An de
studiu
char
Grupa
Note obinute
Nr. discipline
int
char
cha
r
cha
r
15
cha
r
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)
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