5. hét: függvények

Czirkos Zoltán · 2022.10.07.

Gyakorlófeladatok az előadás anyagához kapcsolódóan.

1. Függvények

Előjelek

Készíts függvényt, amelyik megadja két számról, hogy egyezik-e az előjelük!

Szökőév

Készíts függvényt, amelyik adott évszámról eldönti, hogy az szökőév-e. (Szökőév minden negyedik, nem szökőév minden századik, mégis az minden 400-adik. A 2000. évben ezért volt szökőév.)

Armstrong-számok

Írj függvényt, amely megmondja egy számról, hogy hány számjegyű!

Írj függvényt, amely hatványozást végez egész számokon!

Készíts programot, mely Armstrong-számokat keres, és a találatkat megjeleníti a képernyőn! N-jegyű Armstrong számoknak nevezzük azokat a számokat, melyek számjegyei N-dik hatványainak összege éppen a számot adja. Például: egy négyjegyű Armstrong-szám a 1634, mivel: 1634=14+64+34+44. Használd az előbb megírt függvényeket!

Boldog számok

Írj programot, amely kiírja két pozitív egész szám közé eső összes boldog számot! Az alsó és a felső határt a felhasználó adhassa meg!

Boldog szám az, amelyre igaz, hogy ha kiszámítjuk számjegyeinek négyzetösszegét, majd ezt a kapott számmal addig ismételjük, amíg egyjegyű számot nem kapunk, akkor az eredmény 1 lesz. Például boldog szám a 23, mert 22 + 32 = 13, 12 + 32 = 10 és végül 12 + 02 = 1.

Nagyon tökéletes számok

Nagyon tökéletes számoknak nevezzük azokat a számokat, amelyek osztói összegének osztóit összegezve az eredeti szám kétszeresét kapjuk. Az első ilyen szám a 2, mert osztóösszege 1+2=3, aminek osztóösszege 1+3=4, ami az eredeti 2 duplája.

Melyik az 5-ödik ilyen? Írj programot, amelyik kiszámítja és kiírja!

A kapitány

NZH-n volt

A kapitány abban az évben született, amely 2016-hoz alulról a legközelebbi olyan szám, melynek osztói száma 8, és van benne 7-es számjegy. Hány éves a kapitány? Határozd meg algoritmikus módszerrel egy programban az évszámot! Írd ki ezt is, és azt is, hogy most hány éves!

Használj top-down tervezést! Ha jól csinálod, a main() kb. 5 sor, és azt mondja: Az év változóban legyen 2016, és amíg nem igaz a vizsgált számra, hogy az osztóinak száma 8, és van benne 7-es számjegy, addig kell csökkenteni az év változó értékét.

(1978 a megoldás.)

Sakktábla

Írj függvényeket, amelyek paraméterei két koordinátapár, amelyek egy mezőre hivatkoznak a sakktáblán! (Ez lehet négy karakter is, pl. d6 és e8.) Az egyes függvények mondják meg a logikai típusú visszatérési értékükben, hogy az adott mezőpár helyes lépés-e egy királynak, bástyának, futónak, huszárnak vagy vezérnek!

Írj programot, amely megkérdezi egy kiinduló mezőnek a koordinátáit a felhasználótól, és aztán kilistázza az egyes figurák által elérhető mezőket!

A függvények segítségével „sormintamentessé” tehető a program. Hasonlítsd össze az így kapott programot a régebbi gyakorlófeladat anyagában található megoldással. Miben segítenek még a függvények?

Segítség: A karakterek a számítógép számára csak számok (belső ábrázolás), nekünk jelennek meg betűkként (külső ábrázolás). Az ord() függvénnyel megtudhatjuk, hogy egy karakternek mi a kódja. Az abc ékezet nélküli betűi sorban szerepelnek a kódtáblában. Pl.: ord("a") < ord("h")

Minimum, maximum, határ

A python standard könyvtárában, megtalálhatóak a min() és a max() függvények. Ezeknek 2 számot adva paraméterül visszaadják a kisebbet (min) vagy a nagyobbat (max).

Készíts egy függvényt ezen segédfüggvények felhasználásával, amely két oldalról korlátoz egy értéket: korlatoz(szam, min, max) adja vissza a számot, ha min és max közé esik, amúgy pedig min-t vagy max-ot attól függően, hogy merre haladta meg a tartományt.

Segítség: a korlátozásnál figyelni kell arra, hogy az alulról limitáláshoz a max() függvényt kell használni, a felülről limitáláshoz pedig a min() függvényt.

Ötvenhét

Készíts függvényt, mely egy 1 és 99 közötti természetes számot képes szöveggé alakítani! Pl.:

5: öt
44: negyvennégy
16: tizenhat

Ezerkilencázhetvenöt

A feladat ugyanaz, mint fent, csak a tartomány legyen 1 és 999999 között. 2000-ig minden számot egybeírunk, 2000 fölött az ezres és ezer alatti rész közé kötőjelet kell tenni. Példák:

625: hatszázhuszonöt
1975: ezerkilencszázhetvenöt
8000: nyolcezer
23870: huszonháromezer-nyolcszázhetven

Variadikus függvény

Írj szorzat() nevű függvényt, amely tetszőlegesen sok argumentumot kaphat, és visszaadja azok szorzatát! Például szorzat(2, 8, 9) értéke 144 legyen.

Emlékeztető: ehhez variadikus függvényt kell használnod.

2. Függvények: refaktorálás

Adott az alábbi programkód:

szamok = [24, 31, 22, 43, 10, 84, 38, 44, 84, 56, 67, 51, 56, 84, 31, 65, 69, 83, 39]

legnagyobb = szamok[0]
for i in range(1, len(szamok)):
    if szamok[i] > legnagyobb:
        legnagyobb = szamok[i]
print(legnagyobb)
indexek = []
for i in range(0, len(szamok)):
    if szamok[i] == legnagyobb:
        indexek.append(i)
print(indexek)

Ez meghatározza, mi a számsor maximuma, utána pedig egy listába kigyűjti azon elemek indexét, amelyek ezt a maximumot elérik. A példában az eredmény [5, 8, 13], mert a számsor maximuma 84, és ez a szám a lista 5, 8 és 13. indexű helyén szerepel.

Válaszd szét a programkódot részfeladatokra, függvényekre!

  • Írj függvényt, amely paraméterként egy listát kap, és visszaadja annak maximumát!
  • Írj függvényt, amely paraméterként egy listát kap, és egy keresett számot. Térjen vissza egy olyan listával, amely indexeket tartalmaz: azokat a helyeket, ahol a megadott szám a listában előfordul.
  • Végül írj függvényt, amelyik az előző két függvény használatával megoldja a feladatot! Lehessen ezt indexek = legnagyobbak_indexei(szamok) formában használni a fenti változóneveket használva.

Ügyelj arra, hogy lényegében új kódot nem kell írnod – ne is írj új kódot! A meglévő kód darabjait kell mozgatni, függvénybe kiszervezni.

Megoldás
def indexek(szamok, mi):
    indexek = []
    for i in range(0, len(szamok)):
        if szamok[i] == mi:
            indexek.append(i)
    return indexek
    
def legnagyobbak_indexei(szamok):
    return indexek(szamok, max(szamok))

def main():
    szamok = [24, 31, 22, 43, 10, 84, 38, 44, 84, 56, 67, 51, 56, 84, 31, 65, 69, 83, 39]
    indexek = legnagyobbak_indexei(szamok)
    print(indexek)

main()