CONVERTISSEUR

Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 - 11 mars 2010 à 18:55
thebroyeur Messages postés 7 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 8 mai 2010 - 16 mars 2010 à 19:39
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51429-convertisseur

thebroyeur Messages postés 7 Date d'inscription dimanche 10 décembre 2006 Statut Membre Dernière intervention 8 mai 2010 12
16 mars 2010 à 19:39
Tu pourrait mettre quelques commentaires ainsi que les spécifications des fonctions ( pré-requis, résultat, par exemple) Ceci facilite grandement la lecture et évite de se casser la tete lorsque l'on veu reprendre le code aprés une période d'inactivitée ;)
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
11 mars 2010 à 22:37
Voici un rectificatif global de ce que j'ai posté plus tôt.

//-------------------------------------------------------------------------------------

#include
#include <sstream>

int entier()
{
std::string saisie;
std::string verif;

bool good=1;
bool trouble=0;
int num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl;
}

}while(good==0);

return num;
}

double reel()
{
std::string saisie;
std::string verif;

size_t found;
bool good=1;
bool trouble=0;
double num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

found=saisie.find_first_of(",");
while (found!=std::string::npos)
{
saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
found=saisie.find_first_of(",",found+1);
}

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl;
}

}while(good==0);

return num;
}

int main()
{
std::cout<<">-------------------- CONVERTISSEUR D'ARGENT --------------------<"<<std::endl<<std::endl;

int quitter=0;
int choix;
double money;
double val;

std::cout<<"-> Etalonnage du programme <-"<<std::endl;
std::cout<<"-> Donner la correspondance d'un euro en dollar: ";
money=reel();
std::cout<<std::endl<<"<--------------------------->"<<std::endl<<std::endl;

do//pour le "quitter" de fin
{
std::cout<<"-------------------- MENU --------------------"<<std::endl<<std::endl;

std::cout<<" 1. Conversion euros -> dollars"<<std::endl;
std::cout<<" 2. Conversion dollars -> euros"<<std::endl<<std::endl;
std::cout<<" 0. ) Quitter ("<<std::endl;

std::cout<<std::endl<<"--> Choix: ";
do
{
choix=entier();
if(choix<0 || choix>2){std::cout<<std::endl<<"-> Le choix "<<choix<<" n'existe pas, ressaisissez: ";}
}while(choix<0 || choix>2);

if(choix==0)
{
std::cout<<std::endl<<">----------------------------------------------------------------<"<<std::endl<<std::endl;
return 0;
}

std::cout<<std::endl<<"Entrez la valeur que vous voulez convertir: ";
val=reel();

if(choix==1)
{
std::cout<<std::endl<<val<<" euros = "<<val*money<<" dollars";
}
else
{
std::cout<<std::endl<<val<<" dollars = "<<val/money<<" euros";
}

std::cout<<std::endl<<std::endl<<">----------------------------------------------------------------<"<<std::endl;
std::cout<<std::endl<<"--> Faire une autre conversion? (1=oui/0=non): ";
quitter=entier();
std::cout<<std::endl<<">----------------------------------------------------------------<"<<std::endl<<std::endl;
}while(quitter>0);
return 0;
}
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
11 mars 2010 à 20:36
//Oups, je me suis trompé dans les lignes de fin,

//j'ai mis:

std::cout<<std::endl<<"--> Faire un autre calcul d'incertitude? (1=oui/0=non): ";

//il faut remplacer par:

std::cout<<std::endl<<"--> Faire une autre conversion? (1=oui/0=non): ";

//^^.
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
11 mars 2010 à 20:28
Je n'ai pas vraiment de bon tuto à te proposer...

Les strings sont des chaînes permettant de stocker des caractères.

par ex:

std::string a;
a="Bonjour";// ne pas oublier les "".
std::cout<
#include <sstream>

int entier()
{
std::string saisie;
std::string verif;

bool good=1;
bool trouble=0;
int num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl;
}

}while(good==0);

return num;
}

double reel()
{
std::string saisie;
std::string verif;

size_t found;
bool good=1;
bool trouble=0;
double num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

found=saisie.find_first_of(",");
while (found!=std::string::npos)
{
saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
found=saisie.find_first_of(",",found+1);
}

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl;
}

}while(good==0);

return num;
}

int main()
{
std::cout<<">-------------------- CONVERTISSEUR D'ARGENT --------------------<"<<std::endl<<std::endl;

int quitter=0;
int choix;
double money;
double val;

std::cout<<"-> Etalonnage du programme <-"<<std::endl;
std::cout<<"-> 1 euro = ";
money=reel();
std::cout<<std::endl<<"<--------------------------->"<<std::endl<<std::endl;

do//pour le "quitter" de fin
{
std::cout<<"-------------------- MENU --------------------"<<std::endl<<std::endl;

std::cout<<" 1. Conversion euros -> dollards"<<std::endl;
std::cout<<" 2. Conversion dollards -> euros"<<std::endl<<std::endl;
std::cout<<" 0. ) Quitter ("<<std::endl;

std::cout<<std::endl<<"--> Choix: ";
do
{
choix=entier();
if(choix<0 || choix>2){std::cout<<std::endl<<"-> Le choix "<<choix<<" n'existe pas, ressaisissez: ";}
}while(choix<0 || choix>2);

if(choix==0)
{
std::cout<<std::endl<<">----------------------------------------------------------------<"<<std::endl<<std::endl;
return 0;
}

std::cout<<std::endl<<"Entrez la valeur que vous voulez convertir: ";
val=reel();

if(choix==1)
{
std::cout<<std::endl<<val<<" euros = "<<val*money<<" dollards";
}
else
{
std::cout<<std::endl<<val<<" dollards = "<<val/money<<" euros";
}

std::cout<<std::endl<<std::endl<<">----------------------------------------------------------------<"<<std::endl;
std::cout<<std::endl<<"--> Faire un autre calcul d'incertitude? (1=oui/0=non): ";
quitter=entier();
std::cout<<std::endl<<">----------------------------------------------------------------<"<<std::endl<<std::endl;
}while(quitter>0);
return 0;
}

// voilà, si tu as des questions n'hésite pas à m'en faire part...
smartties Messages postés 23 Date d'inscription jeudi 11 mars 2010 Statut Membre Dernière intervention 1 septembre 2014
11 mars 2010 à 20:09
Génial merci pour ces deux fonctions. parcontre je ne comprend pas comment marchent les string et comment les utiliser :
"std::istringstream iss(saisie);// conversion du type string en type double."
"std::ostringstream oss;"
est ce que sa serait possible d'avoir de tutoriels ou de explications ?
Minilogus Messages postés 21 Date d'inscription dimanche 31 janvier 2010 Statut Membre Dernière intervention 10 juin 2011 3
11 mars 2010 à 18:55
Bonjour,

L'idée de ton code est bien, toutefois il y a certains problèmes.

Ton programme n'est pas portable (présence de #include<windows.h> ===> on ne peut pas le compiler en l'état sous linux). Je n'ai rien contre ça, mais pour un programme qui ne fait que convertir un chiffre en un autre... Tu admettras que c'est un peu dommage.

Ensuite tu as tendance à mixer le C et le C++, c'est pas super super pour la lecture de ton code. Par exemple, au lieu des -> \n <- met plutôt des -> <<endl <- (si tu veux le faire en C++), autrement utilise -> printf <- à la place de -> cout <- si tu privilégie le C.

Il me semble que les valeurs de conversion varie avec le temps, à moins que je ne me trompe je n'ai pas vu ton programme gérer les cours fluctuants des monnaies, puisque tu as mis un -> double r = 1.36544; Tu as donc fixé la valeur, alors qu'il serait bon de la saisir afin "d'étalonner" le programme.

Pour finir ton programme ne gère pas vraiment les erreur de saisie (ex: si je tape * au lieu de 9 (les touches sont très proches))...

je te propose donc ces 2 fonctions que j'ai réalisé (elle sont en c++)

#include <sstream>

int entier()
{
std::string saisie;
std::string verif;

bool good=1;
bool trouble=0;
int num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl;
}

}while(good==0);

return num;
}

double reel()
{
std::string saisie;
std::string verif;

size_t found;
bool good=1;
bool trouble=0;
double num;

do
{
if(good==0)
{
std::cout<<std::endl<<"-> Saisie incorrecte, ressaisissez: ";
}

std::cin>>saisie;

found=saisie.find_first_of(",");
while (found!=std::string::npos)
{
saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
found=saisie.find_first_of(",",found+1);
}

std::istringstream iss(saisie);// conversion du type string en type double.
iss>>num;
if(iss.fail())
{
good=0;
trouble=1;
}
else
{
std::ostringstream oss;
oss<<num;
verif=oss.str();

if(verif.size() < saisie.size())
{
good=0;
trouble=1;
}
else{good=1;}
}

if(good==1 && trouble==1)
{
std::cout<<"-> OK!"<<std::endl<<std::endl;
}

}while(good==0);

return num;
}

// voilà

Au lieu de taper cin>>un_nombre;
tu tape un_nombre=entier();

Courage!... ^^
Rejoignez-nous