Oppure

Loading
10/01/17 21:48
slax_go
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...

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

//Funzioni


//STRUCT
struct prodotti{
	char nome[80];
	int codice;
	float prezzo;
	int pezzi;
};


//inizio programma

int main(void){
	float resto, m;
		
	 typedef struct prodotti Prodotti;
	 Prodotti array_prodotti[5]={{"Coca-cola", 0, 1.00, 10},
	                             {"Acqua", 1, 0.50, 10},
	                             {"Caffe'", 2, 0.80, 10},
	                             {"Patatine", 3, 1.00, 10},
	                             {"Cornetto", 4, 1.50, 10}};
	                             
   printf("\t\t\t\t\tDISTRIBUTORE AUTOMATICO\t\t\t\tv1.1\n\n");
   
   while(1){
   printf("\n\nBevande Disponibili\n");
    for(int i=0; i<5; i++){
   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);}
   printf("\n\nInserire numero della bevanda: ");
   int s; fflush(stdin); scanf("%d", &s);
   while ((s>5)||(array_prodotti[s].pezzi==0)){printf ("\nBevanda non disponibile inserire bevanda disponibile: "); scanf("%d", &s);}
   array_prodotti[s].pezzi=array_prodotti[s].pezzi-1;
   printf("\nHai selezionato %s, inserisci l'importo richiesto %g", array_prodotti[s].nome, array_prodotti[s].prezzo);
   printf("\nLa macchina accetta solo monete da 0.10, 0.20, 0.50, 1.00, 2.00\nImporto inserito: ");
   float d; fflush(stdin); scanf("%g", &d);
   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);}
   if(d<array_prodotti[s].prezzo){
   while(d=d+m, d<array_prodotti[s].prezzo){
   resto=d-array_prodotti[s].prezzo;
   printf("\nImporto inserito: %g\tSomma mancante: %g\n\nImporto: ", d, resto);
   scanf("%g", &m);}}
   if(d==array_prodotti[s].prezzo){printf("\n\nRilascio bevanda in corso...\nBevanda rilasciata.\n\nGrazie e Arrivederci\n\n");}
   if(d>array_prodotti[s].prezzo){
   resto=d-array_prodotti[s].prezzo;
   printf("\nRilascio del resto: %g Euro\n\nRilascio bevanda in corso...\nBevanda rilasciata.\n\nGrazie e Arrivederci\n\n", resto);}
   
}

}
Ultima modifica effettuata da slax_go 10/01/17 21:49
aaa
10/01/17 22:06
TheDarkJuster
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)
aaa
10/01/17 22:28
slax_go
Ho provato in questo modo, probabilmente sto sbagliando in qualcosa...

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 10/01/17 22:29
aaa
10/01/17 22:36
TheDarkJuster
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....
aaa
10/01/17 23:12
slax_go
Grazie veramente mi sei stato di grande aiuto, grazie infinite.
aaa
11/01/17 9:01
nessuno
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 11/01/17 9: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à.
11/01/17 9:16
Template
...E già che ci sei, leggi queste slides: calvino.polito.it/~sberrone/Faculty/01ILRFW.2011/…
aaa
11/01/17 9:27
lumo
Comunque lavora in centesimi con gli interi e eviti tutti i problemi di precisione.
aaa