Liczenie BMI

0

Witam, czy mógłby mi powiedzieć co robię nie tak? Dopiero zaczynam moją drogę z programowaniem.
Problem jest taki, że obojętnie jakich danych nie wpiszę, to zawsze wynik wykazuje wychudzenie.

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    cout << "Witaj w programie liczącym twoje BMI!" << endl;
    double a, b, c, d;
    cout << "Proszę podać swoją wagę w kilogramach:" << endl;
    cin >> a; // waga
    cout << "Proszę podać swój wzrost w cm:" << endl;
    cin >> b; // wzrost
    c = b / 100; // zamienia wzrost z cm na metry
    d = a / (c * c);
    if (d < 16) {
        cout << "Twoje BMI wynosi: " << d;
        cout << "Masz poważne problemy ze swoim zdrowiem! Twoje BMI oznacza wygłodznie!!! " << endl;
        return 0;
    }
    if (d >= 16 || d < 17) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "Niestety, oznacza to wychudzenie :( " << endl;
        return 0;
    }
    if (d >= 17 || d < 18.5) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "AJJJ, twoje BMI wskazuje na niedowagę, musisz trochę nad sobą popracować " << endl;
        return 0;
    }
    if (d >= 18.5 || d < 25) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "Gratuluję zdrowia! Masz prawidłowe BMI" << endl;
        return 0;
    }

    if (d >= 25 || d < 30) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "UPS! " << endl;
        cout << "Wychodzi na to, że masz  nadwagę" << endl;
        return 0;
    }
    if (d >= 30 || d < 35) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "Niestety, oznacza to już otyłość I stopnia " << endl;
        cout << "Dobrze byłoby trochę zredukować wagę" << endl;
        return 0;
    }
    if (d >= 35 || d < 40) {
        cout << "Twoje BMI wynosi: " << d << endl;
        cout << "Niestety, oznacza to otyłość II stopnia " << endl;
        cout << "Musisz coś z tym zrobić !" << endl;
        return 0;
    }
    if (d >= 40) {
        cout << "Twoje BMI wynosi: " << d << " Oznacza to skrajną otyłość :9";
        cout << "MORDOOOOOO ";
        cout << "Wychodzi na to, że cierpisz na skrajną otyłość, zrób koniecznie coś z tym";
        return 0;
    }
    return 0;
}
4

(d >= 16 || d < 17) && nie ||

0

Z ciekawości przerobiłem na kod Pythona. Dodatkowo BMI wystarczy wydrukować raz przed warunkami.

while True:
    print("Witaj w programie liczącym twoje BMI!")
    a = int(input("Proszę podać swoją wagę w kilogramach:"))
    b = int(input("Proszę podać swój wzrost w cm:")) / 100
    d = a / (b * b)
    print("Twoje BMI wynosi: " + str(d))

    if d < 16:
        print("Masz poważne problemy ze swoim zdrowiem! Twoje BMI oznacza wygłodznie!!! ")

    elif d < 17:
        print("Niestety, oznacza to wychudzenie :( ")

    elif d < 18.5:
        print("AJJJ, twoje BMI wskazuje na niedowagę, musisz trochę nad sobą popracować ")

    elif d < 25:
        print("Gratuluję zdrowia! Masz prawidłowe BMI")

    elif d < 30:
        print("Wychodzi na to, że masz  nadwagę")

    elif d < 35:
        print("Niestety, oznacza to już otyłość I stopnia ")

    elif d < 40:
        print("Niestety, oznacza to otyłość II stopnia ")

    elif d >= 40:
        print("Wychodzi na to, że cierpisz na skrajną otyłość, zrób koniecznie coś z tym")

    break

2

Jeśli już robisz drabinkę if-ów, to możesz sobie uprościć warunki:

if d < 16:
  # ...
elif d < 17: # d MUSI tu być >= 16, bo gdyby nie było to warunek w if byłby prawdziwy
  # ...
0

To straszne! Użyj tablice

3
_13th_Dragon napisał(a):

To straszne! Użyj tablice

Przecież to wartości rzeczywiste?

UPDATE dobra, jak już napisałem posta to wersja w Haskellu :P (Testowana w Haskellu Online)

main :: IO ()
main = do
  putStrLn "Witaj w programie liczącym twoje BMI!"
  putStrLn "Proszę podać swoją wagę w kilogramach:"
  mStr <- getLine
  putStrLn "Proszę podać swój wzrost w cm:"
  hcmStr <- getLine
  let result = calculateBMI (readDouble mStr) ((readDouble hcmStr) / 100)
  putStrLn ("Twoje BMI wynosi: " ++ (show result))
  putStrLn (messageForBMI result)
  pure ()
  
readDouble :: String -> Double
readDouble = read

