MuzzDead
@MuzzDead
Учу Python, вижу в этом смысл;)

Почему вовремя ввода определённых чисел воспроизводит — 0 или Nan?

Когда в form - програму(на С#) для вычисление площади треугольника ввожу числа 11 11 22 то воспроизводит - 0, а когда ввожу числа 9 9 19 воспроизводит - Nan. Почему и как это исправить?

Вот код:
namespace _6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int a, b, c;
            double s1, s2, p;
            a = Convert.ToInt32(textBox1.Text);
            b = Convert.ToInt32(textBox2.Text);
            c = Convert.ToInt32(textBox3.Text);

            p = (a + b + c) / 2;
            s1 = Math.Sqrt(p * (p - a) * (p - b) * (p - c));

            s2 = 0.5 * a * b;
            if (s1 == s2)
            {
                label5.Text = Convert.ToString("Треугольник abc прямоугольный");
            }
                  
            label4.Text += Convert.ToString(s1);
        }
    }
}
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
1. В этой строке
(a + b + c) / 2
Будет происходить целочисленное деление, тк сумма a+b+c и 2 имеют тип int.
Чтобы это исправить, тебе надо написать так:
(a+b+c)/2.00
Значение 2.00 имеет тип double и тогда деление пройдёт как ожидается.

2. При значениях 9 9 19 будет браться корень отрицательного числа (даже если исправить первую проблему), а так как double - это не комплексное число, то и значение такое оно представить не может.

3. А почему 0 у тебя получается в первом случае - хз. Запускал в консоли и у меня получилось 55.31
Мой код

// Запускал в roslynpad. Тебе возможно придётся убрать вызовы Dump и добавить юзинги
var result1 = CalcualteAreaOfTriangle(11,11,12).Dump("result 1");
var result2 = CalcualteAreaOfTriangle(9,9,19).Dump("result 2");


static double CalcualteAreaOfTriangle(int a, int b, int c)
{
    var p = (a + b + c) / 2.00;
    p.Dump("p");
    var s1 = Math.Sqrt((p * (p - a) * (p - b) * (p - c)).Dump("pre sqrt"));
    var s2 = 0.5 * a * b;
    if (s1 == s2)
    { // Кстати это почти никогда не будет срабатывать из-за IEEE754
        Console.WriteLine("Треугольник прямоугольный");//а точно ли?
    }
    return s1;
}



PS:
button1, a, b, c, s1, s2, label4, label5, Form1, textBox1, textBox2, textBox3, button1, p
Осуждаю такое именование.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы