Калькулятор фракций C # в форме - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь сделать калькулятор фракций в форме C #.

Я просто не могу понять математику. Это форма Моя форма

Я хочу, чтобы она могла вычислить результат.Когда вы набираете 10/5 и 10/7, результат должен быть 3 3/7. Или как Как получится

Что я получу Мой результат

Это мой код

private void button1_Click(object sender, EventArgs e) // result bottom

    {

        double box_In_Top_Left = Convert.ToDouble(textBox1.Text); // Right UPPER BOX
        double box_In_Down_Left = Convert.ToDouble(textBox2.Text); // Venstra Nederst string

        double box_In_Top_Right = Convert.ToDouble(textBox3.Text); // Højre OP string
        double box_In_Down_Right = Convert.ToDouble(textBox4.Text); // Højre Nederst String


        double whole = box_In_Down_Right * box_In_Down_Left; // Whole (Bottom Part of A fraction

        string whole_String = Convert.ToString(whole); // Converts the Whole to a string
        textBox7.Text = whole_String; // Shows the Answer in the box in the bottom right 

        double Calculation1 = box_In_Top_Left * box_In_Down_Right;  // Calculates the top lefts box result

        double Calculation2 = box_In_Top_Right * box_In_Down_Left; // Calculates the top right box Result

        double part = Calculation2 + Calculation1; // Calculates answer for the top box

        string part_String = Convert.ToString(part);


        if (part >= whole) // if the part is bigger then the whole
        {


            double Amount_Of_times_greater = part / whole;


            string string_Amount_Of_times_greater = Convert.ToString(Amount_Of_times_greater);

            double Ekstra_greatnes = part / Amount_Of_times_greater;

            textBox6.Text = string_Amount_Of_times_greater;
            double Part_Whole = (part / Amount_Of_times_greater);


            if (Ekstra_greatnes == whole)
            {

                Part_Whole = Part_Whole - whole;
                string string_Part_Whole = Convert.ToString(Part_Whole);

                textBox8.Text = string_Part_Whole;
            }
            else
            {
                string string_Part_Whole = Convert.ToString(Part_Whole);
                textBox8.Text = string_Part_Whole;
            }


        }
        else // For if the the part is not bigger then the whole
        {

            textBox8.Text = part_String; // Displayes part in the box in the right corner
        }

    }

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Я бы посоветовал хранить числитель и знаменатель отдельно. Лучше всего было бы создать новую структуру Fraction для этой цели. Затем вы можете использовать евклидов алгоритм для вычисления наибольшего общего делителя. Имея эту информацию в руках, вы можете отформатировать свой результат.

string FormatFraction(int numerator, int denominator)
{
    int gcd = Gcd(numerator, denominator );
    numerator /= gcd;
    denominator /= gcd;
    return $"{numerator/denominator} {Math.Abs(numerator/denominator)}";
}

int Gcd(int numerator, int denominator)
{
    int a = Math.Abs(numerator);
    int b = Math.Abs(denominator);
    while (b != 0)
    {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

В этом примере кода предполагается, что вы используете версию c #, которая поддерживает интерполяцию строк ($ ""). Если нет, вы можете заменить последнюю строку фракции Format на конкатенацию строк.

Чтобы добавить две дроби a = a_1 / a_2 и b = b_1 / b_2, вы можете использовать простую формулу a + b = c = c_1 / c_2 = a_1 * b_2 + a_2 * b_1 / a_2 * b_2

0 голосов
/ 08 сентября 2018

Я не вижу правильности вашей логики, но я вижу первую проблему -> может быть из того же теста: Ekstra_greatnes == целом

трудно сравнивать дважды,

Вы можете попробовать использовать десятичный тип, который хранит числа в десятичной записи. Таким образом, 0.1 будет точно представлен или вы можете использовать (видно на сайте Microsoft) значение epsilon для сравнения обоих значений:

// Initialize two doubles with apparently identical values
double double1 = .333333;
double double2 = (double) 1/3;
// Define the tolerance for variation in their values
double difference = Math.Abs(double1 * .00001);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(double1 - double2) <= difference)
   Console.WriteLine("double1 and double2 are equal.");
else
   Console.WriteLine("double1 and double2 are unequal.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...