• 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ź

Object Storage Arubacloud
0 głosów
155 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 (346,320 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 (346,320 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,360 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,360 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ź 669 wizyt
pytanie zadane 26 sierpnia 2018 w SPOJ przez koziolek8820 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 1,005 wizyt
pytanie zadane 18 lipca 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)
0 głosów
1 odpowiedź 825 wizyt

92,690 zapytań

141,603 odpowiedzi

320,100 komentarzy

62,051 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

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!

...