2008-12-11 5 views
1

J'ai travaillé sur ceci pour la majeure partie de la journée et je ne peux pas sembler faire de cette partie de mon travail de code. Le but du code est de permettre à l'utilisateur d'entrer un ensemble de valeurs afin de calculer la valeur manquante. Comme une fonctionnalité supplémentaire, j'ai placé un CheckBox sur le formulaire pour permettre à l'utilisateur de faire d'autres calculs. C'est là que réside mon problème. Je sais que le code fonctionne parce que si je change la formule, la valeur qui apparaît dans tb3_aic.Text change selon la formule. Cependant, quand j'utilise le dessous, la réponse ne change pas comme il se doit. S'il vous plaît référence le code ci-joint. Si une image jpg est nécessaire de la formule, je peux l'envoyer par courrier électronique.C# Math Problème

void Calc3Click(object sender, EventArgs e) 

    { 
     if (String.IsNullOrEmpty(tb3_skv.Text) | String.IsNullOrEmpty(tb3_kva.Text) | String.IsNullOrEmpty(tb3_z.Text)) 
    { 
     MessageBox.Show("Enter all required values", "Missing Data", MessageBoxButtons.OK); 
    } //If user does not enter all the values required for the calculation show error message box 
    else 

    { 
     if (!String.IsNullOrEmpty(tb3_skv.Text) & !String.IsNullOrEmpty(tb3_kva.Text) & !String.IsNullOrEmpty(tb3_z.Text)) 

     { //If motor load check box is not checked and required values are entered calculate AIC based on formula. 
      int y; 
      decimal x, z, a; 
      x = decimal.Parse(tb3_skv.Text);  
      y = int.Parse(tb3_kva.Text); 
      a = decimal.Parse(tb3_z.Text); 
      z = (y * 1000)/(x * 1.732050808m)/(a/100); //the m at the end of the decimal allows for the multiplication of decimals 
      tb3_aic.Text = z.ToString(); 
      tb3_aic.Text = Math.Round(z,0).ToString(); 
     } 


     if (cb3_ml.Checked==true) 
     {//If Motor Load CB is checked calculate the following 
      int y, b; 
      decimal x, z, a; 
      x = decimal.Parse(tb3_skv.Text); 
      y = int.Parse(tb3_kva.Text); 
      a = decimal.Parse(tb3_z.Text); 
      b = int.Parse(tb3_ml.Text); 
      z = ((y * 1000)/(x * 1.732050808m)/(a/100))+((b/100)*(6*y)/(x*1.732050808m)*1000); 
      tb3_aic.Text = z.ToString(); 
      tb3_aic.Text = Math.Round(z,5).ToString(); 
     } 

    } 

Je suis reconnaissant pour toute aide qui peut être fournie.

Merci, Greg Rutledge

+0

Ce poste peut avoir été étiqueté comme devoir, mais il est en fait une calculatrice pour moi et d'autres dans mon bureau. –

+0

Mes yeux! S'il vous plaît utiliser un éditeur de code qui fait l'indentation pour vous;) – VVS

+0

Je suis un débutant en utilisant # Develop. J'ai peur de ne pas connaître la différence entre un code moche et un code élégant. –

Répondre

5

Sans vraiment savoir quel est le problème, quelques choses un peu bizarre:

  • En outre, le mélange décimal et entier dans un calcul peut conduire à des résultats inattendus, sauf si vous savez vraiment ce que vous faites. Je suggère d'utiliser seulement des décimales (ou des doubles, qui sont beaucoup plus rapides et qui ont généralement assez de précision pour les calculs d'ingénierie).
  • Vous définissez également tb3_aic.Text deux fois, je suppose que vous avez décidé d'arrondir plus tard et j'ai oublié d'enlever le premier.

Edit: Ceci est apparemment mal en C#:

  • Vous utilisez au niveau du bit (&) dans le cas où la clause vous dire probablement logique (& &).

La seule différence entre eux lorsqu'ils sont utilisés avec des opérandes booléens sont que & & les courts-circuits (n'évalue pas le droit opérande si la gauche est faux). J'ai appris quelque chose, merci les commentaires.:)

+0

+1 pour le mélange des calculs décimaux et int - c'est là que je regarderais en premier. –

+0

Le premier point est faux. Ce sont des opérateurs logiques non bit-à-bit dans ce contexte. –

+0

Mélanger décimal et int était le problème. Je l'ai changé et la formule calculée correctement. Merci beaucoup pour ça! –

3

Modifier ceci:

int y, b; 

à ceci:

int y; 
decimal b; 

et il fonctionne, selon ce test:

public void Test2() 
    { 
     int y; 
     decimal b; 
     decimal x, z, a; 
     decimal z1, z2; 
     x = 480m; 
     y = 2500; 
     a = 5.75m; 
     b = 10; 
     z1 = ((y * 1000)/(x * 1.732050808m)/(a/100)); 
     z2 = ((b/100) * (6 * y)/(x * 1.732050808m) * 1000); 
     z = z1 + z2; 
     Console.WriteLine("{0}, {1}", z1, z2); 
     Console.WriteLine(Math.Round(z, 0).ToString()); 
    } 

La raison en est que l'entier 10 divisé par l'entier 100 est l'entier 0, lequel zéro est l'entier z2.

+0

J'ai changé toutes les variables en décimal. Y at-il une raison de quitter y int? –

+0

Aucune raison du tout. –

0

Je ne sais pas si c'est énorme mais vous êtes en train de définir deux fois le texte de la boîte de texte tb3_aic quand vous essayez de concaténer?

tb3_aic.Text = z.ToString(); 
tb3_aic.Text = Math.Round(z,0).ToString(); 

Vous semblez faire cela dans les deux méthodes.

Plus je le regarde, cela pourrait être un problème puisque vous le définissez dans le premier si puis le second If écraserait si la case est cochée.

+0

Si la deuxième formule écrase la sortie de la première, elle est correcte car la deuxième formule produira une réponse différente. Comment pourrais-je consolider? –

+0

Peu importe, je vois. Je supprime le premier jeu de texte. –

0

entrées de l'échantillon, la première formule x = 480 y = 2500 a = 5,75

Pour la première formule, la sortie doit être 52296

entrées de l'échantillon, la deuxième formule x = 480 y = 2500 a = 5,75 b = 10

Pour la première formule, la sortie doit être 54100,42

Hope this helps

0

cette ligne n'est pas nécessaire, même si ce ne est pas un bug, il suffit toujours true

if (!String.IsNullOrEmpty(tb3_skv.Text) & !String.IsNullOrEmpty(tb3_kva.Text) & !String.IsNullOrEmpty(tb3_z.Text)) {