Informatika2-2015/NagyHF

A MathWikiből
(Változatok közti eltérés)
("Nagy" Házi feladat)
1. sor: 1. sor:
 
= "Nagy" Házi feladat =
 
= "Nagy" Házi feladat =
 
Ki lesz adva Márc. 29-ig, itt lesz található a részletes leírás.
 
  
 
'''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 [mailto:csirkeee@gmail.com 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.
+
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.
  
Jövő 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.
+
(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., 03: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:

  1. 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.
  2. Ha a legtöbb embernek jó dátumok között van hétvégi, akkor mindenképpen hétvégit választunk.
  3. 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.)

Személyes eszközök