Informatika2-2015/NagyHF
(→"Nagy" Házi feladat) |
|||
1. sor: | 1. sor: | ||
= "Nagy" Házi feladat = | = "Nagy" Házi feladat = | ||
− | |||
− | |||
'''Határidő (mindenkinek):''' Április 7. 23:59 | '''Határidő (mindenkinek):''' Április 7. 23:59 | ||
− | Külön fájlba kell írni, és emailben elküldeni | + | Külön fájlba kell írni, és emailben elküldeni nekem. Bizonyos részei CloudCoder-ben is fenn lesznek, de mivel olyan részt is tartalmaz, ami ott nem ellenőrizhető (megfelelő modul forma, fájl írás/olvasás), nem minden. |
+ | |||
+ | 8. heti labor (Márc. 30. és Ápr. 1. alkalmak) is ennek lesznek szánva, szval ha valakinek nincs python a gépén, és nem akar feltenni, az is opció ha már ott elkészül vele. | ||
+ | |||
+ | = Esemény = | ||
+ | |||
+ | Egy olyan programot kell írnunk, ami egy esemény megszervezésében segít, kicsit hasonlóan a közismert http://doodle.com/ honlaphoz. Minden ismerősünk megadhatja azokat a napokat amik megfelelőek neki, és a program ez alapján kiválasztja a legjobb dátumot. | ||
+ | |||
+ | == Tesztelés == | ||
+ | |||
+ | A feladatot az esemeny.py nevű fájlban kell megoldani. A teszteléshez összeállítottam egy csomagot, ami a feladat megoldását az "esemeny" nevű modulban keresi, így csak ez a fájlnév működik. A tesztelő csomag [http://math.bme.hu/~csirke/Info2-2015/NagyHF.zip itt] található. A tömörített fájl tartalmát csomagoljátok ki egy könyvtárba, és ott hozzátok létre az esemeny.py fájlt is. Ezután tesztelést a esemeny_teszt.py nevű fájl futtatásával tudtok végezni. Windows-on, ha fel van telepítve a python, akkor ehhez elég csak duplán klikkelni a fájlra. Linux-on ehhez futtathatóvá kell tenni előbb a fájlt. Mindkét operációs rendszeren működik ha spyder-ben megnyitjuk a fájlt és onnan futtatjuk, vagy ha a megfelelő könyvtárban azt írjuk a parancssorba hogy: | ||
+ | python esemeny_teszt.py | ||
+ | |||
+ | A tesztelő program a leteszteli a modul működését, és olyan hibák esetén amikre gondoltam, specifikus hibaüzeneteket is ad. Ha valamikor olyan hiba történik benne, amit nem értetek, akkor szóljatok/írjatok emailt. | ||
+ | |||
+ | == Beküldés == | ||
+ | |||
+ | '''Mielőtt elkülditek a feladatot, nevezzétek át a fájlt "esemeny_<CC_user>.py"-re, amibe a saját CloudCoder felhasználóneveteket írjátok be. Tehát pl. aki "testuser" a CloudCoder-en, az "esemeny_testuser.py" fájlnévvel küldje el a megoldását.''' Ezután küldjétek el az így átnevezett fájlt az [mailto:csirkeee@gmail.com email címemre], "Info2 HF" tárggyal. | ||
+ | |||
+ | == Feladat == | ||
+ | |||
+ | A feladat különböző részeihez ebben az esetben megadom a pontértéket is a végső 5 pontból. | ||
+ | |||
+ | === Raeres osztaly [1 pont] === | ||
+ | |||
+ | Legyen a modulban egy '''Raeres''' nevu osztaly, ami annak tárolására van, hogy egy ismerősünk melyik napokon ér rá. Az osztálynak két tagváltozója legyen: | ||
+ | * '''nev''', ami az ismerősünk neve egy karakterláncként | ||
+ | * '''datumok''', ami egy lista [https://docs.python.org/2/library/datetime.html#date-objects datetime.date] objektumokkal, amik időrendi sorrendben vannak letárolva. | ||
+ | |||
+ | A konstruktor is két paramétert kérjen ennek megfelelően. Az első a név, a második legyen a dátumokat tartalmazó lista, és ezt akkor is időrendi sorrendbe tárolja le a ''datumok'' tagváltozóba, ha a paramétert nem úgy kapja! | ||
+ | |||
+ | Az osztálynak a konstruktoron kívül két metódusa legyen: | ||
+ | |||
+ | ==== megis ==== | ||
+ | |||
+ | A '''megis()''' metódus egy paramétert kérjen, ami egy dátum, amikor mégis ráér az adott ismerős. Ez változtassa meg az objektum ''datumok'' tagváltozóját, hogy ez a dátum is szerepeljen a listában az eddigiek mellett. Fontos, hogy a lista továbbra is legyen időrendi sorrendbe rendezve. | ||
+ | |||
+ | ==== megse ==== | ||
+ | |||
+ | A '''megse()''' metódus is egy paramétert kapjon, ami egy olyan dátum lesz, ami szerepel a dátumok jelenlegi listáján. Ezen a dátumon mégse ér rá az adott ismerős, úgyhogy töröljük a listából. Továbbra is legyen a ''datumok'' lista időrendi sorrendbe rendezve. | ||
+ | |||
+ | === legjobb_datum függvény [1 pont] === | ||
+ | |||
+ | Legyen a modulban, de a Raeres osztályon kívül, egy "legjobb_datum" nevű függvény. A függvénynek egy paramétere legyen: | ||
+ | * '''raeresek''', egy lista ''Raeres'' objektumokkal. | ||
+ | |||
+ | A függvény keresse meg a legjobb dátumot az alapján hogy ki mikor ér rá. A legjobb dátum a következőképpen van meghatározva: | ||
+ | # Először is vegyük azt a dátumot, ami a legtöbb embernek jó. Ha több dátum is ugyanannyi embernek jó, akkor ezek közül a dátumok közül, amik a legtöbb embernek jók, válogatunk a továbbiakban. | ||
+ | # Ha a legtöbb embernek jó dátumok között van hétvégi, akkor mindenképpen hétvégit választunk. | ||
+ | # Az így még felmerülő dátumok közül a legkorábbit választjuk. | ||
+ | |||
+ | A függvény térjen vissza az így megtalált legjobb dátummal. | ||
+ | |||
+ | ==== Segítség ==== | ||
+ | |||
+ | * A ''datetime.date'' osztálynak van [https://docs.python.org/2/library/datetime.html#datetime.date.weekday weekday()] metódusa, ami segíthet megállapítani hogy melyik nap hétvége. | ||
+ | |||
+ | === legjobb_fajlbol függvény [1 pont] === | ||
+ | |||
+ | Ez a függvény ugyanazt csinálja mint az előző, csak a különböző emberek ráérését nem függvényparaméterként kapja, hanem egy fájlból olvassa be. A '''legjobb_fajlbol''' függvénynek egy paramétere legyen: | ||
+ | * '''fajlnev''', a fájl neve, amiből olvassa be az adatokat. | ||
+ | |||
+ | A fájloknak olyan lesz a formátuma, hogy minden sor egyvalakinek a ráérését írja le, ilyen formátumban: | ||
+ | |||
+ | Eszter: 2015.2.4, 2015.2.3 | ||
+ | |||
+ | Tehát először is egy kettőspont elválasztja a nevet a dátumok listájától, majd a dátumok listáján belül vesszők választják el a dátumokat, majd a dátumon belül pontok választják el az évet, hónapot és napot. | ||
+ | |||
+ | A függvény a ''legjobb_datum()''-hoz hasonlóan a megtalált dátummal térjen vissza, ''datetime.date'' objektum formában. | ||
+ | |||
+ | ==== Segítség ==== | ||
+ | |||
+ | * Miután beolvastuk a fájlból az adatokat, elég csak meghívni a ''legjobb_datum()'' függvényt az adatokkal, nem kell átmásolni a kódját vagy ilyesmi. | ||
+ | * Fájl olvasásról az [[Informatika2-2015/Eloadas 7 Python-7 Fajl kezeles Kitekintes|előző előadáson]] volt szó. | ||
+ | * Az egy sor adat megfelelő feldarabolásához a karakterlánc [https://docs.python.org/2/library/stdtypes.html#str.split split()] metódusát lehet használni. Pl. ha az egész sor a ''sor'' nevű változóban van, akkor | ||
+ | sor.split(":") | ||
+ | egy két elemű listát ad vissza, amiből az első a név, a második a dátumok teljes listája. Hasonlóan aztán a dátumok listáját a vesszőknél szét lehet vágni, majd a dátumot magát a pontoknál. | ||
+ | |||
+ | === Különálló futtatás [1 pont] === | ||
+ | |||
+ | Azt szeretnénk, ha az esemeny.py fájl akkor is csinálna valami hasznosat, ha magában futtatjuk. A [[Informatika2-2015/Eloadas_3_Python-3_Opcionalis_parameter_Dokumentacio|3. előadáson]] volt róla szó, hogy a kódot amit csak akkor szeretnénk futtatni ha ez a fájl fut (és nem importálva van), azt egy | ||
+ | <python>if __name__ == "__main__":</python> | ||
+ | blokkon belülre kell tenni. | ||
+ | |||
+ | Ennél a python programnál a következőt szeretnénk ha csinálná ilyenkor a fájl: | ||
+ | * Olvassa be a "raeresek.txt" fájlból az adatokat | ||
+ | * Keresse meg ez alapján a legjobb dátumot | ||
+ | * A megtalált legjobb dátumot írja ki a "legjobb_datum.txt" nevű fájlba. A dátumot úgy formázza, ahogy a ''datetime.date'' osztály alapértelmezett formázása van, tehát ilyen formátumú legyen a "legjobb_datum.txt" tartalma: | ||
+ | 2015-06-14 | ||
+ | |||
+ | ==== Segítség ==== | ||
+ | |||
+ | * Fájl írásról is [[Informatika2-2015/Eloadas 7 Python-7 Fajl kezeles Kitekintes|előző előadáson]] volt szó. | ||
+ | * A dátum szöveggé konvertálásához az [https://docs.python.org/2/library/functions.html#str str()] beépített függvényt használhatjuk, ez mindjárt a megfelelő formátumot fogja adni. | ||
+ | * Természetesen a korábban megírt ''legjobb_fajlbol()'' függvény használata jelentősen segít itt. | ||
+ | |||
+ | === Dokumentáció [1 pont] === | ||
+ | |||
+ | A python-ban, mint már [[Informatika2-2015/Eloadas_3_Python-3_Opcionalis_parameter_Dokumentacio|3. előadáson]] tárgyaltuk, a docstringek használata a szabványos megoldás a dokumentációra. Legyen a megoldásunkban minden fontosabb dolognak legalább egy soros docstring-je, tehát: | ||
+ | * Magának a ''Raeres'' osztálynak | ||
+ | * A ''Raeres'' osztály ''megis()'' és ''megse()'' metódusának (a konstruktornak nem kell) | ||
+ | * A ''legjobb_datum()'' és a ''legjobb_fajlbol()'' függvényeknek. | ||
− | + | (Ha valaki ezek közül valamelyeket nem oldotta meg, elég ha minden dokumentálva van amit megoldott.) |
A lap 2015. március 30., 04:10-kori változata
Tartalomjegyzék |
"Nagy" Házi feladat
Határidő (mindenkinek): Április 7. 23:59
Külön fájlba kell írni, és emailben elküldeni nekem. Bizonyos részei CloudCoder-ben is fenn lesznek, de mivel olyan részt is tartalmaz, ami ott nem ellenőrizhető (megfelelő modul forma, fájl írás/olvasás), nem minden.
8. heti labor (Márc. 30. és Ápr. 1. alkalmak) is ennek lesznek szánva, szval ha valakinek nincs python a gépén, és nem akar feltenni, az is opció ha már ott elkészül vele.
Esemény
Egy olyan programot kell írnunk, ami egy esemény megszervezésében segít, kicsit hasonlóan a közismert http://doodle.com/ honlaphoz. Minden ismerősünk megadhatja azokat a napokat amik megfelelőek neki, és a program ez alapján kiválasztja a legjobb dátumot.
Tesztelés
A feladatot az esemeny.py nevű fájlban kell megoldani. A teszteléshez összeállítottam egy csomagot, ami a feladat megoldását az "esemeny" nevű modulban keresi, így csak ez a fájlnév működik. A tesztelő csomag itt található. A tömörített fájl tartalmát csomagoljátok ki egy könyvtárba, és ott hozzátok létre az esemeny.py fájlt is. Ezután tesztelést a esemeny_teszt.py nevű fájl futtatásával tudtok végezni. Windows-on, ha fel van telepítve a python, akkor ehhez elég csak duplán klikkelni a fájlra. Linux-on ehhez futtathatóvá kell tenni előbb a fájlt. Mindkét operációs rendszeren működik ha spyder-ben megnyitjuk a fájlt és onnan futtatjuk, vagy ha a megfelelő könyvtárban azt írjuk a parancssorba hogy:
python esemeny_teszt.py
A tesztelő program a leteszteli a modul működését, és olyan hibák esetén amikre gondoltam, specifikus hibaüzeneteket is ad. Ha valamikor olyan hiba történik benne, amit nem értetek, akkor szóljatok/írjatok emailt.
Beküldés
Mielőtt elkülditek a feladatot, nevezzétek át a fájlt "esemeny_<CC_user>.py"-re, amibe a saját CloudCoder felhasználóneveteket írjátok be. Tehát pl. aki "testuser" a CloudCoder-en, az "esemeny_testuser.py" fájlnévvel küldje el a megoldását. Ezután küldjétek el az így átnevezett fájlt az email címemre, "Info2 HF" tárggyal.
Feladat
A feladat különböző részeihez ebben az esetben megadom a pontértéket is a végső 5 pontból.
Raeres osztaly [1 pont]
Legyen a modulban egy Raeres nevu osztaly, ami annak tárolására van, hogy egy ismerősünk melyik napokon ér rá. Az osztálynak két tagváltozója legyen:
- nev, ami az ismerősünk neve egy karakterláncként
- datumok, ami egy lista datetime.date objektumokkal, amik időrendi sorrendben vannak letárolva.
A konstruktor is két paramétert kérjen ennek megfelelően. Az első a név, a második legyen a dátumokat tartalmazó lista, és ezt akkor is időrendi sorrendbe tárolja le a datumok tagváltozóba, ha a paramétert nem úgy kapja!
Az osztálynak a konstruktoron kívül két metódusa legyen:
megis
A megis() metódus egy paramétert kérjen, ami egy dátum, amikor mégis ráér az adott ismerős. Ez változtassa meg az objektum datumok tagváltozóját, hogy ez a dátum is szerepeljen a listában az eddigiek mellett. Fontos, hogy a lista továbbra is legyen időrendi sorrendbe rendezve.
megse
A megse() metódus is egy paramétert kapjon, ami egy olyan dátum lesz, ami szerepel a dátumok jelenlegi listáján. Ezen a dátumon mégse ér rá az adott ismerős, úgyhogy töröljük a listából. Továbbra is legyen a datumok lista időrendi sorrendbe rendezve.
legjobb_datum függvény [1 pont]
Legyen a modulban, de a Raeres osztályon kívül, egy "legjobb_datum" nevű függvény. A függvénynek egy paramétere legyen:
- raeresek, egy lista Raeres objektumokkal.
A függvény keresse meg a legjobb dátumot az alapján hogy ki mikor ér rá. A legjobb dátum a következőképpen van meghatározva:
- Először is vegyük azt a dátumot, ami a legtöbb embernek jó. Ha több dátum is ugyanannyi embernek jó, akkor ezek közül a dátumok közül, amik a legtöbb embernek jók, válogatunk a továbbiakban.
- Ha a legtöbb embernek jó dátumok között van hétvégi, akkor mindenképpen hétvégit választunk.
- Az így még felmerülő dátumok közül a legkorábbit választjuk.
A függvény térjen vissza az így megtalált legjobb dátummal.
Segítség
- A datetime.date osztálynak van weekday() metódusa, ami segíthet megállapítani hogy melyik nap hétvége.
legjobb_fajlbol függvény [1 pont]
Ez a függvény ugyanazt csinálja mint az előző, csak a különböző emberek ráérését nem függvényparaméterként kapja, hanem egy fájlból olvassa be. A legjobb_fajlbol függvénynek egy paramétere legyen:
- fajlnev, a fájl neve, amiből olvassa be az adatokat.
A fájloknak olyan lesz a formátuma, hogy minden sor egyvalakinek a ráérését írja le, ilyen formátumban:
Eszter: 2015.2.4, 2015.2.3
Tehát először is egy kettőspont elválasztja a nevet a dátumok listájától, majd a dátumok listáján belül vesszők választják el a dátumokat, majd a dátumon belül pontok választják el az évet, hónapot és napot.
A függvény a legjobb_datum()-hoz hasonlóan a megtalált dátummal térjen vissza, datetime.date objektum formában.
Segítség
- Miután beolvastuk a fájlból az adatokat, elég csak meghívni a legjobb_datum() függvényt az adatokkal, nem kell átmásolni a kódját vagy ilyesmi.
- Fájl olvasásról az előző előadáson volt szó.
- Az egy sor adat megfelelő feldarabolásához a karakterlánc split() metódusát lehet használni. Pl. ha az egész sor a sor nevű változóban van, akkor
sor.split(":")
egy két elemű listát ad vissza, amiből az első a név, a második a dátumok teljes listája. Hasonlóan aztán a dátumok listáját a vesszőknél szét lehet vágni, majd a dátumot magát a pontoknál.
Különálló futtatás [1 pont]
Azt szeretnénk, ha az esemeny.py fájl akkor is csinálna valami hasznosat, ha magában futtatjuk. A 3. előadáson volt róla szó, hogy a kódot amit csak akkor szeretnénk futtatni ha ez a fájl fut (és nem importálva van), azt egy
if __name__ == "__main__":
blokkon belülre kell tenni.
Ennél a python programnál a következőt szeretnénk ha csinálná ilyenkor a fájl:
- Olvassa be a "raeresek.txt" fájlból az adatokat
- Keresse meg ez alapján a legjobb dátumot
- A megtalált legjobb dátumot írja ki a "legjobb_datum.txt" nevű fájlba. A dátumot úgy formázza, ahogy a datetime.date osztály alapértelmezett formázása van, tehát ilyen formátumú legyen a "legjobb_datum.txt" tartalma:
2015-06-14
Segítség
- Fájl írásról is előző előadáson volt szó.
- A dátum szöveggé konvertálásához az str() beépített függvényt használhatjuk, ez mindjárt a megfelelő formátumot fogja adni.
- Természetesen a korábban megírt legjobb_fajlbol() függvény használata jelentősen segít itt.
Dokumentáció [1 pont]
A python-ban, mint már 3. előadáson tárgyaltuk, a docstringek használata a szabványos megoldás a dokumentációra. Legyen a megoldásunkban minden fontosabb dolognak legalább egy soros docstring-je, tehát:
- Magának a Raeres osztálynak
- A Raeres osztály megis() és megse() metódusának (a konstruktornak nem kell)
- A legjobb_datum() és a legjobb_fajlbol() függvényeknek.
(Ha valaki ezek közül valamelyeket nem oldotta meg, elég ha minden dokumentálva van amit megoldott.)