Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

kalkulator bmi

Ostatnio zmodyfikowano 2020-02-13 22:14
Autor Wiadomość
klosu
Temat założony przez niniejszego użytkownika
kalkulator bmi
» 2020-02-01 14:45:51
Dzień dobry, jestem osobą zaczynającą przygodę z c++. Narodził mi się pomysł w głowie żeby zrobić kalkulator bmi, niestety podając wartości wagi oraz wzrostu po obliczeniu ze wzoru wychodzi mi wartośc np 0,002241. Kieruje się o pomoc do was jak zrobić, żeby wynik nie zawierał na trzech pierwszy miejscach 0.
wysyłam do was w formie pisemnej początek kodu oraz czekam na wytłumaczenie mi jakby można było mój problem rozwiązać.


#include <iostream>


using namespace std;

int main()

{
    int waga;
    double wzrost, bmi;

    cout << "Prosze, podaj swoja wage." << endl;
    cin >> waga; cout << endl;
    cout << "Prosze, podaj swoj wzrost." << endl;
    cin >> wzrost; cout << endl;
    bmi = waga /( wzrost * wzrost );
    cout << "Twoje bmi wynosi: " << bmi << endl;



    cout << "Komentarz odnosnie twej wagi: " << endl;

     return 0;
}
P-176160
DejaVu
» 2020-02-01 16:21:31
Taki wzór podałeś, więc takie wyniki dostajesz. Zapewne wprowadzasz wzrost w centymetrach, a nie w metrach.

https://pl.wikipedia.org/wiki​/Wskaźnik_masy_ciała

Jednostki mają znaczenie...
P-176162
nanoant20
przykładowe rozwiązanie
» 2020-02-12 11:21:26
Jako programista powinieneś kontrolować lub starać się
przewidzieć jakie dane może wprowadzać użytkownik,
a nawet uniemożliwić wprowadzanie nieprawidłowych danych.
W celu umozliwienia wprowadzania user'owi
różnych jednostek (wzrostu) np.
183 lub 1.83 czy nawet błędnie 1,83
program może wyglądać np. tak:

C/C++
#include <iostream>
#include <cstring>      //strlen
#include <algorithm>    //replace
#include <iomanip>      //cout.setf(ios::fixed); cout.precision(2);
#include <limits>       //std::numeric_limits

using namespace std;

int main()
{
    double waga { 0 }, bmi { 0 }, liczba { 0 };
    string wzrost;
   
    cout << "Podaj wage := ";
    while( !( cin >> waga ) )
    {
        cout << "Wprowadzony znak nie jest liczba" << endl;
        cout << "Prosze podac liczbe : ";
        //czyscimy strumien wejsciowy std::cin
        std::cin.clear();
        std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
        continue;
    }
    //czyscimy strumien wejsciowy std::cin
    std::cin.clear();
    std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
    cout << "Podaj wzrost := ";
    getline( cin, wzrost ); //o.k.
   
    //zamiana przecinka (comma) na kropke (dot)
    replace( wzrost.begin(), wzrost.end(), ',', '.' );
   
    //szukamy kropki
    size_t found = wzrost.find( '.' );
   
    if( found == true )
    {
        //konwersja lancucha znakow do zmiennej typu double, float
        liczba = atof( wzrost.c_str() );
        bmi = waga /( liczba * liczba );
    }
    else
    {
        //konwersja lancucha znakow do zmiennej typu double, float
        liczba = atof( wzrost.c_str() );
        bmi = waga /(( liczba * liczba ) / 10000 );
    }
   
    cout << endl;
    cout << "Your Body Mass Index (BMI) := " << fixed << setprecision( 2 ) << bmi << endl;
   
    if( bmi < 18.5 )
         cout << "Niedowaga.\n";
    else if( bmi >= 18.5 && bmi <= 25 )
         cout << "Prawidlowa masa ciala\n";
    else if( bmi >= 25 && bmi <= 29.99 )
         cout << "Nadwaga\n";
    else if( bmi > 30 )
         cout << "Otylosc.\n";
   
    cout << endl;
    getchar();
    return 0;
}
P-176231
pekfos
» 2020-02-13 18:13:11
W celu umozliwienia wprowadzania user'owi
różnych jednostek (wzrostu) np.
183 lub 1.83 czy nawet błędnie 1,83
Ja tu nie widzę żadnych jednostek. A co jak ktoś poda swój w stopach?

C/C++
size_t found = wzrost.find( '.' );

if( found == true )
Testujesz (błędnie) tylko obecność kropki, więc jak podam że mam 180.5 centymetrów, to traktujesz to jak metry.
P-176232
nanoant20
» 2020-02-13 21:35:34
jak podam że mam 180.5 centymetrów

if( found == true && found != string::npos )


A co jak ktoś poda swój w stopach?
można poprosić o jednostkę miary i dokonywać przeliczeń.
Jednostek miar długości jest dużo.
Zastrzegłem sobie, że
program może wyglądać np. tak:
a nie że jest to (panaceum) ostateczne rozwiązanie
P-176233
pekfos
» 2020-02-13 22:14:57
C/C++
if( found == true && found != string::npos )
Hm.. W sumie to wcześniej było lepiej. Ten dodatek niczego nie zmienia, a w zasadzie found == true, wbrew pozorom, sprawdza właśnie czy kropka jest na pozycji 1, więc czy liczba jest formatu x.xxx.. Genialne.
Byłoby jednak czytelniej używając 1.
P-176234
« 1 »
  Strona 1 z 1