BMI w C#


(hatezit) #1

Witam, po przeanalizowaniu kodu nie wiem już czemu źle przelicza a mianowicie:

Chcę stworzyć kalkulator BMI w C#, tak samo tworzyłem w starym programie C++ Builder i to co jest w komentarzu tak było w C++ B ale bez Convert.To Double.

Na dwa sposoby to robiłem ale źle liczy. A o to kod który jest pod przyciskiem oblicz (button1).

private void button1_Click(object sender, EventArgs e)

        {

            //double wynik, mkg, wcm, t_mkg, w_wcm;

            //t_mkg = Convert.ToDouble(mkg.Text);

            //w_wcm = Convert.ToDouble(wcm.Text);

            //wynik = mkg / (wcm * 100 / wcm * 100);

            wynik.Text = (float.Parse(mkg.Text)/(float.Parse(mkg.Text)*100 / float.Parse(wcm.Text))).ToString("0.00000"); // tu chcę mieć ilość cyfr po przecinku, bez tego też źle liczy


        }

Czemu źle przelicza? Widziałem na youtube jak ktoś robi podobnie jak jest w komentarzu i nie działa. Pola tekstowe w oknie Form1 noszą nazwę mkg, wcm, trzecie pole co daje wynik to nazwa wynik.


(Fiołek) #2

Zamiast wszystko upychać w jednej linii, z masą nawiasów i nic nie mówiącymi nazwami, rozbiłbyś to na zmienne - od razu widziałbyś, że zgubiłeś “* 100” przy float.Parse(wcm.Text) i drugie(licząc od lewej) float.Parse parsuje masę, nie wzrost.

Tak swoją drogą, to ten wzór, jeśli czytać go zgodnie z zasadami matematyki, nie liczy BMI, tylko zamienia kilogramy na setki miligramów(wcm się skraca, zostaje mkg / 10000).

Poprawne liczenie BMI(za Wikipedią):

double mass = double.Parse(mkg.Text); //Masa w kgdouble height = double.Parse(wcm.Text) / 100.0; //Wzrost w metrach, przy założeniu, że wcm to wzrost w centymetrach.double wynik = mass / height / height;[/code]

(hatezit) #3

No tak, ale jak pisałem zgodnie ze wzorem to nie wychodziły mi wyniki jak w innych kalkulatorach BMI, które są w necie a są dostępne online. Sprawdziłem ten kod, nie ma błędów ale też nie pojawia się wynik w polu wynik.


(Fiołek) #4

Widocznie nie pisałeś zgodnie ze wzorem, tylko miałeś coś nie tak(tak jak tutaj), albo ten wzór nie był poprawny.

Brawo za “kopiuj-wklej” bez zrozumienia :wink: Przyjrzyj się ostatniej linijce, i dostosuj ją do swojego kodu.


(hatezit) #5

Ostatnia linijkę robiłem tak jak w swoim kodzie czyli

wynik.Text = (double.Parse(mass.Text) / double.Parse(height.Text) / double.Parse(height.Text))).ToString();

(Fiołek) #6

I mass oraz height to zmienne z mojego kodu? Odsyłam do pierwszego lepszego kursu C#(hint: zmienne typu double nie mają właściwości/pola Text i nie są też TextBoxami tak jak Ci się może wydawać - to już są sparsowane wartości z tych pól tekstowych).


(hatezit) #7

Doszedłem i dobrze teraz liczy:)

wynik.Text = (float.Parse(mkg.Text) / (float.Parse(wcm.Text) / 100.0 * float.Parse(wcm.Text) / 100.0)).ToString();

ale mam problem jak zaokraglać wynik bo nie jest taki jak inne wyniki w kalkulatorach online.


(Fiołek) #8

Brawo.

Jeśli chcesz wyświetlić z daną dokładnością, to możesz podać format do metody ToString - np. tak, jak zrobiłeś to w pierwszym poście. Pamiętaj tylko, że double ma ograniczoną precyzję i nie zawsze dostaniesz idealny wynik.


(hatezit) #9

Dlatego dałem w ToString(“0.00”); Ale mam drugi problem

if(wynik < 22) // tu pojawia sie komunikat o znaczek < jako błąd

  {

   kom.Text =" test"; //kom.text to nowe pole textBox.

  }

PS. C# to dopiero poznaję;) Wiem, powinienem od konsolowych zacząć i tez tworzę :slight_smile:


(Frankfurterium) #10

Hint: błąd błędowi nierówny. Zawsze kiedy takowy zgłaszasz / prosisz o pomoc, załącz komunikat albo chociaż wyraźnie napisz, czego dotyczy. “< jako błąd” zbyt konkretne nie jest.