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
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...

5 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
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 :
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).
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
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 :

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.
0
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
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
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660 > 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
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 ;)
0
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
ok merci
0
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
Alors, qqn a une aide pr moi???
0

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
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
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
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 .
0