Rechercher
Résultats par :
Recherche avancée
Qui est en ligne ?
Il y a en tout 4 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 4 Invités

Aucun

Voir toute la liste


Partagez
Voir le sujet précédentAller en basVoir le sujet suivant
Posting Freak
Messages : 1188
Date d'inscription : 2004-12-09
Voir le profil de l'utilisateurhttp://langagelinotte.free.fr/

[moyen] [résolu] Calculatrice

le Fri 26 Nov - 14:13
Voici un défi assez simple mais intéressant :

Vous devez créer un calculatrice comme celle de Windows par exemple :

<!-- m --><a class="postlink" href="http://www.tutoriaux-excalibur.com/forum-7/la-calculatrice-de-windows-7-est-bien-plus-performante-t1050.html">http://www.tutoriaux-excalibur.com/foru ... t1050.html</a><!-- m -->

A vos claviers <!-- s:) --><img src="{SMILIES_PATH}/smile.gif" alt="Smile" title="Smile" /><!-- s:) -->
Member
Messages : 83
Date d'inscription : 2014-07-12
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Mon 26 Oct - 19:02
Voici la surprise que j'avais promis, en un peu moins de 90 lignes de code  Smile

Calculatrice Linotte version : 1.0.1

J'ai utilisé comme point de départ, le programme placement_grille.liv dans b_tutoriels/h_interfaces_utilisateur

Il semble qu'il y a quatre façons de faire la Calculatrice Linotte :
- soit par un système de lecture des données de l'écran ;
- soit avec un système de mémoire tampon ;
- soit avec un système de base de donnée ;
- ou soit en combinant les trois systèmes.

La version 1.0.1 est ma première version de calculatrice fonctionnelle.
Elle est développée sur la combinaison d'un système de lecture des données de l'écran de la calculatrice,
d'un système de base de donnée rudimentaire utilisant le conduit,
et d'un système de mémoire tampon.

Reste à ajouter :
- une fonction de correction ;
- une fonction de remise à zéro ;
- et un système de gestion des erreurs.

Code:

/*Calculatrice Linotte version : 1.0.1
auteur : XP Rico
date : le 26 octobre 2015

J'ai utilisé comme point de départ, le programme placement_grille.liv dans b_tutoriels/h_interfaces_utilisateur

Il semble qu'il y a quatre façons de faire la Calculatrice Linotte :
- soit par un système de lecture des données de l'écran ;
- soit avec un système de mémoire tampon ;
- soit avec un système de base de donnée ;
- ou soit en combinant les trois systèmes.

La version 1.0.1 est ma première version de calculatrice fonctionnelle.
Elle est développée sur la combinaison d'un système de lecture des données de l'écran de la calculatrice,
d'un système de base de donnée rudimentaire utilisant le conduit,
et d'un système de mémoire tampon.

Reste à ajouter :
- une fonction de correction ;
- une fonction de mise zéro ;
- et un système de gestion des erreurs.
*/
globale
 formulaire est un formulaire, titre vaut "Calculatrice Linotte avec un gestionnaire de placement", largeur vaut 250, hauteur vaut 200
 panneau est un panneau
 calculatrice est une grille, largeur vaut 1, hauteur vaut 2
 écran est un champ, taille vaut 30, texte vaut ""
 touches est une grille, largeur vaut 4, hauteur vaut 3
 l1 est un bouton, texte vaut "1", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "1"
 l2 est un bouton, texte vaut "2", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "2"
 l3 est un bouton, texte vaut "3", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "3"
 l4 est un bouton, texte vaut "4", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "4"
 l5 est un bouton, texte vaut "5", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "5"
 l6 est un bouton, texte vaut "6", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "6"
 l7 est un bouton, texte vaut "7", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "7"
 l8 est un bouton, texte vaut "8", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "8"
 l9 est un bouton, texte vaut "9", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "9"
 l0 est un bouton, texte vaut "0", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "0"
 lp est un bouton, texte vaut "+"
 lm est un bouton, texte vaut "-"
 lf est un bouton, texte vaut "*"
 ld est un bouton, texte vaut "/"
 lé est un bouton, texte vaut "=", touche vaut "=", couleurfond vaut "vert", couleurtexte vaut "ébène", icône vaut "", infobulle vaut "="
 lv est un bouton, texte vaut ".", touche vaut ".", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut ","
 lc est un bouton, texte vaut "c", touche vaut "c", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Effacer"
 sortien est un texte
 conteneur est un conduit
 localisation est un texte valant "c:/temp/Calculatrice_linotte.txt"

