Forums Développement Multimédia

Aller au contenu

Calculette as3

CODE Actionscript

39 réponses à ce sujet

#1 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 02 March 2013 - 09:12 AM

Bonjour à tous,

Je voudrais insérer une calculatrice dans mon swf mais incapable de réaliser ça moi même je cherche une source ou tuto pour une simple calculette en as3.

Merci d'avance pour vos infos ;-) !

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 02 March 2013 - 15:05 PM

Salut,

En cherchant un peu sur le forum ou sur Google tu trouvera plein d'exemple, en voici quelques-uns :

http://www.flashkit....11306/index.php

http://www.flashkit....11685/index.php

http://www.flashkit....11415/index.php

http://www.flashkit....10321/index.php

Ce n'est pas de l'AS3 mais je ne pense pas que ce soit compliqué à traduire.

Techniquement une calculatrice c'est juste une interface qui te permet de faire des opérations basiques (+ , - , / , *, etc...), or ces opérations tu sais les faire avec Flash :

var addition:Number;
var chiffreA:Number;
var chiffreB:Number;

chiffreA = 10;
chiffreB = 12;
addition = chiffreA+chiffreB;
// addition = 22

Côté interface, tu as une série de boutons correspondant aux chiffres et opérateurs, et peut être un textfield pour l'affichage.
Chaque bouton correspond à une valeur à ajouter à ton calcul.
Chaque opérateur correspond à un calcul à effectuer.
Le textField affiche le résultat.

C'est relativement simple à faire.

#3 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 02 March 2013 - 18:19 PM

Je ne suis pas certain d'êtres vraiment au niveau mais je me lance qu'en même.
Je reviens montrer mon premier jet ce soir.

#4 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 02 March 2013 - 21:55 PM

Salut,

Sinon un peu plus complexe, mais permet plus de chose, c'est d'utiliser un arbre binaire de calcul : http://fr.wikimini.o...Calcul_en_arbre
Word hard, play hard.

#5 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 03 March 2013 - 18:52 PM

Alors voici le premier montage, reste certaines choses que je n'ai pas encore trouvé:

1 - Entrer plusieurs chiffres dans les champs texte.

2 - Prendre et garder en compte le résultat si on continue l'opération.


var valeur_1:Number = 0; Valeur_1.text = String(valeur_1);
var valeur_2:Number = 0; Valeur_2.text = String(valeur_2);
var signe:String = "";
var resultat:Number = 0; Resultat.text = String(resultat);
var posi_valeur:Number = 0; Posi_valeur.text = String(posi_valeur);
// BOUTONS
bt_1.addEventListener(MouseEvent.CLICK, num_1);
function num_1(e:MouseEvent):void {
if (posi_valeur == 0){
valeur_1 = 1;
Valeur_1.text = String(valeur_1);
} else {
valeur_2 = 1;
Valeur_2.text = String(valeur_2);
}
}
bt_2.addEventListener(MouseEvent.CLICK, num_2);
function num_2(e:MouseEvent):void {
if (posi_valeur == 0){
valeur_1 = 2;
Valeur_1.text = String(valeur_1);
} else {
valeur_2 = 2;
Valeur_2.text = String(valeur_2);
}
}
bt_3.addEventListener(MouseEvent.CLICK, num_3);
function num_3(e:MouseEvent):void {
if (posi_valeur == 0){
valeur_1 = 3;
Valeur_1.text = String(valeur_1);
} else {
valeur_2 = 3;
Valeur_2.text = String(valeur_2);
}
}
bt_4.addEventListener(MouseEvent.CLICK, num_4);
function num_4(e:MouseEvent):void {
if (posi_valeur == 0){
valeur_1 = 4;
Valeur_1.text = String(valeur_1);
} else {
valeur_2 = 4;
Valeur_2.text = String(valeur_2);
}
}
// OPERATEURS ...
bt_plus.addEventListener(MouseEvent.CLICK, plus);
function plus(e:MouseEvent):void {
posi_valeur = 1; Posi_valeur.text = String(posi_valeur);
signe = "+";
Signe.text = String(signe);
}
bt_moins.addEventListener(MouseEvent.CLICK, moins);
function moins(e:MouseEvent):void {
posi_valeur = 1; Posi_valeur.text = String(posi_valeur);
signe = "-";
Signe.text = String(signe);
}
bt_multiplication.addEventListener(MouseEvent.CLICK, multiplication);
function multiplication(e:MouseEvent):void {
posi_valeur = 1; Posi_valeur.text = String(posi_valeur);
signe = "x";
Signe.text = String(signe);
}
bt_division.addEventListener(MouseEvent.CLICK, division);
function division(e:MouseEvent):void {
posi_valeur = 1; Posi_valeur.text = String(posi_valeur);
signe = "/";
Signe.text = String(signe);
}
// EGALE ...
bt_egale.addEventListener(MouseEvent.CLICK, egale);
function egale(e:MouseEvent):void {
if (signe == "+") {
resultat  = valeur_1 + valeur_2;
Resultat.text = String(resultat);
valeur_1 = 0; Valeur_1.text = String(valeur_1);
valeur_2 = 0;
signe = "";
}
if (signe == "-") {
resultat  = valeur_1 - valeur_2;
Resultat.text = String(resultat);
}
if (signe == "x") {
resultat  = valeur_1 * valeur_2;
Resultat.text = String(resultat);
}
if (signe == "/") {
resultat  = valeur_1 / valeur_2;
Resultat.text = String(resultat);
}
valeur_1 = 0;
Valeur_1.text = String(valeur_1);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
posi_valeur = 0;
Posi_valeur.text = String(posi_valeur);
}
 

Fichier(s) joint(s)



#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 03 March 2013 - 19:11 PM

Moi je serait parti sur un tableau pour stocker ce qu'il se passe.
  • Quand on appuie sur un bouton chiffre : pousse le chiffre dans le tableau
  • Quand on appuie sur un bouton opérateur : pousse l'opérateur dans le tableau
  • Quand on appuie sur le résultat : effectue les opérations dans l'ordre du tableau

Ton objectif est de reproduire l'équation finale en fonction de ce que l'utilisateur à tapé dans l'ordre où il l'a tapé.


Si l'utilisateur tape :

Citation

1
+
2
+
8
*
4
/
8

Tu devrait avoir un tableau du genre :

aCalculer =  [1,"+",2,"+",8,"*",4,"/",8];

Où tu as l'ordre de la saisie et tu fait la distinction entre nombre et opérateur.

A côté tu as tout un tas de petites fonctions qui gèrent les opérations, du genre :


function addition(A:Number,B:Number):Number{return A+B;};
function soustraction(A:Number,B:Number):Number{return A-B;};
function multiplication(A:Number,B:Number):Number{return A*B;};
function division(A:Number,B:Number):Number{return A/B;};
 

Reste plus qu'à calculer la séquence enregistrée dans le tableau lors de la saisie par l'utilisateur.

Note que l'opération peut se faire en temps réel sans avoir à passer par un tableau.
Mais si tu veux étendre les fonctionnalités ce sera surement plus pratique ainsi.

#7 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 04 March 2013 - 19:00 PM

Ok, M Spi je vais voir si je peux y arriver de cette façon, merci pour tes conseils .

#8 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 04 March 2013 - 22:38 PM

Bonsoir,

Peut-être trop compliqué pour ce que tu veux faire, mais ce lien me semble intéressant: http://www.flashandm...parser/mp1.html
Si j'ai bien compris, tu peux avec ça évaluer le résultat d'une expression donnée sous forme de texte, par exemple "2+4*cos(pi/4)"

#9 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 06 March 2013 - 06:44 AM

Merci pour le lien lilive ;-), mais je veux vraiment réaliser une calculette basic et je pense être sur la bonne voie avec les conseils que ma donné M Spi.

#10 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 07 March 2013 - 11:30 AM

salut Cortho :)

si j'observe le fonctionnement de la calculette que j'ai ds le tel :

j'appuie sur 7 --> affiche 7
j'appuie sur + --> affiche 7
j'appuie sur 6 --> affiche 13

j'essaie de te reproduire ça dans la journée ;)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#11 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 07 March 2013 - 12:47 PM

bon… en y regardant une deuxième fois et de plus près, ça ne fonctionne pas comme ça… j'ai raté une étape.

j'appuie sur 7 --> affiche 7
j'appuie sur + --> affiche 7
j'appuie sur 6 --> affiche 6
j'appuie sur opérateur (egal compris) --> affiche 13

Du coup ce que je pensais bête comme chou - et qui doit l'être - que je pensais plier en un quart d'heure à la pause dej me donne du fil à retordre.

Je reviendrai !! ;)

++ :)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#12 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 07 March 2013 - 13:05 PM

Hello,

