Problème pour faire une suite d'opérations en C#

Résolu/Fermé
Eaglewin Messages postés 6 Date d'inscription mardi 26 juin 2018 Statut Membre Dernière intervention 28 juin 2018 - 26 juin 2018 à 12:57
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


10 réponses

Utilisateur anonyme
26 juin 2018 à 13:09
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 https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
Eaglewin Messages postés 6 Date d'inscription mardi 26 juin 2018 Statut Membre Dernière intervention 28 juin 2018
26 juin 2018 à 13:42
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
0
Utilisateur anonyme
26 juin 2018 à 17:49
Et quel est l'enchainement que tu veux faire?
0
Eaglewin Messages postés 6 Date d'inscription mardi 26 juin 2018 Statut Membre Dernière intervention 28 juin 2018
26 juin 2018 à 21:01
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
Modifié le 26 juin 2018 à 22:14
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.
0
Eaglewin Messages postés 6 Date d'inscription mardi 26 juin 2018 Statut Membre Dernière intervention 28 juin 2018
27 juin 2018 à 07:46
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
0
Utilisateur anonyme
27 juin 2018 à 18:25
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;
        }
    }

0
Eaglewin Messages postés 6 Date d'inscription mardi 26 juin 2018 Statut Membre Dernière intervention 28 juin 2018
27 juin 2018 à 19:29
Merci beaucoup, j'ai appris plein de choses grâce à vous ! Tout fonctionne merci encore !
Bonne soirée
Cordialement
0
Utilisateur anonyme
27 juin 2018 à 19:32
Je te conseille de suivre ce cours
https://tahe.developpez.com/dotnet/csharp/

Ça te prendra quelques jours, mais il te donnera de bonnes base en C#
0
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
Merci beaucoup pour le conseil !
Cordialement
0