C# dziwne błędy

0

Siema,
mam dziwny problem z moim kodem. Konsola nie zwraca żadnych błędów jednak zawsze wykonuje się instrukcja z else pomimo wykonania warunku z if. Poniżej zamieszczam kod:

double a = double.Parse(textBox1.Text);
                    double pc = 6 * Math.Pow(a, 2);
                    double V = Math.Pow(a, 3);

                    if (a > 0)
                    {
                        label7.Text = "Pole sześcianu wynosi " + pc.ToString();
                        label8.Text = "Objętość sześcianu wynosi " + V.ToString();
                    }
                    else
                    {
                        label7.Text = "Podano błędne wymiary";
                        label8.Text = "Podano błędne wymiary";
                    }
0

Czyli label 7 i 8 zawierają "błędne wymiary" tak? Sprawdzałeś debuggerem?

0

Tak. Powinno w label 7 i 8 wyświetlić wynik działania, a zawsze wyświetla "Podano błędne wymiary", nawet jeżeli podam w textBox1 liczbę > 0.

0

A blok if wykonuje się (czy warunek jest prawdziwy) przy sprawdzaniu debuggerem?

0

Nic takiego nie widzę.
Wklejam większą część kodu. Może ona coś ułatwi.

private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                try
                {
                    double a = double.Parse(textBox1.Text);
                    double H = double.Parse(textBox4.Text);
                    double pp = (a * a * Math.Sqrt(3) / 4);
                    double pb = 3 * a * H;
                    double pc = 2 * pp + pb;
                    double V = pp * H;

                    if (a > 0 && H > 0)
                    {
                        label7.Text = "Pole graniastosłupa wynosi " + pc.ToString();
                        label8.Text = "Objętość graniastosłupa wynosi " + V.ToString();
                    }
                    else
                    {
                        label7.Text = "Podano błędne wymiary";
                        label8.Text = "Podano błędne wymiary";
                    }
                }
                catch (FormatException liter)
                {
                    label7.Text = "Podano błędne wymiary";
                    label8.Text = "Podano błędne wymiary";
                }
            }
            else if (radioButton2.Checked)
            {
                try
                {
                    double a = double.Parse(textBox1.Text);
                    double b = double.Parse(textBox2.Text);
                    double H = double.Parse(textBox4.Text);
                    double pc = (2 * a * b) + (2 * b * H) + (2 * a * H);
                    double V = a * b * H;

                    if (a > 0 && b > 0 && H > 0)
                    {
                        label7.Text = "Pole prostopadłościanu wynosi " + pc.ToString();
                        label8.Text = "Objętość prostopadłościanu wynosi " + V.ToString();
                    }
                    else
                    {
                        label7.Text = "Podano błędne wymiary";
                        label8.Text = "Podano błędne wymiary";
                    }
                }
                catch (FormatException liter)
                {
                    label7.Text = "Podano błędne wymiary";
                    label8.Text = "Podano błędne wymiary";
                }
            }
0

Na moje to sczytujesz ze złego text boxa. Poza tym najpierw przeliczasz, a potem sprawdzasz czy wprowadzone dane mają sens. Powinieneś obliczenia mieć wewnątrz if albo inaczej to skonstruować

double a = double.Parse(textBox1.Text);
if (a <= 0)
{
   label7.Text = "Podano błędne wymiary";
   label8.Text = "Podano błędne wymiary";
   return;
}
double pc = 6 * Math.Pow(a, 2);
double V = Math.Pow(a, 3);
label7.Text = "Pole sześcianu wynosi " + pc.ToString();
label8.Text = "Objętość sześcianu wynosi " + V.ToString();
0

To teraz naprawdę sprawdź to pod debugerem. Postaw breakpoint na początku metody i po tym, jak program zatrzyma się na nim wykonaj kod linijka po linijce podglądając wartości danych.

Tak przy okazji - nie sądzisz, że bez sensu jest najpierw wykonywać obliczenia, a dopiero potem sprawdzać warunki na dane do tych obliczeń? Stawiam dolary przeciw orzechom, że właśnie z tego powodu masz problem - leci wyjątek, a Ty sądzisz, że wykonało się "else".
Łamiesz także regułę DRY mając cztery kopie tego samego kodu ("Podano błędne wymiary"), co wprowadziło Cię w błąd odnośnie catch/else.

0

Po serii prób i błędów doszedłem, że program traktuje liczbę wpisaną w textBox1 (na pewno właściwy) jako literę. Co może być tego powodem?

@ŁF
Dziękuję za uwagę, zmieniłem kolejność wykonywania obliczeń. Jednak jeżeli mógłbyś mi dokładniej opisać jak zapobiec łamaniu reguły DRY (na tym konkretnym przykładzie). Jak zapewne łatwo zobaczyć patrząc na mój kod jestem dopiero początkującym, więc nie orientuję się jeszcze biegle we wszystkim :)

Pozdrawiam

0

Pewnie wpisałeś z kropką zamiast przecinkiem.

0

I tutaj Ciebie zaskoczę- dałem kropkę :)

0
SiSz napisał(a):

I tutaj Ciebie zaskoczę- dałem kropkę :)

Jeśli uruchamiasz na polskich ustawieniach, to powinieneś dać przecinek.

0
SiSz napisał(a):

I tutaj Ciebie zaskoczę- dałem kropkę :)

Nie miałem opcji edycji. Naturalnie chodziło mi o to, że dałem przecinek. To nie jest powodem tego błędu (próbowałem nawet na liczbach całkowitych).

1 użytkowników online, w tym zalogowanych: 0, gości: 1