Bd Calculatrice Linotte :
 conteneur.enregistrer(localisation)
 conteneur.fermer()
 parcours formulaire

formulaire :
 ajoute calculatrice dans formulaire // A faire en premier !
 ajoute écran dans calculatrice
 ajoute panneau dans calculatrice
 ajoute touches dans panneau // A faire en premier !
 ajoute l1 & l2 & l3 & lc & lp & lm & l4 & l5 & l6 & lv & lf & ld & l7 & l8 & l9 & l0 & lé dans panneau
 fais réagir lc à "clic souris" pour correction
 fais réagir Formulaire à "clic souris" pour Terminer
 fais réagir lp & lm & lf & ld & lé à "clic souris" pour opération arithmétique
 fais réagir lé à "clic souris" pour égal
 fais réagir l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9 & l0 & lv à "clic souris" pour ajouter chiffre
 fais réagir lp & lm & lf & ld à "clic souris" pour ajouter signe
 tant que vrai temporise

ajouter chiffre :
 * b est un bouton
 début
 texte de écran vaut texte de écran + texte de b
 reviens

ajouter signe :
 * b est un bouton
 début
 si (texte de écran) = "",
 texte de écran vaut "0 " + texte de b
 sinon texte de écran vaut texte de écran + " " + texte de b + " "
 reviens

opération arithmétique :
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 sortien vaut sortien + " " + tampon
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

/* On va simplifier le code en réunissant, en une seule, les fonctions :
- d'addition, de soustraction, de multiplication et de division.

addition :
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 affiche tampon //affichage de contrôle pour la construction à effacer plus tard
 // variante pour effacer l'écran entre deux opération : ligne : texte de écran vaut ""
 sortien vaut sortien + " " + tampon
 parcours écriture
 reviens

soustraction :
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0"
 tampon = texte@écran
 affiche tampon //affichage de contrôle pour la construction à effacer plus tard
 // variante pour effacer l'écran entre deux opération : ligne : texte de écran vaut ""
 sortien vaut sortien + " " + tampon
 parcours écriture
 reviens

multiplication :
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 affiche tampon //affichage de contrôle pour la construction à effacer plus tard
 // variante pour effacer l'écran entre deux opération : ligne : texte de écran vaut ""
 sortien vaut sortien + " " + tampon
 parcours écriture
 reviens

division:
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 affiche tampon //affichage de contrôle pour la construction à effacer plus tard
 // variante pour effacer l'écran entre deux opération : ligne : texte de écran vaut ""
 sortien vaut sortien + " " + tampon
 parcours écriture
 reviens
*/

égal :
 calcul est un texte
 début
 calcul prend texte@écran
 évalue calcul
 texte de écran vaut "" // pour effacer l'écran entre deux opérations
 texte de écran prend calcul // affiche le résultat sur l'écran de la calculatrice
 reviens

correction :
// partie non fonctionnelle

Terminer :
 termine

J'aurais préféré la terminer complément, mais autant ne pas faire durer le suspens trop longtemps lol!

Pour faire une comparaison avec d'autre programme, voir :
http://www.tutomobile.fr/faire-une-application-calculette-tutoriel-iphone-n%C2%B04/06/08/2010/
http://www.tutomobile.fr/faire-une-application-calculatrice-tuto-android-n%C2%B06/30/06/2010/
https://openclassrooms.com/courses/apprenez-a-programmer-en-java/tp-une-calculatrice

Et voilà mon premier défi relevé...


