[Risolto] [C++] Problema distributore automatico

di il
3 risposte

[Risolto] [C++] Problema distributore automatico

Salve a tutti, è da stamattina che tento di comprendere il motivo per cui questo programma di cui vi lascio il codice + consegna sotto non funziona. Ho eseguito anche la tavola di verità e risulta corretta, mentre il codice in C++ non ne vuole sapere di funzionare .
Il problema risiede nella procedura pagamento, praticamente quello che ho pensato è di andare a sottrarre i valori dell'array soldi al resto finché non diventa zero. Così facendo il resto diventa 0 e nel mentre ad ogni ciclo stampo quale moneta/banconota la macchina sta rilasciando all'utente.
Il problema è che quando il resto diventa 0.1 non me lo sottrae con il 0.1 nell'array.
Spero vivamente in un vostro aiuto. Grazie in anticipo.
Questo è il programma:

/* Costruire tramite C++ un software che permette di gestire un distributore
automatico di qualsiasi tipo: gelati, snack, caffé, bibite ecc...
Il distributore accetta tutte le monete da 10 centesimi a 2 euro e le banconote da
5, 10 e 20 euro.
Scegliere 5 referenze (di prova) e impostare un prezzo di vendita per ognuna. Quando un cliente
acquista una referenza viene chiesto di inserire monete o banconote, e dopo l'erogazione
vengano calcolate, eventualmente, il taglio delle monete da restituire come resto. 
Consegnare inoltre la documentazione. */


 #include <iostream>
#include <string>
using namespace std;

float soldi [8]={0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0};

struct Prodotto {
	string nome;
	float prezzo;
};

pagamento (float prezzo, float pp)
{
	double re=pp-prezzo;
	do 
	{
		for (int i=7; i>=0; i--)
		{
			if (soldi[i]<=re)
			{
				cout<<"Ti do euro: "<<soldi[i]<<endl;
				re=re-soldi[i];
			}
		}
	}
	while (re!=0);
	cout<<re<<endl;
}

int main ()
{
	int r, pi;
	float pp;
	Prodotto p1, p2, p3, p4, p5;
	p1.nome="Gelato";
    p1.prezzo=1;
    p2.nome="Acqua";
	p2.prezzo=0.5;
    p3.nome="Coca-Cola";
    p3.prezzo=1.5;
    p4.nome="Cicche";
    p4.prezzo=0.2;
    p5.nome="Merendina";
    p5.prezzo=1.9;
	do {
		cout<<"Digita 1 per acquistare un prodotto\n2 per uscire dal programma."<<endl;
		cin>>r;
		switch (r)
		{
			case 1:
				cout<<"Digita 1 per acquistare "<<p1.nome<<"\n2 per acquistare "<<p2.nome<<"\n3 per acquistare "<<p3.nome<<"\n4 per acquistare "<<p4.nome<<"\ne 5 per acquistare "<<p5.nome<<endl;
				cin>>pi;
				switch (pi)
				{
					case 1:
						cout<<"Inserisci euro: "<<p1.prezzo<<": ";
						cin>>pp;
						pagamento (p1.prezzo, pp);
						system ("pause");
						system ("cls");
						break;
						
					case 2:
						cout<<"Inserisci euro: "<<p2.prezzo<<": ";
						cin>>pp;
						pagamento (p2.prezzo, pp);
						system ("pause");
						system ("cls");
						break;
					
					case 3:
						cout<<"Inserisci euro: "<<p3.prezzo<<": ";
						cin>>pp;
						pagamento (p3.prezzo, pp);
						system ("pause");
						system ("cls");
						break;
					
					case 4:
						cout<<"Inserisci euro: "<<p4.prezzo<<": ";
						cin>>pp;
						pagamento (p4.prezzo, pp);
						system ("pause");
						system ("cls");
						break;
					
					case 5:
						cout<<"Inserisci euro: "<<p5.prezzo<<": ";
						cin>>pp;
						pagamento (p5.prezzo, pp);
						system ("pause");
						system ("cls");
						break;
				} 
				break;
			
			case 2:
				cout<<"Sto uscendo..."<<endl;
				break;
		}
	}
	while (r!=2);
	system ("pause");
	return 0;
}

3 Risposte

  • Re: [Risolto] [C++] Problema distributore automatico

    Non usare float ma int. Quindi 10 20 50 ... centesimi
  • Re: [Risolto] [C++] Problema distributore automatico

    
    
    /* Costruire tramite C++ un software che permette di gestire un distributore
    automatico di qualsiasi tipo: gelati, snack, caffé, bibite ecc...
    Il distributore accetta tutte le monete da 10 centesimi a 2 euro e le banconote da
    5, 10 e 20 euro.
    Scegliere 5 referenze (di prova) e impostare un prezzo di vendita per ognuna. Quando un cliente
    acquista una referenza viene chiesto di inserire monete o banconote, e dopo l'erogazione
    vengano calcolate, eventualmente, il taglio delle monete da restituire come resto.
    Consegnare inoltre la documentazione. */
    
    
    #include <iostream>
    #include <string>
    using namespace std;
    float prezzo[]{1.0,1.5};
    float taglio[] {0.1,0.2,0.5,1.0,2.0,5.0,10.0,20.0};
    float soldi = 0;
    void resto (float);
    
    int main ()
    {
        int articolo;
        cout << "1.pizza\n2.pane\ninserisci articolo da comprare : ";
        cin >> articolo;
        switch(articolo)
        {
        case 1:
            cout << "prezzo 1.0\ninserisci soldi : ";
            cin >> soldi;
            resto(prezzo[0]);
            break;
        case 2:
            cout << "prezzo 1.5\ninserisci soldi : ";
            cin >> soldi;
            resto(prezzo[1]);
            break;
        default:
            break;
        }
        return 0;
    }
    
    void resto (float prezzo1)
    {
        float differenza = soldi-prezzo1,divisione=differenza/2;
        int chiusura = 0;
        for (int i=0;i<8;i++)
        {
            if(chiusura==1)
                {
                    break;
                }
            if (divisione==taglio[i])
                {
                    cout << "resto : " << differenza;
                    break;
                }
            for (int j=0;j<8;j++)
            {
                if(chiusura==1)
                    {
                        break;
                    }
                   for(int x=0; x<8; x++)
                    {
                        if(differenza == (taglio[i]+taglio[j]+taglio[x]))
                            {
                                cout << "resto : " << taglio[i] << " + " << taglio[j] << " + " << taglio[x];
                                chiusura=1;
                                break;
                            }
    
                    }
            }
        }
    
    }
    Il problema e che da solo o tre tagli di soldi o un taglio, forse domani mi viene in mente qualcosa di meglio
    Il problema e che mi mancano alcune conoscenze...
    scusami se non ho usato il tuo codice ma la funzione può essere tranquillamente adattata
    se lo migliori mi puoi postare il codice, sono curioso di vederlo.
        for(int i=0;i<8;i++)
        {
            for(int j=0; j<8; j++)
                {
                    if(differenza == (taglio[i]+taglio[j]))
                        {
                            cout << "resto : " << taglio[i] << " + " << taglio[j];
                            break;
                        }
                }
        }
    questo e per il doppio resto, ma mi manca qualcosa per chiudere il tutto.
  • Re: [Risolto] [C++] Problema distributore automatico

    Ho risolto, grazie a tutti.
    Se a qualcuno può servire ecco il codice:
    #include <iostream>
    #include <string>
    using namespace std;
    
    float soldi [8]={0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0};
    int ri=0;
    struct Prodotto {
    	string nome;
    	int id;
    	float prezzo;
    };
    
    void caricamento (Prodotto p[])
    {
    	for (int i=0; i<ri; i++)
    	{
    		cout<<"Inserisci il nome del prodotto "<<i<<": "<<endl;
    		cin>>p[i].nome;
    		cout<<"Inserisci l'id del prodotto "<<i<<": "<<endl;
    		cin>>p[i].id;
    		cout<<"Inserisci il prezzo del prodotto "<<i<<": "<<endl;
    		cin>>p[i].prezzo;
    	}
    }
    
    void pagamento (float prezzo, float pp)
    {
    	float re=pp-prezzo;
    	do 
    	{
    		for (int i=7; i>=0; i--)
    		{
    			if (soldi[i]<=re)
    			{
    				cout<<"Ti do euro: "<<soldi[i]<<endl;
    				re=re-soldi[i];
    				if (re==soldi[i])
    				{
    					re=re-soldi[i];
    					cout<<"Ti do euro: "<<soldi[i]<<endl;
    					break;
    				}
    			}
    		}
    	}
    	while (re>=0.1);
    }
    
    int main ()
    {
    	int r, pi;
    	float pp;
    	cout<<"Quanti prodotti vuoi caricare nella macchina?"<<endl;
    	cin>>ri;
    	Prodotto p[ri];
    	system ("pause");
    	system ("cls");
    	/* Prodotto p1, p2, p3, p4, p5;
    	p1.nome="Gelato";
        p1.prezzo=1;
        p2.nome="Acqua";
    	p2.prezzo=0.5;
        p3.nome="Coca-Cola";
        p3.prezzo=1.5;
        p4.nome="Cicche";
        p4.prezzo=0.2;
        p5.nome="Merendina";
        p5.prezzo=1.9; */
    	do {
    		cout<<"Digita 0 per caricare i dati degli elementi\n1 per acquistare un prodotto\n2 per uscire dal programma."<<endl;
    		cin>>r;
    		system ("pause");
    		system ("cls");
    		switch (r)
    		{
    			case 0:
    				caricamento (p);
    				system ("pause");
    				system ("cls");
    				break;
    			case 1:
    				for (int i=0; i<ri; i++)
    				{
    					cout<<"Digita "<<p[i].id<<" per acquistare "<<p[i].nome<<" (E. "<<p[i].prezzo<<")"<<endl;;
    				}
    				cin>>pi;
    				pi=pi-1;
    				{
    					cout<<"Inserisci i seguenti euro: "<<p[pi].prezzo<<endl;
    					cin>>pp;
    					if (pp>=p[pi].prezzo)
    						{
    						pagamento (p[pi].prezzo, pp);
    						system ("pause");
    						system ("cls");
    						break;
    					    }
    					    else
    					    {
    					    	cout<<"Importo non valido. Riprova."<<endl;
    						}
    						system ("pause");
    						system ("cls");
    				}
    				break;
    			
    			case 2:
    				cout<<"Sto uscendo..."<<endl;
    				break;
    		}
    	}
    	while (r!=2);
    	system ("pause");
    	return 0;
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte