Mit rontok el ebben a kódban?
win7 Python3.7 Idle
Írtam egy kódot, a benne lévő "párbeszéd" nem is lényeg.
A lényeg, hogy muszáj volt zárójelbe raknom az "or" parancshoz tartozó részeket, és úgy megoldanom, hogy közöttük van az "and"-parancs. Mert ha nincsenek zárójelben, akkor nem mindegyik lehetőség fut le. De így meg megint másképp reagál. Gyakorlatilag az összes lehetséges válaszlehetőséggel kipróbáltam, és szinte mindig volt benne hiba. Maga a gép nem jelez hibát, de nem az az ág fut le, aminek kéne. Pl. függ, hogy nagy vagy kis kezdőbetűvel írom-e a válaszokat. A kérdésem, hogy hogyan lehetne megoldani ezen a szinten magasabb szintű ismeretek nélkül, hogy a kódolás normálisan fusson le az összes lehetséges válaszlehetőségnél? Nyilván az or, az and, és a zárójelekkel kell variálni, de bárhogy csinálom, mindig másik ág fut le.
A kódom:
Illetve kérdésem még, hogy ha én a jövőben évek múlva írok egy 50x ilyen hosszú kódot, akkor hogyan lehet megtudni, hogy a kódom minden esetleges lehetőségnél pontosan működik? Vagy nekem programozás közben folyamatosan tesztelnem kell a kódomat? Ha kell, akkor több ezerszer? És ha átírom egy picit a későbbiekben? Akkor újból 200 variációt le kell tesztelnem?
A kód teljesen normálisan lefut és azt csinálja amit kell.
"nem az az ág fut le, aminek kéne. "
Honnan tudná szegély program vagy mi, hogy minek kéne kiíródnia szerinted...
Hangyányit egyszerűbb lenne, ha
s == ("yes" or "Yes") helyett
s.lower()=="yes" -t írnál.
És akkor yes-nek venné a Yes-t a YES-t és yES-t is.
" hogyan lehet megtudni, hogy a kódom minden esetleges lehetőségnél pontosan működik?"
Kipróbálod, ha hibát találsz, akkor megkeresed a hiba helyét és javítod.
"Vagy nekem programozás közben folyamatosan tesztelnem kell a kódomat?"
Igen időnként ki kell próbálnod, hogy azt csinálja-e amit szeretnél.
"És ha átírom egy picit a későbbiekben? Akkor újból 200 variációt le kell tesztelnem?"
Optimális esetben a fejlesztés során készítesz hozzá teszteket, és elég ezeket futtatni a változtatás után.
Megint csak azt látom a legfőbb problémádnak, mint a többi korábbi kérdésednél. Nem szisztematikusan tanulsz, kipróbálgatsz mindenfélét, de fogalmad sincs róla, hogy mit csinálsz valójában.
"s == ("yes" or "Yes")"
Itt azt akarod ellenőrizni, hogy az s változó értéke "yes" vagy "Yes"-e. Csakhogy ezt nem így kell. Amit te csinálsz, az az, hogy veszel egy logikai kifejezést, ami ("yes" or "Yes"), amit ha önmagában beírsz az interpreterbe, láthatod mivel egyenlő: egy True értékkel. Vagyis a kódod első fele azzal lesz egyenértékű, hogy s == True. Miért? Mert minden nem üres string True logikai értékkel ekvivalens, így tehát logikai kifejezésben (string or string) ugyanaz, mint (True or True), ami pedig mindig True.
Hogyan csináld helyesen?
Értékenként külön-külön:
s == "yes" or s == "Yes"
vagy
s in ("yes", "Yes")
vagy
s.lower() == "yes"
Ezen kívül a logikai operátoroknak (or, and...) műveleti sorrendje is van, ahhoz hasonlóan, mint a matekban az összeadás-kivonás-szorzás-osztásnak. Nem mindegy, hogy hogyan cserélgeted fel a műveleti sorrendet, mert nem ugyanazt az eredményt kapod. Érdemes utánanézni a műveleti sorrendnek (precedencia) és a logikai igazságtábláknak.
Ozmium, átnéztem a linket, és lenne pár kérdésem:
Abszorpciós tételek:
A*(A+B) = A
A+(A*B) = A
A*(A+B) = A*B
A+(A*B) = A+B
Ha A*(A+B) = A, és A*(A+B) = A*B, akkor A = A*B, ez viszont csak akkor lehetséges, ha B = A , márpedig B != A-val. Az abszorpciós tétel ez esetben nem jó. Hiszen A*(A+B) nem lehet egyenlő egyszerre A-val és A*B-vel.
Nem hibás a tétel. Egyszerűen csak végezd el a logikai műveleteket, és látni fogod.
A * (A + B) = A
Tegyük fel, hogy A = Igaz.
Ekkor ha behelyettesíted A értékét: Igaz * (Igaz + B) = Igaz
(Igaz * B) B értékétől függetlenül Igaz
Igaz * Igaz szintén igaz.
Tehát arra jutunk, hogy Igaz = Igaz = A
Tegyük fel, hogy A = Hamis.
Behelyettesítve: Hamis * (Hamis + B) = Hamis
(Hamis + B) lehet igaz vagy hamis is.
De Hamis * bármi az mindig Hamis.
Arra jutunk, hogy Hamis = Hamis = A
Ugyanezt eljátszhatod A * (A+B) = A * B esetén is, hogy meggyőződj a tétel igazságáról. Ha kell, minden lehetséges kombinációban. Összesen négy van, mert A is lehet igaz/hamis, meg is lehet igaz/hamis. Az nem sok. Ne feledd, hogy a * és + a logikai ÉS-t és VAGY-t jelenti.
"Ne feledd, hogy a * és + a logikai ÉS-t és VAGY-t jelenti."
Igen, ezt nem vettem figyelembe. Így már tényleg kijön a tétel.
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!