C++
Résolu/Fermé
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
-
16 déc. 2009 à 20:28
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 27 déc. 2009 à 02:06
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 27 déc. 2009 à 02:06
5 réponses
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
25 déc. 2009 à 23:06
25 déc. 2009 à 23:06
Voilà un schéma qui pourrait être utile. Je ne prétends pas qu'il soit le meilleur possible, mais il devrait surement t'aider à clarifier ton programme.
Tu crées une nouvelle classe (Appelons-là Calculette)
tu l'instancieras dans ton programme :
Tes boutons se chargeront d'appeler des méthodes publiques de cette classe, et c'est les méthodes internes (private) de la classe qui se chargeront de faire tout ce qui est "cuisine interne".
Tu as besoin de :
(prototypes des méthodes publiques)
* Pouvoir entrer un nombre (le premier ou le deuxième)
* Pouvoir entrer une opération
* Pouvoir exécuter le calcul et recevoir le résultat
Pour ton problème de signe, qui peut-être cause l'erreur, ne peux-tu pas faire un Conversion string -> double, faire le double *(-1), conversion double -> string ? Ou éventuellement tu crées une méthode "changerSigne()" dans ta classe, qui s'occupera de mettre une variable bool à true ou false, et le bon signe sera choisi à l'aide de cette variable private dans les méthodes entrerNbX() )
quoiqu'il en soit avec le signe, voici à quoi ressembleront tes évènements de boutons:
Cliquer sur une opération fait exécuter :
cliquer sur égal fait exécuter :
Ensuite, je te laisse imaginer le contenu de ces méthodes afin de prévoir diverses erreurs et réaliser l'opération.
N'oublie pas de prévoir un petit constructeur pour initialiser tout à zéro.
Tu auras en tout cas ces variables private:
double nombre1, nombre2;
typeenum operation;
Tu pourrais utiliser des variables private bool qui diraient si un nombre valide est bien entré (le premier et le deuxième). Ces variables seraient vérifiées dans la méthode resultat().
Tu peux essayer de prévoir les erreurs éventuelles, selon si tu arrives ou pas à convertir ta string en double dans les méthodes entrerNbX().
Une manière de faire toute bête serait, en cas d'erreur, de mettre le nombre en question à "NaN" en interne. (Not A Number).
Tu crées une nouvelle classe (Appelons-là Calculette)
tu l'instancieras dans ton programme :
Calculette taCalculette;
Tes boutons se chargeront d'appeler des méthodes publiques de cette classe, et c'est les méthodes internes (private) de la classe qui se chargeront de faire tout ce qui est "cuisine interne".
Tu as besoin de :
(prototypes des méthodes publiques)
* Pouvoir entrer un nombre (le premier ou le deuxième)
void Calculette::entrerNb1(string) void Calculette::entrerNb2(string)
* Pouvoir entrer une opération
void Calculette::entrerOp(? un type enum serait le mieux pour le paramètre, déclaré dans la classe)
* Pouvoir exécuter le calcul et recevoir le résultat
string Calculette::resultat(void)
Pour ton problème de signe, qui peut-être cause l'erreur, ne peux-tu pas faire un Conversion string -> double, faire le double *(-1), conversion double -> string ? Ou éventuellement tu crées une méthode "changerSigne()" dans ta classe, qui s'occupera de mettre une variable bool à true ou false, et le bon signe sera choisi à l'aide de cette variable private dans les méthodes entrerNbX() )
quoiqu'il en soit avec le signe, voici à quoi ressembleront tes évènements de boutons:
Cliquer sur une opération fait exécuter :
TaCalculette.entrerNb1( ce qui est dans la textbox); TaCalculette.entrerOp( le code de l'opération );
cliquer sur égal fait exécuter :
TaCalculette.entrerNb2( ce qui est dans la textbox); double res = TaCalculette.resultat(); //puis tu affiches le résultat dans ta textbox
Ensuite, je te laisse imaginer le contenu de ces méthodes afin de prévoir diverses erreurs et réaliser l'opération.
N'oublie pas de prévoir un petit constructeur pour initialiser tout à zéro.
Tu auras en tout cas ces variables private:
double nombre1, nombre2;
typeenum operation;
Tu pourrais utiliser des variables private bool qui diraient si un nombre valide est bien entré (le premier et le deuxième). Ces variables seraient vérifiées dans la méthode resultat().
Tu peux essayer de prévoir les erreurs éventuelles, selon si tu arrives ou pas à convertir ta string en double dans les méthodes entrerNbX().
Une manière de faire toute bête serait, en cas d'erreur, de mettre le nombre en question à "NaN" en interne. (Not A Number).
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
16 déc. 2009 à 22:49
16 déc. 2009 à 22:49
Bonjour,
je ne connais pas trop la bibliothèque que tu utilises.
Néanmoins, je pense que tu es, et c'est normal puisque tu es débutant, victime de la mauvaise conception de ton code.
Dans l'idéal il faudrait séparer l'affichage dans des cases des calculs. Mais il faut surtout absolument éviter d'avoir des code "doublons" qui sont plus ou moins censés faire la même chose :
et juste après :
j'ai l'impression que tu fais une addition à chaque fois là... Je peux me tromper bien sûr, mais essaye de tout regrouper en une fonction "Calcul(int numopération)' qui exécute le calcul par exemple, et les clics sur les divers boutons ne font que modifier par exemple les variables nombre et nombre2. Dans l'idéal même : une classe qui s'occupe des calculs et une autre classe (qui pourrait être ta classe principale de ton programme qui s'ocuppe de l"'interface" (gestion des évènements avec les boutons, affichage, etc...)
Ce n'est qu'une suggestion possible, il y a surement d'encore meilleures conception que cela, mais un truc de ce goût serait un rempart contre les bugs qui t'arrivent. Et cela permet de modifier plus facilement son code pour la suite.
je ne connais pas trop la bibliothèque que tu utilises.
Néanmoins, je pense que tu es, et c'est normal puisque tu es débutant, victime de la mauvaise conception de ton code.
Dans l'idéal il faudrait séparer l'affichage dans des cases des calculs. Mais il faut surtout absolument éviter d'avoir des code "doublons" qui sont plus ou moins censés faire la même chose :
void __fastcall TMain::btEgalClick(TObject *Sender) { if (operateurEnCours == 1) // Plus { edNombre->Text = resultatFinal + edNombre->Text.ToDouble(); nombre = 0; nombre2 = 0; } if (operateurEnCours == 2) // Moins { edNombre->Text = resultatFinal - edNombre->Text.ToDouble(); nombre = 0; nombre2 = 0; } if (operateurEnCours == 3) // Fois { edNombre->Text = resultatFinal * edNombre->Text.ToDouble(); nombre = 0; nombre2 = 0; } if (operateurEnCours == 4) // Divisé { edNombre->Text =resultatFinal / edNombre->Text.ToDouble(); nombre = 0; nombre2 = 0; } }
et juste après :
void __fastcall TMain::btMoinsClick(TObject *Sender) { operateurEnCours = 2 ; resultatFinal = resultatFinal + edNombre->Text.ToDouble(); nombre = edNombre->Text; edNombre->Text = "0"; nombre2 = edNombre->Text; } //--------------------------------------------------------------------------- void __fastcall TMain::btFoisClick(TObject *Sender) { operateurEnCours = 3; // Fois resultatFinal = resultatFinal + edNombre->Text.ToDouble(); nombre = edNombre->Text; edNombre->Text = "0"; nombre2 = edNombre->Text; } //--------------------------------------------------------------------------- void __fastcall TMain::btDiviseClick(TObject *Sender) { operateurEnCours = 4 ; // Divisé resultatFinal = resultatFinal + edNombre->Text.ToDouble(); nombre = edNombre->Text; edNombre->Text = "0"; nombre2 = edNombre->Text; } ...
j'ai l'impression que tu fais une addition à chaque fois là... Je peux me tromper bien sûr, mais essaye de tout regrouper en une fonction "Calcul(int numopération)' qui exécute le calcul par exemple, et les clics sur les divers boutons ne font que modifier par exemple les variables nombre et nombre2. Dans l'idéal même : une classe qui s'occupe des calculs et une autre classe (qui pourrait être ta classe principale de ton programme qui s'ocuppe de l"'interface" (gestion des évènements avec les boutons, affichage, etc...)
Ce n'est qu'une suggestion possible, il y a surement d'encore meilleures conception que cela, mais un truc de ce goût serait un rempart contre les bugs qui t'arrivent. Et cela permet de modifier plus facilement son code pour la suite.
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
13
17 déc. 2009 à 18:35
17 déc. 2009 à 18:35
Merci Pacorabanix de bien vouloir m'aider.
Pour ton impression sur l'addition, c'est tout simplement quesi je met:
resultatFinal - edNombre->text.toDouble();
pour le bouton moins:
void __fastcall TMain::btMoinsClick(TObject *Sender)
{
operateurEnCours = 2 ;
resultatFinal = resultatFinal - edNombre->Text.ToDouble();
nombre = edNombre->Text;
edNombre->Text = "0";
nombre2 = edNombre->Text;
}
Alors lorsque je lance le programme (compilation), et que je fais: 10 - 3, il va me donner, comme réponse, -13 parce qu'il fait en fait 10 + 3 et il change le signe (10 + 3 = +13 => rép. du prog: -13).
Le seul moyen qui marche et que j'ai trouvé c'est de mettre un + (resultatFinal + edNombre->text.toDouble();).
Si tu as une autre suggestion, c'est avec plaisir
Pour ton impression sur l'addition, c'est tout simplement quesi je met:
resultatFinal - edNombre->text.toDouble();
pour le bouton moins:
void __fastcall TMain::btMoinsClick(TObject *Sender)
{
operateurEnCours = 2 ;
resultatFinal = resultatFinal - edNombre->Text.ToDouble();
nombre = edNombre->Text;
edNombre->Text = "0";
nombre2 = edNombre->Text;
}
Alors lorsque je lance le programme (compilation), et que je fais: 10 - 3, il va me donner, comme réponse, -13 parce qu'il fait en fait 10 + 3 et il change le signe (10 + 3 = +13 => rép. du prog: -13).
Le seul moyen qui marche et que j'ai trouvé c'est de mettre un + (resultatFinal + edNombre->text.toDouble();).
Si tu as une autre suggestion, c'est avec plaisir
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
>
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
17 déc. 2009 à 19:38
17 déc. 2009 à 19:38
je vais y réfléchir ce w-e, là j'ai pas trop le temps.
si personne d'autre ne t'a répondu entre-temps, pense à faire un "up" du sujet (en y répondant) ce dimanche ou plus tard pour éviter que je ne l'oublie ;)
si personne d'autre ne t'a répondu entre-temps, pense à faire un "up" du sujet (en y répondant) ce dimanche ou plus tard pour éviter que je ne l'oublie ;)
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
13
17 déc. 2009 à 19:54
17 déc. 2009 à 19:54
ok merci
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
13
21 déc. 2009 à 18:08
21 déc. 2009 à 18:08
Alors, qqn a une aide pr moi???
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Locki
Messages postés
198
Date d'inscription
mardi 8 décembre 2009
Statut
Membre
Dernière intervention
2 juillet 2013
13
26 déc. 2009 à 17:32
26 déc. 2009 à 17:32
Merci a toi de m'avoir répondu mais le problème c'est que je n'ai pas encore vu le type enum.
Si tu pouvais m'expliquer ce type ce seait très sympa de ta part vu que sous google c'est des explications auxquelles je n'ai pas compris.
Si tu connaitrais un tuto ou un site ou il explique en détail les différents types.
Merci beaucoup pour ton post, il va surement m'aider.
Locki
Si tu pouvais m'expliquer ce type ce seait très sympa de ta part vu que sous google c'est des explications auxquelles je n'ai pas compris.
Si tu connaitrais un tuto ou un site ou il explique en détail les différents types.
Merci beaucoup pour ton post, il va surement m'aider.
Locki
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
661
27 déc. 2009 à 02:06
27 déc. 2009 à 02:06
ok, si tu n'as pas vu le type enum, ce n'est pas grave. C'est juste des constantes. tu peux simplement à la place mettre "int". Et décides (clairement) au début du programme d'associer par exemple 1 à l'addition, 2 à la soustraction, 3 à la multiplication, etc...
Le mieux est de faire des constantes et de n'utiliser que ces constantes dans ton programme, un truc comme :
const int CODE_ADDITION = 1, CODE_SOUSTRACTION = 2, ...
et ensuite n'utilise que ces constantes et jamais directement les nombres "1", "2", etc... ça t'évitera des erreurs et des oublis .
Le mieux est de faire des constantes et de n'utiliser que ces constantes dans ton programme, un truc comme :
const int CODE_ADDITION = 1, CODE_SOUSTRACTION = 2, ...
et ensuite n'utilise que ces constantes et jamais directement les nombres "1", "2", etc... ça t'évitera des erreurs et des oublis .