Edzésterv

Használható segédanyagok: Haskell könyvtárainak dokumentációja, (lokális!) Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármilyen kérdés, észrevétel felmerül, azt a felügyelőknek kell jelezni, nem a diáktársaknak!

A feladatok egymásra épülnek ezért érdemes ezeket a megadásuk sorrendjében megoldani, de legalább megérteni az aktuális feladatot megelőző feladatokat! A függvények definíciójában lehet, sőt javasolt is alkalmazni a korábban definiált függvényeket (függetlenül attól, hogy sikerült-e azokat megadni).

Tekintve, hogy a tesztesetek, bár odafigyelés mellett íródnak, nem fedik le minden esetben a függvény teljes működését, határozottan javasolt még külön próbálgatni a megoldásokat beadás előtt, vagy megkérdezni a felügyelőket!

Részpontszámokat csak az elégséges szint elérése után lehet kapni!

A feladat összefoglaló leírása

A feladatban egy sportolónak és az edzőjének szeretnénk segítséget nyújtani azzal, hogy kiértékeljük a sportoló heti teljesítményét.

A sportoló minden héten feljegyzi, hogy milyen edzéssel mennyi időt töltött.

Az adatokat egy kulcs-érték párokból álló listába írja, melyre bevezetjük a következő típusszinonimákat:

type Practice = String
type Hours = Integer
type Note = (Practice, Hours)
type TrainingCalendar = [Note]

A célunk az, hogy meg tudjuk mondani, hogy a sportolónak sikerült-e teljesíteni a heti kitűzött edzéstervet!

Összesített óraszám (1 pont)

Írjunk függvényt, amely kiszámolja egy adatsor alapján, hogy a sportoló összesen hány órát töltött edzéssel!


Test>
0 :: Hours
Test>
10 :: Hours
Test>
40 :: Hours

Két bejegyzés egyenlősége (1 pont)

Adjuk meg azt a műveletet, amely két bejegyzést egyenlőségét vizsgálja! Két bejegyzést akkor tekintünk egyenlőnek, ha az edzés megegyezik.


Test>
True :: Bool
Test>
False :: Bool

Gyakorlatok listája (1 pont)

Adjuk meg a gyakorlatok listáját, amely nem tartalmaz ismétlődéseket!


Test>
[] :: [Practice]
Test>
["Futás", "Gyaloglás"] :: [Practice]
Test>
["Futás", "Gyaloglás", "Súlyzó", "Úszás"] :: [Practice]

Bejegyzések keresése (1 pont)

Adjuk meg azt a műveletet, amely visszaadja egy adott gyakorlathoz tartozó bejegyzéseket!


Test>
[] :: [Note]
Test>
[("Súlyzó", 1), ("Súlyzó", 2), ("Súlyzó", 3)] :: [Note]
Test>
[("Hasprés", 2), ("Hasprés", 3)] :: [Note]

Összesített terv (2 pont)

A heti feljegyzésben egy-egy gyakorlat többször is szerepel. A feladatunk az, hogy összesítsük a különböző gyakorlatokkal eltöltött időt. Azaz, az eredményben már csak egyszer szerepeljen minden gyakorlat, az összesített idővel.

A későbbiekben legalább olvashatóság szempontjából különbséget szeretnénk tenni a heti és az összesített eredmény között, ezért bevezetjük az CompactCalendar típusszinonimát:

Adjuk meg azt a függvényt, amely összesíti az egyes gyakorlatokkal eltöltött időt!


Test>
[] :: CompactCalendar
Test>
[("Futás", 6), ("Gyaloglás", 6), ("Súlyzó", 6), ("Úszás", 6)] :: CompactCalendar
Test>
[("Futás", 4), ("Hasprés", 5), ("Súlyzó", 4)] :: CompactCalendar

Kiválasztás kulcs alapján (2 pont)

Írjunk magasabb rendű függvényt, amely az adatsorból kiválaszt egy óraszámot a gyakorlat alapján!

Ha a gyakorlat nem szerepel a listában, térjen vissza az alapértelmezett értékkel!


Test>
0 :: Hours
Test>
10 :: Hours
Test>
0 :: Hours
Test>
40 :: Hours

Óraszám kiválasztása nyelvhez (1 pont)

Írjunk függvényt, amely a sportoló listájából lekérdezi egy gyakorlathoz tartozó óraszámot! Ha nem szerepel az adott gyakorlat a listában, adjunk vissza 0 értéket!


Test>
0 :: Hours
Test>
20 :: Hours
Test>
0 :: Hours
Test>
25 :: Hours

Adatsorok különbsége (2 pont)

A sportolónak minden hétre egy ezdés tervet készítenek, hogy milyen gyakorlatot hány órát kell végeznie. Az edző szeretné összehasonlítani a tervezett és az elvégzett gyakorlatok listáját és ellenőrizni, hogy a tervezetben szereplő tételek mennyire teljesültek.

Írjunk függvényt, amely kiszámolja két adatsor különbségét!

Az ezekhez tartozó értékek az első és a második adatsorbeli értékek különbségei. Ha ez a gyakorlat az első adatsorban nem szerepel, akkor az abból származó értéket vegyük nullának! Csak a tervezetnek megfelelő gyakorlatokat vegyük figyelembe!

Tipp: Használjuk az hoursFor függvényt.


Test>
[] :: CompactCalendar
Test>
[] :: CompactCalendar
Test>
[("Gyaloglás", -10)] :: CompactCalendar
Test>
[("Gyaloglás", 5), ("Úszás", -30)] :: CompactCalendar

Terv sikeressége (3 pont)

Írjunk függvényt, amely kiszámolja, hogy sikerült-e a sportolónak teljesítenie tervet!

Az első paraméter a heti feljegyzéseket adja meg, a második paraméter pedig a tervezettet. A tervet akkor tekintjük sikeresnek, ha a benne megadott gyakorlatok mindegyikét legalább annyit végezte, mint amit előirányoztak.

Megjegyzés: Amennyiben az előírttól eltérő gyakorlatot is végzett, azt nem vesszük figyelembe.


Test>
True :: Bool
Test>
False :: Bool
Test>
False :: Bool
Test>
True :: Bool

Pontozás (elmélet + gyakorlat)