Menu

Problème pour faire une suite d'opérations en C# [Résolu]

Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
- - Dernière réponse : Eaglewin
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
- 28 juin 2018 à 08:24
Bonjour,
Cela fait plusieurs mois que je cherche la solution, mais je ne trouve pas j'espère que vous pourrez m'aider. Je suis débutant en C#. Je vous explique mon problème : je code une calculatrice en C# et en UWP. Je voudrais faire un enchainement d'opérations sans cliquer la touche égal. J'ai essayé quelque chose qui marche, mais la deuxième fois que je fais cet enchaînement, cela ne marche plus. Peut être qu'avec la commande PerformClick() cela marchera mais je ne la trouve pas en UWP alors que dans les Windows Forms cette commande s'affiche. Peut être existe t'il un équivalent pour l'UWP ?
Merci d'avance
Je vous joint quelques photos de mon code pour que vous puissiez mieux vous repérer.
Bonne journée
Cordialement


Afficher la suite 

10 réponses

Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
Bonjour,
Pour que l’on puisse faire quelque chise avec ton code, c’est pas des captures d’écran qu’il nous faut.
C’est le code copié collé et mis en couleur avec les balises dédiées, voir explications ici http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Commenter la réponse de Whismeril
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
0
Merci
Bonjour,
Voici donc le code :
 private void button5_Click(object sender, RoutedEventArgs e)
        {
            Button b = (Button)sender;
            if (result != 0)
            {
                operation = Convert.ToString(b.Content);
                txtDisplay.Text = (result / Double.Parse(txtDisplay.Text)).ToString();
                result = Double.Parse(txtDisplay.Text);
                txtDisplay.Text = "";
                IbIShowOps.Text = result + " " + b.Content;
                enter_value = true;
            }
            else
            {
                operation = Convert.ToString(b.Content);
                result = Double.Parse(txtDisplay.Text);
                IbIShowOps.Text = result + " " + b.Content;
                enter_value = true;
            }
            firstnum = IbIShowOps.Text;
        }

