proiect algoritmi

Post on 27-Jun-2015

116 views 4 download

transcript

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:

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;

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

} }