Minta vizsga
Czirkos Zoltán · 2021.05.31.
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.")