Informatika2-2015/Gyakorlat06
Tartalomjegyzék |
6. gyakorlat - Referenciak, Hibakezelés
Ezen a gyakorlaton az előző heti előadás anyagát dolgozzuk fel.
Feladatok
Feladatok a CloudCoder-en megtalálhatóak. Ajánlott sorrend:
- lakoma_1
- lakoma_2
- lakoma_3
- lakoma_4
- nyeses
Az első négy feladat egymásra épül, ugyanazt a lakoma nevű függvényt fejlesztitek egyre tovább. Ezért amikor kész az egyik feladat, érdemes átmásolni az addigi megoldásotokat a következő feladathoz. De vigyázzatok, az ellenőrző kódot ne másoljátok át, csak a megoldásotokat!
A mostani feladatok mind tartalmaznak a kódvázlatban ellenőrző kódot. Ehhez ne nyúljatok hozzá (a házi feladatnál pl. ha hozzányúltok, az hibásnak számít). Az se fontos, hogy megértsétek ami oda van írva, nem kell elolvasnotok. Ha véletlenül átírnátok, itt az eredeti kódvázlat mindegyik feladathoz:
lakoma_1:
def lakoma(vendegek, valtozasok): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! def lakoma_1(vendegek, valtozasok): assert lakoma(vendegek, valtozasok) == None return vendegek
lakoma_2:
def lakoma(vendegek, valtozasok): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! def lakoma_2(vendegek, valtozasok): ret = lakoma(vendegek, valtozasok) if ret != None: return "" + ret else: return vendegek
lakoma_3:
def lakoma(vendegek, valtozasok): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! def lakoma_3(vendegek, valtozasok): ret = lakoma(vendegek, valtozasok) if ret != None: return "" + ret else: return vendegek
lakoma_4:
def lakoma(vendegek, valtozasok): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! def lakoma_4(vendegek, valtozasok): try: ret = lakoma(vendegek, valtozasok) except Exception: return "Ellenor: hiba " + sys.exc_info()[0].__name__ if ret != None: return "" + ret else: return vendegek
nyeses:
def nyes(fa): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! def nyeses(fa): assert nyes(fa) == None return fa
Házi feladat
nokedli_hiba:
def eves(kupacok, hol, k): pass #TODO def nokedli(kupacok, evesek): pass #TODO ################################ # Ellenorzo kod, ne modositsuk! import datetime def nokedli_hiba(kupacok, evesek): try: return nokedli(kupacok, evesek) except: return "Ellenor: mas hiba"
Feladatok megoldása
lakoma_1
def lakoma(vendegek, valtozasok): for nev, szam in valtozasok: vendegek[nev] += szam
lakoma_2
def lakoma(vendegek, valtozasok): for nev, szam in valtozasok: vendegek[nev] += szam if vendegek[nev] < 0: return "Hiba: Negativ vendegszam"
lakoma_3
def lakoma(vendegek, valtozasok): try: for nev, szam in valtozasok: vendegek[nev] += szam if vendegek[nev] < 0: return "Hiba: Negativ vendegszam" except: return "Hiba: Rossz bemenet"
lakoma_4
def lakoma(vendegek, valtozasok): try: for nev, szam in valtozasok: vendegek[nev] += szam if vendegek[nev] < 0: return "Hiba: Negativ vendegszam" except KeyError: return "Hiba: Rossz nev"
nyeses
def nyes(fa): i = 0; while i < len(fa): if fa[i] == []: del fa[i] else: nyes(fa[i]) i += 1
Itt figyelni kell, hogy csak akkor van i += 1, amikor nem töröltem az elemet. A másik esetben, ha törlöm fa[i]-t, akkor ami eddig fa[i+1] volt, az fog a fa[i] helyre csúszni, úgyhogy ha nem akarom kihagyni, nem szabad i-t növelni.
Házi feladat megoldása
nokedli
def eves(kupacok, hol, k): kupacok[hol] = kupacok[hol] % k def nokedli(kupacok, evesek): for hol, k in evesek: eves(kupacok, hol, k) return sum(kupacok)
nokedli_hiba
def eves(kupacok, hol, k): kupacok[hol] = kupacok[hol] % k def nokedli(kupacok, evesek): try: for hol, k in evesek: eves(kupacok, hol, k) except IndexError: return "Hiba: Rossz hely" return sum(kupacok)