Kezdőoldal » Számítástechnika » Programozás » Mit rontok el ebben a kódban?

Mit rontok el ebben a kódban?

Figyelt kérdés

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:

[link]


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?


2019. ápr. 10. 15:55
 1/9 anonim ***** válasza:
Abszolút semmi értelme ennek a kódnak.
2019. ápr. 10. 16:08
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

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.

2019. ápr. 10. 16:19
Hasznos számodra ez a válasz?
 3/9 Ozmium42 ***** válasza:
100%

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.


[link]

2019. ápr. 10. 18:20
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:
Köszönöm a válaszokat, rengeteget segítettek. A tanácsokat is megfogadom.
2019. ápr. 11. 11:30
 5/9 A kérdező kommentje:

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.

2019. ápr. 11. 11:45
 6/9 A kérdező kommentje:
Mármint nyilván az abszorpciós tétel jó, csak elírhattak valamit.
2019. ápr. 11. 11:46
 7/9 anonim ***** válasza:
Az abszorpciós szabályokat felejtsd el, azok a rendes halmazelméletben nem érvényesek, így a programozás világában sem.
2019. ápr. 11. 13:54
Hasznos számodra ez a válasz?
 8/9 Ozmium42 ***** válasza:

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.

2019. ápr. 11. 18:45
Hasznos számodra ez a válasz?
 9/9 A kérdező kommentje:

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

2019. ápr. 11. 19:43

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!