Sunteți pe pagina 1din 23

ACADEMIA DE STUDII ECONOMICE

FACULTATEA DE CIBERNETICA,STATISTICA
SI INFORMATICA ECONOMICA

ALGORITMI IN PROGRAMARE
GESTIUNEA UNUI MAGAZIN
VESTIMENTAR

VIJA RADU
AN II,SERIA A,GRUPA 1026
Prezentare proiect

Tema proiectului:
Sa se realizeze in limbajul C un program multifunctional pentru gestiunea
fisierelor.

Fisierul principal de date trebuie sa fie organizat relativ sau indexat.

Operatiile minime necesare sunt urmatoarele:

1. Creare inventor pentru magazinul vestimentar prezentat

2. Adaugarea de date noi in fisier in diverse moduri de acces.

3. toate datele preluate de la tastatura trebuie sa fie validate.

4. consultarea datelor din fisier in diverse moduri de acces.

4.1 cu afisarea datelor gasite pe ecran.

4.2 cu scrierea de rapoarte in fisiere text

5. Modificarea datelor din fisier in functie de nevoile concrete ale temei alese.

6. realizarea unui raport cu minim 2 grade de total in fisier text

În acest proiect am realizat un fişier organizat relativ. Programul gestionează


produsele existente într-un magazin vestimentar. Acest fişier conţine codul
articolului, numele articolului, preţul şi stocul articolului, cu următoarea structură:
cod articol (int cod_art), numele articolului(char nume[30], numele e un şir se 30 de
caractere), preţul (int pret) si stocul (int stoc).

La baza programului sta un meniu cu mai multe opţiuni din care


programatorul poate alege.Meniul programului este interactiv, oferind posibilitatea
utilizatorului sa aleaga intre 7 campuri: creare fisier,afisarea acestuia(pe ecran sau
in alt fisier),adaugarea de noi date in fisierul baza de date,modificarea unei
informatii gasite deja in fisier, stergerea unei intrari, numarul total de intrari,
listarea produselor care indeplinesc anumite conditii(care au pretul mai mare decat
100).
Fisierele folosite sunt de 2 tipuri. Informatiile despre produse sunt stocate
intr-un fisier binar, sub forma de campuri de date de dimensiunea structurii de date
Produse. Celelalte fisiere folosite pentru afisarea informatiilor sau auxiliare sunt de
tip text.

Programul realizeaza gestiunea produselor unui magazine


vestimentar.

Meniul este realizat printr-o structura alternativa de tip SWITCH,avand


8 ramuri care executa functiile programului(subprograme).Daca optiunea
introdusa nu se regaseste printre valorile valide se va tipari un mesaj de
eroare.”Ati introdus o optiune gresita”

void meniu()
{
printf("\t**************************************************\n");
printf("\t*** Alege o optiune din cele enumerate mai jos ***\n");
printf("\t**************************************************\n\n\n");
printf("\t 1. Creare date produse vestimentare \n");
printf("\t 2. Afisare date produsevestimentare\n");
printf("\t 3. Listare date produse vestimentare\n");
printf("\t 4. Adaugare date fisier \n");
printf("\t 5. Consultare in acces direct\n");
printf("\t 6. Consultare in acces secvential\n");
printf("\t 7. Modificare date fisier \n");
printf("\t 8. Grade de total la produse vestimentare \n");
printf("\t 0. Iesire \n");
}

Structura este:

i pre Nr_produ Nr_articol_vestime num categor


s t se ntar e ie
typedef struct {
int cod_articol_vestimentar;
char nume[30];
int pret;
int is;
int stoc;
char categorie[30];
} Produse;

int nr_articole(FILE *f,int l)