Dernière édition par XP Rico le Tue 27 Oct - 12:47, édité 1 fois
avatar
Site Admin
Messages : 1036
Date d'inscription : 2011-11-03
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Tue 27 Oct - 10:35
Bravo et beau travail !
Vivement la version finale !
Member
Messages : 83
Date d'inscription : 2014-07-12
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Wed 28 Oct - 19:01
J'ai presque finis, il me manque à faire simplement une fonction correctrice.

Mais j'ai découvert un bug avec la virgule (en fait un point Wink : "."), lorsqu'on essaie de faire un calcul avec elle, elle ne conserve dans le calcul que les chiffres qui sont après la virgule.

Autrement dit, si on calcule 1.2 * 2, on n'obtiendra pas 2.4 mais 4.

Ce bug ne permet pas aussi un certain nombre de calcul comme :
12 / 0.2 ; 12 * 0.2 ; 12 - 0.2 ; ou encore 12 + 0.2 .

Un message d'erreur apparaît alors sur l'écran de la calculatrice. scratch

Code:
/*Calculatrice Linotte version : 1.0.4
auteur : XP Rico
date : 28 octobre 2015

J'ai utilisé comme point de départ, le programme placement_grille.liv dans b_tutoriels/h_interfaces_utilisateur

Il semble qu'il y a quatre façons de faire la Calculatrice Linotte :
- soit par un système de lecture des données de l'écran ;
- soit avec un système de mémoire tampon ;
- soit avec un système de base de donnée ;
- ou soit en combinant les trois systèmes.

La version 1.0.1 est la première version de calculatrice fonctionnelle.
Elle est développée sur la combinaison d'un système de lecture des données de l'écran de la calculatrice,
d'un système de base de donnée rudimentaire utilisant le conduit,
et d'un système de mémoire tampon.

Ajout :
- une fonction de remise à zéro ;
- et une gestion des erreurs de division finale et une gestion des erreurs généraliste.

Reste à finir : la fonction de correction.
*/
globale
 formulaire est un formulaire, titre vaut "Calculatrice Linotte avec un gestionnaire de placement", largeur vaut 250, hauteur vaut 200
 panneau est un panneau
 calculatrice est une grille, largeur vaut 1, hauteur vaut 2
 écran est un champ, taille vaut 30, texte vaut ""
 touches est une grille, largeur vaut 4, hauteur vaut 3
 l1 est un bouton, texte vaut "1", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "1"
 l2 est un bouton, texte vaut "2", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "2"
 l3 est un bouton, texte vaut "3", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "3"
 l4 est un bouton, texte vaut "4", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "4"
 l5 est un bouton, texte vaut "5", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "5"
 l6 est un bouton, texte vaut "6", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "6"
 l7 est un bouton, texte vaut "7", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "7"
 l8 est un bouton, texte vaut "8", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "8"
 l9 est un bouton, texte vaut "9", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "9"
 l0 est un bouton, texte vaut "0", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "0"
 lp est un bouton, texte vaut "+"
 lm est un bouton, texte vaut "-"
 lf est un bouton, texte vaut "*"
 ld est un bouton, texte vaut "/"
 lé est un bouton, texte vaut "=", touche vaut "=", couleurfond vaut "vert", couleurtexte vaut "ébène", icône vaut "bustout.png", infobulle vaut "="
 lv est un bouton, texte vaut ".", touche vaut ".", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut ","
 lc est un bouton, texte vaut "C", touche vaut "c", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Effacer"
 lr est un bouton, texte vaut "R", touche vaut "r", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Remise à zéro"
 sortien est un texte
 conteneur est un conduit
 localisation est un texte valant "c:/temp/Calculatrice_linotte.txt"
 a' & b' & c' & cc valant ""

Bd Calculatrice Linotte :
 conteneur.enregistrer(localisation)
 conteneur.fermer()
 parcours remise à zéro
 parcours formulaire

