Eldöntés

Az előző alkalommal láttuk életünk első programozási tételét. Már rém okosak vagyunk, és tudjuk, hogy a programozási tétel valójában nem is tétel, hanem egy jól bejáratott, kipróbált módszer egy típusprobléma megoldására.

A mai alkalommal eldöntünk dolgokat.

Eldőlt a szék

Aztakurva…

Az eldöntés úgy értendő, hogy eldöntjük, hogy egy adott gyűjteményes adatszerkezetben – azaz például listában – van-e adott tulajdonságú elem. Ez az a programozási tétel, amit Pythonban nagyon másképp csinál az ember, mint sok más elterjedt nyelvben. Ennek sok oka van, de lássuk a videót!

Azt láttuk hát, hogy az eldöntés programozási tétel általánosan:

sorozat = valamilyen lista, range, vagy más bejárható objektum

ciklus sorozat minden elem-ére
    ha az elem keresett tulajdonságú:
        kiírjuk, vagy egy változóban jelezzük, hogy van
        break
    elágazás vége
ciklus vége

Valójában ez az egy algoritmus kétféleképp használatos. Az egyik esetben a bejárható objektumot a szokásos módon, érték szerint járjuk be:


vanilyen = False
for elem in bejárható_objektum:
    if elem olyan_amilyet_keresünk:
        vanilyen = True
        break

A másik esetben indexek szerint járjuk végig a sorozatot (emlékszel még? indexnek hívtuk azt a számot, ami megmondja, hogy a lista eleme hányadik a listában.) Ez olyankor kell, amikor az előző vagy következő elemekhez akarjuk hasonlítgatni az épp vizsgált elemet. Először a len() függvénnyel meghatározzuk a bejárható objektum elemszámát, majd ezt betoljuk a range() függvénybe. Ugye egy tízelemű lista elemszáma tíz, de a range(10) csak 0-tól 9-ig adja vissza a számokat. Ami viszont nem baj, mert a tízelemű lista pont indexei pont nullától kilencig terjednek. Annak idején ígértem, hogy egy napon megbeszéljük, hogy miért jó, hogy a range() függvény a felső határig nem jut el soha. Hát ezért, hogy tudjunk ilyet írni:


for index in range(len(bejárható_objektum)):
    if bejárható_objektum[index] olyan_amilyet_keresünk:
        print(bejárható_objektum[index])
        break

A videóban említettem, hogy a break miatt többen, például tanárkollégáim közül is esetleg mérgesek lesznek. Ha nézik ezt a videót. Nem gond, ha meg érteni akarod, hogy mi ennek az oka, hát majd a feladatok után visszatérek rá.

A Python egyszerűsítése:

  • ha az eldöntés csak arról szól, hogy megvan-e egy elem egy gyűjteményes adatszerkezetben, akkor használható az if keresett_elem in adatszerkezet utasításforma is. Az in egy operátor, azt vizsgálja, hogy benne van-e egy elem például egy listában Lehet olyat is írni, hogy if keresett_elem not in adatszerkezet.

Feladatok

F0022a: Adott a hét napjainak listája. Döntsd el, hogy a felhasználó rendes napnevet adott-e meg! (Megoldás itt.)

F0022b: Döntsd el, hogy a lottó kihúzott számai közül mind 40 és 60 közé esik-e! (Segítség: Van-e olyan szám, amelyik nem ilyen?) (Megoldás itt.)

F0022c: Döntsd el egy számról, hogy prímszám-e! (Segítség: Mit is kell itt eldönteni? Azt, hogy van-e….) (Megoldás itt.)

F0022d: Az elmúlt hónapokban minden nap feljegyeztük két kedvenc részvényünk árfolyamát: [34, 35, 37, 39, 40, 42, 44, 45] és [31, 32, 34, 35, 35, 35, 40, 41]. Döntsd el, hogy folyamatosan emelkedett-e az árfolyam! (Segítség: Itt kell az indexes-bejárós változata a tételnek. Hasonlítsuk össze az előző elemmel a lista aktuális elemét, és ha nem nagyobb…) (Megoldás itt.)

F0022e: Hozz létre 10-30 közötti véletlenszámokból egy 30 elemű listát! Ez a vendéglőd elmúlt hónapjának forgalma, ennyi vendéged volt az egyes napokon. Ha van benne legalább egyetlen alkalommal 30 vendég, akkor rájössz, hogy szükséged van a vendéglő bővítésére. Ha van három egymás utáni nap, amikor legfeljebb 12-en voltak, akkor reklámozni kell. Írd ki, hogy melyik teendőt kell ellátnod! (Segítség: Igen, ez két külön feladat. Az első pofonegyszerű, a második meg majdnem olyan, mint az előző, a 22d.) (Megoldás itt.)

F0022f: Ha még nem menne fejből: vágd be az eldöntés tételét!

A gonosz break és a strukturált programozás

(majd)

Legutóbb a sorozatszámítás tételét néztük meg. Legközelebb a kiválasztás tétele következik.

Az eleső krapek: http://cliparts.co/clipart/2861049

Reklámok

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 )

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 )

Google+ kép

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

Kapcsolódás: %s