CONVERTISSEUR

Messages postés
23
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
- - Dernière réponse : 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

Minilogus
Messages postés
23
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
-
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!... ^^
smartties
Messages postés
23
Date d'inscription
jeudi 11 mars 2010
Statut
Membre
Dernière intervention
1 septembre 2014
-
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
23
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
-
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...
Minilogus
Messages postés
23
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
-
//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
23
Date d'inscription
dimanche 31 janvier 2010
Statut
Membre
Dernière intervention
10 juin 2011
-
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;
}