formulaire :
 ajoute calculatrice dans formulaire // A faire en premier !
 ajoute écran dans calculatrice
 ajoute panneau dans calculatrice
 ajoute touches dans panneau // A faire en premier !
 ajoute l1 & l2 & l3 & lr & lp & lm & l4 & l5 & l6 & lc & lf & ld & l7 & l8 & l9 & l0 & lv & lé dans panneau
 fais réagir lc à "clic souris" pour correction
 fais réagir lr à "clic souris" pour remise à zéro
 fais réagir Formulaire à "clic souris" pour Terminer
 fais réagir lp & lm & lf & ld & lé à "clic souris" pour opération arithmétique
 fais réagir lé à "clic souris" pour égal
 fais réagir l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9 & l0 à "clic souris" pour ajouter chiffre
 fais réagir lp & lm & lf & ld & lv à "clic souris" pour ajouter signe // ajout lv
 tant que vrai temporise

ajouter chiffre :
 * b est un bouton
 début
 b' = texte@b
 si (texte de écran) = "0", texte de écran vaut "" + texte de b // empêche le doublement du zéro en début d'opération
 sinon texte de écran vaut texte de écran + texte de b
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

ajouter signe :
 * b est un bouton
 début
 a' prend texte@b
 si (texte de écran) = "", texte de écran vaut "0 " + texte de b
 sinon texte de écran vaut texte de écran + " " + texte de b + " "
 reviens

opération arithmétique :
 *b est un bouton
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 sortien vaut sortien + " " + tampon
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

égal :
 calcul est un texte
 texte est un texte
 n & Oui est un nombre
 début
 si (a' + b') = "/0", lis /* gestion de la division finale par zéro,
attention il ne permet pas de repérer les divisions intermédiaires par zéro */
 évoque  conteneur.ouvrir(localisation)
 n prend conteneur.taille() - 2
 cc = texte@écran {n}
 conteneur.fermer()
 si (a' + cc + b') = "/ 0", lis
 texte de écran vaut µ"2718" + " Impossible de diviser par zéro ! "
 Oui = 1
 texte@écran !
 ferme
 ferme
 si Oui = 0, lis
 essaie lis // entrée du gestionnaire d'erreur généraliste
 calcul = (texte@écran)
 évalue calcul /* BUG DE LA VIRGULE : refuse le calcul comme : 12 / 0.2 ; 12 * 0.2 =>
 Message d'erreur : opération mathématique interdite ! */
 texte de écran vaut "" // pour effacer l'écran entre deux opérations
 texte de écran prend calcul // affiche le résultat sur l'écran de la calculatrice
 ferme
 sinon lis // corps du gestionnaire d'erreur généraliste
 texte de écran vaut "Message de l'erreur : " + message_erreur
 ferme
 ferme
 reviens

correction :
// non fonctionnelle

remise à zéro :
 début
 vide texte@écran & a' & b' & touche
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

Terminer :
 termine

Si tu pouvais voir ce qui ne va pas avec la virgule, cela sera sympa Smile
Merci, d'avance.
Member
Messages : 83
Date d'inscription : 2014-07-12
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Wed 28 Oct - 23:30
Rectificatif :

BUG DE LA VIRGULE :  solutionné : il s'agissait en fait d'une mauvaise affectation de ma part de la virgule,
qui réagissait en signe et non en chiffre.

Voici donc le nouveau code corrigé :

Code:

/*Calculatrice Linotte version : 1.0.5
auteur : XP Rico
date : 28 octobre 2015

J'ai utilisé comme point de départ, le programme placement_grille.liv dans b_tutoriels/h_interfaces_utilisateur

Il semble qu'il y a quatre façons de faire la Calculatrice Linotte :
- soit par un système de lecture des données de l'écran ;
- soit avec un système de mémoire tampon ;
- soit avec un système de base de donnée ;
- ou soit en combinant les trois systèmes.

La version 1.0.1 est la première version de calculatrice fonctionnelle.
Elle est développée sur la combinaison d'un système de lecture des données de l'écran de la calculatrice,
d'un système de base de donnée rudimentaire utilisant le conduit,
et d'un système de mémoire tampon.

Ajout :
- une fonction de remise à zéro ;
- et une gestion des erreurs de division finale et une gestion des erreurs généraliste.

Reste à finir : la fonction de correction.
*/
globale
 formulaire est un formulaire, titre vaut "Calculatrice Linotte avec un gestionnaire de placement", largeur vaut 250, hauteur vaut 200
 panneau est un panneau
 calculatrice est une grille, largeur vaut 1, hauteur vaut 2
 écran est un champ, taille vaut 30, texte vaut ""
 touches est une grille, largeur vaut 4, hauteur vaut 3
 l1 est un bouton, texte vaut "1", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "1"
 l2 est un bouton, texte vaut "2", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "2"
 l3 est un bouton, texte vaut "3", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "3"
 l4 est un bouton, texte vaut "4", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "4"
 l5 est un bouton, texte vaut "5", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "5"
 l6 est un bouton, texte vaut "6", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "6"
 l7 est un bouton, texte vaut "7", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "7"
 l8 est un bouton, texte vaut "8", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "8"
 l9 est un bouton, texte vaut "9", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "9"
 l0 est un bouton, texte vaut "0", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "0"
 lp est un bouton, texte vaut "+"
 lm est un bouton, texte vaut "-"
 lf est un bouton, texte vaut "*"
 ld est un bouton, texte vaut "/"
 lé est un bouton, texte vaut "=", touche vaut "=", couleurfond vaut "vert", couleurtexte vaut "ébène", icône vaut "bustout.png", infobulle vaut "="
 lv est un bouton, texte vaut ".", touche vaut ".", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut ","
 lc est un bouton, texte vaut "C", touche vaut "c", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Effacer"
 lr est un bouton, texte vaut "R", touche vaut "r", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Remise à zéro"
 sortien est un texte
 conteneur est un conduit
 localisation est un texte valant "c:/temp/Calculatrice_linotte.txt"
 a' & b' & c' & cc valant ""

Bd Calculatrice Linotte :
 conteneur.enregistrer(localisation)
 conteneur.fermer()
 parcours remise à zéro
 parcours formulaire

formulaire :
 ajoute calculatrice dans formulaire // A faire en premier !
 ajoute écran dans calculatrice
 ajoute panneau dans calculatrice
 ajoute touches dans panneau // A faire en premier !
 ajoute l1 & l2 & l3 & lr & lp & lm & l4 & l5 & l6 & lc & lf & ld & l7 & l8 & l9 & l0 & lv & lé dans panneau
 fais réagir lc à "clic souris" pour correction
 fais réagir lr à "clic souris" pour remise à zéro
 fais réagir Formulaire à "clic souris" pour Terminer
 fais réagir lp & lm & lf & ld & lé à "clic souris" pour opération arithmétique
 fais réagir lé à "clic souris" pour égal
 fais réagir l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9 & l0 & lv à "clic souris" pour ajouter chiffre
 fais réagir lp & lm & lf & ld à "clic souris" pour ajouter signe // ajout lv
 tant que vrai temporise

ajouter chiffre :
 * b est un bouton
 début
 b' = texte@b
 si (texte de écran) = "0", texte de écran vaut "" + texte de b // empêche le doublement du zéro en début d'opération
 sinon texte de écran vaut texte de écran + texte de b
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

ajouter signe :
 * b est un bouton
 début
 a' prend texte@b
 si (texte de écran) = "", texte de écran vaut "0 " + texte de b
 sinon texte de écran vaut texte de écran + " " + texte de b + " "
 reviens

opération arithmétique :
 *b est un bouton
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 sortien vaut sortien + " " + tampon
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

égal :
 calcul est un texte
 texte est un texte
 n & Oui est un nombre valant 0
 début
 attends 0.05 seconde // temps nécessaire pour être sûr que l'opération artithmétique se finisse
 si (a' + b') = "/0", lis /* gestion de la division finale par zéro,
attention il ne permet pas de repérer les divisions intermédiaires par zéro */
 évoque  conteneur.ouvrir(localisation)
 n prend conteneur.taille()
 n = n - 2
n !
 cc = texte@écran {n}
 conteneur.fermer()
 si (a' + cc + b') = "/ 0", lis
 texte de écran vaut µ"2718" + " Impossible de diviser par zéro ! "
 Oui = 1
 texte@écran !
 ferme
 ferme
 si Oui = 0, lis
 essaie lis // entrée du gestionnaire d'erreur généraliste
 calcul = (texte@écran)
 évalue calcul
 texte de écran vaut "" // pour effacer l'écran entre deux opérations
 texte de écran prend calcul // affiche le résultat sur l'écran de la calculatrice
 ferme
 sinon lis // corps du gestionnaire d'erreur généraliste
 texte de écran vaut "Message de l'erreur : " + message_erreur
 ferme
 ferme
 reviens

correction :// non fonctionnelle
 
remise à zéro :
 début
 vide texte@écran & a' & b' & touche
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

Terminer :
 termine
avatar
Site Admin
Messages : 1036
Date d'inscription : 2011-11-03
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Thu 29 Oct - 7:39
Bonjour,

Je vais tester cette nouvelle version dans la journée.
En effet, je vois le problème que tu as rencontré avec la virgule, il me reste un bogue à corriger quand même car :
Code:
affiche 2 .5*2
ça devrait produire une erreur.

Encore bravo ! Même la division par zéro est gérée Smile ça été mon premier test....
Member
Messages : 83
Date d'inscription : 2014-07-12
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Thu 29 Oct - 15:40
Effectivement, si on insère un espace entre le chiffre 2 et la virgule, tout ce passe comme si on avait entré seulement le calcul "5*2".

J'ai aussi relevé d'autres petits bugs sur le calcul :

Code:

365 + * 2 = 365
365 + - 2 = 363 //il est possible d'admettre ce résultat

365 - - 2 = 367 // il est possible d'admettre ce résultat
365 - + 2 => Erreur //si on admet le deux derniers, pourquoi avoir une erreur ici

365 / - 2 = - 182.5 // correct
365 / + 2 => Erreur //on devrait aussi pouvoir avoir un résultat correct

365 * - 2 = -730 // correct
365 * + 2 => Erreur //on devrait aussi pouvoir avoir un résultat correct
365 * * 2 = "" // alors qu'on devrait avoir un message d'erreur (sic !)

Tous les autres calculs donnent des messages d'erreur.


Mais bon, à part cela, j'ai finis la première version de la Calculatrice Linotte stable : version 1.0.6 : Very Happy

Code:

/*Calculatrice Linotte version : 1.0.6
auteur : XP Rico
date : 29 octobre 2015

J'ai utilisé comme point de départ, le programme placement_grille.liv dans b_tutoriels/h_interfaces_utilisateur

Il semble qu'il y a quatre façons de faire la Calculatrice Linotte :
- soit par un système de lecture des données de l'écran ;
- soit avec un système de mémoire tampon ;
- soit avec un système de base de donnée ;
- ou soit en combinant les trois systèmes.

La version 1.0.1 est la première version de calculatrice fonctionnelle.
Elle est développée sur la combinaison d'un système de lecture des données de l'écran de la calculatrice,
d'un système de base de donnée rudimentaire utilisant le conduit,
et d'un système de mémoire tampon.

Ajout :
- la fonction de correction.
*/
globale
 formulaire est un formulaire, titre vaut "Calculatrice Linotte avec un gestionnaire de placement", largeur vaut 250, hauteur vaut 200
 panneau est un panneau
 calculatrice est une grille, largeur vaut 1, hauteur vaut 2
 écran est un champ, taille vaut 30, texte vaut ""
 touches est une grille, largeur vaut 4, hauteur vaut 3
 l1 est un bouton, texte vaut "1", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "1"
 l2 est un bouton, texte vaut "2", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "2"
 l3 est un bouton, texte vaut "3", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "3"
 l4 est un bouton, texte vaut "4", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "4"
 l5 est un bouton, texte vaut "5", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "5"
 l6 est un bouton, texte vaut "6", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "6"
 l7 est un bouton, texte vaut "7", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "7"
 l8 est un bouton, texte vaut "8", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "8"
 l9 est un bouton, texte vaut "9", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "9"
 l0 est un bouton, texte vaut "0", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut "0"
 lp est un bouton, texte vaut "+"
 lm est un bouton, texte vaut "-"
 lf est un bouton, texte vaut "*"
 ld est un bouton, texte vaut "/"
 lé est un bouton, texte vaut "=", touche vaut "=", couleurfond vaut "vert", couleurtexte vaut "ébène", icône vaut "bustout.png", infobulle vaut "="
 lv est un bouton, texte vaut ".", touche vaut ".", couleurfond vaut "bleu céleste", couleurtexte vaut "bleu france", icône vaut "", infobulle vaut ","
 lc est un bouton, texte vaut "C", touche vaut "c", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Effacer"
 lr est un bouton, texte vaut "R", touche vaut "r", couleurfond vaut "noir", couleurtexte vaut "rouge vif", icône vaut "", infobulle vaut "Remise à zéro"
 sortien est un texte
 conteneur est un conduit
 localisation est un texte valant "c:/temp/Calculatrice_linotte.txt"
 a' & b' & c' & cc valant ""

Bd Calculatrice Linotte :
 conteneur.enregistrer(localisation)
 conteneur.fermer()
 parcours remise à zéro
 parcours formulaire

formulaire :
 ajoute calculatrice dans formulaire // A faire en premier !
 ajoute écran dans calculatrice
 ajoute panneau dans calculatrice
 ajoute touches dans panneau // A faire en premier !
 ajoute l1 & l2 & l3 & lr & lp & lm & l4 & l5 & l6 & lc & lf & ld & l7 & l8 & l9 & l0 & lv & lé dans panneau
 fais réagir lc à "clic souris" pour correction
 fais réagir lr à "clic souris" pour remise à zéro
 fais réagir Formulaire à "clic souris" pour Terminer
 fais réagir lp & lm & lf & ld & lé à "clic souris" pour opération arithmétique
 fais réagir lé à "clic souris" pour égal
 fais réagir l1 & l2 & l3 & l4 & l5 & l6 & l7 & l8 & l9 & l0 & lv à "clic souris" pour ajouter chiffre
 fais réagir lp & lm & lf & ld à "clic souris" pour ajouter signe // ajout lv
 tant que vrai temporise

ajouter chiffre :
 * b est un bouton
 début
 b' = texte@b
 si (texte de écran) = "0", texte de écran vaut "" + texte de b // empêche le doublement du zéro en début d'opération
 sinon texte de écran vaut texte de écran + texte de b
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

ajouter signe :
 * b est un bouton
 début
 a' prend texte@b
 si (texte de écran) = "", texte de écran vaut "0 " + texte de b
 sinon texte de écran vaut texte de écran + " " + texte de b + " "
 reviens

opération arithmétique :
 *b est un bouton
 tampon est un texte // solution reprise de conduit_structure.liv
 début
 si (texte@écran) = "", texte@écran vaut "0" // évite que le tampon soit égal à néant
 tampon = texte@écran
 sortien vaut sortien + " " + tampon
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

égal :
 calcul est un texte
 texte est un texte
 n & Oui est un nombre valant 0
 début
 attends 0.05 seconde // temps nécessaire pour être sûr que l'opération artithmétique se finisse
 si (a' + b') = "/0", lis // gestion de la division finale par zéro, attention il ne permet pas de repérer les divisions intermédiaires par zéro
 évoque  conteneur.ouvrir(localisation)
 n prend conteneur.taille() - 2
 cc = texte@écran {n}
 conteneur.fermer()
 si (a' + cc + b') = "/ 0", lis
 texte de écran vaut µ"2718" + " Impossible de diviser par zéro ! "
 Oui = 1
 ferme
 ferme
 si Oui = 0, lis
 essaie lis // entrée pour le gestionnaire d'erreur généraliste
 calcul = (texte@écran)
 évalue calcul
 texte de écran vaut "" // pour effacer l'écran entre deux opérations
 texte de écran prend calcul // affiche le résultat sur l'écran de la calculatrice
 ferme
 sinon lis // gestionnaire d'erreur généraliste fait sur l'exemple du livre gestion_erreurs.liv, dans dans b_tutoriels/b_confirme
 texte de écran vaut µ"2718" + " Erreur : " + message_erreur
 ferme
 ferme
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