{
long poz=ftell(f);
fseek(f,0,2);
int n=ftell(f)/l;
fseek(f,poz,0);
return n;
}prod;
Functia nrart_vestimentar cu 2 parametrii, va returna numarul de articole
memorate in fisierul transmis ca parametru. In variabila s se memoreaza cu ajutorul
functiei ftell(f), pozitia curenta in fisier (în numãr de octeti fata de începutul
fisierului). Ne pozionam la sfarsitul fisierului prin functia fseek(f,0,2), 2 semnifica
sfarsitul de fisier si 0 reprezinta deplasamentul fata de sfarsitul de fisier. In p se
memoreaza pozitia actuala, si aflandu-ne la sfarsitul fisierului in p se va memora
lungimea totala a zonei de memorie asociata tuturor articolelor din fisier. Numarul
de articole din fisier este determinat prin impartirea lungimii totale a zonei de
memorie asociata tuturor articolelor la lungimea unui singur articolului. (prin
parametrul l va fi transmisa lungimea zonei de memorie asociate articolului elev
prin operatorul sizeof(prod) )

int nr_art_vestimentar(FILE *f,int l)

long poz_cur=ftell( f);

fseek(f,0,2) ;

int n=ftell(f)/l;

fseek(f,poz_ cur,0);

return n;

}
Functia CREARE creaza fisierul binar relativ "prod.dat". Fisierul se deschide
in modul wb+ care suprascrie un fisier existent sau creeaza unul nou, fiind permise
atât citiri cât si scrieri pentru fisier binar.Daca fisierul poate sau nu poate fi creat se
va afisa un mesaj corespunzator

void creare()
{ FILE *f;
int n,i;
char prod[50],s1[20];
char fis[20];
fflush(stdin);
printf("\n Nume Fisier: => ");gets(s1);
f=fopen(s1,"wb");
if (!f)
{
printf("Fisierul o sa fie creat!!");
}
else
{
fclose(f);
printf("\n Fisierul exista deja!");
printf("\n Continuati ?");
printf("\n(Yes=1|No=0) => ");scanf("%d",&i);
if(i==0)
{
return;
}
}
printf("Dati numele fisierului :");
fflush(stdin);
scanf("%s",&fis);

while(!(f=fopen(fis,"w+b"))){
printf("\nNu poate fi creat fisierul specificat\n");
printf("Dati numele fisierului :");
fflush(stdin);
scanf("%s",&fis);
}

printf("\nDoriti sa adaugati produse? (y/n) "); char r=getche();


while(toupper(r) == 'Y')
{
Produse p;
int exista=0;
printf("\n\nCodul produsului: "); scanf("%d",&n);
fflush(stdin);
int nr_art=nr_articole(f,sizeof(Produse));
if(n>=nr_art)
{
fseek(f,0,2);
Produse q;
q.is=0;
for(int i=nr_art;i<n;i++)
{fwrite(&q,sizeof(Produse),1,f);
fseek(f,1,1);
}
fseek(f,n*sizeof(Produse),0);
}
else
{fseek(f,n*sizeof(Produse),0);
fread(&p,sizeof(Produse),1,f);
if(p.is==1) exista=1;
}
if(exista) printf("\n Produs existent!");
else
{
printf("\n Cod articol: "); fflush(stdin);
scanf("%d",&p.cod_articol_vestimentar);
printf("\n Nume produs: ");
fflush(stdin); scanf("%s",&p.nume);
printf("\n Pret: "); fflush(stdin);
scanf("%d",&p.pret);
printf("\n Stoc: "); fflush(stdin);
scanf("%d",&p.stoc);
printf("\n Categorie: ");;
fflush(stdin);scanf("%d",&p.categorie);
fflush(stdin);

p.is=1;
fseek(f,n*sizeof(Produse),0);
fwrite(&p,sizeof(Produse),1,f);
fseek(f,1,1);
}
printf("\nMai doriti sa adaugati produse? (Y=da,N=nu");
r=getche();
}
fclose(f);

}
Functia AFISARE listeaza articolele din fisier pe ecran. Fisierul binar se
dechide in modul rb- consultare fisier binar. Intr-o structura while care verifica
sfarsitul fisierului (feof(f)) se citesc articolele (verificand indicatorul de stare x.is!
=0) pe rand din fisierul f, in variabila x de tip prod, se afiseaza pe ecran.

