C++ - miért csinálja azt, amit csinál ez a sor? (WHILE, OR)
Sziasztok. Nagyon kezdő C++os vagyok, és elakadtam az első összetettebb programomban.
while (colour!=1 || colour !=2)
{
cout << "\n \n" << colour << " is not a valid choice. Please enter 1 or 2:";
cin >> colour;
}
Amit akarnék, hogy amíg a user nem 1-et vagy 2-t ad meg, addig folyamatosan csinálja a zárójeles részt, azaz újra kéri az elemet (colour).
Ehhez képest amit csinál, hogy akár 1-et, akár 2-t, akár bármi msát adok meg, a végtelenségig írja ki ezt az üzenetet, a cin >> pedig egy az egyben kimarad, mintha ott se lenne. Mit rontok el?
Köszönöm szépen.





"Addig megy a ciklusod, amíg az X változó értéke nem egyenlő valamivel, vagy nem egyenlő valami mással."
Tehát addig megy a ciklus amíg az X változó nem egyenlő 1-gyel, vagy nem egyenlő 2-vel. Ezt akarom én is.
"Namost ha végiggondolod, ha valami és valami más nem ugyanaz, akkor ez egy mindig igaz feltétel, hiszen X értéke nem lehet egyszerre mindkettő. "
Szerintem nem is kell, hogy egyszerre legyen mindkettő. Az az AND (&&) logikai kapcsolás lenne, hogy mindkettő teljesüljön. Én azt akarom, hogy vagy 1 legyen, vagy 2. Nem pedig 1 és 2.
Viszont mégse jó, tehát biztos én vagyok a h*lye, de nem jövök rá, hogy hol.
Hol a hiba a gondolkodásomban?





Gondold végig mit is csinál mint a programod:
Mondjuk beolvasol 1-et: a bennmaradási feltétel első része hamis, a második része igaz (vagy kapcsolat), menjünk még egy kört.
Mondjuk beolvasol 2-t: a bennmaradási feltétel első része igaz (a második rész vagy kapcsolatnál és rövidzár kiértékelésnél már nem is lényeges), menjünk még egy kört.
és így tovább.
2-es: köszönöm, nagyon világos, így már értem.
Megoldás sajnos csak egy nagyon béna jut eszembe, hogy if (colour=1 or colour=2) {ide az összes többi része a programnak}.. meg ez nem is firtatja tovább a bekérdezést. van ennél jobb megoldás if, while használatával valahogy, ugye?





"Szerintem nem is kell, hogy egyszerre legyen mindkettő. Az az AND (&&) logikai kapcsolás lenne, hogy mindkettő teljesüljön. Én azt akarom, hogy vagy 1 legyen, vagy 2. Nem pedig 1 és 2. "
Nem jól értelmezed a dolgokat. Ha te azt mondod, hogy colour!=1 && colour !=2 az nem azt jelenti, hogy colour-nak 1-nek és 2-nek kell lennie, hanem azt hogy a feltételed mindkét részének teljesülnie kell ahhoz, hogy a feltételed igaz legyen. Ugyanez vagy kapcsolattal: elég ha feltételed legalább egyik fele igaz.
Tehát neked jelen esetben és kapcsolat kell.
Ilyesmiket nézegess amíg meg nem érted:
Nagyon szépen köszönöm. Meg fogom nézni a linkeket is.
Közben azt hiszem, találtam egy kibúvót a felfogása alól.. NOR-ral is működik.
while (!(colour==1 || colour==2 || c==15)) {}





while (!(colour==1 || colour==2))
Ez már jobb lehet, de kicsit ilyen jobbkézzel vakarjuk a balfülünket megoldás. Rosszabbul olvasható (és értelmezhető) kódot ad, ami nagyobb projekteknél már lényeges szempont. A c==15 nem tudom honnan jött.





Alap logikai tétel:
!(A v B) <=> !A & !B
(ugyanez igaz fordított műveletekkel is, tehát !(A & B) <=> !A v !B )
Tehát ugyanazt fogalmaztad meg másképp, mint amit én akartam kicsiholni belőled az első hozzászólással.





Na akkor Béláim, gondolkodjunk.
A feltétel, amit odaírtál:
color nem egyenlő 1, VAGY nem egyenlő 2.
Nézzük csak, hogyan értékelődik ki, ha mondjuk 3-at adsz meg:
nem egyenlő 1, tehát igaz lesz a feltétel.
Mi történik, ha 1-et adsz meg:
a nem egyenlő 1 hamis lesz, megvizsgálja a VAGY másik oldalát, és azt találja, hogy nem egyenlő 2-vel, tehát a végeredmény megint igaz.
Mi történik, ha 2-őt adsz meg:
ez nem egyenlő 1, tehát a feltétel igaz lesz.





Azt szeretnéd, hogy ez a feltétel teljesüljön:
(c==1 || c==2)
akkor a while addig megy, amíg ez hamis, itt jön a képbe, amit te csináltál:
!(c==1 || c==2)
szebben De Morgan azonossággal, amit a többiek is írtak:
(c==1 || c==2) -> tagokat negáljuk, AND->OR OR->AND
eredmény:
(c!=1 && c!=2)
azzal, hogy ez könnyebben olvasható, mint a többi, nem tudok egyetérteni, kinek mi
(kérdező: nem bújtál ki a felfogás alól, sőt, átalakítottad egy magadnak könnyebben érthetőre, ilyet gyakran kell csinálni)
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!