Bon exemple de calculatrice

Soyez le premier à donner votre avis sur cette source.

Vue 2 322 fois - Téléchargée 695 fois

Description

Il y a de nombreux codes sources de calculatrices en C# ou VB.Net.

Les projets de calculatrices, sont des exercices de débutant.
Les codes que l'ont trouve, reflètent donc le niveau du codeur à ce moment de sa formation.
Par conséquent, ces codes présentent tous (enfin ceux que j'ai regardé) des défauts de débutants.
Ils sont généralement fonctionnels, et répondent certainement à la demande du professeur ou cours en ligne que suit le débutant.
Mais CodeS SourceS n'a pas vocation à montrer le résultat d'un exercice.
CodeS SourceS a vocation à montrer ce qu'il faudrait faire.

Ces codes enfreignent souvent quelques précepts généraux de la programmation.
Le principal est la duplication de code.
Il y a un code complet pour la touche "0", et un code pour la touche "1" etc...
Cependant au chiffre près ces codes sont identiques.
On a donc 10 codes quasiments identiques, ça prend du temps à écrire et s'il y a une erreur, il faudra la corriger 10 fois.
Il faut donc factoriser ce code de façon à avoir en paramètre le chiffre à saisir.
Un autre principe souvent oublié est la réutisabilité du code.
En effet, souvent le code est directement écrit dans l'interface, si on veut faire une autre calcultrice et bien on ne pourra pas réutiliser le code directement.
Il faudra en copier un bout ici et en réécrire un bout là.

De plus, C# et VB.Net sont des langages objets, et là encore des principes de la programmation objet ne sont pas appliqués.
Bien souvent, il n'y a pas d'objet métier (c'est l'idée de base....)
En plus un objet métier bien écrit, résout automatiquement les problèmes de duplication et de réutilisabilité.

C'est ce que je veux montrer avec ce dépôt.

Il y a un projet "dll" qui contient le code métier, la dll c'est pas obligé, mais comme j'ai fait 3 interfaces différentes, c'était plus simple.
Pour les interfaces, il y en à une en mode console (pas très ergonomique, ça reste un exemple et une calculatrice en mode console, n'a pas vraiment d'intêret), une en Winform et une en WPF.
Dans l'interface Winform les "chiffres" pointent tous vers une seule méthodes coté interface, idem pour les opérateurs.
Dans l'interface WPF, j'ai factorisé un peu plus, tous les boutons pointent vers une méthode unique.
Pour choisir quelle interface lancer, il faut définir le projet de démarage avec un clic droit sur le nom du projet dans l'explorateur de solution.


Il y a un autre point qui me chagrine dans les dépots de débutants.
La saisie est construite comme du texte, on ajoute un caractère, puis un autre ect...
Sans être un défaut, ça ne me parrait pas logique, on calcule avec des nombres pas du texte.
Et puis si on construit le texte avec un point comme symbole décimal, il faut gérer les pc ou c'est la virgule qui est utilisée.
Aussi, il faut vérifier qu'un point n'a pas déjà été saisi.
J'ai donc construis ma saisie avec des nombres, et bindé l'affichage pour les interfaces fenétrées, comme ça pas de soucis avec le symbole décimal.

Cet exemple n'est pas complet, il ne montre que les 4 opérations de base.
On pourrait le recoder de 1000 façons différentes, tout en appliquant correctement les principes que j'ai cité.
Mais c'est un exemple de "ce qu'il faudrait faire".

Mise à jour du 21/06/2019 => prise en compte des remarques de pascal16m.

Mise à jour du 29/06/2019, suite aux nouvelles remarques de pascal16m sur le problème de précision des doubles:
-changement de la façon de calculer le nombre en cours de saisie, il n'est plus calculé au fur est à mesure en fonction du résultat précédent, mais recalculé entièrement à chaque frappe (utlisation de 2 listes de int)
-limitation à 16 chiffres significatifs, ce qui permet quand même de saisir de 0,00000000000001 à 9999999999999999, en passant par exemple par 12345678,12345678, ce qui est je pense amplement suffisant pour un exemple destiné aux débutants.

Si vous voulez plus d'informations sur les doubles, vous pouvez jetter un oeil à cette discussion (notamment les réponses de Revivax et Dalfab), et à l'article wikipédia que je cite.
Pour effectuer des calculs avec une meilleure précision, on peut utiliser le type Decimal, qui reste un nombre à virgule flottante mais codé sur 64bits.
Ou pour les très grands nombres ou les très petits nombres utiliser ou écrire des classes dédiées.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
14719
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Oui, mais on déborderait du cadre que je me suis fixé.
Ça doit rester un exemple incomplet, sinon le premier malin venu le vendrait à son prof comme son propre projet.
Messages postés
69
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
22 décembre 2019

j'ai rechargé la code et maintenant l'affichage est nickel et le bug disparu. Le code téléchargé hier datait du 02/06/2019 avec un nom commençant par 102400-0-...

Ca serait bien de pouvoir enchaîner les calculs à partir du résultat quand on a fait "=" et une touche RAZ .
Messages postés
14719
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Ha il doit y avoir un soucis avec le cash du site (c'est un des bugs connus et remonté depuis longtemps) car il n'y a plus de coefDecimal, et quand on explore le code direct sur le site, on le constate



J'ai rechargé le zip, et l'ai téléchargé dans la foulée, ça a l'air bon
Messages postés
69
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
22 décembre 2019

le bug de départ persiste :
il faut un long pour coefDecimal car il retient 10^n et pas seulement n.
Du coup, on dépasse la capacité de cette variable sans erreur.

C'est ce dépassement de capacité qui pouvait générer un entier négatif dont le log plantait.

Tu peux être à la fois précis mathématiquement et dans la conversion binaire/décimale en ajoutant une notion de "précision" dans le programme pour formater les sorties vois générer une erreur de précision dans les calculs du type 1/3+1/100000000000000000000-1/3.
Messages postés
14719
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Voilà, c'est à jour
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.