Se face o citire a primului articol in afara structurii while.

void afisare()
{ FILE *f;

int n,i;

char prod[50],s1[20];

char fis[20];

fflush(stdin);

printf("\n Nume Fisier: => ");gets(s1);

f=fopen(s1,"wb");

if (!f)

printf("Fisierul nu exista si va fi creat !");

else

fclose(f);

printf("\n Fisierul cu numele specificat exista !");

printf("\n Continuati ?");

printf("\n(Yes=1|No=0) => ");scanf("%d",&i);

if(i==0)

return;

printf("Dati numele fisierului de date :");

fflush(stdin);

scanf("%s",&fis);
while(!(f=fopen(fis,"w+b"))){

printf("\nNu poate fi creat fisierul specificat\n");

printf("Dati numele fisierului de date :");

fflush(stdin);

scanf("%s",&fis);

printf("\nDoriti sa adaugati produse? (y/n) "); char r=getche();

while(toupper(r) == 'Y')

Produse p;

int exista=0;

printf("\n\nNumar articolului vestimentar: "); scanf("%d",&n);


fflush(stdin);

int nr_art=nr_articole(f,sizeof(Produse));

if(n>=nr_art)

fseek(f,0,2);

Produse q;

q.is=0;

for(int i=nr_art;i<n;i++)

{fwrite(&q,sizeof(Produse),1,f);

fseek(f,1,1);
}

fseek(f,n*sizeof(Produse),0);

else

{fseek(f,n*sizeof(Produse),0);

fread(&p,sizeof(Produse),1,f);

if(p.is==1) exista=1;

if(exista) printf("\n Produs existent!");

else

printf("\n Cod articol vestimentar: "); fflush(stdin);


scanf("%d",&p.cod_articol_vestimentar);

printf("\n Nume produs: "); fflush(stdin);


scanf("%s",&p.nume);

printf("\n Pret: "); fflush(stdin);


scanf("%d",&p.pret);

printf("\n Stoc: "); fflush(stdin);


scanf("%d",&p.stoc);

fflush(stdin);

p.is=1;

fseek(f,n*sizeof(Produse),0);

fwrite(&p,sizeof(Produse),1,f);

fseek(f,1,1);
}

printf("\nMai doriti sa adaugati produse? (Y=da,N=nu");


r=getche();

fclose(f);

Functia ADAUGARE adauga date in fisier. Se deschide fisierul in modul rb+


pentru consultare si actualizare fisier binar. Se citeste de la tastatura numarul
relativ, n, reprezentand pozitia de pe lista a unui produselor. Intr-o structura while
se verifica sfarsitul de fisier cu functia feof(f). Cat timp nu s-a ajuns la sfarsitul
inserarii (ctrl+z) se face prelucrarea: avem 2 cauzuri- n citit sa fie mai mare decat
numarul de articole deja adaugate in fisier, caz in care adaugarea se face la sfarsit,
sau n sa fie mai mic, caz in care se face un fel de inserare in fisier.Daca avem n in
primul caz ne pozitionam la sfarsitul fisierului, se face o preformare dinamica (se
scriu articole cu indicatorul de stare is=0 pana la pozitia n, pe care vrem sa
adaugam noul articol. Se citesc de la tastatura caracteristicile campurilor articolului
in variabila e de tip produse si se scrie artcolul in fiser cu functia fwrite(articolul e,
pe o lungime sizeof(elev), 1 singura data, in fisierul f). In cazul in care n este mai
mic decat numarul de articole din fisier, ne pozitionam in fisier dupa primele n-1
articole, verificam daca indicatorul de stare este 0, adica nu exista articol pe pozitia
respectiva, se citeste si se scrie articolul pe pozitia n. Daca avem articol pe pozitia
respectiva se va da un mesaj corespunzator.

void adaugare_fisier()
{
FILE *f;
int n;
char prod[50];
char fis[20];

// if(!(f=fopen("prod.dat","rb+"))) printf("\nNu poate fi deschis


fisierul");

printf("Dati numele fisierului de date :");


fflush(stdin);
scanf("%s",&fis);
while(!(f=fopen(fis,"rb+"))){
printf("\nNu poate fi accesat fisierul specificat\n");
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);
}

printf("\nDoriti sa adaugati produse? (y/n) "); char r=getche();


while(toupper(r) == 'Y')
{
Produse p;
int exista=0;
printf("\n\nNumar articol: "); fflush(stdin); scanf("%d",&n);
fflush(stdin);
int nr_art=nr_articole(f,sizeof(Produse));
if(n>=nr_art)
{
fseek(f,0,2);
Produse q;
q.is=0;
for(int i=nr_art;i<n;i++)
{fwrite(&q,sizeof(Produse),1,f);
fseek(f,1,1);
}
fseek(f,n*sizeof(Produse),0);
}
else
{fseek(f,n*sizeof(Produse),0);
fread(&p,sizeof(Produse),1,f);
if(p.is==1) exista=1;
}
if(exista) printf("\nProdus existent!");
else
{
printf("\nCod articol: "); fflush(stdin); scanf("%d",&p.cod_art);
printf("\nNume produs: ");
fflush(stdin);scanf("%s",&p.nume);
printf("\nCantitate: "); fflush(stdin); scanf("%d",&p.cant);
printf("\nPret: "); fflush(stdin); scanf("%d",&p.pret);
printf("\nStoc: "); fflush(stdin); scanf("%d",&p.stoc);
fflush(stdin);
p.is=1;
fseek(f,n*sizeof(Produse),0);
fwrite(&p,sizeof(Produse),1,f);
fseek(f,1,1);
}
printf("\nMai doriti sa adaugati produse? "); fflush(stdin);
r=getche();
}
fclose(f);

}
Listarea fisierului

FILE *f,*g;

char prod[50];

Produse p;

int i;

char choice= 'c';

char fis[20];

char fis1[20];

printf("Dati numele fisierului de date :");

fflush(stdin);

scanf("%s",&fis);

while(!(f=fopen(fis,"rb+"))){

printf("\nNu poate fi accesat fisierul specificat\n");

printf("Dati numele fisierului de date :");

fflush(stdin);

scanf("%s",&fis);

}
printf("Vreti sa afisare pe ecran sau intr-un fisier ?\n e - pt ecran, f -
pt fisier\n");

while(choice != 'e' && choice != 'f')

fflush(stdin);

scanf("%c",&choice);

if(choice == 'e' || choice == 'E')

printf("\ncod_articol_vestimentar Nume Pret Stoc");

fread(&(p),sizeof(Produse),1,(f));

while(!feof(f))

if(p.is)

{
printf("\n %d %s %8d %6d
",p.cod_articol_vestimentar,p.nume,p.pret,p.stoc);

fread(&(p),sizeof(Produse),1,(f));

else

{ printf("Dati numele fisierului in care vreti sa salvati\n");

fflush(stdin);

scanf("%s",&fis1);

while(!(g=fopen(fis1,"w"))){

printf("\nNu poate fi accesat fisierul specificat\n");

printf("Dati numele fisierului in care vreti sa


salvati\n");

fflush(stdin);

scanf("%s",&fis1);

//g=fopen("prod1.txt","w");

fprintf(g,"\ncod_articol_vestimentar Nume Pret Stoc");


fread(&(p),sizeof(Produse),1,(f));

while(!feof(f))

if(p.is)

fprintf(g,"\n %d %s %d
",p.cod_articol_vestimentar,p.nume,p.pret,p.stoc);

fread(&(p),sizeof(Produse),1,(f));

fclose(g);

printf("\nFisier salvat ....");

fclose(f);

getch();

Consultare dupa caracteristica: se cauta un produs dupa


categoria de pret al acestuia care se citesc de la tastatura.

Cautare se face intr-o structura while, atata timp cat nu s-a ajuns la sfarsitul
fisierului si nu s-a gasit produsul (verificarea se face cu ajutorul variabilei este care
are valoarea 0 daca nu s-a gasit eprodusul si ia valoarea 1 cand categoria de pret
s-a gasit intr-unlul dintre articolele existente in fisier).

Cautarea se incheie cand una dintre conditii nu este indeplinita.

void consultaresecv()
{ FILE *f,*g;
Produse p;
fflush(stdin);
printf("\n Introduceti numele fisierului : ");
char numef[30];
gets(numef);
f=fopen(numef,"rb");
if(!f)
printf(" \n eroare ");
else
{ int gasit;
char numeg[30];
fflush(stdin);
printf("\n Introduceti numele fisierului in care doriti sa creati lista: ");
gets(numeg);
g=fopen(numeg,"w+");
if(!g)
printf(" \n eroare ");
else
{ char categ[30];
printf("\n Introduceti categoria de produse ");
gets(categ);
while(!feof(stdin))
{
fseek(f,0,0);
fread(&p,sizeof(Produse),1,f);
fprintf(g,"\n %s categoria \n",categ);
fprintf(g," Denumire | Furnizor | Val totala \n");
gasit=0;
while(!feof(f))
{
if(strcmp(categ,p.categorie)==0 && p.is==1)
{fprintf(g,"\n %s %d %d " , p.nume,p.stoc,p.cant*p.pret );
gasit=1;}
fread(&p,sizeof(Produse),1,f);
}
if (gasit==0)

{ fprintf(g,"\n Categorie inexistenta\n");


printf(" \nCategorie inexistanta\n");
}
fflush(stdin);
printf("\n\n Introduceti categoria de produse sau ctrl+z:");
gets(categ);
}
}
fclose(g);

fclose(f);
}
Listare produse

void listare_fisier()
{
FILE *f,*g;
char prod[50];
Produse p;
int i;
char choice= 'c';

char fis[20];
char fis1[20];
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);

while(!(f=fopen(fis,"rb+"))){
printf("\nNu poate fi accesat fisierul specificat\n");
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);
}

printf("Vreti sa afisare pe ecran sau intr-un fisier ?\n e - pt ecran, f -


pt fisier\n");

while(choice != 'e' && choice != 'f')


{

fflush(stdin);
scanf("%c",&choice);
}

if(choice == 'e' || choice == 'E')


{
printf("\nCod_art Nume Cantitate Pret Stoc");

fread(&(p),sizeof(Produse),1,(f));

while(!feof(f))
{
if(p.is)
{
printf("\n %d %s %d %8d %6d
",p.cod_art,p.nume,p.cant,p.pret,p.stoc);

}
fread(&(p),sizeof(Produse),1,(f));
}

}
else
{ printf("Dati numele fisierului in care vreti sa salvati\n");

fflush(stdin);
scanf("%s",&fis1);
while(!(g=fopen(fis1,"w"))){
printf("\nNu poate fi accesat fisierul specificat\n");
printf("Dati numele fisierului in care vreti sa
salvati\n");
fflush(stdin);
scanf("%s",&fis1);
}

fprintf(g,"\nCod_art Nume Cantitate Pret Stoc");

fread(&(p),sizeof(Produse),1,(f));
while(!feof(f))
{
if(p.is)
{

fprintf(g,"\n %d %s %d %d %d
",p.cod_art,p.nume,p.cant,p.pret,p.stoc);
}
fread(&(p),sizeof(Produse),1,(f));
}
fclose(g);
printf("\nSalvat ....");

fclose(f);
getch();

//--

In functia MODIFICARE se modifica produsul sau datele despre produsul aflat


pe pozitia n citit de la tastatura. Se deschide fisierul pentru consultare si
actualizare. Ne pozitionam pe pozitia n-1, se citeste articolul dorit, de pe pozitia
n,in variabila x de tip elev, se modifica datele dorite, ne pozitionam cu o pozitie in
urma si se suprascrie articolul nou citit, peste cel vechi.

void modif_fisier()
{
FILE *f;
char prod[20];
Produse p;
int n,i,j,e;
char fis[20];
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);
while(!(f=fopen(fis,"rb+"))){
printf("\nNu poate fi accesat fisierul specificat\n");
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);
}

printf("\nCod articol: ");


scanf("%d",&n);

while(n>=nr_articole(f,sizeof(Produse)))
{
printf("\nNu exista produsul cu numarul articol %d",n);
printf("\nCod articol: ");
fflush(stdin);
scanf("%d",&n);
}

fseek(f,n*sizeof(Produse),SEEK_SET);
fread(&(p),sizeof(Produse),1,(f));
if(!p.is)printf("\nNu exista produsul cu numarul articol %d",n);

else
printf("\nPretul nou: ");
fflush(stdin);
scanf("%d",&j);

while((j<0)||(j>p.pret))
{
printf("Pret incorect");
printf("\nDati alt pret: ");
fflush(stdin);
scanf("%d",&j);
}

p.pret=j;
fseek(f,n*sizeof(Produse),SEEK_SET);
fwrite(&(p),sizeof(Produse),1,(f));
}

fclose(f);
}

Problema cu grade de total

void TotalProducts()
{
FILE *f;
char prod[50];
Produse p;
int n,i;
char fis[20];
int cate = 0;

printf("Dati numele fisierului de date :");


fflush(stdin);
scanf("%s",&fis);
while(!(f=fopen(fis,"rb+"))){
printf("\nNu poate fi accesat fisierul specificat\n");
printf("Dati numele fisierului de date :");
fflush(stdin);
scanf("%s",&fis);
}

fread(&(p),sizeof(Produse),1,(f));
while(!feof(f))
{
if(p.is)
{

cate ++;
}

fread(&(p),sizeof(Produse),1,(f));
}

fflush(stdin);
printf("\n In total au fost gasite %i produse ", cate);
getch();
fclose(f);

}
Meniul este realizat printr-o structură alternativă de tip SWITCH, având
9 ramuri care execută funcţiile programului (subprograme). Dacă opţiunea
introdusă nu se regaseşte printre valorile valide, se va tipari un mesaj de
eroare: “Aţi introdus o optiune greşită!” .

void meniu()

printf("\t**************************************************\n");
printf("\t*** Alege o optiune din cele enumerate mai jos ***\n");
printf("\t**************************************************\n\n\n");
printf("\t 1. Creare date produse \n");
printf("\t 2. Afisare date produse\n");
printf("\t 3. Consultare acces direct\n");
printf("\t 4. Consultare acces secvential \n");
printf("\t 5. Adaugare date produse \n");
printf("\t 6. Problema grade de total \n");
printf("\t 7. Listare fisier tex\n");
printf("\t 8. Creare date produse pentru fisier indexat\n");
printf("\t 0. Iesire \n");
}

void main()
{
int exit=0;
meniu();
while(exit!=1)
{
int opt;
fflush(stdin);
printf("\n\t Introduceti optiunea: => ");scanf("%d",&opt);
if(opt<0)
{
opt=10;
}
switch (opt)
{
case 1:
creare();
break;
case 2:
afisare();
break;
case 3:
listare_fisier();
break;
case 4:
adaugare_fisier();
break;
case 5:
caut_nr_rel();
break;
case 6:
consultaresecv();
break;
case 7:
modif_fisier();
break;
case 8:
TotalProducts();
break;
case 9:
SmallPrice();
break;
case 0:
exit=1;
break;
default :
printf("\n\t === Optiune inexistenta ===");
break;
}
meniu();
}
}

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