Математическая задача - PullRequest
       14

Математическая задача

1 голос
/ 12 декабря 2008

Я работал над этим большую часть дня и не могу заставить эту часть моего кода работать. Цель этого кода - дать пользователю возможность ввести набор значений для вычисления пропущенного значения. В качестве дополнительной функции я поместил CheckBox в форму, чтобы позволить пользователю делать дальнейшие вычисления. Вот где моя проблема. Я знаю, что код работает, потому что, если я меняю формулу, значение, которое появляется в tb3_aic.Text, изменяется в соответствии с формулой. Однако, когда я использую ниже, ответ не меняется, как это должно быть. Пожалуйста, обратитесь к приложенному коду. Если требуется изображение в формате jpg формулы, я могу отправить его по электронной почте.

 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();
        }

     }

Я благодарен за любую помощь, которая может быть оказана.

Спасибо, Грег Ратледж

Ответы [ 5 ]

5 голосов
/ 12 декабря 2008

Не зная, в чем проблема, некоторые вещи выглядят немного странно:

  • Кроме того, смешивание десятичного и целого в вычислениях может привести к неожиданным результатам, если вы действительно не знаете, что делаете. Я предлагаю использовать только десятичные числа (или двойные числа, которые намного быстрее и обычно достаточно точны для инженерных вычислений).
  • Вы также дважды задали tb3_aic.Text. Полагаю, вы решили округлить позже и забыли удалить первый.

Редактировать: Это очевидно неправильно в C #:

  • Вы используете побитовое И (&) в предложении if, где вы, вероятно, подразумеваете логическое И (&&).

Единственное различие между ними при использовании с булевыми операндами заключается в том, что && короткое замыкание (не оценивает правый операнд, если левый равен false). Я кое-что узнал, спасибо людям, комментирующим. :)

3 голосов
/ 12 декабря 2008

Изменить это:

int y, b;

К этому:

int y;
decimal b;

и это работает, согласно этому тесту:

    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());
    }

Причина в том, что целое число 10, деленное на целое число 100, является целым числом 0, что равно нулю целого z2.

0 голосов
/ 12 декабря 2008

эта строка не нужна, хотя это и не ошибка, она всегда всегда имеет значение true

if (!String.IsNullOrEmpty(tb3_skv.Text) & !String.IsNullOrEmpty(tb3_kva.Text) & !String.IsNullOrEmpty(tb3_z.Text)) {
0 голосов
/ 12 декабря 2008

Пример входов, первая формула х = 480 у = 2500 а = 5,75

Для первой формулы результат должен быть 52296

Пример входов, вторая формула х = 480 у = 2500 а = 5,75 б = 10

Для первой формулы результат должен быть 54100.42

Надеюсь, это поможет

0 голосов
/ 12 декабря 2008

Я не знаю, насколько это велико, но вы устанавливаете текст текстового поля tb3_aic дважды, когда, возможно, вы пытаетесь объединить?

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

Кажется, вы делаете это обоими способами.

Чем больше я на это смотрю, тем более это может быть проблемой, поскольку вы устанавливаете его в первом, если затем во втором, если оно будет перезаписано, если флажок установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...