Megyünk túrázni?

A fenének van kedve ma programozni, amikor ilyen szép az idő. Menjünk inkább túrázni!… Ja nem, ez hülyeség, inkább rohadjunk itt a gép előtt. Akarom mondani, gondoljuk át az egészet, de jól.

Elmegyünk túrázni, ha (tudod: if)

  • nyár van és akkor nem baj, ha esik az eső, mert majd mexáradunk
  • ősz van, de akkor nem eshet az eső
  • és a szelet meg utáljuk: szélhámosak vagyunk, azaz lehámlunk a széltől (az emberek nagy része naphámos, ők a naptól hámlanak le), azaz ha szél van, akkor ki nem mozdulunk, inkább programozunk.

A videóban lévő programkódok:

Első verzió, ami működik, de nem tudja kiírni, hogy ha itthon maradunk. Ebben a verzióban két, egymástól teljesen független if-ágat írtunk. Ha az első eset teljesül is, és kiírjuk, hogy ‘megyünk’, a második esetet is végiggondolja (kiértékeli) a Python, lévén teljesen külön fogalmaztuk meg. Csak a mi fejünkben tiszta, hogy a két eset közül csak az egyik valósulhat meg, a Pythonnak erről ezzel a megfogalmazással nem szólunk.


évszak = input('Nyár van, vagy ősz? (ny/ő) ')
esik = input('Esik? (i/n) ')
szél = input('Fúj a szél? (i/n) ')

if évszak == 'ny' and szél == 'n':
    print('megyünk')
if évszak == 'ő' and esik == 'n' and szél == 'n':
    print('megyünk')

Második verzió, amelyikben a két feltételt összekötöttük, és egy elágazásrendszerünk van. Vagy az egyik feltételegyüttes valósul meg (5. sor), vagy a másik (7. sor), vagy egyik sem (9. sor). Ebben a megoldásban a Python az első feltételegyüttes megvalósulása esetén el sem gondolkodik a másodikon, azaz spóroltunk gépidőt. Oké, most a másodperc töredékének töredékéről van szó, de így kezdődik a dolog. 


évszak = input('Nyár van, vagy ősz? (ny/ő) ')
esik = input('Esik? (i/n) ')
szél = input('Fúj a szél? (i/n) ')

if évszak == 'ny' and szél == 'n':
    print('megyünk')
elif évszak == 'ő' and esik == 'n' and szél == 'n':
    print('megyünk')
else:
    print('maradunk')

Harmadik verzió, amelyikben rájövünk, hogy az második verziójában az if- és az elif-ág végső soron ugyanazt eredményezi: hogy megyünk. Ha meg így van, akkor egyszerűen egy or utasítáásal összekötjük a kettőt és az elif-ágat kivágjuk a francba. Ez azért is jó, mert ha nem csak egy egyszerű kiírást végeznénk – print(‘megyünk’) -, hanem mindkét ágon hatezer soros kód volna, akkor mostantól csak egy helyen kell karbantartani, javítgatni a kódot. Figyeld meg a feltételben a visszapert (” \ “): arra jó, hogy az olvashatatlanul hosszú sort letörjük vele. Természetesen nem kötelező a használata, olyan hosszú sorokat írsz, amilyet akarsz.

évszak = input('Melyik évszak van? (ny/ő) ')
esik = input('Esik? (i/n) ')
szél = input('Fúj a szél? (i/n) ')

if (évszak == 'ny' and szél == 'n') or (évszak == 'ő' and esik == 'n' \
                                        and szél == 'n'):
    print('megyünk')
else:
    print('maradunk')

Negyedik és végső verzió, amelyikben rájövünk, hogy a feltételek alkalmas újraértelmezésével mennyit javulhat a helyzetünk.

évszak = input('Nyár van, vagy ősz? (ny/ő) ')
esik = input('Esik? (i/n) ')
szél = input('Fúj a szél? (i/n) ')

if szél == 'n' and (évszak == 'ny' or (évszak == 'ő' and esik == 'n')):
    print('megyünk')
else:
    print('maradunk')

Most akkor és vagy vagy?

A magyar nyelv néha másképp gondolkodik, mint az informatika. Na jó, sokszor gondolkodik máshogy:)

