• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

BMI Spoj - przeliczanie BMI

VPS Starter Arubacloud
0 głosów
375 wizyt
pytanie zadane 29 października 2018 w C i C++ przez Shimeo7 Obywatel (1,910 p.)

Cześć, mam problem z BMI, nie mam pojęcia dlaczego nie liczy mi BMI poprawnie ;/. Siedzę nad tym i chyba ślepy jestem, bo nie widzę co jest.

 

#include <iostream>

using namespace std;

int ile, wzrost[100], waga[100], nwzrost[100];
int BMI[100];
string imie[100];

int main()
{
    cout << "Ile badanych osob: ";
    cin >> ile;

    for(int i=0; i<ile; i++)
    {
        cin >>imie[i]>>waga[i]>>wzrost[i];
        nwzrost[i] = (wzrost[i]/100);
        BMI[i] = waga[i]/(nwzrost[i]*nwzrost[i]);
        cout << BMI[i];
    }
    return 0;
}

 

komentarz 29 października 2018 przez Undisputed Gaduła (3,040 p.)
Po co to wszystko do tablic?
komentarz 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)
Taki miałem pierwszy pomysł, ale mam świadomość, że jest na to zadanie parę sposobów, mam świadomość, że tworzenie takich tablic to jest marnowanie pamięci, ale na potrzeby tego zadania nie patrzę na to, chociaż wiem, że powinienem. Chodzi mi, dlaczego nie ,,wypluwa" mi prawidłowej wartości BMI dla konkretnej osoby
komentarz 29 października 2018 przez DragonCoder Nałogowiec (36,500 p.)
Jaka jest tresc zadania?
komentarz 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)
https://pl.spoj.com/problems/FR_02_06/

W sumie to chodzi mi o wersje testową, dlaczego mi BMI prawidłowo nie oblicza dla danej osoby, z całą resztą sobie radzę.
komentarz 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)

@DragonCoder,

#include <iostream>

using namespace std;

int ile, wzrost[100], waga[100];
int BMI[100];
string imie[100];

int main()
{
    cout << "Ile badanych osob: ";
    cin >> ile;

    for(int i=0; i<ile; i++)
    {
        cin >>imie[i]>>waga[i]>>wzrost[i];
        BMI[i] = waga[i]/((wzrost[i]/100)*(wzrost[i]/100));
    }

    for(int i=0; i<ile; i++)
    {
        if( BMI[i] < 18.5)
        {
            if(i==0)
            {
                cout << "niedowaga" << endl;
                cout << imie[i] << endl;
            }
            else
            {
                cout << imie[i] << endl;
            }
        }
        if( BMI[i]>=18.5 && BMI[i]<25)
        {
            if(i==0)
            {
                cout << "waga prawidlowa" << endl;
                cout << imie[i] << endl;
            }
            else
            {
                cout << imie[i] << endl;
            }
        }
        if( BMI[i]>=25)
            {
            if(i==0)
            {
                cout << "nadwaga" << endl;
                cout << imie[i] << endl;
            }
            else
            {
                cout << imie[i] << endl;
            }
        }
    }
    return 0;
}

To jest pełny kod, nie wiem kurde, gdzie popełniam błąd ;/

komentarz 29 października 2018 przez DragonCoder Nałogowiec (36,500 p.)
Bede mogl sprawdzic, gdy bede w domu. Ale tylko tak dodam, int to liczby calkowite, a BMI, moze ale nie musi byc liczba calkowita. Tak samo waga, wzrost itd.
komentarz 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)
edycja 29 października 2018 przez Shimeo7

Zrobiłem, program działa, ale SPOJ nie przyjmuje, a więc gdzieś mam błąd ;/ Czy ktoś jest mi w stanie powiedzieć, gdzie robię błąd?

 

#include <iostream>

using namespace std;

int ile, dlugosc[100];
float wzrost[100], waga[100];
float BMI[100];
string imie[100];

int main()
{
    cout << "Ile badanych osob: ";
    cin >> ile;

    for(int i=0; i<ile; i++)
    {
        cin >>imie[i]>>waga[i]>>wzrost[i];
        dlugosc[i] = imie[i].length();
        if(dlugosc[i]<=20)
            if(waga[i]>=0 && waga[i]<200)
                if(wzrost[i]>=0 && wzrost[i]<200)
                    BMI[i] = waga[i]/((wzrost[i]/100)*(wzrost[i]/100));
    }

    cout << endl << "niedowaga" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i] < 18.5)
            cout << imie[i] << endl;
    }

    cout << endl << "waga prawidlowa" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i]>=18.5 && BMI[i]<25)
            cout << imie[i] << endl;
    }

    cout << endl << "nadwaga" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i]>=25)
            cout << imie[i] << endl;
    }

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 29 października 2018 przez niezalogowany
wybrane 29 października 2018 przez Shimeo7
 
Najlepsza
  1. Wypisujesz zbędne dane (dodatkowe uwagi na czas testów możesz wypisywać na strumieniu std::clog - w razie gdybyś ich nie usunął i tak nie będą sprawdzane):
    cout << "Ile badanych osob: ";
    
  2. Dla prawidłowej wartości BMI wypisz "wartosc prawidlowa", a nie "waga prawidlowa":
    cout << endl << "wartosc prawidlowa" << endl;

Kod:

#include <iostream>
#include <string>

using namespace std;

int ile;
float wzrost[1000], waga[1000];
float BMI[1000];
string imie[1000];

int main()
{
	cin >> ile;

	for (int i = 0; i<ile; i++)
	{
		cin >> imie[i] >> waga[i] >> wzrost[i];
		BMI[i] = waga[i] / ((wzrost[i] / 100)*(wzrost[i] / 100));
	}

	cout << endl << "niedowaga" << endl;
	for (int i = 0; i<ile; i++)
	{
		if (BMI[i] < 18.5)
			cout << imie[i] << endl;
	}

	cout << endl << "wartosc prawidlowa" << endl;
	for (int i = 0; i<ile; i++)
	{
		if (BMI[i] >= 18.5 && BMI[i]<25)
			cout << imie[i] << endl;
	}

	cout << endl << "nadwaga" << endl;
	for (int i = 0; i<ile; i++)
	{
		if (BMI[i] >= 25)
			cout << imie[i] << endl;
	}

	return 0;
}

Dodatkowe uwagi: naucz się o strukturach, rzutowaniu i nie używaj VLA (lepiej dynamiczne tablica, std::vector).

komentarz 29 października 2018 przez DragonCoder Nałogowiec (36,500 p.)

Te tablice chyba za duze sa...

W zadaniu jest napisane :

liczba t (1 ≤ t ≤ 100) określająca ilość badanych osób.

Nie trzeba wiec sprawdzic, czy liczba jest wieksza od 100?

(imię - maksymalnie 20 znaków, masa i wzrost to wartości naturalne dodatnie nie przekraczające 200).

I tego tez nie trzeba zaimplementować? 

komentarz 29 października 2018 przez niezalogowany

@DragonCoder 

Co do tablic to słuszna uwaga, ale tak naprawdę wcale w tej formie nie powinno ich tu być. Poprawiłem to co uniemożliwiało zaliczenie zadania.

Nie ma żadnej informacji dotyczącej sprawdzania poprawności danych wejściowych. Jeżeli takowej nie ma - nie trzeba sprawdzać. Wtedy dodatkowe informacje o zakresach liczb służą do wyboru typów zmiennych, lub odpowiedniego algorytmu.

komentarz 29 października 2018 przez DragonCoder Nałogowiec (36,500 p.)
Ah okay, myslalem ze te wytyczne dotycza kodu, a nie parametrow uzywanych przez spoi
0 głosów
odpowiedź 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)
#include <iostream>

using namespace std;

int ile, dlugosc[100];
float wzrost[100], waga[100];
float BMI[100];
string imie[100];

int main()
{
    
    cin >> ile;

    for(int i=0; i<ile; i++)
    {
        cin >>imie[i]>>waga[i]>>wzrost[i];
        dlugosc[i] = imie[i].length();
        if(dlugosc[i]<=20)
            if(waga[i]>=0 && waga[i]<200)
                if(wzrost[i]>=0 && wzrost[i]<200)
                    BMI[i] = waga[i]/((wzrost[i]/100)*(wzrost[i]/100));
    }

    cout << endl << "niedowaga" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i] < 18.5)
            cout << imie[i] << endl;
    }

    cout << endl << "wartosc prawidlowa" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i]>=18.5 && BMI[i]<25)
            cout << imie[i] << endl;
    }

    cout << endl << "nadwaga" << endl;
    for(int i=0; i<ile; i++)
    {
        if(BMI[i]>=25)
            cout << imie[i] << endl;
    }

    return 0;
}

Zrobiłem, ale nadal sędzia zwraca, że błędna odpowiedź

komentarz 29 października 2018 przez niezalogowany

Nie zrobiłeś, bo nadal widzę to:

cout << "Ile badanych osob: ";
komentarz 29 października 2018 przez niezalogowany
Minimalny działający kod załączyłem w swojej odpowiedzi. Nie rób dodatkowych sprawdzeń.
komentarz 29 października 2018 przez Shimeo7 Obywatel (1,910 p.)
edycja 29 października 2018 przez Shimeo7
Przeszło !!! Dziękuję za podpowiedzi. Tylko nadal nie rozumiem, dlaczego ze sprawdzeniami odrzucało, a bez nie, skoro w treści zadania jest, że imię nie może mieć więcej niż 20 znaków
komentarz 29 października 2018 przez niezalogowany
Nie będzie miało więcej. To są przedziały, które przez SPOJ zostaną podane w testach - innych danych nie będzie. Wszystkie działania masz dokładnie opisane w treści zadania. Twój kod nie przechodził, bo miał błędne warunki, które odrzucały poprawne testy (np wzrost[i]<200, a co z 200?).

Podobne pytania

0 głosów
1 odpowiedź 957 wizyt
pytanie zadane 18 lipca 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)
+1 głos
2 odpowiedzi 2,299 wizyt
pytanie zadane 25 września 2021 w JavaScript przez void6 Użytkownik (790 p.)
0 głosów
2 odpowiedzi 1,184 wizyt
pytanie zadane 26 marca 2021 w Java przez Paluch22 Nowicjusz (230 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...