Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: František Zatloukal 05 Listopadu 2012, 14:25:22
-
Ahojte,
narazil jsem na problémek u mého ,,programu,, v C++. Program počítá BMI. Problém nastane, pokud uživatel zvolí možnost zadávat výšku v metrech. Pak je výsledek nesmysl.
Díky moc za pomoc, zdrojový kód je zde:
#include <iostream>
int main()
{
using namespace std;
unsigned short vyska;
float vyskab;
unsigned short vaha;
float bmia;
float bmib;
unsigned short jednotka;
cout << "Zadejte váhu v kg\n";
cin >> vaha;
cout << "Zvolte, v jakých jednotkách chcete zadávát výšku? \n";
cout << "1 - cm\n";
cout << "2 - m\n";
cin >> jednotka;
cout << "Zadejte vysku \n";
if (jednotka = 1)
{
cin >> vyska;
vyskab = vyska / 100.f;
}
else
{
cin >> vyskab;
}
bmia = vyskab * vyskab;
bmib = vaha / bmia;
cout << "Vaše BMI je: ";
cout << bmib;
cout << "\n";
/*
cin >> debug;
*/
if (bmib >= 40)
cout << "Morbidní obezita";
else if (bmib >= 35)
cout << "Střední obezita";
else if (bmib >= 30)
cout << "Mírná obezita";
else if (bmib >= 25)
cout << "Nadváha";
else if (bmib >= 18.5)
cout << "Ideální váha";
else if (bmib >= 16.5)
cout << "Podváha";
else
cout << "Podvýživa";
cout << "\n";
return 0;
}
(jsem v C++ začátečník, proto mne prosím za případné nedostatky neukamenujte ;) ). Díky
-
no to je strasnej kod :D .. az ho napises nejak strukturovane, tak slibuju, ze si ho prectu ;)
-
if (jednotka = 1)
Takhle se do else nikdy nedostaneš. Jedno rovná se je přiřazení, což takhle vrátí true a vesele se skočí do if a na else nikdy v životě nedojde. Takže správně:
if (jednotka == 1)
Tip: Překládej s parametry -Wall a -pedantic a gccčko bude upozorňovat na mnohem víc "chyb".
-
Vložit do eclipsu a nechat si naformátovat :D
Porovnání je "==". Mluvím o if.
Přiřadil jsi do jednotky v if jedničku. V C if přijímá int. 0 je false a 1 je true.
-> tak jsem to nestihl :D
-
Taky jsem to nestihl... todle se stane... ale je nesmysl to hledat visuálně koukáním do kódu.... prostě si to někde nad tím stopnu a krokuju a chybu mám za chvíli odhalenou bez fóra. ;)
TIP: až budeš pak trochu dále... tak zkus ošetřit uživatelský vstupy... uživatelé jsou potvory a rádi experimentujou... bmib = vaha / bmia; není ošetřeno dělení nulou ;)
-
TIP: až budeš pak trochu dále... tak zkus ošetřit uživatelský vstupy... uživatelé jsou potvory a rádi experimentujou... bmib = vaha / bmia; není ošetřeno dělení nulou ;)
A hlídat nejen nulu, ale cokoli -- uživatelé jsou svině a zadají klidně písmeno nebo nic :)
(Tohle u nás na fitu rychle naučí progtest -- systém, který automaticky vyhodnocuje programovací úlohy a zkouší veškeré vstupy a za neošetření takových "debilit" letí body dolů hodně rychle.)
-
TIP: až budeš pak trochu dále... tak zkus ošetřit uživatelský vstupy... uživatelé jsou potvory a rádi experimentujou... bmib = vaha / bmia; není ošetřeno dělení nulou ;)
Pokud jde o úpravy, je zde použito několik zbytečných proměnných. Ošetření vstupů vůbec. Výběr m/cm by šel udělat například vepsáním jednotky přímo do vstupu (mě by se to tak více líbilo :)).
-
Díky všem, problém opravdu spočíval v tom, že jsem měl jen jedno = v podmínce.
Co se týče struktury, popř. zbytečný proměnných - aktuálně nejsem na úrovni, kdy bych to dokázal vyřešit, o c++ jsem se začal zajímat teprve nedávno :)
PS: tolik odpovědí jsem opravdu nečekal ;D
-
Tak tak ... proto jsem psal až budeš dále a také to byl jeden TIP z mnoha... to by jsme tu mohli vymýšlet do nekonečna jak zlepšovat... ku příkladu co uvedl @Citrisin... tak takové věci jsem záměrně nepitval, protože jsi psal, že jsi začátečník. A hlídat samozřejmě cokoliv na vstupu, protože to je cesta jak aplikaci schodit a o to se vždy musí postarat vývojář. Uvedl jsem záměrně dělení nulou což je taková běžná věc... ale na druhou stranu z toho vyplývá, že aby to dělilo nulou, tak nás to opět zavede k uživatelskému vstupu. Prostě tip ;)