Kezdőoldal » Számítástechnika » Programozás » C++ - miért csinálja azt,...

C++ - miért csinálja azt, amit csinál ez a sor? (WHILE, OR)

Figyelt kérdés

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.



2013. aug. 28. 14:05
 1/10 iostream ***** válasza:
Addig megy a ciklusod, amíg az X változó értéke nem egyenlő valamivel, vagy nem egyenlő valami mással. 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ő. Innentől rádbízom a javítást.
2013. aug. 28. 14:09
Hasznos számodra ez a válasz?
 2/10 A kérdező kommentje:

"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?

2013. aug. 28. 14:40
 3/10 anonim ***** válasza:

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.

2013. aug. 28. 14:42
Hasznos számodra ez a válasz?
 4/10 A kérdező kommentje:

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?

2013. aug. 28. 14:50
 5/10 anonim ***** válasza:

"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:

[link]

[link]

2013. aug. 28. 14:52
Hasznos számodra ez a válasz?
 6/10 A kérdező kommentje:

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)) {}

2013. aug. 28. 14:59
 7/10 anonim ***** válasza:

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.

2013. aug. 28. 15:06
Hasznos számodra ez a válasz?
 8/10 iostream ***** válasza:

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.

2013. aug. 28. 19:29
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:

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.

2013. aug. 28. 19:55
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:
100%

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)

2013. aug. 29. 14:53
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!