Voilà une base complète en AS2 pour refaire la calculette de Windows :



- Afficher le SWF -
Fichier joint  calculator.swf   232.35 Ko   30 téléchargement(s)

Je pense que la traduction en AS3 ne sera pas bien compliquée.

Fichier(s) joint(s)



#13 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 07 March 2013 - 17:58 PM

merci Spi !

du coup je vais regarder, je croyais que c'était tout niais et je viens d'y engloutir bien une heure et demie en pure perte :mrgreen:

J'aurai au moins appris que toutes les calculettes, même basiques, ne fonctionnent pas pareil quant à la priorité des opérateurs…
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#14 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 07 March 2013 - 19:25 PM

Salut, je suis toujours sur le coup mais je n'ai pas eu le temps bosser ces derniers jours :sad:, je vais peut-être mis remettre un peu ce soir.

#15 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 14 March 2013 - 21:39 PM

Salut,

J'ai pratiquement terminé mon script de la calculette qui fonctionne pas trop mal mais je bloque pour afficher plusieurs chiffres dans mes textes dynamique, dans le cas présent le chiffre présent est remplacé par le suivant, une aide serait la bienvenue ;-), merci.


clavier.addEventListener(MouseEvent.CLICK, action);
function action(e:MouseEvent):void{
if (posi_valeur == 0){
valeur_1 =(clavier.getChildIndex(e.target as DisplayObject));
Valeur_1.text = String(valeur_1);
} else {
valeur_2 =(clavier.getChildIndex(e.target as DisplayObject));
Valeur_2.text = String(valeur_2);
}
}
 

Fichier(s) joint(s)



#16 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 15 March 2013 - 15:57 PM

Salut,

J'ai du mal à saisir où est ton problème.
Dans ton code tu utilise deux "valeurs", comment les affiches-tu ?

Citation

dans le cas présent le chiffre présent est remplacé par le suivant

C'est cette partie que je ne comprend pas, tu veux afficher deux chiffres ?
Si on regarde ta calculette on ne vois qu'un seul champ texte pour le résultat.

#17 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 15 March 2013 - 20:23 PM

Non en faite je n'arrive pas à écrire plus d'un chiffre dans mes champs "valeur_1" et "valeur_2". si je veux écrire 14 par exemple, j'écris 1 puis 4 mais le 4 remplace le 1 au lieu de se placer à la suite.
Je joints mon code complet pour mieux apprécier l'ensemble.

// VARIABLE ...
var valeur_1:Number = 0; Valeur_1.text = String(valeur_1);
var valeur_2:Number = 0; Valeur_2.text = String(valeur_2);
var signe:String = ""; Signe.text = String(signe);
var posi_valeur:Number = 0; Posi_valeur.text = String(posi_valeur);
var resultat:Number = 0; Resultat.text = String(resultat);
var myTimerReset:Timer = new Timer(5, 1);
// CLAVIER ...
clavier.addEventListener(MouseEvent.CLICK, action, true);
function action(e:MouseEvent):void{
if (posi_valeur == 0){
valeur_1 =(clavier.getChildIndex(e.target as DisplayObject));
Valeur_1.text = String(valeur_1);
resultat =(clavier.getChildIndex(e.target as DisplayObject));
Resultat.text = String(resultat);
egale_temp(null);
} else {
valeur_2 =(clavier.getChildIndex(e.target as DisplayObject));
Valeur_2.text = String(valeur_2);
resultat =(clavier.getChildIndex(e.target as DisplayObject));
Resultat.text = String(resultat);
egale_temp(null);
}
}
// OPERATEURS ...
bt_plus.addEventListener(MouseEvent.CLICK, plus);
function plus(e:MouseEvent):void {
signe = "+"; Signe.text = String(signe);
posi_valeur = 1;
Posi_valeur.text = String(posi_valeur);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
}
bt_moins.addEventListener(MouseEvent.CLICK, moins);
function moins(e:MouseEvent):void {
signe = "-"; Signe.text = String(signe);
posi_valeur = 1;
Posi_valeur.text = String(posi_valeur);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
}
bt_multiplication.addEventListener(MouseEvent.CLICK, multiplication);
function multiplication(e:MouseEvent):void {
signe = "*"; Signe.text = String(signe);
posi_valeur = 1;
Posi_valeur.text = String(posi_valeur);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
}
bt_division.addEventListener(MouseEvent.CLICK, division);
function division(e:MouseEvent):void {
signe = "/"; Signe.text = String(signe);
posi_valeur = 1;
Posi_valeur.text = String(posi_valeur);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
}
// POINT POUR DECIMALE... ???
// EGALE TEMPORAIRE ...
bt_egale_temp.addEventListener(MouseEvent.CLICK, egale_temp);
function egale_temp(e:MouseEvent):void {
if (signe == "+") {
valeur_1  = valeur_1 + valeur_2;
Valeur_1.text = String(valeur_1);
}
if (signe == "-") {
valeur_1  = valeur_1 - valeur_2;
Valeur_1.text = String(valeur_1);
}
if (signe == "*") {
valeur_1  = valeur_1 * valeur_2;
Valeur_1.text = String(valeur_1);
}
if (signe == "/") {
valeur_1  = valeur_1 / valeur_2;
Valeur_1.text = String(valeur_1);
}
myTimerReset.start();
}
// TIMER ...  
  myTimerReset.addEventListener(TimerEvent.TIMER, runReset);
function runReset(event:TimerEvent):void {
  valeur_2 = 0; Valeur_2.text = String(valeur_2);
}
// EGALE FINALE ...
bt_egale_finale.addEventListener(MouseEvent.CLICK, egale_finale);
function egale_finale(e:MouseEvent):void {
resultat = valeur_1;
Resultat.text = String(resultat);
}  
// RESET ...
bt_reset.addEventListener(MouseEvent.CLICK, reset);
function reset(e:MouseEvent):void {
valeur_1 = 0;
Valeur_1.text = String(valeur_1);
valeur_2 = 0;
Valeur_2.text = String(valeur_2);
posi_valeur = 0;
Posi_valeur.text = String(posi_valeur);
signe = ""; Signe.text = String(signe);
resultat = 0;
Resultat.text = String(resultat);
}
 


#18 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 16 March 2013 - 18:49 PM

Bonjour,

Si tu as une variable numérique valeur et que tu veux lui "ajouter un chiffre" tu peux faire:


var valeur:int = 12;

var chiffre:int = 4;
valeur = valeur * 10 + 4; // 12*10 + 4 = 120+4 = 124
 

Mais ça va devenir plus délicat pour les nombres à virgule. Dans ce cas il faudrait savoir combien de décimales le nombre a déjà:


var valeur:Number = 12.7;
var numDecimales:int = 1;

var chiffre:int = 4;
numDecimales ++ ;
valeur = valeur + chiffre / Math.pow( 10, numDecimales); // 12.7 + 4 / 10^2 = 12.7 + 4/100 = 12.7 + 0.04 = 12.74
 

Tu pourrais aussi préférer le stockage de ta valeur dans une chaine, et utiliser parseFloat() quand tu as besoin de faire des calculs dessus:


var valeur:String = "12";
valeur += "4"; // 124
valeur += "." // 124.
valeur += "5" // 124.5
valeur += "6" // 124.56
var result:Number = 1000 + parseFloat(valeur); // 1124.56
 

mais dans ce cas il faudra faire attention à ce que l'utilisateur n'ajoute pas deux fois la virgule.

NB: Je n'ai testé aucun de ces codes, j'ai peut-être fait des erreurs.

#19 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 16 March 2013 - 21:42 PM

Note au passage :

valeur_1 = 0;
Valeur_1.text = String(valeur_1);

Pas top.... hier j'ai passé un moment à me demander comment tu pouvais avoir une variable de type String qui se comportait comme un champ texte..... je n'avais tout simplement pas vu la majuscule.


Sinon, en plus de ce que te file Lilive, moi je serait parti sur un truc de ce genre :

stage.addEventListener(KeyboardEvent.KEY_DOWN,appuie);

function appuie(e:KeyboardEvent){      

        var touche:String = (String.fromCharCode(e.charCode));
       
        if(touche == "."){
                for (var i:int=0; i<resultat.length; i++)       {
                        if (resultat.text.charAt(i) == "." ) return;
                }
        }
       
        resultat.appendText(touche);
}

J'ai un champ texte "resultat" sur la scène, je récupère le caractère représenté par la touche, je vérifie si il n'y a pas déjà un point (une virgule) dans le résultat affiché, si c'est le cas j’interdis d'ajouter un nouveau point, puis j'ajoute le caractère de la touche au résultat affiché.


[EDIT] Désolé, je n'avais pas réalisé que tu ne te servait pas du clavier mais de la souris pour cliquer sur des boutons. Du coup remplace "String.fromCharCode(e.charCode)" par la valeur du bouton cliqué.

#20 cortoh

  • Members
  • PipPipPipPipPipPipPipPip
  • 639 messages

Posté 17 March 2013 - 08:24 AM

Une vrai usine à gaz cette calculette :eusa_doh:"j'aurais su, j'aurais pas venu", je vais tout de même tenter de la finaliser avec vos dernières suggestions.

#21 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 17 March 2013 - 14:26 PM

coucou;
pour savoir le nombre de décimale on peut faire très simple


var b=723.325625
trace(String( b ).length -String(Math.floor( b ).length-1)
sortie=6
ou avec les OSB (Opérateur Sur le Bit) (je pense plus rapide que Math.floor() qui est lent)

var b=723.325625

trace(String( b ).length -String( b | 0).length-1)
sortie=6

#22 Krevare

    Ceinture Noire

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 923 messages

Posté 17 March 2013 - 15:12 PM

Haha Hubeert, représentant officiel des OSB sur mediabox :mrgreen:

:jesors:

Fred.

#23 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 17 March 2013 - 18:14 PM

coucou;
lol j'aime bien.. ;-)

avec les OSB "codez moins cher"

#24 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 March 2013 - 19:22 PM

Voir le messagelilive, le 16 March 2013 - 18:49 PM, dit :

Bonjour, Si tu as une variable numérique valeur et que tu veux lui "ajouter un chiffre" tu peux faire:
 var valeur:int = 12; var chiffre:int = 4; valeur = valeur * 10 + 4; // 12*10 + 4 = 120+4 = 124
Mais ça va devenir plus délicat pour les nombres à virgule. Dans ce cas il faudrait savoir combien de décimales le nombre a déjà:
 var valeur:Number = 12.7; var numDecimales:int = 1; var chiffre:int = 4; numDecimales ++ ; valeur = valeur + chiffre / Math.pow( 10, numDecimales); // 12.7 + 4 / 10^2 = 12.7 + 4/100 = 12.7 + 0.04 = 12.74
Tu pourrais aussi préférer le stockage de ta valeur dans une chaine, et utiliser parseFloat() quand tu as besoin de faire des calculs dessus:
 var valeur:String = "12"; valeur += "4"; // 124 valeur += "." // 124. valeur += "5" // 124.5 valeur += "6" // 124.56 var result:Number = 1000 + parseFloat(valeur); // 1124.56
mais dans ce cas il faudra faire attention à ce que l'utilisateur n'ajoute pas deux fois la virgule. NB: Je n'ai testé aucun de ces codes, j'ai peut-être fait des erreurs.

Hello.

Autant je suis parfaitement d'accord pour la première réponse, (qui est une multiplication par la base + la valeur (à l'intention de ceux qui voudraient faire une calculatrice binaire par exemple))
Autant pour les décimales, je suis moins emballé.

Je ferais plutôt une mise en proportion(?) sur le principe suivant :
- toujours utiliseer la méthode de multiplier par la base + la valeur, et avoir une seconde variable que l'on multiplie par 10 pour chaque ajout d'une touche nombre.
On aurait donc : la valeur entière, le diviseur.
(suis-je clair ?)

Je vais ressortir une vieille version de calculette et essayer de montrer qu'on peut faire simple, uniquement avec des nombres…

#25 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 17 March 2013 - 20:57 PM

coucou;
mon propos était juste de calculer le nombre de décimale; lol ; d'autre part tous les langages font des erreurs ( dont certaine grave) lorsque'il s'agit des nombre a virgules

#26 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 March 2013 - 22:09 PM

Bon, je ne retrouve pas ma "vieille" calculette.

Mais voici une base qui me semble plus simple et plus solide que la tienne :
- le premier principe, c'est de créer au plus haut niveau des constantes portant le même nom que les touches du clip "clavier"
- ceci permet de récupérer une valeur int de la touche cliquée via :
_touche = this[event.target.name];// On récupère la constante associée au nom de la touche

Le second principe : essayer de toujours travailelr sur des nombres.
Pour cela je conserve 3 valeurs :
- _saisie : la valeur en cours de saisie
- _total : la valeur précédante du calcul
_ affichage : dépend de la situation (on affiche soit la _saisie, soit le _total)

Avec ce principe, si la touche cliquée est inférieure à 10, on sait qu'on a un chiffre qui continue la saisie, que l'on calcule avec la formule : _saisie = _saisie * 10 + _touche;

