Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calculer plusieurs textbox

Anonyme
12 décembre 2016 à 17:35:34

Bonjour,

Je commence juste la programmation en C#. Je suis donc en train de réaliser mon premier petit programme.

J'ai actuellement trois textBox et un Label qui est en visible = False;

Je cherche à pouvoir faire mon calcul à l'aide de cette formule: ((textBox1/ 100) * textBox2) * textBox3;

Après je cherche donc à faire afficher le résultat dans le label une fois la progress bar charger.

Voici donc mon code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TripPrice
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void calculPrix_Click(object sender, EventArgs e)
        {
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 10;
            progressBar1.Value = progressBar1.Minimum;
            while (progressBar1.Value < progressBar1.Maximum)
            {
                progressBar1.Value += 1;
                System.Threading.Thread.Sleep(1); //Cette ligne ne sert qu'a stopper l'exécution 1 seconde entre chaque changement de la progressBar.
            }
        }
    }
}

J'ai chercher sur internet mais pas plus je continue..

Je vous remercie.

Bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
12 décembre 2016 à 17:56:29

Plop!

https://msdn.microsoft.com/fr-fr/library/bb397679.aspx

double res = ((Int32.Parse(textBox1.Text)/ 100) * Int32.Parse(textBox2.Text)) * Int32.Parse(textBox3.Text);
label1.Text = "resultat: " + res.ToString();

a peu près ?
Aussi Convert.ToDouble(textbox1.Text) en fonction du type (entier, réél?) du nombre

-
Edité par breizhbugs 12 décembre 2016 à 17:59:23

  • Partager sur Facebook
  • Partager sur Twitter
** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
Anonyme
12 décembre 2016 à 20:39:49

Je te remercie!

Mais ce code je dois le mettre à quel endroit dit moi? S'active t-il une fois la progress bar charger? Et peut tu m'expliquer ce code à ta façon?

Excuse moi si je demande tout ça mais j'essaye de comprendre et d'apprendre :)

Merci!

  • Partager sur Facebook
  • Partager sur Twitter
12 décembre 2016 à 21:08:30

Logiquement le code qui vient de t'etre donné tu le mets dans la méthode calculPrix_Click (et je ne pige pas trop pourquoi tu as une progress bar là.) .


breizhbugs te le diras mieux que moi mais

(Int32.Parse(textBox1.Text)

 est une conversion de ta chaine récupérée de la textbox (qui est donc de type string) en int32 (un nombre en gros).

Int32.Parse(textBox2.Text)


 idem. Et pareil pour la partie sur la textbox3. Au lieu de créer à chaque fois une variable puis de lui attribuer le résultat de la conversion, les opérateurs agissent directement sur les conversions.

Le résultat est envoyé dans ton label (label1.Text) mais comme on a ici une variable de type int, elle va être convertie en string (donc ToString()).

-
Edité par Daerlnaxe 12 décembre 2016 à 21:15:31

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
12 décembre 2016 à 21:28:15

D'accord je vois maintenant, oui la progress bar c'etait juste un plus pour découvrir un peut plus du coup je l'ai enlver mais une fois que je clique sur mon bouton le résultat est 0 comment cela ce fait?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TripPrice
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void calculPrix_Click(object sender, EventArgs e)
        {
            double res = ((Int32.Parse(consoMoyvoiture.Text) / 100) * Int32.Parse(nbKm.Text)) * Int32.Parse(prixEssence.Text);
            label6.Text = res.ToString() + "€";
        }
    }
}



  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2016 à 9:53:50

Je pense que l'erreur vient de la division, diviser un int par 100 amène une erreur

