Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Gestione di un market - problema con stringhe e puntatori

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Se usi sempre la stessa stringa

    char cat[size];

    e quindi passi sempre lo stesso puntatore alla funzione acquisto, avrai sempre e solo lo stesso dato per la categoria.

    Devi allocare dinamicamente la categoria e passare il puntatore alla funzione acquisto.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Originariamente inviato da stefanuzz199
    Salve, questo è il mio programma in C.
    In futuro, usa il tag CODE per formattare il codice, come indicato nel Regolamento (punto 9).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4

    risolto

    Ringrazio e chiedo scusa per il codice

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Indenta il codice (per la prossima volta che posti).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.