3. hét: adatszerkezetek építése

Czirkos Zoltán, Frey Balázs · 2019.08.07.

Gyakorlófeladatok az előadás anyagához kapcsolódóan.

1. Listák: statisztikák, indirekt adatelérés

Statisztika a számokról (részletes mintamegoldással)

1: 5 db
2: 3 db
3: 4 db
...

Írj programot, amelyik a szabványos bemenetről olvas számokat, ameddig üres sort nem kap. Számold meg benne, hogy a beírt számok közül, amelyek 1 és 10 között vannak, melyik hányszor szerepelt! Írd ki ezt a szabványos kimenetre az oldalt látható formában!

Figyelj arra, hogy ezt egy fix méretű listával meg kell tudnod oldani. Vagyis bármilyen sok számot ad is meg a felhasználó, a megépített adatszerkezeted nem nőhet azzal együtt; nem kell eltárolnod a beolvasott adatokat.

Autópálya I.

Az M7-es autópályán traffipaxot szerelnek fel, amely a Balaton felé igyekvők gyorshajtásait rögzíti. A mérés több nap adatait is tartalmazza; egy autó adatait „óra perc sebesség” formában. Pl. 12 45 198 azt jelenti, 12:45-kor 198 km/h-val száguldott valaki. Az adatsor végét üres sor zárja.

Készítsen a programod egy táblázatot arról, hogy melyik órában mennyivel ment a leggyorsabb autó! Ha egy adott órában nem volt gyorshajtás, az maradjon ki! A kimenet ilyen legyen:

14:00-14:59 -> 145 km/h
16:00-16:59 -> 167 km/h

(Tipp: a sebességek mind pozitív számok.)

Autópálya II.

Az M7 autópályán traffipax méri az autók sebességét. Minden mérésről három adatot ad: „óra perc sebesség”, szóközzel elválasztva. Pl. „9 39 125” jelentése az, hogy 9:39-kor egy autó 125 km/h-val ment. A 140 km/h feletti sebességért 30 000 Ft a bírság, a 180 km/h felettiért 100 000 Ft. Az adatsor több nap adatait tartalmazza, és a végét üres sor zárja.

Olvassa be a programod ezeket az adatokat, és írja ki, hogy a nap mely órájában mennyi az összes kirótt bírság! Példa kimenet:

12:00-12:59, 60000 Ft
13:00-13:59, 230000 Ft

Bliccelés I.

Egy busztársaság kíváncsi az utasok bliccelési szokásaira. Felviszik számítógépre az összes bírságolás időpontját. Arra kíváncsiak, a napok fél órás intervallumaiban hány jegy nélkül utazót kaptak el.

Az időpontok „óra perc” formában érkeznek, vagyis szóközzel elválasztva. Így 13 44 jelentése délután 13:44. Az adatsort üres sor zárja. Írja ki a programod, mely fél órás időszakban hány bliccelő volt! Pl.:

12:00-12:29 között 3 utas
12:30-12:59 között 5 utas

Bliccelés II.

Egy busztársaság szeretné tudni, a napok mely óráiban hány ellenőrt érdemes terepmunkára küldenie. Ehhez összesítik a bírságok adatait. Egy adat a következőkből áll: „óra perc típus összeg”, ahol a típusnál h a helyszíni bírság, c pedig a csekk. „9 45 c 6000” jelentése: egy utas 9:45-kor csekket kapott 6000 forintról. A helyszíni bírságokat az ellenőrök begyűjtik; a csekkes bírságoknak átlagosan 80%-át tudják behajtani. (Vagyis egy 6000-es csekk a társaság számára átlagosan csak 4800-at ér.) Az adatsor végén egy üres sor szerepel.

Olvassa be a programod ezeket az adatokat! Készíts kimutatást arról, hogy mely napszakban mennyi a pótdíjakból a bevétel! Példa kimenet:

16:00-16:59, 14800 Ft
17:00-17:59, 12000 Ft

ZH statisztika I.

Egy oktató statisztikát szeretne készíteni a megíratott ZH-k sikerességéről. A ZH-n 4 csoport volt (A…D). Mindegyikben három feladat, ezek pontszáma egész szám, egyenként maximum 10 pont, így a ZH-k maximum 30 pontosak lehetnek. A ZH akkor sikeres, ha a feladatok külön-külön legalább 2 pontosak, és a ZH legalább 12 pontos.

Írj programot, mely a szabványos bemenetéről olvassa be soronként egy ZH betűjelét és 3-3 pontszámát, és a szabványos kimenetre írja ki az egyes sorokra, hogy hány embernek sikerült. A beolvasott adatsor végét üres sor zárja.

Példa bemenet:

A 1 10 7
C 3 3 5
B 10 10 9

Példa kimenet:

A 0
B 1
C 0
D 0

ZH statisztika II.

Egy oktató statisztikát szeretne készíteni a megírt ZH-król. A ZH-ban három feladat van, ezek pontszáma nemnegatív egész szám, egyenként max. 10 pont, így az egész max. 30 pontos lehet.

Írj programot, mely a szabványos bemenetéről olvassa be soronként a ZH-k pontszámait. Az adatsort üres sor zárja. Írja ki ezután a szabványos kimenetre, hány 0 pontos, hány 1 pontos, … és hány 30 pontos megoldás lett. Ha adott pontszámú dolgozat nem született, a sort ne írja ki.

Példa bemenet:

8 10 7
4 3 5
10 10 9
10 9 10

Példa kimenet:

12 pontos: 1 db
25 pontos: 1 db
29 pontos: 2 db

Múzeum I.

Egy múzeumban kíváncsiak arra, a hét mely napján van a legtöbb látogató. Ehhez több hét adatait feldolgozzák.

Írj programot, mely a szabványos bemenetén fogadja a múzeum napi látogatási adatait úgy, hogy soronként a hét napjának sorszámát kapjuk 0-6 között, majd szóközzel elválasztva a látogatók számát. Az adatok rendezetlenül érkeznek, adott sorszámú naphoz több bejegyzés is tartozhat. A bemenet végét üres sor jelzi.

Írja ki a program a szabványos kimenetre annak a napnak a sorszámát, mely a legtöbb látogatót jelenti. Feltételezzük, hogy egy ilyen nap van.

Példa bemenet:

1 7
2 3
6 33
5 44
4 4
6 55

Példa kimenet:

6





Múzeum II.

Kis ZH volt

Egy múzeumban gazdasági okok miatt heti egy szünnapot szeretnének tartani, ezért keresik a hét azon napját, amikor a legkevesebb a látogató.

Írj programot, mely a szabványos bemenetén fogadja a múzeum napi látogatási adatait úgy, hogy soronként a hét napjának sorszámát kapjuk 1-7 között, majd szóközzel elválasztva a látogatók számát. Az adatok rendezetlenül érkeznek, adott sorszámú naphoz több bejegyzés is tartozhat. A bemenet végét üres sor jelzi.

Írja ki a program a szabványos kimenetre annak a napnak a sorszámát, amely a legkevesebb látogatót jelenti. Feltételezzük, hogy egy ilyen nap van.

Példa bemenet:

1 7
3 5
6 56
2 3
7 88
5 25
4 7
1 6
0 0

Példa kimenet:

2








Kasszák I.

Egy áruházban 32 kassza van, 1-től számozva. A tulajdonos nyomon szeretné követni a napi forgalom adatait az egyes kasszáknál. Így minden vásárláskor egy központi gépen megjelenik a kassza sorszáma és a fizetett összeg, szóközzel elválasztva: 11 33800 – Ez a 11-es kassza, 33800 Ft. Írj olyan programot, ami beolvassa ezeket az adatokat a szabványos bemenetéről, és összegzi kasszánként a bevételeket! (Záráskor üres sorral zárul az aznapi forgalom figyelése.) Írja ki az összegzés után, melyik kasszánál mekkora volt a bevétel, és hogy az az összbevétel hány százaléka! Ha egy kassza az adott napon nem üzemelt, akkor az ne jelenjen meg.

Kasszák II.

Egy áruházban 32 kassza van, 1-től számozva. A tulajdonos észrevette, hogy bizonyos kasszákat valamiért a vevők jobban preferálnak, és ezt szeretné megfigyelni. Minden vásárláskor egy központi gépen megjelenik a kassza sorszáma, amely egy 1...32 közötti egész szám. Záráskor üres sorral zárul az aznapi forgalom figyelése. Írj olyan programot, ami beolvassa a kasszák sorszámait, és a nap végén kiírja a szabványos kimenetre annak a kasszának a sorszámát, ahol a legtöbb vevő járt, és azt is, hogy ez az összes vevő hány százaléka!

Kódtörő I.

Bölcsész haverod, aki az angol nyelvvel foglalkozik, szeretné megvizsgálni a szavakban előforduló betűk gyakoriságát. Ezért megkér téged, hogy írj egy programot, amely a szabványos bemenetén egy angol nyelvű szöveget fogad. A szöveg eleve nagybetűsítve van: „TO BE OR NOT TO BE: THAT IS THE QUESTION.” A programod feladata egy statisztikát készíteni, amelyben az szerepel, hogy melyik betű hányszor fordult elő a szövegben, és az összes betű hány százalékát adja. A kimenete ilyen:

A: 19 db, 5.0%
B: 7 db, 1.8%

Ha valamelyik betű nem szerepelt a szövegben, az ne jelenjen meg a statisztikában se! A nem betű karaktereket figyelmen kívül kell hagyni.

Kódtörő II.

Kódtörő haverod nagyon ért a titkosítások visszafejtéséhez, a programozással viszont hadilábon áll. Szerzett egy számjegyekből álló titkos kódot:

1238971125432563125555535555665554325671231321555253555

Megfigyelte, hogy ebben nem egyforma a jegyek gyakorisága. Megkért téged, hogy írj egy programot, amely a szabványos bemenetén fogadja ezt a szöveget, és megmondja, hogy melyik az a számjegy, amely a legtöbbször szerepelt, és azt is, hogy hány % a gyakorisága! A fenti bemenetre ez az 5-ös számjegy, 40%-kal. Ha bemeneten számjegyen kívül más karakter is szerepel, azt figyelmen kívül kell hagyni.

2. Listák két dimenzióban

Ülőhelyek

Egy 195 fős előadóba előadást szerveznek. A székek 13 sorban, összesen 15 oszlopban (téglalap) helyezkednek el. A székek számozása a (színpaddal szembeni) bal alsó sarokból kezdődik, jobbra növekszik, és a legfelső sorban vannak a legnagyobb számú székek.

A jegyirodában két dimenziós listában tárolják a már kiadott foglalásokat. A foglalt helyeket a megfelelő székszámhoz írt True jelöli, False a szabad hely. Készíts programot, mely az újonnan érkező vendégek számára a kívánt számú, egymás melletti ülőhelyet kikalkulálja! Vigyázz a sorok szélére!

3. Véletlenszámok, játékok

Nincsenek egyformák

Készíts programot, amely N (maximum 100) darab véletlen számot állít elő, amelyek között nincsenek egyformák!

Fej vagy írás

Adott egy feladat: „dobjunk fel egy pénzt” a programban, és írjuk ki, hogy fej vagy írás lett. Ennek a feladatnak az alábbi megoldása helytelen:

if random.randint(0, 1) == 0:
    print("fej")
if random.randint(0, 1) == 1:
    print("írás")

A kipróbálás nélkül mondd meg: milyen hibás eredményt adhat ez a program, és milyen elvi hiba miatt? Ha megvan, próbáld ki, és végül javítsd ki a programot!

Kő, papír, olló

Kő (k), papír (p), olló (o) vagy vége (v)?

Szerinted: k
Szerintem: k.
Senki nem kap pontot.

Szerinted: p
Szerintem: k.
p>k, ezt te vitted!

Szerinted: v

Te nyertél, 1>0 ponttal.

Írj programot, amelyik „kő, papír, olló” játékot játszik! A program először kérje el a felhasználó tippjét (k, p, o betűk, mint kő, papír, olló). Ezután válasszon ő maga is egyet, és hasonlítsa a kettőt össze! A kő erősebb, mint az olló, mert kicsorbítja. A papír erősebb, mint a kő, mert becsomagolja. Az olló erősebb, mint a papír, mert elvágja. Ezek alapján a gép vagy a játékos kapjon egy pontot! Ha egyformát tippeltek, akkor semelyikük nem kap. A v beírása után írja ki a program, hogy ki nyert!

Tipp

A gépnek háromféle választása lehet. Érdemes ehhez a random.choice() függvényt használni egy listával, amiben a három választás van.

Memóriajáték

Memóriajátékot írunk. 6x6 kártya van lefordítva a játékosok előtt, 18 pár, amelyek egyformák. A kártyákon betűk vannak, A, B, C, ... Írj egy programot, amelyik generál egy véletlenszerű leosztást! Természetesen egy betűnek pontosan kétszer kell szerepelnie (egy pár)!

Tipp

Ehhez érdemes előbb a listát úgy feltölteni, hogy sorrendben szerepelnek benne a kártyák, és utána összekeverni. Úgy nem kell mindig vizsgálni, hogy minden kártya pontosan kétszer szerepel-e benne. A lista megkeveréséhez minden elemet cserélj meg egy véletlenedikkel!

Master Mind

A Master Mind játékban egyik játékos kitalál egy feladványt, amely 4 tüskéből áll. A tüskék 6-féle színűek lehetnek. Lehetséges az is, hogy két vagy több tüske ugyanolyan színű, pl. piros, piros, zöld, kék. A másik játékos ezután megtippeli, mire gondolhatott az első. Az előbbi minden körben aképpen segít kitalálni a feladványt, hogy elárulja, a tippben hány olyan tüske van, amely a megfelelő színű és a megfelelő helyen is van (ezt feketékkel jelöli); és hány olyan, amely az előbbieken kívül még jó színű, de rossz helyen van (ezt pedig fehérekkel).

Pl. feladvány: oooo, tipp: oooo, segítség: ooo (a második piros, illetve a zöld és a sárga miatt).

Írj programot, amely feladványt ad a felhasználónak, és a leírt szabályok alapján segít neki kitalálni azt! A hat színt jelöld a programban az a…f betűkkel.

Tipp

Miután a felhasználó megadta a tippjét, a program használhat olyan algoritmust, amely hatására ez a beírt tipp elfelejtődik. Először a pozíció szerint is stimmelő tüskéket érdemes keresni, és az így megtalált egyezések a listából törölhetőek, hogy a második, pozíciót figyelembe már nem vevő keresés ne találja meg azokat újra.

Karakterek beolvasásával kapcsolatban lásd a fentebbi megjegyzéseket (pl. a kő, papír, olló játéknál.)

Sorbarakó játék

    1    2    3    4    5    6
  145   12    5   77  100   44

1. felcserelendo = 3
2. felcserelendo = 1
    1    2    3    4    5    6
    5   12  145   77  100   44

Írj programot, amely a felhasználótól bekért egész számokkal feltölt egy hatelemű listát! A program ezután keverje össze véletlenszerűen a számokat, majd írja ki ezeket az oldalt látható módon.

    1    2    3    4    5    6
    5   12   44   77  100  145

Gratulalok, nyertel!

A program ezután kérjen a felhasználótól két 1 és 6 közötti sorszámot, majd a program cserélje fel az ezekhez a sorszámokhoz tartozó értékeket, és írja ki ismét a számokat. Mindaddig ismételje a sorszámok bekérését és a cserét, míg a felhasználó nem rakta növekvő sorrendbe a számokat. Ha a felhasználó nem 1 és 6 közötti értékeket ad meg, adjon hibaüzenetet!