calculateBMI :: Double -> Double -> Double
calculateBMI m h = m/(h*h) 

messageForBMI :: Double -> String
messageForBMI bmi 
  | bmi < 16   = "Masz poważne problemy ze swoim zdrowiem! Twoje BMI oznacza wygłodznie!!! "
  | bmi < 17   = "Niestety, oznacza to wychudzenie :( "
  | bmi < 18.5 = "AJJJ, twoje BMI wskazuje na niedowagę, musisz trochę nad sobą popracować "
  | bmi < 25   = "Gratuluję zdrowia! Masz prawidłowe BMI"
  | bmi < 30   = "Wychodzi na to, że masz nadwagę"
  | bmi < 35   = "Niestety, oznacza to już otyłość I stopnia "
  | bmi < 40   = "Niestety, oznacza to otyłość II stopnia "
  | otherwise  = "Wychodzi na to, że cierpisz na skrajną otyłość, zrób koniecznie coś z tym"
1
  1. Jak coś ci nie działa zacznij od gdb -> idz go google albo youtube i wpisz gdb tutorial Gdb pozwala ci np. krok po kroku wykonać program i zobaczysz wartości zmiennych.
  2. tu zaproponuję coś nietypowego względem kolegów interval tress
    przykład implementacji z geks for geeks.
    https://www.geeksforgeeks.org/interval-tree/
    oczywiście to wymaga zmiany np. powinieneś dodać string do struktury.

implementacja z geek for geeks nie musi być najlepsza.
edit: podpowiem przedział do wyszukiwania jak w przykładzie z gg można użyć np. [6,6] w twoim przypadku [d,d]

2

@KamilAdam: Wersja z tablicą. Przy okazji dobrze wiedzieć, że w Haskellu można pisać krótki kod : P

while True:
    print("Witaj w programie liczącym twoje BMI!")
    b = int(input("Proszę podać swój wzrost w cm: ")) / 100
    a = int(input("Proszę podać swoją wagę w kilogramach: ")) / (b * b)
    print(f"Twoje BMI wynosi: {a}")
    wartosci = [16, 17, 18.5, 25, 30, 35, 40]
    komunikat = ["Masz poważne problemy ze swoim zdrowiem! Twoje BMI oznacza wygłodzenie!!! ",
                 "Niestety, oznacza to wychudzenie :( ",
                 "AJJJ, twoje BMI wskazuje na niedowagę, musisz trochę nad sobą popracować ",
                 "Gratuluję zdrowia! Masz prawidłowe BMI",
                 "Wychodzi na to, że masz  nadwagę",
                 "Niestety, oznacza to już otyłość I stopnia ",
                 "Niestety, oznacza to otyłość II stopnia ",
                 "Wychodzi na to, że cierpisz na skrajną otyłość, zrób koniecznie coś z tym"]
    i = 0
    for x in wartosci:
        if a < wartosci[i]:
            print(komunikat[i])
            break
        elif a >= 40:
            print(komunikat[7])
            break
        i += 1
    break

1

@Ryan_1975:

Jak już chcesz się bawić w tablice w Pythonie...

print (komunikat[next(filter(lambda x: x[1]>bmi, enumerate(wartosci)),(7,))[0]])
1
#include <iostream>
using namespace std;

void BMImessage(double d)
{
	static const struct { double value; const char *message; } tb[]
	{
		{  0.0,  "Ujemna waga? Niedowiary!!!"},
		{ 16.0,  "Masz poważne problemy ze swoim zdrowiem! Twoje BMI oznacza wygłodznie!!!"},
        { 17.0,  "Niestety, oznacza to wychudzenie :(" },
        { 18.5,  "AJJJ, twoje BMI wskazuje na niedowagę, musisz trochę nad sobą popracować." },
        { 25.0,  "Gratuluję zdrowia! Masz prawidłowe BMI." },
        { 30.0,  "Wychodzi na to, że masz  nadwagę." },
        { 35.0,  "Dobrze byłoby trochę zredukować wagę." },
        { 40.0,  "Niestety, oznacza to otyłość II stopnia. Musisz coś z tym zrobić!" },
        { , "Oznacza to skrajną otyłość :9 Wychodzi na to, że cierpisz na skrajną otyłość, zrób koniecznie coś z tym!" },
	};
	for(const auto rec:tb)
	{
		if(d<rec.value)
		{
			cout<<rec.message<<endl;
			return;
		}
	}
	cout<<"Jaja sobie robisz?"<<endl;
}

int main()
{
	BMImessage(-2);
	BMImessage(15);
	BMImessage(40);
	BMImessage(100);
	return 0;
}

Tak a propos BMI, policzcie to dla Pudziana: https://www.google.com/search?q=Pudzian+wzrost+waga

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