Le deuxième :
 private void btnEquals_Click(object sender, RoutedEventArgs e)
        {
            secondnum = txtDisplay.Text;
            IbIShowOps.Text = "";
            switch (operation)
            {
                case "+":
                    txtDisplay.Text = (result + Double.Parse(txtDisplay.Text)).ToString();
                    break;
                case "-":
                    txtDisplay.Text = (result - Double.Parse(txtDisplay.Text)).ToString();
                    break;
                case "X":
                    txtDisplay.Text = (result * Double.Parse(txtDisplay.Text)).ToString();
                    break;
                case "/":
                    txtDisplay.Text = (result / Double.Parse(txtDisplay.Text)).ToString();
                    break;
                default:
                    break;

            }
            result = Double.Parse(txtDisplay.Text);
            operation = "";

Et le dernier :
Double result = 0;
        String operation = "";
            bool enter_value = false;
        String firstnum, secondnum;

        public MainPage()
        {
            this.InitializeComponent();
        }

J'espère que cela pourra vous aider
Cordialement
Commenter la réponse de Eaglewin
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
Et quel est l'enchainement que tu veux faire?
Commenter la réponse de Whismeril
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
0
Merci
En fait, je voudrais faire un enchainement d'opérations sans cliquer sur la touche égal. Par exemple, si on touche une fois la touche diviser je voudrais calculer les deux nombres entrés précédemment et cela plusieurs fois. Je ne sais pas si je suis très clair, sinon référez vous au message qui a ouvert le sujet. J'espère que vous pourrez résoudre mon problème.
Bonne soirée
Cordialement
Commenter la réponse de Eaglewin
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
J'avais relu le premier message, mais je n'étais pas sûr d'avoir bien compris.

Le problème selon moi, est un problème récurrent chez les débutants.
Tu te sers de l'interface graphique comme source de données.

C# est un langage tout objet (tout ce que l'on utilise est un objet, tape
"n'importe quel texte".
et intellisense va te proposer les quelques méthodes d'une instance de string.

L'idée principale de la programmation objet est de spécialiser ses classes et de les faire travailler ensemble.

Imaginons une classe "Calculatrice"

Elle pourrait avoir une méthode SaisieChiffre qui prend un caractère en paramètre.
Cette méthode ajouterait le chiffre correspondant au nombre en cours.

public double NombreEnCours {get; set;} = 0;

public void SaisieChiffre(char Chiffre)
{
       int chiffre;
       if (int.TryParse(Chiffre, out chiffre)
       {
                NombreEnCours *= 10 + chiffre;
       }
}


Du coté de l'interface, tous les clicks des boutons représentant les chiffres appellent cette méthode

private void buttonChiffres_Click(object sender, RoutedEventArgs e)
{
     bouton b = sender as Button;
    if (b != null)
    {
         maCalculatrice.SaisieChiffre(b.Texte);
    }

}



D'une part tu fais calculs sur des nombres et pas sur du texte. Ça parait logique non? Et pourtant, ça n'est pas ce que tu as codé.

En te servant de quelques variables tu peux stocker, un résultat temporaire (tant que égal n'est pas tapé), un opérateur intermédiaire et un nombre en cours.
  • Si tu tapes égal, le résultat final sera le résultat temporaire "opéré" par le nombre en cours,
  • si c'est un opérateur alors résultat temporaire sera le résultat temporaire "opéré" par le nombre en cours, et l'opérateur deviendra le nouveau tapé.


En plus tu peux binder ton affichage sur le résultat ou sur une propriété que tu construis exprès.
Voir ici un aperçu du binding en WPF https://codes-sources.commentcamarche.net/faq/11277-apercu-du-binding-en-wpf
Et ici, un tour d'horizon de la programmation objet en C# https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3


Pour les codes, j'ai tapé de tête, y'a p'tet une boulette ou 2, et j'ai pas gérés les chiffres après la virgule.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Commenter la réponse de Whismeril
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
0
Merci
Bonjour, merci pour votre code qui m'a aidé. Pourriez vous me donner un exemple pour les variables où sera stocké le résultat temporaire car je ne sais pas trop comment m'y prendre. En effet, je suis débutant et collégien. Merci d'avance.
Bonne journée

Cordialement
Commenter la réponse de Eaglewin
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
Un truc comme ça
    class Calculatrice
    {
        public double NombreEnCours { get; set; } = 0;

        public double Resultat { get; set; } = 0;

        private double resultatTemporaire = double.NaN;//Nan => not a number

        private string operateur = null;

        public void SaisieChiffre(string Chiffre)
        {
            int chiffre;
            if (int.TryParse(Chiffre, out chiffre))
            {
                NombreEnCours *= 10 + chiffre;
            }
        }

        public void SaisieOperateur(string Operateur)
        {
            if (operateur == null)//on est au premier nombre
            {
                resultatTemporaire = NombreEnCours;
            }
            else
            {
                //On calcule l'opération précédente
                CalculOperation();
            }

            //on remet le nombre en cours à zéro et on enregistre le nouvel opérateur
            NombreEnCours = 0;
            operateur = Operateur;
        }

        private void CalculOperation()
        {
            switch (operateur)
            {
                case "+":
                    resultatTemporaire += NombreEnCours;
                    break;

                //etc

                default:
                    //cas d'un opérateur non prévu
                    throw new Exception("Opérateur non codé");
            }

        }

        public void SaisieEgal()
        {
            CalculOperation();
            Resultat = resultatTemporaire;

            //on RAZ les variables
            NombreEnCours = 0;
            operateur = null;
            resultatTemporaire = double.NaN;
        }
    }

Commenter la réponse de Whismeril
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
0
Merci
Merci beaucoup, j'ai appris plein de choses grâce à vous ! Tout fonctionne merci encore !
Bonne soirée
Cordialement
Commenter la réponse de Eaglewin
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
344
0
Merci
Je te conseille de suivre ce cours
http://tahe.developpez.com/dotnet/csharp/

Ça te prendra quelques jours, mais il te donnera de bonnes base en C#
Commenter la réponse de Whismeril
Messages postés
6
Date d'inscription
mardi 26 juin 2018
Statut
Membre
Dernière intervention
28 juin 2018
0
Merci
Merci beaucoup pour le conseil !
Cordialement
Commenter la réponse de Eaglewin