+ All Categories
Home > Documents > proiect algoritmi

proiect algoritmi

Date post: 27-Jun-2015
Category:
Upload: petrea-elena-codruta
View: 116 times
Download: 4 times
Share this document with a friend
27
ACADEMIA DE STUDII ECONOMICE FACULTATEA DE CIBERNETICA,STATISTICA SI INFORMATICA ECONOMICA ALGORITMI IN PROGRAMARE GESTIUNEA UNUI MAGAZIN VESTIMENTAR
Transcript
Page 1: proiect algoritmi

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

Page 2: proiect algoritmi

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.

Page 3: proiect algoritmi

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:

is pret Nr_produse

Nr_articol_vestimentar

nume categorie

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;

Page 4: proiect algoritmi

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!!");}

Page 5: proiect algoritmi

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;

Page 6: proiect algoritmi

} 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);

Page 7: proiect algoritmi

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

Page 8: proiect algoritmi

}

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;

Page 9: proiect algoritmi

}

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

Page 10: proiect algoritmi

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

Page 11: proiect algoritmi

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];

Page 12: proiect algoritmi

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

Page 13: proiect algoritmi

{

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

Page 14: proiect algoritmi

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

}

Page 15: proiect algoritmi

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

Page 16: proiect algoritmi

{ 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); }

Page 17: proiect algoritmi

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); }

Page 18: proiect algoritmi

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

Page 19: proiect algoritmi

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

Page 20: proiect algoritmi

}

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

Page 21: proiect algoritmi

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;

Page 22: proiect algoritmi

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();

} }


Recommended