Pour avoir fait ce code plus décomposé, (et l'avoir décomposé encore plus a un moment) la division ramène un 0 à un moment.

        private void calculPrix_Click(object sender, EventArgs e)
        {
            int conso = Int32.Parse(consoMoyvoiture.Text);
            int kilomètres = Int32.Parse(nbKm.Text);
            int prix = Int32.Parse(prixEssence.Text);

            var res = (conso * kilomètres *  prix /100);
            label6.Text = res.ToString() + "€";
        }


J'ai collé le 100 à la fin pour que ça soit plus simple à remarquer, si tu le lèves, immédiatement tu n'as plus 0 en résultat.

Je ne suis pas une bête en programmation il y a un mois je ne connaissais pas le c# (je programme de temps en temps en amateur sur d'autres langages), mais je pense que  c'st une erreur type de conversion. Donc il y a le choix de convertir tout en double, avec l'impact sur la mémoire que ça peut avoir (encore que là), mais sinon la bonne nouvelle c'est qu'il suffit de convertir une des variables en double pour que l'opération fonctionne. Je laisse le soin à ceux qui s'y connaissent mieux de donner un avis sur ce qui est le mieux à faire tout convertir en double ou bien une des variables... entre compréhension, bugs plus loin à venir et autre, je n'ai pas un recul assez bon pour savoir.

        private void calculPrix_Click(object sender, EventArgs e)
        {
            int conso = Int32.Parse(consoMoyvoiture.Text);
            double kilomètres = Double.Parse(nbKm.Text);
            int prix = Int32.Parse(prixEssence.Text);

            var res = (conso * kilomètres *  prix /100);
            label6.Text = res.ToString() + "€";
        }

Fonctionne donc, j'ai collé le double bien au milieu exprès pour montrer que l'ordre n'a pas d'importance...

Ce qui ne sera par contre pas le cas avec Ta fonction, puisqu'on ne stocke pas chaque variable en cours de route.

Donc pour toi:

     private void calculPrix_Click(object sender, EventArgs e)
        {
            double res = ((Int32.Parse(consoMoyvoiture.Text) / 100) * Double.Parse(nbKm.Text)) * Int32.Parse(prixEssence.Text);
            label6.Text = res.ToString() + "€";
        }

//Affiche 0 puisque la première opération donne 0


amène un 0 en résultat alors que

        private void calculPrix_Click(object sender, EventArgs e)
        {
            double res = ((Double.Parse(consoMoyvoiture.Text) / 100) * Int32.Parse(nbKm.Text)) * Int32.Parse(prixEssence.Text);
            label6.Text = res.ToString() + "€";
        }

//Affiche un résultat correct


Ramène un résultat juste .

(note bien la position du double)


Si tu as bien compris, en fait le calcul se fait à droite, d'abord, puis on l'affecte à la variable. Or bien sur diviser un int par un nombre qui lui est supérieur, ramène 0, puisqu'il ne prend pas ce qui est après la virgule. Tu peux essayer avec :

int test = 5 /5 ;
int test1= 5/6;
double test2=5/6;
double test3=(Double)5 / 6;

// test vaut 1
// test1 vaut 0;
// test2 vaut aussi 0
// test3 vaut 8.33333333333 => Enfin !  \o/ - Wooott



j'espère ne pas prendre une mauvaise méthode pour faire un cast, j'en ai fait peu. Donc si quelqu'un de plus calé me corriger au besoin. C'était pour te montrer un peu le fonctionnement pour que tu apprennes plus de cette erreur.

-
Edité par Daerlnaxe 13 décembre 2016 à 10:12:39

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
13 décembre 2016 à 10:11:35

D'accord je retiens bien merci!

Mais pourquoi alors le Double fait tout foirer?

Et une question pourquoi lorsque je met des virgule ou des point pour des nombres décimaux cela ne marche pas?

Merci!

  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2016 à 10:16:48

J'ai édité en cours de route avant ton message (désolé c'est une sale habitude) je pense que ça va répondre à ta question, le double ne fait pas foirer, c'est juste qu'on a assigné des int au double, par défaut le compilateur a du aller au plus simple, faire des opérations sur des int et assigner le résultat a la variable qui est double. Donc assigner un int (le résultat implicite à droite du = ) qui vaut 0 à un double ça fera toujours 0 :).

au cas ou tu ne l'aurais pas lu, donc je t'engage à lire la portion sur le 5/6 que j'ai rajouté probablement avant que tu ne lises.

Si ça t'intéresse j'ai appris le plus gros avec un livre qui date, peut être y'a t'il mieux depuis, relativement bien fait c'est "c# et .net version 1 à 4" de Gérard Leblanc aux éditions Eyrolles.

edit:
Pour ce qui est des virgules ou des points, j'imagine que tu dois prendre une erreur quand tu essaies, je me trompe ?
Dans tous les cas le type int ne prends que des nombres entiers signés (négatifs ou positifs).

Je te file un lien avec les types, ça t'aidera.

https://msdn.microsoft.com/fr-fr/library/ms228360(v=vs.90).aspx

selon les cas de figure il faut bien choisir sa donnée afin de ne pas utiliser trop de mémoire, tout en faisant en sorte qu'en cours de route ça soit compatible avec ce que l'on souhaite.

Je ne connais pas le cout des conversions je t'avoue en temps machine, je n'ai pas noté un énorme impact sur le processeur ou la mémoire.  Tu peux toujours le mesurer en lançant un chrono pour mesurer le temps écoulé si un jour ça t'intéresse avec StopWatch().

Je m'en sers pour optimiser mes fonctions les plus lourdes.

-
Edité par Daerlnaxe 13 décembre 2016 à 12:02:07

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
13 décembre 2016 à 15:22:58

C'est bon merci! Je viens d'utiliser le lien que tu m'as fournis pour les types et j'ai corriger! Cependant comment je peut faire pour que uniquement des chiffres sois possible à taper dans chaque textbox? En attendant ta réponse je cherche sur le net ;)
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2016 à 15:45:38

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
30 juin 2022 à 16:35:23

Comment faire la somme de deux textBox en C# pour afficher dans un autre textBox ?
  • Partager sur Facebook
  • Partager sur Twitter
30 juin 2022 à 21:00:37

Faites votre propre sujet SVP.

Et avec ce que vous avez déjà fait.

Sinon, du simple DataBinding ferait largement l'affaire.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
30 juin 2022 à 21:37:50

@JérémieChristianMateta Bonsoir, merci de ne pas déterrer d'ancien sujet. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses) un descriptif de votre problème et le code que vous avez écrit inséré sur le forum avec l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter