You are on page 1of 3

Országh Benjámin 2. beadandó/25.feladat 2021. április 3.

E8OVK2
e8ovk2@inf.elte.hu
.csoport
Feladat

Egy általános iskola alsó tagozatán papírgyűjtő versenyt rendeztek. A verseny 2018.
szeptember 1-től, december 31-ig tartott. Feljegyezték a verseny adatait, és egy szöveges
állományban tárolták el. A fájl egy sorának felépítése: elsőként a tanuló neve szerepel (két
vagy több szóközök nélküli sztring), majd az osztálynak az azonosítója (1-4 számjeggyel
kezdődő, szóközt nem tartalmazó sztring, például 1a, 2b, 4c), majd a papírgyűjtés adatai:
dátum-súly (a dátum EEEE/HH/NN alakú sztring, a súly egy pozitív valós szám: a gyűjtött
papír súlya kilogrammban megadva) formájában. A sor dátum szerint rendezett. Az adatok
szóközökkel vagy tabulátorjelekkel vannak egy soron belül elválasztva. A szöveges állomány
sorait osztály-azonosító szerint rendezték. Feltehetjük, hogy a szöveges állomány helyesen
van kitöltve. Példa az állomány egy sorára: Nagyon Szorgalmas Eszter 4c 2018/09/10 4.5
2018/09/22 3.5 2018/11/05 1.2

(1) Listázzuk ki azokat a tanulókat (nevüket és osztályukat), akik legalább egyszer, több mint
5 kg papírt hoztak!

(2) Hány olyan osztály van, melynek minden tanulója (aki a versenyben részt vett) legalább
egyszer, több mint 5 kg papírt hozott?

(1) Részfeladat megoldása:

Főprogram terve:

A = ( f : infile(Sor), l : 𝕃, elem: Diak )


Sor = rec (nev : String, osztaly : String, papir : hozott*)
hozott = rec (datum : String, suly : R+)
Diak = rec (nev : String, osztaly : String, suly : R+, eleg : bool)

Új állapottér:

A = ( d : enor(Diak), l : 𝕃, elem : Diak )


Ef =( d = d’) Uf =( 𝑙, 𝑒𝑙𝑒𝑚 =
𝑺𝑬𝑨𝑹𝑪𝑯′ (d. suly > 5))
𝑒∈𝑡
Diákok felsorolója1

enor(Diak) first(), next(), current(), end()

f : infile(Sor) first() ~ next()


cur : Diak next() ~ ld. külön
end : 𝕃 current() ~ return cur
end() ~ return end
Státusz = { norm, abnorm }

Az enor(Diak) first() és next() műveletei megegyeznek, és az alábbi feladatot kell


megoldaniuk: olvassuk be a szöveges állomány (az f szekvenciális inputfájl) soron következő
sorát. Ha ilyen nincs, akkor az end változó értéke legyen igaz. Ha van, akkor kiszedhetjük
belőle a diák nevét és osztályát, majd a hozott papír mennyiségek között megvizsgáljuk, hogy
a suly adattag legalább egyszer több-e mint 5.

Anext = ( f: infile(Sor), cur : Diak, end : 𝕃 )


Efnext = ( f = f’ )
Ufnext = ( sf, df, f = read(f’) ∧ end = (sf=abnorm)
∧¬end → cur.nev = df.nev ∧ cur.eleg = (cur.suly>5))

(2) Részfeladat megoldása

Főprogram terve

A = ( f : infile(Sor), l : 𝕃)
Sor = rec (nev : String, osztaly : String, papir : hozott*)
hozott = rec (datum : String, suly : R+)

Új állapottér:

A = ( t : enor(Osztaly), l : 𝕃)
Osztaly = rec (nev : String, hozo : 𝕃)
Ef =( t = t’)
Uf =( 𝑙, 𝑒𝑙𝑒𝑚 = 𝑺𝑬𝑨𝑹𝑪𝑯′(𝑒. hozo) ∧ 𝑙 → osztaly = 𝑒𝑙𝑒𝑚. osztaly)
𝑒∈𝑡
2
Osztályok felsorolója

1
enor(Osztaly) first(), next(), current(), end()

tt : enor(Diak) first() ~ tt.first(); next()


cur : Osztaly next() ~ ld. külön
end : 𝕃 current() ~ return cur end()
~ return end
Diak = rec (nev : String, osztaly : String, suly : R+, eleg : bool)
Státusz = { norm, abnorm }

Az enor(Osztaly) next() műveletnek az alábbi feladatot kell megoldania:

Állítsuk elő a soron következő Osztályt, akiről el kell dönteni, hogy vajon minden tanulója
hozott-e legalább 5 kg papírt legalább egyszer. Ehhez fel tudjuk használni az első részfeladat
megoldásához készített diák felsorolót (enor(Diak)), mely az input fájl egy sorát értelmezi, és
megadja, hogy az adott diák hozott-e több mint 5 kg papírt. A next() művelet végrehajtásakor
a Diak felsoroló (ha még nem ért a felsorolás végére) már tartalmazza azt az osztályt, és
annak első diákját, amelyet a next() feldolgoz majd, így, a tt.current() értékét már ismerjük,
ehhez nem kell sem a tt.first(), sem a tt.next(). A felsorolás csak addig tart, amíg ugyanazon
osztály diákjait „olvassuk” a tt.next() művelettel.

Anext = ( tt : enor(Diak) , cur : Osztaly, end : 𝕃 )


Efnext = ( tt = tt’ )
Ufnext = ( 𝑒𝑛𝑑 = 𝑡𝑡 ′ .𝑒𝑛𝑑() ∧ ¬𝑒𝑛𝑑 → (𝑐𝑢𝑟. osztaly = 𝑡𝑡 ′ . 𝑐𝑢𝑟𝑟𝑒𝑛𝑡(). osztaly ∧
𝑒.osztaly = cur.osztaly

(𝑐𝑢𝑟. hozo, 𝑡𝑡) (e.suly>5)


𝑒Є(tt’.𝑐𝑢𝑟𝑟𝑒𝑛𝑡(),tt’)

Tesztelési terv

 File megnyitás tesztelése:


1. üres file
2. nem létező
3. működő (elég papír)
 Papírmennyiség tesztelése:
1. kevés majd elég papír
2. kevés papír

 Osztályok sikeressége
1. sikertelen osztály
2. sikeres osztály

You might also like