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

question-closed FR_02_06 - BMI - błędna odpowiedź

VPS Starter Arubacloud
0 głosów
130 wizyt
pytanie zadane 7 maja 2023 w C i C++ przez alfutek Początkujący (360 p.)
zamknięte 8 maja 2023 przez alfutek

Dzień dobry, 

 

mam drobny problem ze spoj i zadaniem https://pl.spoj.com/problems/FR_02_06/, mianowicie sędzia Spoj ciągle wyrzuca mi błędna odpowiedź mimo iż wydaje mi się, że program działa prawidłowo, według ideone również program działa prawidłowo.

szukam i szukam co może być nie tak, źle znaleźć nie mogę 

będę wdzięczna za wszystkie podpowiedzi. 

 

#include <iostream>
#include <vector>
#include <map>
#include <string>

using namespace std;

struct Person {
    string name = "";
    double weightInKilograms = 0;
    double heightInCentimeters = 0;
};

Person enterPersonDetails() {
    Person person;
    cin >> person.name >> person.weightInKilograms >> person.heightInCentimeters;
    return person;
}

double calculateBMI(const Person& person) {
    double heightInMeters = person.heightInCentimeters / 100.0;
    return person.weightInKilograms / (heightInMeters * heightInMeters);
}

string classify(const Person& person) {
    double bmi = calculateBMI(person);
    if (bmi <= 18.5)
        return "niedowaga";
    else if (bmi <= 25)
        return "wartosc prawidlowa";
    else
        return "nadwaga";
}

void groupPeople(const vector<Person>& people, map<string, vector<Person>>& groups) {
    for (const Person& person : people) {
        string classif = classify(person);
        groups[classif].push_back(person);
    }
}

void printPeople(const vector<Person>& people, const string& groupName) {
    if (!people.empty()) {
    cout << groupName << " :" <<endl;
    for (const Person& person : people)
        cout << person.name << endl;
    cout << endl;
    }
}

int main() {
    int howManyTest;
    cin >> howManyTest;

    vector<Person> people;
    for (int i = 0; i < howManyTest; i++) {
        people.push_back(enterPersonDetails());
    }

    map<string, vector<Person>> groups;
    groupPeople(people, groups);

    printPeople(groups["niedowaga"], "niedowaga");
    printPeople(groups["wartosc prawidlowa"], "wartosc prawidlowa");
    printPeople(groups["nadwaga"], "nadwaga");

    return 0;
}

 

komentarz zamknięcia: Otrzymałam podpowiedź do zadanego pytania
komentarz 7 maja 2023 przez adrian17 Ekspert (342,500 p.)
Tak na oko to masz źle zakresy BMI zapisane.
komentarz 7 maja 2023 przez alfutek Początkujący (360 p.)
zmiana zakresów na

   if (bmi < 18.5)
        return "niedowaga";

    else if (bmi > 18.5 && bmi < 25)
        return "wartosc prawidlowa";

    else if (bmi >= 25.0)
        return "nadwaga";

też niewiele pomogła :/
komentarz 7 maja 2023 przez adrian17 Ekspert (342,500 p.)
No, to też jest niezgodne z treścią.
komentarz 8 maja 2023 przez alfutek Początkujący (360 p.)
edycja 8 maja 2023 przez alfutek
Faktycznie, chyba za długo patrzę w kod.

zakresy poprawione, dwukropek w pustej grupa poprawiony i nadal błędna odpowiedź

 

może jutro na świeżo na cos wpadnę :)

Bardzo dziękuję za wszystkie podpowiedzi
komentarz 8 maja 2023 przez Great Stary wyjadacz (12,260 p.)

@alfutek Dodałem poprawny kod do mojej odpowiedzi. Zmiana zakresów nie ma żadnego znaczenia, ponieważ SPOJ nie testuje restrykcyjnie granicznych wartości BMI.

1 odpowiedź

+1 głos
odpowiedź 7 maja 2023 przez Great Stary wyjadacz (12,260 p.)
wybrane 8 maja 2023 przez alfutek
 
Najlepsza

W przypadku pustej grupy powinieneś wypisać jej nazwę. Wypisz nazwę grupy bez dwukropka.

void printPeople(const vector<Person>& people, const string& groupName) {
    //if (!people.empty()) {
        cout << groupName << endl; 
        for (const Person& person : people)
            cout << person.name << endl;
        cout << endl;
    //}
}

Poprawny kod:

#include <iostream>
#include <vector>
#include <map>
#include <string>
 
using namespace std;
 
struct Person {
    string name = "";
    double weightInKilograms = 0;
    double heightInCentimeters = 0;
};
 
Person enterPersonDetails() {
    Person person;
    cin >> person.name >> person.weightInKilograms >> person.heightInCentimeters;
    return person;
}
 
double calculateBMI(const Person& person) {
    double heightInMeters = person.heightInCentimeters / 100.0;
    return person.weightInKilograms / (heightInMeters * heightInMeters);
}
 
string classify(const Person& person) {
    double bmi = calculateBMI(person);
    if (bmi <= 18.5)
        return "niedowaga";
    else if (bmi <= 25)
        return "wartosc prawidlowa";
    else
        return "nadwaga";
}
 
void groupPeople(const vector<Person>& people, map<string, vector<Person>>& groups) {
    for (const Person& person : people) {
        string classif = classify(person);
        groups[classif].push_back(person);
    }
}
 
void printPeople(const vector<Person>& people, const string& groupName) {
    cout << groupName << endl;
    for (const Person& person : people)
        cout << person.name << endl;
    cout << endl;
}
 
int main() {
    int howManyTest;
    cin >> howManyTest;
 
    vector<Person> people;
    for (int i = 0; i < howManyTest; i++) {
        people.push_back(enterPersonDetails());
    }
 
    map<string, vector<Person>> groups;
    groupPeople(people, groups);
 
    printPeople(groups["niedowaga"], "niedowaga");
    printPeople(groups["wartosc prawidlowa"], "wartosc prawidlowa");
    printPeople(groups["nadwaga"], "nadwaga");
} 
komentarz 8 maja 2023 przez alfutek Początkujący (360 p.)
Dziękuję bardzo za pomoc, działa :)

Podobne pytania

0 głosów
1 odpowiedź 585 wizyt
pytanie zadane 26 sierpnia 2018 w SPOJ przez koziolek8820 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 938 wizyt
pytanie zadane 18 lipca 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)
0 głosów
1 odpowiedź 814 wizyt

92,305 zapytań

141,109 odpowiedzi

318,585 komentarzy

61,756 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!

...