A klasszikus példa az volt, amikor 2009-ben az ukránok elzárták az Ukrajnán átmenő orosz gázvezetékeket, és így gyorsan mindenki szénnel, fával, olajjal kezdett tüzelni, és Budapesten annyira megnőtt a szálló por mennyisége, hogy az akkori polgármester rendelete szerint

  • páratlan napokon csak a páratlan rendszámú járművek,
  • míg a naptár szerinti páros napokon csak a páros és a nullára végződő rendszámú járművek (nyilván ez utóbbi kitétel azért került be, mert van-egy ősi vita, hogy a 0 az páros szám-e) közlekedhetnek

Namost, írjunk erre programot:


if páratlan(dátum) and páratlan(rendszám):
    print('mehet')
elif páros(dátum) and (páros(rendszám) and nulláravégződik(rendszám))
    print('mehet')
else:
    print('marad a parkolóhelyén')

Ha a mi autónk az ABC-100, akkor nincs gond, páros napokon megyünk. De mikor megyünk az ABC-102 rendszámúval?… Soha. Mert ugye soha nem teljesül az, hogy a 102 páros és nullára végződik.

Tanulság: vigyázzunk, amikor a szövegben megadott feltételt átírjuk kóddá: lehet, hogy ami a szövegben és, az a programban vagy. Néhány példa:

  • “Ez a szakma fiúknak és lányoknak való” – való nekem ez a szakma? Fiú és lány vagyok?
  • “Péntekenként az állatkereskedésben a halak és a madarak 10%-kal olcsóbbak” – biztos ilyet akarunk?

Feladatok

F0006a: Kérj be két számot, és írd ki a kisebbet!

F0006b: Írd meg az előző feladatot úgy, hogy csak egy olyan sor legyen a programkódodban, ami kiírást végez! (Megoldás az expand source-ra kattintva)


egyik = int(input('Mi az egyik szám? '))
másik = int(input('Mi a másik szám? '))
if egyik > másik:
    kiírandó = 'Az ' + str(egyik) + ' a nagyobb.'
elif egyik == másik:
    kiírandó = 'Egyenlőek.'
else:
    kiírandó = 'A ' + str(másik) + ' a nagyobb.'
print(kiírandó)

F0006c: Kérdezd meg, hogy a felhasználó hányadik lett a versenyen! Ha benne van az első háromban, írd ki, hogy “dobogós”! Csak egy if-sort használhatsz.

F0006d: Kérdezd meg, hogy a felhasználó hányadik lett a versenyen! Ha benne van az első háromban, írd ki, hogy milyen érmet kapott. Csak egy if-sort használhatsz, de elif-et annyit, amennyit úri kedved diktál. (Megoldás itt.)

F0006e:A háromszög bármely oldalának hossza kisebb a másik két oldal hosszának összegénél” – így a tétel. Írj programot, amely bekéri a b és c hosszát, majd megmondja, hogy szerkeszthető-e a háromszög. (Megoldás Itt.)

F0006f: Nézd meg az alábbi három mondatszerű leírást!


Ha darab > 100, akkor
    ki: ár * 0,9
Elágazás vége
Ha darab > 500, akkor
    ár: ár * 0,7
Elágazás vége


Ha darab > 500, akkor
    ki: ár * 0,7
Különben ha darab > 100, akkor
    ki: ár * 0,9
Elágazás vége


Ha darab > 100, akkor
    ki: ár * 0,9
Különben ha darab >; 500, akkor
    ki: ár * 0,7
Elágazás vége

A mondatszerű leírással megadott pszeudokódok közül melyik az, amelyik a kereskedő szándékának megfelelően (már ha nem őrült a kereskedő) írja ki az árat? (Juhász Tibor – Kiss Zsolt: Programozási Ismeretek, Műszaki Kiadó, 2011 nyomán)

F0006g: Kérdezd meg a felhasználótól a nevét, a nemét és a napszakot, majd köszöntsd őt a napszaknak megfelelően, angolul (vagy németül, vagy franciául, vagy akárhogy, ahol tudsz a nemnek megfelelő, Mr. illetve Ms. – jellegű előtagot)! Először állítsd elő a köszöntést, és egyetlen sorban használj print-et, mint a b feladatban! (Megoldás az “expand source”-ra kattintva.)


