Mi az istenér írja ki azt, hogy a háromszög nem létrehozható?
Van elírás, illetve iostream tökéletesen megfogalmazta.
A precedencia a "végrehajtás sorrendje".
Azaz ha nézzük a példát:
"A és B vagy C
zárójelezve:
(A és B) vagy C"
Látszik, hogy az és ELŐBB hajtódik végre, mint a vagy művelet.
Ez zárójelezéssel módosítható.
Azaz, ha a célod az, hogy itt B vagy C hajtódjon előbb/együtt végre, akkor ilyen formában kell írni:
A és (B vagy C)
Ekkor végrehajtódik a B vagy C és ennek eredményére jön az és A művelet.
Ha nem teszel zárójelet, azaz A és B vagy C van csak, akkor előbb lefut az A és B, majd ennek az eredményére a vagy C.
Amúgy röviden és tömören a válasz a kérdésre:
Mert rossz a feltétel, amit megszabtál.
Ha még mindig nem lenne világos a dolog, akkor: [link]
Én ezt értem de minek módosítani?
Nem értem miért lesz más az eredmény akkor,ha módosítok zárójelekkel a precedencián.
Minkét esetben le fog futni az egész feltétel.
Mi értelme van annak,hogy zárójelbe teszem ezt a részt?
(a < b + c) or (b < a + c) or (c < a + b)
Nem mindegy mejik hajtódik végre először ugyanannak az eredménynek kellene lennie és megsem.
Nem értem, mi ezen a bonyolult.
A nincs zárójel, akkor a maradék három "or"-ral összekapcsolt feltétel balról-jobbra egymás után kiértékelődik a már kiszámolt boolean értékhez. Tehát hiába false az első három "összeéselt" művelet, az egyik or után jövő feltétel igaz, ezért az egész kifejezés értéke igaz lesz.
Ha zárójelbe teszed az (A or B or C) kifejezést, akkor kiderül, hogy true, viszont ez csak ezután lesz és kapcsolatba hozva a már false értékkel -> az eredmény false.
Akkor mégsem érted és nem itt, hanem a az and és or határánál van a gond.
A konkrét példában ez történik:
not a <= 0, mivel a = 6 -> not 6 <= 0 -> not HAMIS -> IGAZ
Ugyan így egészen a C, ahol is ugye mivel a C = 0, not IGAZ, vagyis HAMIS jön ki.
Az első rész így néz ki:
(i és i és h) -> ami ugye hamis
Na de itt jön a gond.
A többi feltételt is kiértékelve:
h vagy (a < b + c) vagy (b < a + c) vagy (c < a + b)
h vagy (8 < 6 + 0) vagy (6 < 8 + 0) vagy (0 < 8 + 6)
h vagy (8 < 6 ) vagy (6 < 8 ) vagy (0 < 14)
h vagy h vagy i vagy i
Ezt tovább megoldva, ugye h vagy h az h, az i vagy h az viszont már i!
És így igaz a feltétel és a háromszög létrehozható jön ki.
Na akkor most gondolkodj el, hogy ezt hogy lehetne megoldani.
Helyesbítés csak siettem:
h és (a < b + c) vagy (b < a + c) vagy (c < a + b)
h és (8 < 6 + 0) vagy (6 < 8 + 0) vagy (0 < 8 + 6)
h és (8 < 6 ) vagy (6 < 8 ) vagy (0 < 14)
h és h vagy i vagy i
h és h -> h
Marad:
h vagy i vagy i
h vagy i -> viszont már i!
Vagyis a feltétel igaz lesz.
Én ezeket amiket mondtatok eddig mind tudtam.
if( ( (not a <= 0) and (not b <= 0) and (not c <= 0) ) and (a < b + c) or (b < a + c) or (c < a + b) ):
Na akkor mindig a legbelső zárójelpáros hajtódik végre.
Ez az a rész ami először le fog futni:
(not a <= 0) and (not b <= 0) and (not c <= 0)
balról jobbra. a c = 0 val akkor ez a feltétel hamis:(not c <= 0) És mivel ez hamis hamis lesz az egész feltétel ennek ellenére azt írja ki,hogy a háromszög létrehozható.Tehát annak ellenére,hogy a feltétel hamis mégis úgy viselkedik mintha igaz lenne.Innentől a többi része a feltételnek le sem fog futni mert ez a rész (not c <= 0) nem teljesült.
Miért működik rosszul?
Nézzétek meg:
Jól mondtam először ez a rész fog lefutni:
(not a <= 0) and (not b <= 0) and (not c <= 0)
Aztán ha ez a három feltétel mind igaz akkor még megvizsgálja azt is,hogy ezek közül igaz e valamelyik:
(a < b + c) and (b < a + c) and (c < a + b)
ha igen akkor igaz a az egész feltétel ha nem akkor pedig nem.
Ez történik itt?
Ha igen akkor mégis miért teljesül a feltétel,ha a c értéke egyenlő 0 val?
Hol teljesül itt ebben neked?
a = 8
b = 6
c = 0
"A haromszoget nem lehet letrehozni" az eredmény.
Kielemeztem neked részletesen, hogy mi történik az első feladott példában.
Fogj egy darab papírt és te is csináld meg különböző módokon, ha nem megy, de ezt ennél jobban már nem lehet magyarázni.
Tik nem értitek.
Az egész feltétel hamis mert:
(not a <= 0) and (not b <= 0) and (not c <= 0)
igaz,igaz,hamis
Az utolsó hamis lett és ha az utolsó hamis akkor az egész hamis lett
ez az egész hamis lett miatta ahhoz,hogy igaz legyen mindháromnak teljesülnie kell.
És mivel és van
and (not c <= 0) ) and (a < b + c) or (b < a + c) or (c < a + b) ):
ezért nem számít az,hogy itt már melyik igaz és melyik nem
Ahhoz,hogy az egész feltétel igaz legyen ahhoz
itt:
(not a <= 0) and (not b <= 0) and (not c <= 0)
három igazt kell kapni a másik felében az and után pedig legalább egyet.
Az általam belinkelt kódban pedig
(not a <= 0) and (not b <= 0) and (not c <= 0)
a harmadik hamis.
És ennek ellenére mégis igaz a feltétel.
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!