Esercizio

di il
4 risposte

Esercizio

Salve a tutti. Riscontro un problema con questo esercizio. Il compilatore non mi segnala nulla, quindi si tratta di un errore logico, ma onestamente non riesco a capire Appena avvio il programma mi dice: Windows ha smesso di funzionare :E Probabilmente è un disastro, ma sono una povera studentessa, comprendetemi
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXPRODOTTI 20
#define MAXLUNG 40

typedef struct {
   int giorno, mese, anno;
}TipoData;

typedef struct {
   char codice[6];
   char *nomeProdotto;
   int quanti; /*quanti prodotti devono essere ordinati*/
   int disponibili; /*quanti prodotti sono già presenti in magazzino*/
   double prezzo;
   TipoData quando; /*Data prevista per l'arrivo dell'ordine*/
   TipoData scadenza; /*Data di scadenza del prodotto*/
}TipoProdotto;

typedef struct {
   TipoProdotto array_prodotti[MAXPRODOTTI];
   int quanti_prodotti;
}TipoTabella;

int aggiungi_prodotto(TipoTabella *t); /*aggiunge un prodotto da ordinare*/
int elimina_prodotto(TipoTabella *t, char cod[]); /*elimina un prodotto dall'array*/

int modifica_quantita(TipoTabella *t, char cod[]); /*modifica la quantità di prodotti da ordinare*/
int modifica_data(TipoTabella *t, char cod[]); /*modifica la data di consegna del prodotto*/
int presenza(TipoTabella t, char cod[]); /*verifica quanti prodotti ci sono attualmente nel negozio, se ci sono*/

void stampa_prodotto(TipoTabella t, char cod[]); /*stampa le informazioni relative ad un prodotto*/
void stampa_tabella(TipoTabella t); /*stampa la tabella*/

int indice_prodotto(TipoTabella t, char cod[]); /*restituisce l'indice del prodotto nell'array, oppure -1*/

int main() {
   TipoTabella tab;
   int scelta, prodotti_disponibili, riuscita;
   char buffer[MAXLUNG];
   
   do {
      printf("Menu' scelta:\n\n1- Ordina un nuovo prodotto;\n2- Elimina un prodotto;\n3-Verifica la disponibilità di un prodotto (quantità di prodotto);\n4- Modifica quantità da ordinare;\n5- Modifica data di consegna di un prodotto;\n6- Stampa di un prodotto;\n7- Stampa tabella;\n0- Fine.\n");
      scanf("%d", &scelta);
      
      switch(scelta) {
         case 1:
            riuscita = aggiungi_prodotto(&tab);
               if(riuscita==0) printf("Aggiunta avvenuta correttamente.\n");
               else printf("Errore.\n");
            break;
         case 2: 
            printf("Codice del prodotto da eliminare?\n");
            scanf("%s", buffer);
            riuscita = elimina_prodotto(&tab, buffer);
               if(riuscita!=0) printf("Aggiunta avvenuta correttamente.\n");
               else printf("Errore.\n");
            break; 
         case 3:
            printf("Codice del prodotto?\n");
            scanf("%s", buffer);
            prodotti_disponibili = presenza(tab, buffer);
            printf("In magazzino sono presenti %d prodotti di questo tipo\n", prodotti_disponibili);
            break;
         case 4:
            printf("Codice del prodotto?\n");
            scanf("%s", buffer);          
            riuscita = modifica_quantita(&tab, buffer);
               if(riuscita) printf("Aggiunta avvenuta correttamente.\n");
               else printf("Errore.\n");
            break;    
         case 5:
            printf("Codice del prodotto?\n");
            scanf("%s", buffer);          
            riuscita = modifica_data(&tab, buffer);
               if(riuscita) printf("Aggiunga avvenuta correttamente.\n");
               else printf("Errore.\n");
            break;
         case 6:
            printf("Codice del prodotto da stampare?\n");
            scanf("%s", buffer);
            stampa_prodotto(tab, buffer);
            break;
         case 7:
            stampa_tabella(tab);
            break;
         case 0:
            printf("Fine programma.\n");
            break;
         default:
            printf("Opzione non disponibile.\n");
                    } /*Fine switch*/
               
              } while(scelta != 0); /*Fine do...while*/

printf("\n\n\n");
system("PAUSE");
return 0;
}


/*INIZIO FUNZIONI*/

/*------AGGIUNTA DI UN PRODOTTO ALLA TABELLA-------*/

int aggiungi_prodotto(TipoTabella *t) {
char buf[MAXLUNG], *aux;

if(t->quanti_prodotti == MAXPRODOTTI) {
   printf("Spazio insufficiente.\n");
   return -1;                      
   }    
   
printf("Codice prodotto?\n");
scanf("%s", t->array_prodotti[t->quanti_prodotti].codice);

printf("Nome prodotto?\n");
scanf("%s", buf);
aux = (char *)malloc(strlen(buf) + 1);
if(aux == NULL) {
   printf("Problemi in allocazione.\n");
   return -1;
   }
else {
aux = buf;

t->array_prodotti[t->quanti_prodotti].nomeProdotto = aux; 
}

printf("Quanti %s sono presenti in magazzino?\n", aux);
scanf("%d", &t->array_prodotti[t->quanti_prodotti].disponibili);

printf("Quanti %s si desiderano ordinare?\n", aux);
scanf("%d", &t->array_prodotti[t->quanti_prodotti].quanti);

printf("Prezzo prodotto?\n");
scanf("%g", &t->array_prodotti[t->quanti_prodotti].prezzo);

printf("Data scadenza prodotto? Inserire di seguito giorno, mese, anno\n");
scanf("%d %d %d", &t->array_prodotti[t->quanti_prodotti].scadenza.giorno, &t->array_prodotti[t->quanti_prodotti].scadenza.mese, &t->array_prodotti[t->quanti_prodotti].scadenza.anno);

printf("Data di consegna del prodotto? Inserire di seguito giorno, mese, anno\n");
scanf("%d %d %d", &t->array_prodotti[t->quanti_prodotti].quando.giorno, &t->array_prodotti[t->quanti_prodotti].quando.mese, &t->array_prodotti[t->quanti_prodotti].quando.anno);


return 0; 

}

/*----ELIMINAZIONE PRODOTTO---*/

int elimina_prodotto(TipoTabella *t, char cod[]) {
int k = indice_prodotto(*t, cod);
int j = t->quanti_prodotti - 1;

if(k==-1) {
   printf("Prodotto non presente in tabella.\n");
   return 0;          
          }
          
strcpy(t->array_prodotti[k].codice, t->array_prodotti[j].codice);

t->array_prodotti[k].nomeProdotto = (char *)malloc(strlen(t->array_prodotti[j].nomeProdotto) + 1);
strcpy(t->array_prodotti[k].nomeProdotto, t->array_prodotti[j].nomeProdotto);

t->array_prodotti[k].quanti = t->array_prodotti[j].quanti;
t->array_prodotti[k].disponibili = t->array_prodotti[j].disponibili;
t->array_prodotti[k].prezzo = t->array_prodotti[j].prezzo;
t->array_prodotti[k].quando.giorno= t->array_prodotti[j].quando.giorno;
t->array_prodotti[k].quando.mese= t->array_prodotti[j].quando.mese;
t->array_prodotti[k].quando.anno= t->array_prodotti[j].quando.anno;
t->array_prodotti[k].scadenza.giorno= t->array_prodotti[j].scadenza.giorno;
t->array_prodotti[k].scadenza.mese= t->array_prodotti[j].scadenza.mese;
t->array_prodotti[k].scadenza.anno= t->array_prodotti[j].scadenza.anno;

t->quanti_prodotti--;

return 1;

}


int modifica_quantita(TipoTabella *t, char cod[]) {
int k = indice_prodotto(*t, cod);
if(k==-1) {
   printf("Prodotto non presente in magazzino.\n");
   return 0;
}

printf("Quantitativo da prodotto da ordinare?\n");
scanf("%d", &t->array_prodotti[k].quanti);

return 1;
}

int modifica_data(TipoTabella *t, char cod[]) {
int k = indice_prodotto(*t, cod);
if(k==-1) {
   printf("Prodotto non presente in magazzino.\n");
   return 0;
}

printf("Nuova dat d'arrivo? Scrivere di seguito giorno, mese, anno.\n");
scanf("%d %d %d", &t->array_prodotti[k].quando.giorno, &t->array_prodotti[k].quando.mese, &t->array_prodotti[k].quando.anno);

return 1;
}

int presenza(TipoTabella t, char cod[]){
int k = indice_prodotto(t, cod);
int prod = t.array_prodotti[k].disponibili;

if(k==-1) {
   printf("Prodotto non presente in magazzino.\n");
   return 0;
}

return prod;
}


void stampa_prodotto(TipoTabella t, char cod[]){
int k = indice_prodotto(t, cod);
if(k==-1) {
   printf("Prodotto non presente in magazzino.\n");
   return;
}

printf("- Nome prodotto: %s\n- Codice Prodotto: %s\n- Prezzo: %lf\n- Disponibili in magazzino: %d\n- Ordinati: %d\n- Data d'arrivo: %d.%d.%d\n", t.array_prodotti[k].nomeProdotto, t.array_prodotti[k].codice, t.array_prodotti[k].prezzo, t.array_prodotti[k].disponibili, t.array_prodotti[k].quanti, t.array_prodotti[k].quando.giorno, t.array_prodotti[k].quando.mese, t.array_prodotti[k].quando.anno);
return;     
}

void stampa_tabella(TipoTabella t) {
int i;
int k = t.quanti_prodotti;

for(i=0; i<k; i++) {
printf("- Nome prodotto: %s\n- Codice Prodotto: %s\n- Prezzo: %lf\n- Disponibili in magazzino: %d\n- Ordinati: %d\n- Data d'arrivo: %d.%d.%d\n", t.array_prodotti[k].nomeProdotto, t.array_prodotti[k].codice, t.array_prodotti[k].prezzo, t.array_prodotti[k].disponibili, t.array_prodotti[k].quanti, t.array_prodotti[k].quando.giorno, t.array_prodotti[k].quando.mese, t.array_prodotti[k].quando.anno);
}

return;
}

int indice_prodotto(TipoTabella t, char cod[]) {
int i;
int k = t.quanti_prodotti;

for(i=0; i<k; i++) {
   if(strcmp(t.array_prodotti[i].codice, cod) == 0)
      return i;        
    }
    
return -1;
} /*Funzione di servizio*/

4 Risposte

  • Re: Esercizio

    In genere questo tipo di errori sono causati da problemi con i puntatori.

    Quando avvii il programma, il menu viene visualizzato.

    In quale caso hai l'errore ? Segui l'esecuzione del codice linea per linea prima dell'errore ... ti accorgerai del problema.
  • Re: Esercizio

    In realtà, qualsiasi funzione chiami, mi crasha sempre. Ho provato ad isolare le singole funzioni. Ad esempio, ho simulato un piccolo main con la chiamata aggiungi_prodotto, e dentro aggiungi prodotto ho inserito unicamente una printf, e continuava a crashare.
  • Re: Esercizio

    Comincia dalla funzione

    aggiungi_prodotto

    Tu passi una struttura di cui poi controlli il valore

    t->quanti_prodotti

    ma quel valore non è mai stato inizializzato. Quanto vale? Perché lo usi se non lo hai inizializzato?
  • Re: Esercizio

    Oddio, grazie mille, effettivamente era questo il problema, e il fatto che aggiungendo il prodotto dimenticavo di incrementare t->quanti_prodotti. Davvero, grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte