Salve, questo è il mio programma in C. Devo gestire un supermercato e, visto che sono agli inizi, ho deciso di utilizzare uno stack che mi sembrava la struttura più abbordabile. Dopo un bel pò di tempo, funziona quasi tutto.
Ho creato una struttura prodotto contenente un puntatore a prodotto e in questo modo ho formato il mio stack. Ogni prodotto contiene qualche informazione int e una stringa che ho definito come puntatore a carattere (oltre che un puntatore a struttura prodotto).
Ho difficoltà proprio con la stringa. Questa, definisce la categoria del prodotto (fresco, alimentare ecc...) e, quando aggiungo il primo prodotto, la funzione acquisto funziona perfettamente.
Quando invece aggiungo un secondo prodotto con una categoria diversa da quella del primo, allora entrambe le categorie dei prodotti, si modificano all'ultima categoria inserita.
Es. Inserisco un prodotto "alimentare". Faccio varie operazioni tutto ok. Inserisco un altro prodotto di categoria "fresco" e, alla stampa, vedo che entrambi i prodotti hanno categoria "fresco".
Questo è parte del codice:
const int size=20;
struct prodotto{
char *categoria;
int prezzoAcquisto;
int prezzoVendita;
int dataScadenza;
struct prodotto *nextPtr;
};
typedef struct prodotto Prodotto;
typedef Prodotto *ProdottoPtr;
void acquisto(ProdottoPtr *, char[], int , int ,int , int *);
void vendita(ProdottoPtr *, int *);
int isEmpty(ProdottoPtr);
void printStack(ProdottoPtr);
void ritiro(ProdottoPtr *, int );
void elimina(ProdottoPtr *);
void istruzioni(void);
main(){
ProdottoPtr prodotto=NULL; //Punta alla testa;
int choice; char c; char cat[size]; int pA; int pV; int dS;
int bilancio=1000;
istruzioni();
printf("?\n");
scanf("%d", &choice);
while (choice!=6) {
switch (choice) {
case 1:
printf("Inserire categoria del prodotto: \n");
scanf("%s", &cat);
if (!strcmp(cat, "fresco")){
printf("Inserire data di scadenza: \n");
scanf("%d", &dS);
}
else dS=0;
printf("Inserire prezzo d'acquisto: \n");
scanf("%d", &pA);
printf("Inserire prezzo di vendita: \n");
scanf("%d", &pV);
acquisto(&prodotto, cat, pA, pV, dS, &bilancio);
printStack(prodotto);
printf("Bilancio dopo l'acquisto: \t %d \n", bilancio);
break;
case 2:
if (isEmpty(prodotto)==0){
vendita(&prodotto, &bilancio);
printStack(prodotto);
printf("Bilancio dopo la vendita: \t %d \n", bilancio);
break;
}
else {
printf("Lo stack è vuoto!\n");
break;
}
case 3:
printf("Inserire data corrente: ");
scanf("%d", &dS);
ritiro(&prodotto, dS);
printStack(prodotto);
break;
case 4:
elimina(&prodotto);
printStack(prodotto);
break;
case 5:
printf("Il bilancio corrente é: \t %5d \n", bilancio);
break;
default:
printf("Valore inserito non valido");
break;
}
printf("?\n");
scanf("%d", &choice);
}
printf("End..\n");
return 0;
}
//Funzione di acquisto.
void acquisto(ProdottoPtr *topPtr, char *categ, int aPrice, int vPrice, int scade, int *bilancio){
ProdottoPtr newPtr;
newPtr=malloc(sizeof(Prodotto));
if (newPtr!=NULL){
newPtr->categoria=categ;
newPtr->prezzoAcquisto=aPrice;
newPtr->prezzoVendita=vPrice;
newPtr->dataScadenza=scade;
newPtr->nextPtr=*topPtr;
*topPtr=newPtr;
printf("Prodotto acquistato: \n");
printf("\tCategoria: %s\n", categ);
printf("\tPrezzo di acquisto: %d\n", aPrice);
printf("\tPrezzo di vendita: %d\n", vPrice);
printf("\tData di scadenza: %d\n", scade);
(*bilancio)=(*bilancio)-aPrice;
}
else
printf("Prodotto non inserito. Memoria non disponibile!");
}
//Funzione di stampa. Stampa ogni prodotto in testa al precedente.
void printStack(ProdottoPtr currentPtr){
if (currentPtr==NULL) printf("***La lista è vuota!\n");
else {
printf("***La lista è:***\n\n");
while (currentPtr!=NULL){
printf(" | %10s |\n", currentPtr->categoria);
printf(" | %10d |\n", currentPtr->prezzoAcquisto);
printf(" | %10d |\n", currentPtr->prezzoVendita);
printf(" | %10d |\n", currentPtr->dataScadenza);
printf("\t|\n");
printf("\t|\n");
printf("\tV\n\n");
currentPtr=currentPtr->nextPtr;
}
}
}
Grazie in anticipo.
Se trovate altri errori più grossolani correggetemi