correction :
 n est un nombre valant 0
 i est un nombre valant 0
 textec est un texte valant ""
 début
 évoque conteneur.ouvrir(localisation)
 n prend conteneur.taille() - 1
 si n = -1, n = 0
 si n = 0, textec prend ""
 sinon si texte@écran {0} contient µ"2718", texte@écran prend ""
 sinon lis
 si n = -1, n = 0
 si n = 0, textec prend ""
 sinon lis
 pour i de 0 à n-1, lis
 textec vaut textec + texte@écran {i}
 ferme
 ferme
 ferme
 texte@écran prend textec
 conteneur.fermer()
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

remise à zéro :
 début
 vide texte@écran & a' & b' & touche
 conteneur.enregistrer(localisation)
 conteneur.écrire(texte@écran)
 conteneur.fermer()
 reviens

Terminer :
 termine
avatar
Site Admin
Messages : 1036
Date d'inscription : 2011-11-03
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Thu 29 Oct - 19:29
pas mal ! j'ai marqué le post en Résolu.

Je vais devoir chercher d'autres idées de défis !

et merci pour les bugs remontés, je regarde ça.
avatar
Site Admin
Messages : 1036
Date d'inscription : 2011-11-03
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Fri 30 Oct - 14:46
J'aurai fait autrement le moteur de la calculatrice.
Je propose cette version qui me semble plus simple (une version textuelle juste pour ne montrer que le "moteur" de la calculatrice) :
Code:
globale
 tampon est un texte
 saisi est un texte
 opération est un texte

principale :
 commande est un texte
 début
 tant que vrai lis
 demande commande // Ne saisir qu'un caractère pour simuler la calculatrice !
 parcours analyser avec commande
 ferme

analyser : commande
 si commande = "+" parcours traiter commande avec commande
 sinon si commande = "-" parcours traiter commande avec commande
 sinon si commande = "/" parcours traiter commande avec commande
 sinon si commande = "*" parcours traiter commande avec commande
 sinon si commande = "=" parcours traiter commande avec commande
 sinon ajoute commande dans saisi
 reviens

traiter commande : commande
 si opération != "" parcours calculer
 sinon tampon = saisi
 opération prend commande
 saisi prend ""
 reviens

calculer :
 a est un nombre
 b est un nombre
 début
 si saisi = "" reviens
 si tampon = "", tampon prend "0"
 convertis tampon en a
 convertis saisi en b
 si opération = "+", tampon prend a + b
 sinon si opération = "-", tampon prend a - b
 sinon si opération = "/" lis
 si b = 0 affiche "interdit de diviser par zéro !"
 sinon tampon prend a / b
 ferme
 sinon si opération = "*", tampon prend a * b
 // si opération = "=", on ne fait rien de plus !
 affiche "résultat = " + tampon
 reviens

Voici ce que ça donne :

Member
Messages : 83
Date d'inscription : 2014-07-12
Voir le profil de l'utilisateur

Re: [moyen] [résolu] Calculatrice

le Fri 30 Oct - 16:10
Oui, c'est une calculatrice de type tampon de mémoire, tu nous avais donné une piste avec le livre calculatrice.liv dans b_tutoriels/b_confirme.  Very Happy

Mais je voulais aussi essayer autre chose, tout en montrant l'utilisation possible de Linotte comme base de donné dans le futur. Mais il faudrait encore un peu développer le conduit pour ce faire, afin qu'il puisse utiliser des verbes comme "rechercher"; "extraire"; "modifier"; ou encore "supprimer". Idea

C'est d'ailleurs sur ce type de calculatrice à mémoire de tampon, qui fonctionne dans les exemples de comparaison de que j'avais donné :

http://www.tutomobile.fr/faire-une-application-calculette-tutoriel-iphone-n%C2%B04/06/08/2010/
http://www.tutomobile.fr/faire-une-application-calculatrice-tuto-android-n%C2%B06/30/06/2010/
https://openclassrooms.com/courses/apprenez-a-programmer-en-java/tp-une-calculatrice
Contenu sponsorisé

Re: [moyen] [résolu] Calculatrice

Voir le sujet précédentRevenir en hautVoir le sujet suivant
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum