PDA

Visualizza la versione completa : c++ problema valore sentinella


aleye
24-12-2012, 18:34
Salve a tutti, colgo l'occasione per augurare a tutti voi un felice natale.
Vi propongo il mio SEMPLICE problema:devo creare un programmino che calcoli il rapporto chilometri/litro di benzina mandati dall'untente in input da tastiera.Infine devo fare la media tra tutti i risultati ottenuti.
Vi propongo il mio codice:

#include <iostream>
#include <iomanip>
main()
{
using namespace std;

int contatore=0, a, b, somma=0;
double c, m;


while(a != -1)
{
cout<<"\ndigita la benzina usata(-1 per terminare): "<<endl;
cin>>a;
cout<<"digita i kilometri fatti: "<<endl;
cin>>b;
cout<<"\nla benzina usata : "<<a<<endl;
cout<<"i kilometri fatti sono: "<<b<<endl;
c = static_cast< double >(a)/ b;
somma += c;
contatore++;
}
m= static_cast<double>(somma)/contatore;
cout<<"\nla media del rapporto benzina/kilometri e' : "<<setprecision(2)
<< setiosflags(ios::fixed | ios::showpoint)<<m<<endl;

return 0;
}

Il problema il seguente, nel momento il cui digito il valore sentinella, che sarebbe "a" e quindi -1, mi continua a far digitare b.Qualcuno riesce a spiegarmi il perch, e come dovrebbe essere il codice corretto?grazie a tutti.

oregon
24-12-2012, 19:27
L'input di b segue quello di a mentre il controllo avviene al "giro" seguente.
Quindi il comportamento del programma corretto.

Se vuoi che il valore -1 interrompa il ciclo devi testarlo subito dopo l'input con una if.

aleye
24-12-2012, 19:48
#include <iostream>
#include <iomanip>
main()
{
using namespace std;

int contatore=0, a, b, somma=0;
double c, m;


while(a != -1)
{
cout<<"\ndigita la benzina usata(-1 per terminare): "<<endl;
cin>>a;
if(a==-1)
break;
cout<<"digita i kilometri fatti: "<<endl;
cin>>b;
cout<<"\nla benzina usata : "<<a<<endl;
cout<<"i kilometri fatti sono: "<<b<<endl;
c = static_cast< double >(a)/ b;
somma += c;
contatore++;
}
m= static_cast<double>(somma)/contatore;
cout<<"\nla media del rapporto benzina/kilometri e' : "<<setprecision(2)
<< setiosflags(ios::fixed | ios::showpoint)<<m<<endl;

return 0;
}

quindi il codice dovrebbe essere questo?ora per mi da sempre zero quando faccio il calcolo della media, non riesco ad individuaro l'errore.

oregon
24-12-2012, 20:06
Originariamente inviato da aleye
ora per mi da sempre zero quando faccio il calcolo della media

Questo un altro problema.

Tu accumuli valori double in una variabile intera ... normale che perdi precisione nel calcolo.

La variabile somma non pu essere intera.

aleye
24-12-2012, 20:17
grazie mille oregon, sono riuscito a risolvere.

Loading