Si la touche cliquée est égale à un opérateur, on applique l'opération entre le total précédant et la saisie

Le plus difficile dans cette histoire, c'est de toujours penser avec un temps de retard : l'opérateur cliqué est mémorisé et ne sera appliqué qu'à la fin d'une saisie (donc soit une touche opérateur, soit la touche égal)…

Pour l'instant, pas de gestion du point (parce que ça va compliquer le code et je préfère te le montrer avant pour que tu comprennes la simplicité (enfin, je crois))

// Les _touches de chiffres
const _0:int=0, _1:int=1, _2:int=2, _3:int=3, _4:int=4, _5:int=5, _6:int=6, _7:int=7, _8:int=8, _9:int=9;
// Les _touches d'opérateurs
const ADDITION:int=10, SOUSTRACTION:int=11, MULTIPLICATION:int=12, DIVISION:int=13, TOTAL:int=14;
// Code principal
var _touche:int;
var _saisie:int=0, _total:Number=0, _affichage:Number=0;
var _operateur:int=ADDITION;
clavier.addEventListener (MouseEvent.CLICK,clic);
// Fonction associée aux _touches du clavier écran
function clic (event:MouseEvent):void {
  _touche = this[event.target.name];// On récupère la constante associée au nom de la touche
  if (_touche<10) {
   _saisie = _saisie * 10 + _touche;
   _affichage = _saisie;
  } else if (_operateur == TOTAL) {
   _affichage = _total = _saisie;
  } else {
   if   (_operateur == ADDITION)    _total += _saisie;
   else if  (_operateur == SOUSTRACTION)   _total -= _saisie;
   else if (_operateur == MULTIPLICATION) _total *= _saisie;
   else if (_operateur == DIVISION)    _total /= _saisie;
   _affichage = _total
   _operateur = _touche;
   _saisie = 0;
  }
  ecran.text=String(_affichage);
}


Je me penche sur le . et je reviens…
:-)

#27 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 March 2013 - 22:47 PM

Pour le point, j'ai fait ce que j'ai tenté d'expliqué plus haut :
- lors d'un clic sur la touche POINT, je me sers d'un booléen pour me rappeler que je suis en mode "décimal"
- je continue sans changer de méthode pour la valeur saisie
- mais à chaque touche chiffre cliqué, je fais augmenter mon coefficiant de puissance de 10
- et quand j'accède à la valeur saisie pour faire un calcul, je la divise par le coefficiant…
(en fait, en gardant un coefficiant à un par défaut, je me simplifie la vie, j'évite des if sur mon mode décimal, car je peux toujours diviser par le coefficient.

// Les _touches de chiffres
const _0:int=0, _1:int=1, _2:int=2, _3:int=3, _4:int=4, _5:int=5, _6:int=6, _7:int=7, _8:int=8, _9:int=9;
// Les _touches d'opérateurs
const ADDITION:int=10, SOUSTRACTION:int=11, MULTIPLICATION:int=12, DIVISION:int=13, TOTAL:int=14, POINT:int=15;
// Code principal
var _touche:int;
var _saisie:int=0, _total:Number=0, _affichage:Number=0;
var _operateur:int=ADDITION;
var _entier:Boolean = true;
var _coefficiant:int=1;

clavier.addEventListener (MouseEvent.CLICK,clic);
// Fonction associée aux _touches du clavier écran
function clic (event:MouseEvent):void {
  _touche = this[event.target.name];// On récupère la constante associée au nom de la touche
  if (_touche<10) {
   _saisie = _saisie * 10 + _touche;
   if (!_entier) _coefficiant *= 10;
   _affichage = _saisie;
  } else if (_touche == POINT) {
   _entier = false;
  } else if (_operateur == TOTAL) {
   _affichage = _total = _saisie / _coefficiant;
   _operateur = ADDITION;
   _entier = true;
   _coefficiant = 1;
   _saisie = 0;
  } else {
   if   (_operateur == ADDITION)        _total += _saisie/_coefficiant;
   else if  (_operateur == SOUSTRACTION)   _total -= _saisie/_coefficiant;
   else if (_operateur == MULTIPLICATION) _total *= _saisie/_coefficiant;
   else if (_operateur == DIVISION)     _total /= _saisie/_coefficiant;
   _affichage = _total;
   _operateur = _touche;
   _entier = true;
   _coefficiant = 1;
   _saisie = 0;
  }
  ecran.text=String(_affichage/_coefficiant);
}

Il reste peut-être des trous dans le code, je l'ai peu testé.

Il reste sûrement des fonctionnements à améliorer, comme repartir du total comme valeur après un calcul, si la touche cliquée aussitôt est un opérateur…

Toutes ces petites améliorations vont perturber (et donc rallonger) le code mais si tu gardes bien la logique tu t'y retrouveras peut-être mieux qu'avec ton code actuel qui est un peu torturé.
C'est toi qui voit, je sais bien que repartir du code de quelqu'un d'autre quand on avait bien avancé le sien n'est pas forcément agréable. Et puis, faire l'effort de poursuivre son idée malgré la difficulté est très formateur. A toi de voir.


PS / tu auras un souci aussi pour l'affichage des décimales se terminant par zéro.
C'est là que la variable affichage va prendre tout son intérêt : tu connais la valeur, et tu sais si tu es en mode décimal ou non. Un if juste avant de placer la variable affichage dans l'écran devrait te permettre de t'en sortir sans avoir a modifier la construction globale.

Fichier(s) joint(s)



#28 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 March 2013 - 23:13 PM

Oups.I
ll y a des (gros) trous.

Je prends le temps de te faire une version plus solide demain, promis.

#29 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 17 March 2013 - 23:59 PM

coucou;
beh pas besoin de rappeler que c 'est en décimal. L'ordi le sais mais bon c"est pas ce que tu veux dire sans doute ;

je voulais juste dire pour ma part que connaitre le nombre de décimale c’était pas compliqué. quand a multiplier par 10 je suis ok sauf qu'il faut que tu saches combien de fois il faut multiplier par 10; ce que mon code indique..Mais bon cest pas ca sans doute que tu veux dire?

#30 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 18 March 2013 - 09:16 AM

Hop.

Nettoyage du code, suppression des "trous" logique et j'en ai profité pour ajouter la gestion du bouton correction.
// Les _touches de chiffres
const _0:int=0, _1:int=1, _2:int=2, _3:int=3, _4:int=4, _5:int=5, _6:int=6, _7:int=7, _8:int=8, _9:int=9, POINT:int=10;

// Les _touches d'opérateurs
const ADDITION:int=11, SOUSTRACTION:int=12, MULTIPLICATION:int=13, DIVISION:int=14;
const TOTAL:int=15, CORRECTION:int=16, AUCUN:int=17;

// Variables
var _touche:int, _saisie:int, _operateur:int, _coefficiant:int;
var _total:Number, _affichage:Number;
var _virgule:Boolean;

// Code principal
_total=0;
nouvelle_saisie ();
clavier.addEventListener (MouseEvent.CLICK,clic);

// Fonction associée aux _touches du clavier écran
function clic (event:MouseEvent):void {
  _touche = this[event.target.name];// On récupère la constante associée au nom de la touche
  if (_touche == CORRECTION) {
   nouvelle_saisie ();
  } else if (_touche == POINT) {
   _virgule = true;
  } else if (_touche<POINT) {
   if (_operateur==TOTAL)  _operateur=AUCUN, _saisie = _total;
   _saisie = _saisie * 10 + _touche;
   _coefficiant *= _virgule ? 10 : 1;
   _affichage = _saisie / _coefficiant;
  } else {
   if(_operateur == ADDITION)    _total += _saisie / _coefficiant;
   else if(_operateur == SOUSTRACTION)  _total -= _saisie / _coefficiant;
   else if(_operateur == MULTIPLICATION)  _total *= _saisie / _coefficiant;
   else if(_operateur == DIVISION)   _total /= _saisie / _coefficiant;
   else if(_operateur == AUCUN) _total  = _saisie / _coefficiant;
   nouvelle_saisie ();
   _operateur = _touche;
   _affichage = _total;
  }
  ecran.text = String(_affichage);
}
// Préparation des variables pour une nouvelle saisie
function nouvelle_saisie ():void {
  _saisie = 0;
  _operateur = AUCUN;
  _virgule = false;
  _coefficiant = 1;
  _affichage = _saisie;
}

Il reste le souci de l'affichage du zéro saisi après un point. :-) Je n'ai rien vu d'autre, mais Je n'assurerais rien.

Fichier(s) joint(s)



#31 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 18 March 2013 - 09:26 AM

@ hubert : je mémorise que le nombre saisi doit être calculé en décimal via un coefficient multiple de 10.
Ça n'a rien d'obligatoire en effet. C'est juste un choix qui me permet de travailler toujours sur une saisie entière, qui, a mon avis, simplifie beaucoup de code. Du coup, l'ordi ne sait pas que la saisie est en décimal… vu que c'est moi qui ai décidé qu'il n'en soit pas ainsi.

On peut bien sûr passer par un String, même si c'est + lent, vu qu'il y a très peu de code à l'exécution.
Perso, je suis à l'aise pour séparer la valeur d'un nombre et son écriture, alors j'en profite. C'est un avantage à mon sens parce que ce code se transforme très facilement pour une calculatrice en base quelconque, même si ce n'est pas trop le sujet.

Après, je n'ai pas essayé avec des String, sans doute qu'il y a des maladresses dans le code de Cortoh et que l'on peut simplifier… Mais comme le dit Nataly, je crois que le truc devient vite compliqué si l'on s'attache à l'écriture du nombre plus qu'à sa valeur.

#32 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 18 March 2013 - 09:47 AM

coucou
ok pas de probleme..si cest plus simple il y a pas de souci; je ne m’étais pas penché sur le code; mais juste sur la possibilité de connaitre le nombre de décimale;; d'autant plus que Flash bug grave avec les décimale
a=743,255
trace(c=743.255 -743 )donne un chiffre fantaisiste
donne 0.254999999999995

#33 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 18 March 2013 - 13:53 PM



- Afficher le SWF -
Fichier joint  calc.swf   23.18 Ko   13 téléchargement(s)


Parce que j'avais un peu de temps…
:-)


[PS : @Hubert : Oui, c'est un peu pénible les défauts de calculs de Flash… mais je ne sais pas comment s'en débarrasser…]

Fichier(s) joint(s)

  • Fichier joint  calc.fla   585 Ko   14 téléchargement(s)


#34 Galacta

    Etudiant Ingénieur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 689 messages

Posté 18 March 2013 - 19:28 PM

Et si tu fais :

trace((c=743.255*100 -743*100)/100) ?
Word hard, play hard.

#35 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 20 March 2013 - 21:46 PM

coucou;
oui ca marche même si cest un peu du au hasard.. lol

il eut mieux valu écrire ceci pour être sûr.. trace((c=743.255*1000 -743*1000)/1000);

ceci dit après quelques timides essais ; jai pas résolu le bug de flash; il faut passer par des entiers j'imagine.
La calculette de notre ami didler travaille sur des entiers il me semble mais restitue les erreurs de flash cependant; donc jai loupé un ligne de code sans doute lol.

#36 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 March 2013 - 22:02 PM

NB : je ne travaille sur des entiers que pour la valeur en cours de saisie, pour la facilité du code. Après avoir relu le sujet en entier, je me suis aperçu que je n'avais rien inventé, c'est ce que lilive conseillais dans un post beaucoup plus tôt.
Dès qu'il y a un égal ou une seconde opération, je calcule l'opération précédente avec les opérateurs classiques de flash, et donc soumises au sus-dit bug.
Pour le contourner il faudrait réecrire le code des multiplications/divisions et là, je n'ai clairement pas le niveau. :-)

#37 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 21 March 2013 - 07:23 AM

coucou;
Lol, mais si tu as le niveau !! Il faut juste écrire ce qu'a fait Galacta il il me semble . Si il y a une virgule on multiple les deux opérandes par une puissance de 10 genre Math.pow(10,nombre_de_decimale) on fait l’opération qu'on divise a nouveau par le même chiffre .. y a plus qu'a..

#38 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 24 March 2013 - 11:53 AM

Et moi j'en suis toujours a essayer de respecter la priorité des opérateurs… o.O

j'ai d'abord tenté en procédural et me suis noyée ds les switch case*

me suis dit que peut-être des etats selon l'opérateur précédent, me suis noyée ailleurs.


*pourtant ça marchait bien avec seulement +, x et =, vais sans doute revenir sur cette première piste

Voir le messagecortoh, le 17 March 2013 - 08:24 AM, dit :

Une vrai usine à gaz cette calculette :eusa_doh:"j'aurais su, j'aurais pas venu",

+ 1 :mrgreen:
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#39 Goabonga

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2724 messages

Posté 24 March 2013 - 13:37 PM

y'a un pattern bien pratique pour ce genre de cas :

http://www.as3dp.com...stscript-tutor/

:)

#40 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 24 March 2013 - 14:04 PM

ahhhhhhhhhh !… Super ! je vais voir ça :)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)