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

Název: C++ menší komplikace[vyřešeno]
Přispěvatel: 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:
Kód: [Vybrat]
#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
Název: Re:C++ menší komplikace
Přispěvatel: ntz_reloaded 05 Listopadu 2012, 14:26:25
no to je strasnej kod :D .. az ho napises nejak strukturovane, tak slibuju, ze si ho prectu ;)
Název: Re:C++ menší komplikace
Přispěvatel: Vojtěch Trefný 05 Listopadu 2012, 14:56:34
Kód: [Vybrat]
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ě:

Kód: [Vybrat]
if (jednotka == 1)

Tip: Překládej s parametry -Wall a -pedantic a gccčko bude upozorňovat na mnohem víc "chyb".
Název: Re:C++ menší komplikace
Přispěvatel: Citrisin 05 Listopadu 2012, 15:00:49
Vložit do eclipsu a nechat si naformátovat :D
Kód: [Vybrat]
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
Název: Re:C++ menší komplikace
Přispěvatel: Martin - ViPEr*CZ* 05 Listopadu 2012, 15:05:44
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  ;)
Název: Re:C++ menší komplikace
Přispěvatel: Vojtěch Trefný 05 Listopadu 2012, 15:10:34
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.)
Název: Re:C++ menší komplikace
Přispěvatel: Citrisin 05 Listopadu 2012, 15:16:05
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 :)).
Název: Re:C++ menší komplikace
Přispěvatel: František Zatloukal 05 Listopadu 2012, 15:32:41
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
Název: Re:C++ menší komplikace[vyřešeno]
Přispěvatel: Martin - ViPEr*CZ* 05 Listopadu 2012, 17:25:57
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  ;)