név = input('Mi a kedves vezetékneved? ')

nem = input('Lány vagy, avagy fiú vagy-é? (l/f) ')
if nem == 'l':
    előtag = 'Ms.'
elif nem == 'f':
    előtag = 'Mr.'
else:
    print('Íly nemet sajna nem ismerek. Nem fogok rendesen köszönni.')
    előtag = 'M?.'

napszak = input('Milyen napaszak van? (r/du/e/é) ')
# r = reggel, du = délután, e = este, é = éjjel
if napszak == 'r':
    angol_napszak = 'morning'
elif napszak == 'du':
    angol_napszak = 'afternoon'
elif napszak == 'e':
    angol_napszak = 'evening'
elif napszak == 'é':
    angol_napszak = 'night'
else:
    print('E napszakot sajnos nincs szerencsém ismerni. Aú! Revoár!')
    angol_napszak = 'i-don\'t-know'

print('Good ', angol_napszak, ', ', előtag, ' ', név, '!', sep='')

F0006h: Vedd elő a múltkori számkitalálós programot! Módosítsd úgy, hogy ha csak egy számmal térünk el a gondolt számtól (lefelé vagy felfelé), akkor más üzenetet adjon, mint ha jobban eltérünk! (Megoldás itt.)

F0006i: Kérdezd meg a felhasználó korát, és ha hat év alatti, akkor mondd meg neki, hogy nézze a Piroska és a farkast, ha már legalább hat, de legfeljebb 16, akkor nézze a Zootropoliszt, ha meg 16 elmúlt, akkor közöld vele, hogy már elég nagy hozzá, hogy bármit is megnézzen! (Megoldás itt. Akkor is érdemes megnézned, ha sikerült a feladat egyedül, emrt megnézzük, hogy miként hasonlítható egy változó két értékhez.) (Ez csak egy gyakorlófeladat, a jogi tartalmáért nem vállalok felelősséget :Đ)

 

A múltkor megismerkedtünk az elágazással. Legközelebb ciklust szervezünk.

Reklámok

