C++
Résolu
Locki
Messages postés
198
Date d'inscription
Statut
Membre
Dernière intervention
-
Pacorabanix Messages postés 3248 Date d'inscription Statut Membre Dernière intervention -
Pacorabanix Messages postés 3248 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'utilise Code Guear Borland C++ 2009 pour faire de la programmation. Je travaille avec des applications fiches VCL. Je suis en train de programmer une calculatrice et j'ai un problème.
Tout d'abord mon code:
http://www.cijoint.fr/cjlink.php?file=cj200912/cijpX4OOV8.txt
Lorsque je veut faire plusieurs additions, ça marche par contre pour les soustractions, les multiplications et les divisions, il n'affiche pas la bonne réponse.
Si vous pouviez m'aider à résoudre mon problème, ce serait sympa.
Locki
PS Je suis encore débutant en progammation alors ne soyez pas trop méchant avec mon code...
J'utilise Code Guear Borland C++ 2009 pour faire de la programmation. Je travaille avec des applications fiches VCL. Je suis en train de programmer une calculatrice et j'ai un problème.
Tout d'abord mon code:
http://www.cijoint.fr/cjlink.php?file=cj200912/cijpX4OOV8.txt
Lorsque je veut faire plusieurs additions, ça marche par contre pour les soustractions, les multiplications et les divisions, il n'affiche pas la bonne réponse.
Si vous pouviez m'aider à résoudre mon problème, ce serait sympa.
Locki
PS Je suis encore débutant en progammation alors ne soyez pas trop méchant avec mon code...
5 réponses
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).
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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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 .