Bug in esercizio sui file

di il
5 risposte

Bug in esercizio sui file

Buonasera ragazzi. Sono alle prese con un esercizio sui file e avrei bisogno di una mano per risolvere un piccolo bug. La traccia è questa: da un elenco di record (char codice, char nome_prodotto, int mese, float prezzo) precedentemente scritti su file txt, prendere l'elenco più piccolo possibile di prodotti acquistabili da un budget inserito dall'utente. Tale elenco sarà stampato su un secondo file txt, ordinato numericamente in base al campo mese.
Ho creato quindi due strutture, una per leggere i record dal primo txt e l'altra per creare il nuovo elenco di prodotti e stamparlo sul nuovo txt.


typedef struct{
    char codice[6];
    char nome[15];
    int mese;
    float prezzo;
}record;

record frutta[MAX];
record newFrutta[MAX];

Dopo aver preso i dati in memoria, usando la struttura frutta li ho ordinati in maniera decrescente in base al prezzo per poi selezionare come nel codice seguente i record inserendoli in newFrutta. Per velocità, ho preinserito la scelta dell'utente.


float scelta=3.00;
int conta=0;
for(int counter=0; counter<indice; counter++){
    if(frutta[counter].prezzo<=scelta){
        newFrutta[counter]=frutta[counter];
        scelta=scelta-frutta[counter].prezzo;
        conta++;
    }
}

Tale algoritmo sembra funzionare ma quando vado a stampare l'elenco a schermo in questo modo


for(int x=0; x<conta; x++){
    printf("%s  %s  %d  %.2f\n", newFrutta[x].codice, newFrutta[x].nome, newFrutta[x].mese, newFrutta[x].prezzo);
}

mi stampa il primo record come vuoto, cioè degli zeri, poi stampa gli altri correttamente e omette l'ultimo.
Il bello è che tale errore avviene solo se il valore che dovrebbe inserire l'utente è inferiore al 5, al di sopra del quale tutto funziona benissimo. Aiutatemi a capire dove sbaglio per favore.

5 Risposte

  • Re: Bug in esercizio sui file

    Avrai fatto l'errore dell'altra volta. Però, se non sai che pesci prendere, non puoi avere la presunzione di aver localizzato l'errore nel codice...
  • Re: Bug in esercizio sui file

    Dovresti mostrare *tutto* il codice compilabile e il file dati
  • Re: Bug in esercizio sui file

    Questo è tutto il codice. Molte printf sono state piazzate nel tentativo di trovare l'errore. Non troverete la parte per scrivere sul nuovo file perchè stavo cercando di risolvere il bug prima di proseguire. Al suo posto c'è infatti un semplice ciclo for con printf per stampare a schermo. Il primo bubble sort serve per mettere i prezzi dal più grande al più piccolo in modo da, come da traccia, trovare il minimo elenco possibile di prodotti acquistabili con un certo budget.

    
    
    #define MAX 1000
    
    FILE *puntatore;
    
    typedef struct{
        char codice[6];
        char nome[15];
        int mese;
        float prezzo;
    }record;
    
    record frutta[MAX];
    record hold[MAX];
    record newFrutta[MAX];
    record hold2[MAX];
    int indice=0;
    
    int main()
    {
    
    if((puntatore=fopen("dati_originali.txt", "r"))==NULL){
        puts("Errore");
    }else{
        while(!feof(puntatore)&&indice<MAX){
            fscanf(puntatore, "%s%s%d%f\n", frutta[indice].codice, frutta[indice].nome, &frutta[indice].mese, &frutta[indice].prezzo);
            printf("%s  %s  %d  %.2f\n", frutta[indice].codice, frutta[indice].nome, frutta[indice].mese, frutta[indice].prezzo);
            indice++;
        }
        fclose(puntatore);
    }
    
    for(int x=0; x<indice-1; x++){
        for(int y=0; y<indice - x - 1; y++){
            if(frutta[y].prezzo<frutta[y+1].prezzo){
                hold[y]=frutta[y];
                frutta[y]=frutta[y+1];
                frutta[y+1]=hold[y];
            }
        }
    }
    
    
    puts("\nOrdinati per prezzo\n");
    for(int c=0; c<indice; c++){
        printf("%s  %s  %d  %.2f\n", frutta[c].codice, frutta[c].nome, frutta[c].mese, frutta[c].prezzo);
    }
    puts("\n\n");
    float scelta=3.00;
    int conta=0;
    for(int counter=0; counter<indice; counter++){
        if(frutta[counter].prezzo<=scelta){
            printf("originale: %s %s %d %f\n", frutta[counter].codice, frutta[counter].nome, frutta[counter].mese, frutta[counter].prezzo);
            newFrutta[counter]=frutta[counter];
            printf("nuovo: %s  %s  %d  %.2f\n", newFrutta[counter].codice, newFrutta[counter].nome, newFrutta[counter].mese, newFrutta[counter].prezzo);
            scelta=scelta-frutta[counter].prezzo;
            printf("scelta:%.2f\n\n", scelta);
            conta++;
        }
    }
    printf("\n\nconta%d", conta);
    puts("\n\necco i prodotti acquistabili col budget");
    
    for(int x=0; x<conta-1; x++){
        for(int y=0; y< conta - x - 1; y++){
            if(newFrutta[y].mese>newFrutta[y+1].mese){
                hold2[y]=newFrutta[y];
                newFrutta[y]=newFrutta[y+1];
                newFrutta[y+1]=hold2[y];
            }
        }
    }
    puts("");
    for(int x=0; x<conta; x++){
        printf("%s  %s  %d  %.2f\n", newFrutta[x].codice, newFrutta[x].nome, newFrutta[x].mese, newFrutta[x].prezzo);
    }
    
    
    }
    
    
    
    Invece il file txt è stato riempito in questa maniera:

    123DD finocchi 06 1.00
    256AA carote 08 1.50
    145FF pesche 01 1.60
    217ZZ arance 04 0.80
    196HH limoni 09 0.65
    308LL cavoli 07 1.20
    380GG zucchine 01 0.50
    210RR melanzane 0.90
    185PP mele_gialle 11 1.50
    301QQ mele_rosse 01 1.10
  • Re: Bug in esercizio sui file

    Nella selezione devi usare due indici diversi dato che il primo vettore deve essere esaminato elemento per elemento ma il secondo va aggiornato solo quando possibile. Quindi usa anche newcounter
    
    	for (int counter = 0, newcounter=0; counter<indice; counter++) {
    		if (frutta[counter].prezzo <= scelta) {
    			printf("originale: %s %s %d %f\n", frutta[counter].codice, frutta[counter].nome, frutta[counter].mese, frutta[counter].prezzo);
    			newFrutta[newcounter++] = frutta[counter];
    
  • Re: Bug in esercizio sui file

    Certo, mi era completamente sfuggito quel dettaglio...grazie mille oregon.
Devi accedere o registrarti per scrivere nel forum
5 risposte