Megyünk túrázni?” bejegyzéshez ozzászólás

  1. Szia. Tetszenek a leckéid és nagyon jók a gyakorlatok.
    Ezen az oldalon egy apró hiba van.
    Az F0006f programkód harmadik szegmensének 3. sorában a relációs jel helyett > szerepel, ami a > szimbólum HTML kódja, de valamiért nem jól jelenik meg.
    Csak így tovább!

    FI

    Kedvelés

  2. Üdv!

    A F0006h feladatban én ezeket sorokat szúrtam be:

    elif tipp == gondolt_szám + 1 or gondolt_szám – 1:
    print(‘Majdnem sikerült!’)
    print(‘Ott van mellette!’)

    Viszont nem csak a 3 és az 5 tippre kapom ezt a választ, hanem mindenre, ami nem a pontos találat. Minta nem “elif”, hanem “else” utasításként hajtódna végre.
    Mit néztem el?

    Kedvelés

    • Közben rájöttem, hogy mindenképp kell a “tipp == ” az “or” után is.
      De még mindig nem értem hogy így miért nem működik:
      elif tipp == (gondolt_szám + 1) or (gondolt_szám – 1):

      Kedvelés

      • Kicsit tippelek, nem próbáltam ki, de majdnem biztos:
        Azért mert így értékelődik ki: (tipp == (gondolt_szám + 1)) or (gondolt_szám – 1), és a másik nem nulla lesz, azaz nem lesz hamis. Próbáld ki, hogy mi van, ha gondolt_szám -nak beállítasz 1-et, és akkor a második fele 0 lesz, azaz hamis lesz.

        Kedvelik 1 személy

  3. A F0006i megoldásban a
    elif kor > 16: sor helyett elvileg a sima else: -nek is jónak kell lennie, nem?
    Hiszen megoldottad az előző két sorral a 16 év alatti kort. Csak a 16 feletti érték maradhat.

    Kedvelés

  4. Szia!
    Nagyon tetszenek a videok es klassz, hogy vannak hazi feladatok is. Nelkuluk az emeber azt gondolhatna, hogy mindent ert es tud. Egy szintaxissal kapcsolatos kerdesem lenne.
    Ha ugy kerem be az elso szamot, hogy:

    szam1 = input(“Kerlek adj meg egy tetszoleges egesz szamot! ” ‘\n’), akkor mindek mukodik es szep is. Ha viszont ugy, hogy:

    szam2 = input(print(‘Kerlek adj meg egy ujabb tetszoleges egesz szamot! ‘ ‘\n’)), akkor futtataskor szam2 bekeresekor egy ‘None’ felirat jelenik meg. A progi mukodik igy is, ugy is, csak a masodik esetben nem tul szep a kepernyore iras. Miert okkoza ezt a parancsba beagyazott print?

    Elore is koszi a valaszt.

    Kedvelés

    • Nem vagyok 100% biztos a válaszomban, de 99,9%-ban igen. Szóval: a Python 3-ban a print egy függvény. Amikor a programodat futtatod, az input a print visszatérési értékét írja ki, és az meg a nagy semmi.
      Lásd ezt (figyelj, a wordpress elrontja az aposztrófokat, át kell írnod őket, ha másolod az alábbiakat):
      a = print(‘Kerlek adj meg egy ujabb tetszoleges egesz szamot! ‘, ‘\n’)
      print(a) #ez lesz az egyik None
      szam2 = input(a) #ez meg a másik None

      Kedvelés

  5. Helló!
    Ez a lecke is királyul össze lett rakva, a feladatok nagyon ott vannak,köszi!
    Annyit szeretnék pluszban mondani, hogy az F0006g feladathoz én véletlenül ( a megoldás megnézése nélkül) összehoztam egy sokkal egyszerűbbnek tűnő megoldást: (működik!)

    név = input(‘Mi a neved? ‘)
    nem = input(‘Mi a nemed?(f/n) ‘)
    napszak = input(‘Milyen napszak van?(reggel/délután/este) ‘)

    if nem == ‘f’ and napszak == ‘reggel’:
    köszöntés = ‘Good morning, Mr.’
    elif nem == ‘f’ and napszak == ‘délután’:
    köszöntés = ‘Good afternoon, Mr.’
    elif nem == ‘f’ and napszak == ‘este’:
    köszöntés = ‘Good evening, Mr. ‘
    elif nem == ‘n’ and napszak == ‘reggel’:
    köszöntés = ‘Good morning, Ms.’
    elif nem == ‘n’ and napszak == ‘délután’:
    köszöntés = ‘Good afternoon, Ms.’
    elif nem == ‘n’ and napszak == ‘este’:
    köszöntés = ‘Good evening, Ms.’
    print(köszöntés ,név)

    Ezt tényleg meg lehet ilyen egyszerűen is csinálni, vagy kihagytam valamit?

    Kedvelés

    • Meg lehet, és nem hagytál ki semmit:) A probléma például a skálázhatóságában-karbantarthatóságában van a dolognak, és idővel majd azt fogod látni, hogy ezt te is automatikusan figyelembe veszed a megoldásodban.
      Tételezzük fel, hogy még egy harmadik dolgot is figyelembe kell venned a köszöntéskor, mondjuk meg kell dicsérned a partner kutyáját vagy macskáját, ha van neki. (“and what a lovely cat/dog you have with you”). Ez a te megoldásodban triplájára emeli a kód hosszát, az enyémben pár sor betoldását jelenti.
      Ez semmit nem von le a te mostani megoldásod sikeréből – minden okod meg van, hogy büszke legyél -, mindössze arra akartam rávilágítani, hogy miért írok egy picit bonyolultabb megoldást automatikusan – és miért fogsz te is, ahogy fejlődsz:)

      Kedvelik 1 személy

  6. Helló!
    Egy olyan kérdésem lenne (mindegyik programnál), hogy a kész programot megnyitom és utána minden jó beírtam a válaszokat és ki írja amit a print-hez írtam, de egyből be is zárja a programot.
    A segítséget előre is köszönöm.

    Kedvelés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés /  Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés /  Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés /  Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés /  Módosítás )

Kapcsolódás: %s