# 5. hét: függvények

Czirkos Zoltán · 2024.10.23.

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áltakat 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 2024-hez 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 2024, é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.

Írj általában is használható függvényeket, amelyek közül az első a) megadja egy szám osztóinak darabszámát; a második b) megadja, hogy egy megadott számban szerepel-e egy megadott számjegy! Használd fel ezeket a főprogramban!

Ebben a feladatban NE használj sztringműveleteket!

(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

### Ezerkilencszá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()