J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
-- ;-)
On Mon, 21 Mar 2005 19:14:47 +0100, "Rudy" <rudy.vogel@free.fr>:
J'aimerai faire une action en fonction du type de la variable enregistrée
avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec
std::getline() si possible, histoire de gérer le cas où l'utilisateur
tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un
flottant. Si la chaîne ne contient pas de point, c'est un entier. Si
elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que
vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ?
Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier,
mais il lui faut plus de 64 bits, et il y a peu de chances que ton
compilo supporte ça en natif. On peut le mettre dans un double, mais
avec perte de précision.
J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
-- ;-)
Rudy
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
En fait, il faudrait considérer le cas où il n'y a pas d'espace, ni de points ; la chaîne est soit un entier, soit des lettres ; il n'y a pas de risques de dépasser la capacité ; et il n'y a pas de cas tordus ;-)
En réalité, l'utilisateur, c'est moi ; et je risque juste de me tromper en tapant "(" au lieu de "5" par ex, étant donné que j'utilise un ordi portable sans pavé numérique ...
Wala wala !
Merci !
@+
Il te faut mettre les caractères tapés dans une chaîne (avec
std::getline() si possible, histoire de gérer le cas où l'utilisateur
tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un
flottant. Si la chaîne ne contient pas de point, c'est un entier. Si
elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que
vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ?
Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier,
mais il lui faut plus de 64 bits, et il y a peu de chances que ton
compilo supporte ça en natif. On peut le mettre dans un double, mais
avec perte de précision.
En fait, il faudrait considérer le cas où il n'y a pas d'espace, ni de
points ; la chaîne est soit un entier, soit des lettres ; il n'y a pas de
risques de dépasser la capacité ; et il n'y a pas de cas tordus ;-)
En réalité, l'utilisateur, c'est moi ; et je risque juste de me tromper en
tapant "(" au lieu de "5" par ex, étant donné que j'utilise un ordi portable
sans pavé numérique ...
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
En fait, il faudrait considérer le cas où il n'y a pas d'espace, ni de points ; la chaîne est soit un entier, soit des lettres ; il n'y a pas de risques de dépasser la capacité ; et il n'y a pas de cas tordus ;-)
En réalité, l'utilisateur, c'est moi ; et je risque juste de me tromper en tapant "(" au lieu de "5" par ex, étant donné que j'utilise un ordi portable sans pavé numérique ...
Wala wala !
Merci !
@+
Alexandre
"Fabien LE LEZ" a écrit dans le message de news:
On Mon, 21 Mar 2005 19:14:47 +0100, "Rudy" :
J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
en fait le + simple serait de faire faire le boulot au compilateur... Par exemple en créeant une classe héritant de basic_istream (ou du type exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >> utilisés par cin, en créeant une instance cin de cette classe (dans un espace de nom distinct de std, bien sur), ou encore en faisant une classe contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles l'opérateur sur std::cin ET tu affectes un membre à ta classe te permettant de connaitre le type. Pas simple finalement ;-)
qq chose comme :
namespace a_moi { class my_istream { enum TYPE {non_defini,BOOL, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE}; //--- à continuer... TYPE TypeVarEntree; public: TYPE GetType() const {return TypeVarEntree;} my_istream(){TypeVarEntree=non_defini;} }; my_stream cin;
my_stream& operator>>(my_istream& flux, int val) { std::cin>>val; TypeVarEntree=INT; } }
ou alors un truc en utilisant typeid pour gagner du temps...
Mais si qqn voit + simple / + efficace je suis preneur également !
"Fabien LE LEZ" <gramster@gramster.com> a écrit dans le message de news:
j67u311qcqi53tk47rbcs2fp7m7iddnlev@4ax.com...
On Mon, 21 Mar 2005 19:14:47 +0100, "Rudy" <rudy.vogel@free.fr>:
J'aimerai faire une action en fonction du type de la variable enregistrée
avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec
std::getline() si possible, histoire de gérer le cas où l'utilisateur
tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un
flottant. Si la chaîne ne contient pas de point, c'est un entier. Si
elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que
vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ?
Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier,
mais il lui faut plus de 64 bits, et il y a peu de chances que ton
compilo supporte ça en natif. On peut le mettre dans un double, mais
avec perte de précision.
en fait le + simple serait de faire faire le boulot au compilateur...
Par exemple en créeant une classe héritant de basic_istream (ou du type
exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >>
utilisés par cin, en créeant une instance cin de cette classe (dans un
espace de nom distinct de std, bien sur), ou encore en faisant une classe
contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles
l'opérateur sur std::cin ET tu affectes un membre à ta classe te permettant
de connaitre le type.
Pas simple finalement ;-)
qq chose comme :
namespace a_moi
{
class my_istream
{
enum TYPE {non_defini,BOOL, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE};
//--- à continuer...
TYPE TypeVarEntree;
public:
TYPE GetType() const {return TypeVarEntree;}
my_istream(){TypeVarEntree=non_defini;}
};
my_stream cin;
J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Il te faut mettre les caractères tapés dans une chaîne (avec std::getline() si possible, histoire de gérer le cas où l'utilisateur tape un espace) et analyser la chaîne en question.
Par exemple, si la chaîne contient un point, l'utilisateur a rentré un flottant. Si la chaîne ne contient pas de point, c'est un entier. Si elle en contient deux, c'est une erreur.
Mais ttention aux cas tordus : 1e+3 = 1000.0, pas de souci. Mais que vaut 1e3 ? 1000.0 ou 0x1e3 == 483 ? Et si l'utilisateur tape 123456789012345678901234 ? C'est un entier, mais il lui faut plus de 64 bits, et il y a peu de chances que ton compilo supporte ça en natif. On peut le mettre dans un double, mais avec perte de précision.
en fait le + simple serait de faire faire le boulot au compilateur... Par exemple en créeant une classe héritant de basic_istream (ou du type exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >> utilisés par cin, en créeant une instance cin de cette classe (dans un espace de nom distinct de std, bien sur), ou encore en faisant une classe contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles l'opérateur sur std::cin ET tu affectes un membre à ta classe te permettant de connaitre le type. Pas simple finalement ;-)
qq chose comme :
namespace a_moi { class my_istream { enum TYPE {non_defini,BOOL, CHAR, SHORT, INT, LONG, FLOAT, DOUBLE}; //--- à continuer... TYPE TypeVarEntree; public: TYPE GetType() const {return TypeVarEntree;} my_istream(){TypeVarEntree=non_defini;} }; my_stream cin;
my_stream& operator>>(my_istream& flux, int val) { std::cin>>val; TypeVarEntree=INT; } }
ou alors un truc en utilisant typeid pour gagner du temps...
Mais si qqn voit + simple / + efficace je suis preneur également !
Rudy
en fait le + simple serait de faire faire le boulot au compilateur... Par exemple en créeant une classe héritant de basic_istream (ou du type exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >> utilisés par cin, en créeant une instance cin de cette classe (dans un espace de nom distinct de std, bien sur), ou encore en faisant une classe contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles l'opérateur sur std::cin ET tu affectes un membre à ta classe te permettant de connaitre le type. [...]
Merci pur ces infos, mas vu que je ne connais pas encore les classes et que je préfère attendre de les voir en cours (je suis étudiant) pour apprendre leur système, je préfère éviter.
Il me semble avoir vu "isdigit", mais je n'ai pas trouvé comment l'utiliser dans mon cas précis ...
Merci !
@+
en fait le + simple serait de faire faire le boulot au compilateur...
Par exemple en créeant une classe héritant de basic_istream (ou du type
exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >>
utilisés par cin, en créeant une instance cin de cette classe (dans un
espace de nom distinct de std, bien sur), ou encore en faisant une classe
contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles
l'opérateur sur std::cin ET tu affectes un membre à ta classe te
permettant de connaitre le type.
[...]
Merci pur ces infos, mas vu que je ne connais pas encore les classes et que
je préfère attendre de les voir en cours (je suis étudiant) pour apprendre
leur système, je préfère éviter.
Il me semble avoir vu "isdigit", mais je n'ai pas trouvé comment l'utiliser
dans mon cas précis ...
en fait le + simple serait de faire faire le boulot au compilateur... Par exemple en créeant une classe héritant de basic_istream (ou du type exact de CIN, je sais plus trop), en redéfinissant tous les opérateurs >> utilisés par cin, en créeant une instance cin de cette classe (dans un espace de nom distinct de std, bien sur), ou encore en faisant une classe contenant std::cin (+ simple) ,et dans ces opérateurs, tu appelles l'opérateur sur std::cin ET tu affectes un membre à ta classe te permettant de connaitre le type. [...]
Merci pur ces infos, mas vu que je ne connais pas encore les classes et que je préfère attendre de les voir en cours (je suis étudiant) pour apprendre leur système, je préfère éviter.
Il me semble avoir vu "isdigit", mais je n'ai pas trouvé comment l'utiliser dans mon cas précis ...
Merci !
@+
Fabien LE LEZ
On Mon, 21 Mar 2005 20:44:27 +0100, "Rudy" :
mas vu que je ne connais pas encore les classes
Patience, c'est le programme de la deuxième heure de cours.
On Mon, 21 Mar 2005 20:44:27 +0100, "Rudy" <rudy.vogel@free.fr>:
mas vu que je ne connais pas encore les classes
Patience, c'est le programme de la deuxième heure de cours.
N'hésite pas à écrire "plus" en toutes lettres, ça ne coûte pas plus cher.
À part ça, ta solution ne me paraît pas répondre à la question, puisqu'elle présuppose qu'on connaît le type de la variable avant la saisie.
-- ;-)
Rudy
Patience, c'est le programme de la deuxième heure de cours.
LOL !!
Ben non vu que j'ai déjà fait 6 heures (peut-être 8, je sais plus ...). mais c'est sûr que la prof est trop lente !!! On commence à peine les sous-progs ; heureusement que j'ai vu les chaînes de caracs tout seul, je me serai ennuyé sinon ;-)
@+
Patience, c'est le programme de la deuxième heure de cours.
LOL !!
Ben non vu que j'ai déjà fait 6 heures (peut-être 8, je sais plus ...). mais
c'est sûr que la prof est trop lente !!! On commence à peine les sous-progs
; heureusement que j'ai vu les chaînes de caracs tout seul, je me serai
ennuyé sinon ;-)
Patience, c'est le programme de la deuxième heure de cours.
LOL !!
Ben non vu que j'ai déjà fait 6 heures (peut-être 8, je sais plus ...). mais c'est sûr que la prof est trop lente !!! On commence à peine les sous-progs ; heureusement que j'ai vu les chaînes de caracs tout seul, je me serai ennuyé sinon ;-)
@+
Fabien LE LEZ
On Mon, 21 Mar 2005 21:47:17 +0100, "Rudy" :
On commence à peine les sous-progs
De quoi s'agit-il ?
heureusement que j'ai vu les chaînes de caracs tout seul,
C'est cool. Encore un peu d'efforts et tu réussiras à écrire "caractères" en entier.
-- ;-)
On Mon, 21 Mar 2005 21:47:17 +0100, "Rudy" <rudy.vogel@free.fr>:
On commence à peine les sous-progs
De quoi s'agit-il ?
heureusement que j'ai vu les chaînes de caracs tout seul,
C'est cool. Encore un peu d'efforts et tu réussiras à écrire
"caractères" en entier.
Ben des programmes qui peuvent être utilisés dans d'autres pour effectuer certaines opérations, par exemple.
heureusement que j'ai vu les chaînes de caracs tout seul,
C'est cool. Encore un peu d'efforts et tu réussiras à écrire "caractères" en entier.
Je ne veux pas être méchant, mais tout le monde connaît "caracs" ! C'est pas non plus une abréviation que j'aie inventé ...
@+
Fabien LE LEZ
On Mon, 21 Mar 2005 19:14:47 +0100, "Rudy" :
J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Dans les langages de script comme PHP, les variables n'ont pas vraiment de type bien défini, une variable déclarée par $machin= "42"; peut être considérée comme un nombre à un endroit du programme, et comme une chaîne de caractères à un autre endroit. Du coup, on a besoin de deux opérateurs "additifs" : + (addition de nombres) et . (concaténation de chaînes)
En C++, au contraire, on a un typage très fort des variables. Une variable de type "entier signé" n'est pas une variable de type "chaîne de caractères" ni une variable de type "entier non signé". En particulier, le type d'une variable ne dépend pas de ce qui se passe pendant le fonctionnement du programme[*][**].
Du coup, si tu décides de lire des octets depuis l'entrée standard (cin) dans une chaîne, ta variable est une chaîne, point final. Tu peux éventuellement décider d'analyser cette chaîne pour savoir si elle contient uniquement des chiffres, voire obtenir une variable de type "entier" contenant la valeur associée à cette chaîne de ton point de vue.
[*] Il y a quelques subtilités, par exemple la différence entre type statique et type dynamique, mais tu verras ça dans... un bon bout de temps...
[**] Une conséquence est qu'on peut surcharger les fonctions et donc les opérateurs. En d'autres termes, le symbole "+" peut avoir des sens très différents suivant le type des variables qui se trouvent autour :
int entier1= 1; int entier2= 2; std::string chaine1= "1"; std::string chaine2= "2";
chaine1 + chaine2 est un std::string qui vaut "12" entier1 + entier2 est un int qui vaut 3
-- ;-)
On Mon, 21 Mar 2005 19:14:47 +0100, "Rudy" <rudy.vogel@free.fr>:
J'aimerai faire une action en fonction du type de la variable enregistrée
avec un cin.
Dans les langages de script comme PHP, les variables n'ont pas
vraiment de type bien défini, une variable déclarée par
$machin= "42";
peut être considérée comme un nombre à un endroit du programme, et
comme une chaîne de caractères à un autre endroit. Du coup, on a
besoin de deux opérateurs "additifs" : + (addition de nombres) et .
(concaténation de chaînes)
En C++, au contraire, on a un typage très fort des variables. Une
variable de type "entier signé" n'est pas une variable de type "chaîne
de caractères" ni une variable de type "entier non signé".
En particulier, le type d'une variable ne dépend pas de ce qui se
passe pendant le fonctionnement du programme[*][**].
Du coup, si tu décides de lire des octets depuis l'entrée standard
(cin) dans une chaîne, ta variable est une chaîne, point final. Tu
peux éventuellement décider d'analyser cette chaîne pour savoir si
elle contient uniquement des chiffres, voire obtenir une variable de
type "entier" contenant la valeur associée à cette chaîne de ton point
de vue.
[*] Il y a quelques subtilités, par exemple la différence entre type
statique et type dynamique, mais tu verras ça dans... un bon bout de
temps...
[**] Une conséquence est qu'on peut surcharger les fonctions et donc
les opérateurs. En d'autres termes, le symbole "+" peut avoir des sens
très différents suivant le type des variables qui se trouvent autour :
int entier1= 1;
int entier2= 2;
std::string chaine1= "1";
std::string chaine2= "2";
chaine1 + chaine2 est un std::string qui vaut "12"
entier1 + entier2 est un int qui vaut 3
J'aimerai faire une action en fonction du type de la variable enregistrée avec un cin.
Dans les langages de script comme PHP, les variables n'ont pas vraiment de type bien défini, une variable déclarée par $machin= "42"; peut être considérée comme un nombre à un endroit du programme, et comme une chaîne de caractères à un autre endroit. Du coup, on a besoin de deux opérateurs "additifs" : + (addition de nombres) et . (concaténation de chaînes)
En C++, au contraire, on a un typage très fort des variables. Une variable de type "entier signé" n'est pas une variable de type "chaîne de caractères" ni une variable de type "entier non signé". En particulier, le type d'une variable ne dépend pas de ce qui se passe pendant le fonctionnement du programme[*][**].
Du coup, si tu décides de lire des octets depuis l'entrée standard (cin) dans une chaîne, ta variable est une chaîne, point final. Tu peux éventuellement décider d'analyser cette chaîne pour savoir si elle contient uniquement des chiffres, voire obtenir une variable de type "entier" contenant la valeur associée à cette chaîne de ton point de vue.
[*] Il y a quelques subtilités, par exemple la différence entre type statique et type dynamique, mais tu verras ça dans... un bon bout de temps...
[**] Une conséquence est qu'on peut surcharger les fonctions et donc les opérateurs. En d'autres termes, le symbole "+" peut avoir des sens très différents suivant le type des variables qui se trouvent autour :
int entier1= 1; int entier2= 2; std::string chaine1= "1"; std::string chaine2= "2";
chaine1 + chaine2 est un std::string qui vaut "12" entier1 + entier2 est un int qui vaut 3