Problema funzione in c

di il
8 risposte

Problema funzione in c

Salve avrei bisogno di una mano a capire cosa sto sbagliando, sto facendo un esercizio sullla simulazione di un distributore automatico
int Inserimento_Monete(float moneta){
printf("Inserire moneta(0.10 0.20 0.50 1.00)\n");
scanf("%f",&moneta);
if(moneta!=0.10f && moneta!=0.20f && moneta!=0.50f && moneta!=1.00f)
            printf("Il distributore non accetta questa moneta\n");
else
    return moneta;
}
questa é la mia funziona per inserire le monete, però nel main quando provo a fare

saldo_totale= saldo_totale + moneta;
printf("Saldo disponibile:%1.2f",saldo_totale);
il saldo rimane a 0 e non si aggiorna, come se non mi vedesse la moneta inserita nella funzione
qualcosa sa aiutarmi?

8 Risposte

  • Re: Problema funzione in c

    Ma saldo e saldo_totale sono due variabili diverse
  • Re: Problema funzione in c

    Non vorrei scrivere scemenze, ma in Inserimento_Monete() passi un parametro float moneta, poi più avanti usi il parametro stesso (che si comporta come una qualsiasi variabile) in scanf(). Da quel momento moneta contiene il valore inserito dall'utente. E va bene. Però quando vai a restituire moneta lo restituisci come int anziché come float, quindi moneta subisce una conversione automatica che comporta la "troncatura" della parte dopo la virgola, per cui 0.10, 0.20 e 0.50 vengono sempre restituiti come zero. Se tutto va bene riesci a "salvare" l'inserimento di 1.00 che, se non si verificano errori di arrotondamento per difetto in scanf(), viene troncato a 1.

    Per superare questa "grana" restituisci un float e non un int.

    Al di là di questo, se non erro non è buona cosa presupporre che un valore float possa essere esattamente uguale a un valore dato, per cui le condizioni che hai inserito in if() potrebbero dar luogo a valutazioni della condizione non coerente con quel che vorresti ottenere.
  • Re: Problema funzione in c

    Ho provato a risolvere mettendo mettendo float e non int ma il risultato non cambia, nel printf del saldo rimane sempre 0
  • Re: Problema funzione in c

    Ma hai letto quello che ti ho risposto??
  • Re: Problema funzione in c

    Non è che anche il tuo saldo_totale è un int? Perché se così fosse non avresti fatto altro che spostare in un altro punto lo stesso meccanismo (la conversione automatica con troncamento della parte dopo la virgola).

    Fossi al tuo posto lascerei perdere l'uso dei float e del conteggio in euro e passerei a "tradurre" tutto in quantità intere di eurocent. Tipo...
    int inserimento_moneta( void ){
        float moneta;
        int cent;
    
        printf( "Inserire moneta (0.10 0.20 0.50 1.00): " );
        scanf( "%f", &moneta );
    
        /* quel +0.5 serve per evitare che il troncamento conduca a un valore
           inferiore a quello che dovrebbe essere
           ad esempio, se moneta fosse 0.199999997...
           100.0 * 0.199999997 = 19.9999997 (verrebbe troncato a 19)
           100.0 * 0.199999997 + 0.5 = 20,4999997 (verrebbe troncato a 20) */
    
        cent = 100.0f*moneta + 0.5f;
    
        if( cent==10 || cent==20 || cent==50 || cent==100 )
             return cent;
        else return -1;
    }
  • Re: Problema funzione in c

    @AldoBaldo ... la prima cosa che bisogna fargli notare è che usa

    saldo_totale

    e poi visualizza

    saldo

    Tutto il resto, compreso l'uso dei float, come ti ho detto in tante occasioni, potrebbe essere una precisa indicazione dei docenti.
  • Re: Problema funzione in c

    Mmm... ti riferisci a questo?
    saldo_totale= saldo_totale + moneta;
    printf("Saldo disponibile:%1.2f",saldo_totale);
    In effetti sta visualizzando saldo_totale.
    Non vedo traccia di alcuna variabile "saldo".

    Comunque, se vuole continuare a usare float può farlo, però deve stare attento alle conversioni "automatiche" di tipo e ai troncamenti che ne possono conseguire.

    L'uso dell'int per immagazzinare direttamente i centesimi è una mia piccola fissazione... da quando tempo fa scrissi un programma per Macintosh (con processore Motorola 68040) memorizzando una valanga di dati, per fortuna non vitali, in formato double. Per qualche ragione legata all'endianness e/o all'uso di standard diversi per i valori in virgola mobile, un port per Windows che feci anni dopo non riusciva ad accedere ai dati salvati. Feci qualche ricerca capendo a grandi linee cosa stava succedendo, poi decisi che proprio non valeva la pena d'indagare oltre (oggi che conosco qualcosa in più probabilmente potrei risolvere il "problema", allora mi parve troppo ostico).
  • Re: Problema funzione in c

    [Ha modificato il post ieri


    ...
Devi accedere o registrarti per scrivere nel forum
8 risposte