Az miért van hogy ez a feltétel mindig teljesül?
void cKeno::i_setTet(void)
{
bool x = false, y = true ;
do
{
if(x == true)
{
cout << "Csak ezekkel a tetekkel rakhatod meg: (0.30),(0.60),(0.90),(1,20) ! \n"
<< "Add be ujra a tetet: " ;
cin >> this->i_tet ;
}
if(x == false)
{
x = true ;
cout << "\nMennyiert adod fel a szelvenyt(0.30),(0.60),(0.90),(1,20): " ;
cin >> this->i_tet ;
if(this->i_tet == 0.30 || 0.60 || 0.90 || 1.20)
y = false ;
}
}while(y) ;
}
if(this->i_tet == 0.30 || 0.60 || 0.90 || 1.20)
Egész számokat adok be és teljesül mindig.
Hihetetlen.
1., i_tet integer változó?
2., próbáld meg így: if((i_tet == 0.30) || (i_tet == 0.60)...
Ezt tanulmányozd. Segítek, az == és az || is operátor, precedenciával. Zárójelezd be a kifejezést úgy, ahogy a precedenciájuk adná, és csodálkozz.
Mit is jelent ez a c++ nyelvén?
if(this->i_tet == 0.30 || 0.60 || 0.90 || 1.20)
Ugyan ezt:
if(this->i_tet == 0.30 || 1 || 1 || 1)
Illetve Ugyan ezt:
if(this->i_tet == 0.30 || true || true || true)
------
Miért is?
if (kif) ...
akkor teljesül ha kif értéke nem 0. 0 hamis nem 0 igaz.
this->i_tet == 0.30 ez a kifejezés visszaad egy értéket a {0,1} halmaz egy elemét, utána "vagy" van ami után lévő kifejezés, konstans változó függvény ... bármi ami nem 0 értéket ad vissza, itt konkrétan egy nem 0 konstans a 0,30 így mindig igaz lesz.
if(this->i_tet == (0.30 || 0.60 || 0.90 || 1.20))
Most meg állandóan hamisat ad vissza minden esetben.
Miért nem jó.
if((this->i_tet == 0.30) || (this->i_tet == 0.60) || (this->i_tet == 0.90) || (this->i_tet == 1.20))
Így sem jó.
Az i_tet egy float pedig hiába adok be 0.30 vagy 0.60 akkor is rossz minden esetben hamis.
Sosem teljesül a feltétel.
if(this->i_tet == (0.30 || 0.60 || 0.90 || 1.20))
A (0.30 || 0.60 || 0.90 || 1.20) 1-re értékelődik ki, ha megértetted volna amit írtam akkor tudtad volna, azt is hogy miért 1.
--------
"Így sem jó.
Az i_tet egy float pedig hiába adok be 0.30 vagy 0.60 akkor is rossz minden esetben hamis.
Sosem teljesül a feltétel."
Ide meg nem ártana egy kis numerikus matek ismeret, a gép által használt (lebegőpontos) véges pontosságú aritmetikába nem ábrázolható minden szám pontosan, míg egész számoknál az egészek pontosan, addig valósaknál nem ábrázolhatóak pontosan de pl a 0.5 pontosan ábrázolható.
Melleselg nem igaz az az aszociativitás tulajdonsága sem ... a hatékonyság miatt, de ne menjünk bele.
Első megközelítésbe float helyett használj double-t, ez dupla pontosságú több számot ábrázol pontosan. (Viszont lassabb, persze ez itt elhanyagolható.)
Jók a válaszaid, de azok a -ban-ben ragok fájnak (vagyis a hiányuk, -ba-be raggal kicsúfolásuk).
Az ábrázoláshoz pedig itt egy ökölszabály: lebegőpontos számot soha nem vizsgálunk egyenlőségre. Amúgy a valós az egy hülye név rá, mert az egész számok is valósak, a float semennyivel sem valósabb, mint az int.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!