PDA

Visualizza la versione completa : Aiuto programma c Inserendo una data rimane bloccato! perchè?


lucasacco94
12-12-2013, 11:43
Non capisco perché se inserisco una data errata il programma rimane bloccato. MI potete aiutare a risolvere questo piccolo problema?

Ecco il testo:

/*Un’azienda deve gestire un certo numero di venditori che vendono un certo numero di prodotti.
Una volta al giorno ognuno dei venditori fornisce al programma il proprio codice,
il codice del prodotto venduto e la quantità del venduto giornaliero per quel prodotto.
Scrivere un programma C che immagazzini i dati in una struttura dinamica e visualizzi le vendite totali dell’ultimo
periodo per ognuno dei prodotti e per ognuno dei venditori.
Il programma deve inoltre stilare una classifica sia dei prodotti che dei venditori riferita al singolo periodo e globale.
Organizzare l’intero programma in funzioni.*/

lucasacco94
12-12-2013, 11:45
#include <stdio.h>
#include <stdlib.h>
#define PRODOTTO 10
#define VENDITORE 10
#define VENDITE 20
typedef struct
{
int cod_p;
char nome[20];
int prezzo;
}Prodotto;
typedef struct
{
int cod_v;
char nome[20];
char cognome[20];
}Venditore;
typedef struct
{
int cod_p;
int cod_v;
int quantita;
int anno;
int mese;
int giorno;
}Vendita;
/*/////////////////////PROTOTIPI FUNZIONI\\\\\\\\\\\\\\\\\\\\\\\\\*/
void stampa_menu();
void ordina_vendite(Vendita *vend, int n_v);
void ordina_vendite_idVend(Vendita *vend, int n_v);
void stampa_vendite_totali_prodotti(Vendita *vend, int n_v);
Venditore leggi_venditore(int cod);
Prodotto leggi_prodotto(int cod);
Vendita leggi_vendita(int cod_v, int cod_p);
int aggiungi_venditore(Venditore *vend, int *n_vend);/* return -1 se è gia presente un venditore con lo stesso codive, altrimenti 1*/
int aggiungi_prodotto(Prodotto* prod, int *n_prod);/* return -1 se è gia presente un prodotto con lo stesso codive, altrimenti 1*/
int aggiungi_vendita(Venditore *vend, Vendita *ven, Prodotto *prod, int n_vend, int *n_v, int n_prod);
void stampa_venditori(Venditore* vend, int n_vend);
void stampa_prodotti(Prodotto* prod, int n_prod);
void stampa_vendite(Vendita* ven, int n_v);
int trova_prodotto(Prodotto *prod, int n_prod);
int trova_venditore(Venditore *vend, int n_vend);
void ordina_vendite_idProd(Vendita *vend, int n_v);
void ordina_vendite_idVend(Vendita *vend, int n_v);
void stampa_vendite_totali_venditori(Vendita *vend, int n_v);
void stampa_vendite_totali_prodotti(Vendita *vend, int n_v);

lucasacco94
12-12-2013, 11:45
int main()
{
Prodotto prodotti[PRODOTTO];
Venditore venditori[VENDITORE];
Vendita vendite[VENDITE];
int n_vend=0;
int n_prod=0;
int n_v=0;
int input;
int anno, mese, giorno;
do
{
stampa_menu();
do
{
printf("Inserisci un codice.\n");
scanf("%d", &input);
puts("");
}while(input < 0 || input > 7);
switch (input)
{
case 1: /*AGGIUNGI UN VENDITORE*/
{
if ((aggiungi_venditore(venditori, &n_vend))==1)
{
stampa_venditori(venditori, n_vend);
}
break;
}
case 2: /*AGGIUNGI UN PRODOTTO*/
{
if ((aggiungi_prodotto(prodotti, &n_prod))==1)
{
stampa_prodotti(prodotti, n_prod);
}
break;
}
case 3: /*INSERISCI VENDITA*/
{
if((aggiungi_vendita(venditori, vendite, prodotti, n_vend, &n_v, n_prod))==1)
{
stampa_vendite(vendite, n_v);
}
break;
}
case 4: /*CLASSIFICA GLOBALE*/
{
if(n_v>0)
{
ordina_vendite_idVend(vendite,n_v);
stampa_vendite_totali_venditori(vendite, n_v);
puts("");
ordina_vendite_idProd(vendite, n_v);
stampa_vendite(vendite, n_v);
stampa_vendite_totali_prodotti(vendite,n_v);
}
break;
}
case 5: /*CLASSIFICA GIORNALIERA*/
{
if(n_v>0)
{
printf("Inserisci una data valida di vendita!!\n");
printf("inserisci la data: gg mm aaaa");
scanf("%d %d %d",&giorno, &mese, &anno);
ordina_vendite_idVend(vendite,n_v);
stampa_vendite_giornaliera_venditori(vendite,n_v,a nno,mese,giorno);
}
break;
}
case 7:
{
stampa_venditori(venditori, n_vend);
break;
}
}
}while(input!=0);
return 0;
}
void stampa_menu()
{
printf("\n--------------------------------ELENCO OPERAZIONI-------------------------------\n");
printf("\t\t[1] Per aggiungere un venditore.\n");
printf("\t\t[2] Per aggiungere un prodotto.\n");
printf("\t\t[3] Per inserire una vendita.\n");
//printf("\t\t[4] Per stampare le vendite totali dei prodotti (globale).\n");
printf("\t\t[4] Per visualizzare la classifica globale.\n");
printf("\t\t[5] Per visualizzare la classifica di un giorno.\n");
//printf("[6] Classifica prodotti piu venduti in tutto il periodo.\n");
printf("\t\t[7] Per stampare l'array venditori.\n");
printf("\t\t[0] ESCI.\n\n\n");
}
/*////////////////////////////////FUNZIONI PER I VENDITORI\\\\\\\\\\\\\\\\\\\\\\*/
int aggiungi_venditore(Venditore *vend, int *n_vend)
{
int i=0;
int cod;
do
{
printf("Inserisci il codice del venditore ( maggiore di 0 ): ");
scanf("%d", &cod);
puts("");
}while(cod <=0);
for(i=0; i<(*n_vend); i++)
{
if (vend[i].cod_v == cod)
{
printf("\nEsiste gia\' un venditore con quel id.\n");
return -1;
}
}
vend[i] = leggi_venditore(cod);
(*n_vend)++; /*incremento la variabile che conta il numero dei venditori presenti nell'array*/
return 1;
}
Venditore leggi_venditore(int cod)
{
Venditore vend;
vend.cod_v=cod;
printf("\nInserisci il nome del venditore: ");
scanf("%s", vend.nome);
printf("\nInserisci il cognome del venditore: ");
scanf("%s", vend.cognome);
return vend;
}
void stampa_venditori(Venditore* vend, int n_vend)
{
int i;
for (i=0; i<n_vend; i++)
{
printf("id venditore=%d\t", vend[i].cod_v);
printf("nome = %s\t", vend[i].nome);
printf("cognome = %s\t", vend[i].cognome);
puts("");
}
}
/*//////////////FUNZIONE PER I PRODOTTI\\\\\\\\\\\\\\\\\\\\\\\\*/
int aggiungi_prodotto(Prodotto* prod, int *n_prod)
{
int i=0;
int cod;
do
{
printf("Inserisci il codice del prodotto ( maggiore di 0 ): ");
scanf("%d", &cod);
puts("");
}while(cod <=0);
for(i=0; i<(*n_prod); i++)
{
if (prod[i].cod_p == cod)
{
printf("\nEsiste gia\' un prodoto con quel id.\n");
return -1;
}
}
prod[i] = leggi_prodotto(cod);
(*n_prod)++; /*incremento la variabile che conta il numero dei prodotti presenti nell'array*/
return 1;
}
Prodotto leggi_prodotto(int cod)
{
Prodotto prod;
prod.cod_p=cod;
printf("\nInserisci il nome del prodotto: ");
scanf("%s", prod.nome);
printf("\nInserisci il prezzo del prodotto: ");
scanf("%d", &prod.prezzo);
return prod;
}
void stampa_prodotti(Prodotto* prod, int n_prod)
{
int i;
for (i=0; i<n_prod; i++)
{
printf("\nid prodotto=%d\t", prod[i].cod_p);
printf("nome = %s\t", prod[i].nome);
printf("prezzo = %d\t", prod[i].prezzo);
puts("");
}
}
/*////////////FUNZIONI GENERALI\\\\\\\\\\\\\\\\\\\\\\\\*/
int trova_venditore(Venditore *vend, int n_vend)
{
int i=0;
int cod;
do
{
printf("Inserisci il codice del venditore ( maggiore di 0 ): ");
scanf("%d", &cod);
puts("");
}while(cod <=0);
for(i=0; i<n_vend; i++)
{
if (vend[i].cod_v == cod)
{
return cod;
}
}
printf("\nNon esiste nessun venditore con quel ID.");
return -1;
}
int trova_prodotto(Prodotto *prod, int n_prod)
{
int i=0;
int cod;
do
{
printf("Inserisci il codice del prodotto ( maggiore di 0 ): ");
scanf("%d", &cod);
puts("");
}while(cod <=0);
for(i=0; i<n_prod; i++)
{
if (prod[i].cod_p == cod)
{
return cod;
}
}
printf("\nNon esiste nessun prodotto con quel ID.");
return -1;
}
/*//////////////////FUNZIONI PER LE VENDITE\\\\\\\\\\\\\\\\\\\\\\\*/
int aggiungi_vendita(Venditore *vend, Vendita *ven, Prodotto *prod, int n_vend, int *n_v, int n_prod)
{
int cod_v;
int cod_p;
cod_v=trova_venditore(vend, n_vend);
if ( cod_v != -1)
{
cod_p=trova_prodotto(prod, n_prod);
if (cod_p != -1)
{
ven[(*n_v)]=leggi_vendita(cod_v, cod_p);
(*n_v)++; /*incremento il contatore delle vendite*/
return 1;
}
}else return -1;
}
Vendita leggi_vendita(int cod_v, int cod_p)
{
Vendita ven;
ven.cod_v=cod_v;
ven.cod_p=cod_p;
printf("\nInserisci la quantita\' venduta: ");
scanf("%d", &ven.quantita);
printf("\nInserisci l'anno in cui e\' stato venduto: ");
scanf("%d", &ven.anno);
printf("\nInserisci il mese in cui e\' stato venduto: ");
scanf("%d", &ven.mese);
printf("\nInserisci il giorno in cui e\' stato venduto: ");
scanf("%d", &ven.giorno);
return ven;
}
void stampa_vendite(Vendita* ven, int n_v)
{
int i;
for (i=0; i<n_v; i++)
{
printf("\nid venditore=%d\t", ven[i].cod_v);
printf("\nid prodotto=%d\t", ven[i].cod_p);
printf("\nquantita\' = %d\t", ven[i].quantita);
printf("\nin data: %d-%d-%d\n", ven[i].giorno, ven[i].mese, ven[i].anno);
puts("");
}
}
void ordina_vendite_idProd(Vendita *vend, int n_v)/*ordino le vendite per vend.cod_p*/
{
int i=0;
int a;
Vendita v;
for(i=0; i<n_v; i++)
{
for(a=i; a<n_v-1; a++)
{
if(vend[a].cod_p>vend[a+1].cod_p)/*ordino in modo crescente*/
{
v=vend[a];
vend[a]=vend[a+1];
vend[a+1]=v;
}
}
}
}
void ordina_vendite_idVend(Vendita *vend, int n_v)/*ordino le vendite per vend.cod_v*/
{
int i=0;
int a;
Vendita v;
for(i=0; i<n_v; i++)
{
for(a=i; a<n_v-1; a++)
{
if(vend[a].cod_v>vend[a+1].cod_v)/*ordino in modo crescente*/
{
v=vend[a];
vend[a]=vend[a+1];
vend[a+1]=v;
}
}
}
}
void stampa_vendite_giornaliera_venditori(Vendita *vend, int n_v, int anno, int mese, int giorno)/*classifica venditori giornaliera*/
{
int i;
int a;
int cod_v;
int qnt;
printf("PERIODO SELEZIONATO: %d-%d-%d\n",giorno,mese,anno);
for(i=0; i<n_v;)
{
cod_v=vend[i].cod_v;
qnt=0;
while(cod_v== vend[i].cod_v && i<n_v)
{
if (vend[i].anno==anno && vend[i].mese==mese && vend[i].giorno==giorno)
{
qnt+=vend[i].quantita;
i++;
}
}
printf("cod_v: %d\tquantita\' venduta in totale: %d\n",cod_v, qnt);
}
}
void stampa_vendite_totali_venditori(Vendita *vend, int n_v)/*classifica venditori globale*/
{
int i;
int a;
int cod_v;
int qnt;
printf("\n\t\tCLASSIFICA GLOBALE VENDITORI\n");
for(i=0; i<n_v;)
{
cod_v=vend[i].cod_v;
qnt=0;
while(cod_v== vend[i].cod_v && i<n_v)
{
qnt+=vend[i].quantita;
i++;
}
printf("cod_v: %d\tquantita\' venduta in totale: %d\n",cod_v,qnt);
}
}
void stampa_vendite_totali_prodotti(Vendita *vend, int n_v)/*classifica prodotti globale*/
{
int i;
int a;
int cod_p;
int qnt;
int classifica[VENDITORE][2];/*nella prima colonna c'è il codice del prodotto, nella seconda la quantita totale venduta*/
int c=0;
printf("\n\t\tCLASSIFICA GLOBALE PRODOTTI\n");
for(i=0; i<n_v;)
{
//cod_p=vend[i].cod_p;
//qnt=0;
classifica[c][0]=vend[i].cod_p;
classifica[c][1]=0;/*quantita*/
while(classifica[c][0]== vend[i].cod_p && i<n_v)
{
//qnt+=vend[i].quantita;
classifica[c][1]+=vend[i].quantita;
i++;
}
c++;
//printf("cod_p: %d\tquantita\' venduta in totale: %d\n",classifica[i][0],qnt);
}
for (i=0; i<n_v; i++)
{
printf("i=%d cod_p: %d\tquantita\' venduta in totale: %d\n",i, classifica[i][0],classifica[i][1]);
}
int temp[1][2];
int min;
for(i=0; i<n_v-1; i++)
{
min = i;
for(a=i+1; a<n_v; a++)
{
if(classifica[a][1]<classifica[min][1])
{
min = a;
}
}
temp[0][0] =classifica[min][0];
temp[0][1] =classifica[min][1];
classifica[min][0]=classifica[i][0];
classifica[min][1]=classifica[i][1];
classifica[i][0]=temp[0][0];
classifica[i][1]=temp[0][1];
}


/* for (i=0; i<n_v; i++)
{
for(a=i+1; a<n_v-1; a++)
{
if(classifica[i][1]<classifica[a][1])
{
tmp[0][0]=classifica[a][0];
tmp[0][1]=classifica[a][1];
classifica[a][0]=classifica[i][0];
classifica[a][1]=classifica[i][1];
classifica[i][0]=tmp[0][0];
classifica[i][0]=tmp[0][1];
}
}
}*/
for (i=0; i<n_v; i++)
{
printf("i=%d cod_p: %d\tquantita\' venduta in totale: %d\n",i, classifica[i][0],classifica[i][1]);
}
}

