Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma Distributore problema 0.10 - 0.20 centesimi...
Forum - C/C++ - Programma Distributore problema 0.10 - 0.20 centesimi...

Avatar
slax_go (Normal User)
Newbie


Messaggi: 4
Iscritto: 15/11/2016

Segnala al moderatore
Postato alle 22:48
Martedì, 10/01/2017
Ho un problema che non riesco a risolvere, il programma funziona discretamente bene per quello che voglio fare, unico problema, ho inserito un controllo che se si inserisco monete diverse da "0.10, 0.20, 0.50, 1.00, 2.00" il programma rilascia un messaggio dove dice di inserire le monete elencate prima, fin qui tutto bene, se non fosse che mi da l'inserimento sbagliato anche sulle monete 0.10 e 0.20...

Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4.  
  5. //Funzioni
  6.  
  7.  
  8. //STRUCT
  9. struct prodotti{
  10.         char nome[80];
  11.         int codice;
  12.         float prezzo;
  13.         int pezzi;
  14. };
  15.  
  16.  
  17. //inizio programma
  18.  
  19. int main(void){
  20.         float resto, m;
  21.                
  22.          typedef struct prodotti Prodotti;
  23.          Prodotti array_prodotti[5]={{"Coca-cola", 0, 1.00, 10},
  24.                                      {"Acqua", 1, 0.50, 10},
  25.                                      {"Caffe'", 2, 0.80, 10},
  26.                                      {"Patatine", 3, 1.00, 10},
  27.                                      {"Cornetto", 4, 1.50, 10}};
  28.                                      
  29.    printf("\t\t\t\t\tDISTRIBUTORE AUTOMATICO\t\t\t\tv1.1\n\n");
  30.    
  31.    while(1){
  32.    printf("\n\nBevande Disponibili\n");
  33.     for(int i=0; i<5; i++){
  34.    printf("\n%d) %s\t%g \tEuro\t\tDisponibili ancora: %d", array_prodotti[i].codice, array_prodotti[i].nome, array_prodotti[i].prezzo, array_prodotti[i].pezzi);}
  35.    printf("\n\nInserire numero della bevanda: ");
  36.    int s; fflush(stdin); scanf("%d", &s);
  37.    while ((s>5)||(array_prodotti[s].pezzi==0)){printf ("\nBevanda non disponibile inserire bevanda disponibile: "); scanf("%d", &s);}
  38.    array_prodotti[s].pezzi=array_prodotti[s].pezzi-1;
  39.    printf("\nHai selezionato %s, inserisci l'importo richiesto %g", array_prodotti[s].nome, array_prodotti[s].prezzo);
  40.    printf("\nLa macchina accetta solo monete da 0.10, 0.20, 0.50, 1.00, 2.00\nImporto inserito: ");
  41.    float d; fflush(stdin); scanf("%g", &d);
  42.    while((d!=0.10)&&(d!=0.20)&&(d!=0.50)&&(d!=1.00)&&(d!=2.00)){printf("\nMoneta non accettata...\nInserire moneta da 0.10, 0.20, 0.50, 1.00, 2.00\n\nNuovo importo: "); scanf("%g", &d);}
  43.    if(d<array_prodotti[s].prezzo){
  44.    while(d=d+m, d<array_prodotti[s].prezzo){
  45.    resto=d-array_prodotti[s].prezzo;
  46.    printf("\nImporto inserito: %g\tSomma mancante: %g\n\nImporto: ", d, resto);
  47.    scanf("%g", &m);}}
  48.    if(d==array_prodotti[s].prezzo){printf("\n\nRilascio bevanda in corso...\nBevanda rilasciata.\n\nGrazie e Arrivederci\n\n");}
  49.    if(d>array_prodotti[s].prezzo){
  50.    resto=d-array_prodotti[s].prezzo;
  51.    printf("\nRilascio del resto: %g Euro\n\nRilascio bevanda in corso...\nBevanda rilasciata.\n\nGrazie e Arrivederci\n\n", resto);}
  52.    
  53. }
  54.  
  55. }


Ultima modifica effettuata da slax_go il 10/01/2017 alle 22:49
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1451
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:06
Martedì, 10/01/2017
Immagino sia perchè quei numeri nello standard IEEE754 non contempla la possibilità di rappresentare 0.10. DEVI quindi comparare il tuo numero con un range di valori, tipo (x > 0.08) && (x < 0.12)

PM Quote
Avatar
slax_go (Normal User)
Newbie


Messaggi: 4
Iscritto: 15/11/2016

Segnala al moderatore
Postato alle 23:28
Martedì, 10/01/2017
Ho provato in questo modo, probabilmente sto sbagliando in qualcosa...

Codice sorgente - presumibilmente Plain Text

  1. while((d>0.08)&&(d<0.12)&&(d!=0.50)&&(d!=1.00)&&(d!=2.00)){printf("\nMoneta non accettata...\nInserire moneta da 0.10, 0.20, 0.50, 1.00, 2.00\n\nNuovo importo: "); scanf("%g", &d);}



da sempre lo stesso problema...

Ultima modifica effettuata da slax_go il 10/01/2017 alle 23:29
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1451
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 23:36
Martedì, 10/01/2017
Perchè quel while non ha senso.....

Se d >0.08 e d>0.12 il valore è CORRETTO, tu invece mostri l'errore. Comunque quello non è l'unico errore del tuo while.

dovrebbe essere qualcosa tipo:

(!((d>0.08) && (d <0.12))) && (!((d>0.18) && (d<0.22))) ecc....

PM Quote
Avatar
slax_go (Normal User)
Newbie


Messaggi: 4
Iscritto: 15/11/2016

Segnala al moderatore
Postato alle 0:12
Mercoledì, 11/01/2017
Grazie veramente mi sei stato di grande aiuto, grazie infinite.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:01
Mercoledì, 11/01/2017
Lavora con degli interi. Praticamente usa 10 per dieci centesimi, 20 per venti e così via.

Oppure non usare la scanf per ottenere direttamente il valore ma usa un menu

1) 0.10
2) 0.20
...

Ultima modifica effettuata da nessuno il 11/01/2017 alle 10:02


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 10:16
Mercoledì, 11/01/2017
...E già che ci sei, leggi queste slides: http://calvino.polito.it/~sberrone/Faculty/01ILRFW.2011/1_ ...


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 412
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 10:27
Mercoledì, 11/01/2017
Comunque lavora in centesimi con gli interi e eviti tutti i problemi di precisione.

PM Quote
Avatar
slax_go (Normal User)
Newbie


Messaggi: 4
Iscritto: 15/11/2016

Segnala al moderatore
Postato alle 14:20
Mercoledì, 11/01/2017
Ringrazio anche le altre persone che mi hanno suggerito delle soluzioni, grazie mille a tutti siete stati di grande aiuto.

PM Quote