Minta vizsga

Czirkos Zoltán · 2020.11.28.

Minta vizsga, néhány feladattal.

Minta vizsga. Tudnivalók a feladatsor felhasználásával kapcsolatban: lásd itt. Ez csak minta. Nem fedi le a teljes tananyagot; nem jelent semmi olyasmit, hogy „csak ez lehet”, vagy „csak ilyen lehet”, esetleg „más nem lesz”.

1. feladat: Ajándék vagy virgács?

A mikulás szeretné megtudni mindegyik gyerekről, hogy jó volt vagy rossz. Ha jó volt, ajándékot visz neki, ha rossz, akkor virgácsot küld a krampusszal. A gyerekekről szóló szöveg vigyorgó hangulatjelet :) tartalmaz minden jótett leírása után, és szomorút :( minden csínytevés után. Például segített főzni :) és rendetlenséget hagyott a szobájában :(.

Írj programot, amelyik karakterenként olvassa a bemenetét, és állapotgépes szemléletű feldolgozással megszámlálja, hány vigyorgó :) és szomorú :( jel volt benne! Végül írja ki, hogy ajándék jár (több jótett, mint csínytevés), vagy virgács (a jótett kevesebb), esetleg nem lehet eldönteni a történetből, ha ugyanannyi :) volt, mint :(. Másféle hangulatjel nem lesz a szövegben.

A programod legyen állapotgépes, sztringkezelés nem lehet benne (input, readline, split stb.) Rajzolj állapottáblát vagy állapotátmeneti gráfot, az sokat segít!

Megoldás
: ( ) többi
alap →kp - - -
kp - szom+, →alap vid+, →alap →alap
import sys

ALAP = 1
KETTOSPONT = 2

allapot = ALAP
vidam = szomoru = 0

while True:
    c = sys.stdin.read(1)
    if c == "": break
    
    if allapot == ALAP:
        if c == ":": allapot = KETTOSPONT
    elif allapot == KETTOSPONT:
        if c == ")": vidam += 1
        elif c == "(": szomoru += 1
        if c != ":": allapot = ALAP
    
if vidam > szomoru: print("ajándék")
elif vidam < szomoru: print("virgács")
else: print("közömbös")

2. feladat: Valutaváltó

A mikulás az utolsó pillanatban kapcsol, hogy nem szerzett elég ajándékot. Ezért betér egy valutaváltóba, hogy pénzt szerezhessen újabb játékokra.

Írj függvényt, mely a paraméterként megadott nevű fájlból beolvassa az aktuális vételi és eladási árfolyamokat, s ezeket dict típusú tárolóban visszaadja! Ez a valuta kódjával indexelhető, és vétel, eladás adattagokat használó objektumokat kell tartalmazzon. A fájl minden sora három mezőből áll, melyeket szóköz karakter választ el: valutakód, vételi árfolyam, eladási árfolyam. Példa lent látható. Definiáld az ehhez szükséges Árfolyam osztályt is!

Írj programot, mely bemutatja a függvény és az adatszerkezet használatát. A program írja ki a bemenetről bekért típusú és mennyiségű valuta vételi és eladási értékét – lásd a lentebbi példát.

USD  278.51  292.21
GBP  350.00  369.67
EUR  315.51  331.69
CHF  278.58  294.99
Váltani kívánt valuta kódja: EUR
Váltani kívánt valuta mennyisége: 100

31551 forintért vesszük, 33169 forintért adjuk.
Megoldás
class Arfolyam:
    def __init__(self, vetel, eladas):
        self.vetel = vetel
        self.eladas = eladas

def ArfolyamBeolvas(fnev):
    A = {}
    with open(fnev) as fin:
        for line in fin:
            kod, vetel, eladas = line.strip().split()
            A[kod] = Arfolyam(float(vetel), float(eladas)) 
    return A

def main():
    A = ArfolyamBeolvas("arfolyam.txt")
    
    kod = input("Váltani kívánt valuta kódja: ")
    num = float(input("Váltani kívánt valuta mennyisége: "))
    
    print("{:.2f} forintért vesszük, {:.2f} forintért adjuk.".
        format(A[kod].vetel * num, A[kod].eladas * num))

main()

3. feladat: Karambol

A mikulás a szánjával nekihajtott egy fának. Az ajándékok szétszóródtak a fa ágain. Hogy mentse a menthetőt, felmászik a fára, végigjárja az összes ágát, az ott található ajándékokat összegyűjti, és mindet a fa gyökeréhez cipeli. A fa történetesen épp bináris fa, amelynek csomópontjai az oda került ajándékok darabszámát tárolják.

  • Definiáld az osztályt, amely ilyen fa felépítésére alkalmas! Írj függvényt, amely kilistázza a csomópontokban található ajándékok számát! A sorrend most lényegtelen.
  • Írj függvényt, amelyik a fa gyökerébe teszi az elemek összegét, az összes többi csomópontot pedig nullázza! (Több megoldás elképzelhető, ha gondolod, írj segédfüggvényeket!)
  • Egy példa kódrészletben hozz létre fa gyökerét tároló változót (egyetlen csomópontot; nagyobb fát építeni nem kell), gyűjtsd az ajándékokat a gyökerébe!
Megoldás
class BinFa:
    def __init__(self, db):
        self.db = db
        self.bal = self.jobb = None

def kiir(fa):
    if fa is None:
        return
    print(fa.db)
    kiir(fa.bal)
    kiir(fa.jobb)

def gyokerbe(fa):
    if fa.bal is not None:
        gyokerbe(fa.bal)
        fa.db += fa.bal.db
        fa.bal.db = 0
    if fa.jobb is not None:
        gyokerbe(fa.jobb)
        fa.db += fa.jobb.db
        fa.jobb.db = 0

fa = BinFa(5)
gyokerbe(fa)
kiir(fa)
# alternatív megoldás, triviális segédfüggvényekkel: a) összeg, b) nullázás, c) összeg gyökérbe.
def osszeg(fa):
    if fa is None:
        return 0
    return fa.db + osszeg(fa.bal) + osszeg(fa.jobb)

def nullaz(fa):
    if fa is None:
        return
    fa.db = 0
    nullaz(fa.bal)
    nullaz(fa.jobb)

def gyokerbe_alt(fa):
    ossz = osszeg(fa)
    nullaz(fa)
    fa.db = ossz

4. feladat: Térkép

A mikulás ajándékokat visz végtelen, kétdimenziós rácson elhelyezkedő házakba. Kezdetben beadja az ajándékot a kiindulási pozícióban lévő házba, utána pedig rádión kapja az utasításokat, merre kell tovább mennie: északra (^, kalap), délre (v, kis v betű), keletre vagy nyugatra (>, <, kacsacsőrök). Minden lépés után bead egy ajándékot az új pozícióban lévő házba.

A gond csak az, hogy az utasítások kicsit össze-vissza vannak, ezért némely háznál többször is jár. Kérdés az, hogy hány házba vitt legalább egy ajándékot. Például:

  • > két házba; egyik a kiindulási pozíció (origó, 0,0), másik pedig az attól keletre lévő (0,1).
  • ^>v< négy házba; a kiinduló házban így két ajándékot kapnak.
  • ^v^v^v^v^v rengeteg ajándékot kap két szerencsés gyerek.

Olvasd be a bemenetről az irányokat, és oldd meg ezt egy halmazzal! A halmazba (set) a koordinátákat kell tenni, amelyeket legegyszerűbben egy tuple-ben tárolhatsz, pl. (5,-9). A halmaz számossága (mérete) a válasz.

Megoldás
import sys

x = 0
y = 0
holjart = set()
holjart.add((x, y))

while True:
    irany = sys.stdin.read(1)
    if irany == "":
        break
    if irany == "^":
        y -= 1
    elif irany == "v":
        y += 1
    elif irany == "<":
        x -= 1
    elif irany == ">":
        x += 1
    # ha más karakter jött, az nem baj, mert marad a pozíció,
    # és a halmazba ugyanaz kerülne
    holjart.add((x, y))

print(len(holjart), "helyen járt.")