Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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: 1620
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: 1620
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: 6402
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
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_ ...

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
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