oregon
12-12-2013, 15:09
Ma in che senso? Dove inserisci questa data? Cosa succede?

lucasacco94
12-12-2013, 18:45
Se ad esempio nell' esecuzione del programma digito 5(CLASSIFICA GIORNALIERA) , ed inserisco un anno sbagliato dove non sono mai state effettuate vendite, il programma mi stampa la data che ho inserito ma si blocca! perché?

oregon
12-12-2013, 19:37
Nella funzione

stampa_vendite_giornaliera_venditori

i non aumenta

lucasacco94
12-12-2013, 21:27
Ma anche se inserisco i++ in quella funzione cmq non funziona lo stesso ! Mi potete dare soluzioni per questo problema per favore ?

oregon
13-12-2013, 00:30
La soluzione te l'ho data ma non ho capito come l'hai applicata nel codice ... se non lo mostri (oltre a dirlo) non si capisce se l'hai fatto bene ...

lucasacco94
13-12-2013, 09:01
Ma cosa vuol dire se non lo mostri?? l'ho pure utilizzata nel main !! l'ho pure mostrata !! C'è mi avete veramente stufato! Facevi prima a dire che non capivi dove era il problema !! In questo forum siete utili veramente e non sto scherzando visto il vostro non sapere come : la maionese sul gelato, gli stivali in spiaggia, le infradito a Cortina, il cesso Austriaco(con tubi stretti,visto che non hanno ancora inventato il buco largo come il nostro(Ma non credo tu lo sapesti)), il ketchup sulla frutta, Alvaro Pereira all'Inter !! E ti potrei fare una lista lunga quanto la Divina Commedia, ma non ce né bisogno !
Dopo questo messaggio non me ne frega se mi bannerete, se chiudera la conversazione apposta e dirai(si è protratta troppo a lungo)!
l'IMPORTANTE è che tu capisca e ammetta il tuo non.sapere di fronte a questo problema !! E proprio questo problema rimarrà insuluto alla fine ! CIAO

goatboy
13-12-2013, 09:53
I problemi insuluti sono quelli peggiori.. :fagiano:

Loading