Logo‎ > ‎Feladatok‎ > ‎Funkcionális programozás‎ > ‎

Összetett feladatok

BUMM!

Kisebb gyerekek szokták játszani a Bumm! nevű társasjátékot. A játékosok 1-től kezdve egy határszámig egyesével mondják a következő számot, de az úgynevezett tiltott szám és többszörösei helyett azt kell mondani, hogy „Bumm!”. Szintén Bumm!-ot kell mondani akkor, ha a szám tartalmazza a tiltott számot számjegyként. Aki eltéveszti, zálogot ad.

Készítsünk a játék szabályainak megfelelő sorozatot!

Példa: játék 15 3
Eredmény: [1 2 Bumm! 4 5 Bumm! 7 8 Bumm! 10 11 Bumm! Bumm! 14 Bumm!]

TESSÉK BETŰZNI!

A telefonban egy nehezen érthető szót betűzni szoktunk. Sokszor még így is összekeverjük a betűket. Ilyenkor a szó minden betűje helyett egy olyan szót vagy nevet mondunk, amely a megfelelő betűvel kezdődik. A nevek listában rendelkezésünkre áll az ábécé minden betűjéhez egy szó, többnyire keresztnév. Azokat az összetett betűket, amelyek nem fordulnak elő a listában, külön betűzzük.

Készítsük el egy karakteres kifejezés betűzését, azaz az ezeknek megfelelő kezdőbetűjű szavak listáját!
nevek:
[Anna Ádám Bálint Cecil Dénes Ervin Éva Ferenc Gábor Hugó Ilona Ír János Kálmán László Mária Nóra Ottó Óra Ödön Őr Pál Kú Rózsi Sándor Tibor Ubul Úr Üzbég Űr Vilma Xénia Ypszilon Zoltán]

Példa: tessék "Jeromos 
Eredmény: [János Ervin Rózsi Ottó Mária Ottó Sándor]

RÓMAI SZÁM ÁTVÁLTÁSA TÍZES SZÁMRENDSZERBE

A következő feladatokban csak a nagybetűs, 1-től 4000-ig terjedő római számokkal foglalkozunk. A római számjegyek értékei:

 Római számjegyek jelei  Érték
 I  1
 V  5 
 X  10
 L  50
 C  100
 D  500
 M  1000

Alakítsuk át a római számokat tízes számrendszerbe! (A számok helyességének vizsgálata nem feladat.)

Példa: római_tízes "MCCXCIV 
Eredmény: 1294
római_tízes "MMIX 
Eredmény: 2009

Megoldás algoritmusa:


SZEMÉLYI SZÁM

A közigazgatási rendszerben használt személyi azonosító (személyi szám) több információt tárol. Az azonosító szám felépítése a születés időpontjától függ. Használatát és képzési szabályát törvény írja elő, amely 1997. január 1-jével és 2000. január 1-jével változott:

„1. A személyi azonosító tizenegy jegyű szám.

2. A személyi azonosítót az alábbiak szerint kell képezni:
a) az 1. számjegy az állampolgár születésének évszázadát és nemét jelöli a következők szerint:
1997. január 1. és 1999. december 31. között született férfi 1; nő 2 és 1999. december 31. után férfi 3; nő 4.
b) a 2-7. számjegyek a polgár születési évének utolsó két számjegyét, a születés hónapját és napját tartalmazzák;
c) a 8-10. számjegyek az azonos napon születettek születési sorszáma;
d) a 11. számjegy az 1-10. számjegyek felhasználásával, matematikai módszerekkel képzett ellenőrzőszám.

3. A személyi azonosító 11. számjegyét úgy kell képezni, hogy a 2. a)-c) pontok szerint képzett számjegy mindegyikét meg
kell szorozni egy számmal, mégpedig a 10. helyen állót eggyel, a 9. helyen állót kettővel és így tovább. A szorzatokat össze kell adni, és az összeget tizeneggyel elosztani. A 2. c) pont szerinti születési sorszám nem osztható ki, ha a tizeneggyel való osztás maradéka egyenlő tízzel.”

Készítsünk függvényeket egy tetszőlegesen begépelt személyi szám információtartalmának megjelenítésére!

Példa: személyiszám 40504291247 
Eredmény: Ellenőrzés: igaz Neme: nő Születés_év: 2005 Hó: 04 Nap: 29 Sorszám: 124

SPORTLÖVÉSZET

A sportlövő edzéseken a hagyományos lőfegyvereken kívül elektronikus változatokat is használnak. A lőállásokból ekkor monitorokon szimulált lőlapokra történik a „tüzelés”. Elektronikus rendszer tárolja a lövések koordinátáit és értékeli ki az eredményeket.

A céltábla a koordináta-rendszerében rögzítésre kerülnek a versenyző lövéseinek (x,y) vízszintes és függőleges koordinátái. A kiértékeléshez a találatok körértékét számolják ki. Ennek szabályai a következők:
  • A lövés a maximális 10 kört éri, ha a céltábla közepébe talált. Az érték annyival csökken, ahány egységgel messzebb van a középponttól: É=10-négyzetgyök(x2+y2)
  • Ha a találat a középponttól 10-nél nagyobb távolságra van, akkor a körérték 0.
  • A körértéket végül két tizedesre kerekítik.
A versenyző egyes találatainak koordinátái a következő listában olvashatók.
Például:
[[-5,28 -1,42] [6,17 18,67] [1,50 3,07] [-0,36 -0,78] [-6,65 -8,04] [-3,00 -8,41] [6,07 0,22]]

A példa jelentése:
  • Az első találat körértéke tehát 10-négyzetgyök((-5,28)2+(-1,42)2)=4,53.
  • A második találat körértéke 0.
Készítsük el az alábbi problémák megoldását:
  1. Állítsuk elő találatok körértékének sorozatát!
    (körérték :l)

  2. Listázza ki a legnagyobb találat sorszámát és körértékét!
    (lőmax :l)

  3. A célra tartás egyenletességének jellemzéséhez adja meg, hogy a lősorozatban hány 0 körértékű találat volt!
    (szétszórt :l)

  4. A lövész teljesítményét jellemzi, ha valamelyik irányban több találata van, mint a többiben. Adjuk meg, hogy a nem 0 körértékű találatok közül hány volt az egyes síknegyedekben! Írjuk a képernyőre az eredményeket a következőhöz hasonló formában: "1. síknegyedben: 13 találat, 2. síknegyedben: 18 találat, ..."! (síknegyed :l)
    (x≥0 és y≥0→síknegyed=1) és (x≥0 és y<0→síknegyed=4) és(x<0 és y≥0→síknegyed=2) és (x<0 és y<0→síknegyed=3)

  5. Döntsük el, hogy volt-e olyan négy egymás utáni lövés, hogy a találatok az 1., a 2., a 3. és a 4. síknegyedbe csapódtak egymás után!
    (szórt :l)

RÉTES

Kiránduláson a hosszú túra után mindenki legfeljebb három rétest kérhet vacsorára a turistaházban. A neveket és választott rétesfajtákat listában tároljuk.

Példa: 
[[András [mákos meggyes almás]] [Joli [túrós]] [Anna [almás almás]] [Tamás []] [Mari [almás meggyes]] [Vera []]]

Minta bemenet:
eljárás osztály
 eredmény [
  [András [mákos meggyes almás]]
  [Joli [túrós]]
  [Anna [almás almás]]
  [Tamás []]
  [Mari [almás meggyes]]
  [Vera []]
 ]
vége

Ki nem kért egyetlen rétest sem?
Példa: nemeszik osztály 
Eredmény: [Tamás Vera]

Adjuk meg, hogy ki hány rétest kért!
Példa: kérés osztály 
Eredmény: [[András 3] [Joli 1] [Anna 2] [Tamás 0] [Mari 2] [Vera 0]]

Milyen fajta rétest kérnek a gyerekek? Minden fajta egyszer szerepeljen a listában!
Példa: rétesfajták osztály 
Eredmény: [mákos túrós almás meggyes]

Hány darabot kell rendelni az egyes rétesfajtákból?
Példa: rétesszámok osztály 
Eredmény: [[mákos 1] [túrós 1] [almás 4] [meggyes 2]]

Határozzuk meg, hogy egyes rétesfajtákat kik kérték!
Példa: fajtakérők osztály 
Eredmény: [[mákos [András]] [túrós [Joli]] [almás [András Anna Mari]] [meggyes [András Mari]]]

ÁLLATTENYÉSZTŐK

(Nemes Tihamér OKSzTV'96 elsőfordulós feladata alapján)
Két állattenyésztõ nyilvántartást vezet állatairól. Ez a nyilvántartás kétszeres mélységű sorozat, amely ábécé szerint rendezve tartalmazza az állatfajták nevét és darabszámát.

Példa: agazda: [[kacsa 5][liba 13][nyúl 66][tyúk 4]] bgazda: [[kacsa 1][kecske 33][nyúl 99]]

Határozzuk meg a két gazda állatainak számát!
Példa: állatszám agazda bgazda 
Eredmény: 221

Készítsünk függvényt, amellyel meghatározzuk, hogy az állatfajtákból hány példányuk van együttesen!
Példa: közös agazda bgazda 
Eredmény: [kacsa 6] [kecske 33] [liba 13] [nyúl 165] [tyúk 4]

Készítsünk olyan függvényt, amely megadja, hogy a két gazdának összesen hány fajta állata van!
Példa: fajtaszám agazda bgazda 
Eredmény: 5

Készítsünk olyan függvényt, amely megadja, hogy melyik állatfajtából mennyit tudnak eladni akkor, ha egy-egy állatfajtából mindkettőjüknek ugyanannyit kell értékesíteniük!
Példa: eladhatók agazda bgazda 
Eredmény: [kacsa 1] [nyúl 66]

Készítsünk olyan függvényt, amely megadja, hogy hány olyan állatfajta van, amely csak egyik gazdának van! 
Példa: különbözők agazda bgazda 
Eredmény: 3

SZÜLŐ-GYEREK KAPCSOLAT


Adott szülő-gyerek kapcsolatpárok sorozata. 
Például, ha az 1. ember szülője a 2.-nak, a 2. pedig a 3.-nak, akkor a sorozat: [[1 2][2 3]]
Feltesszük, hogy mindenkinek maximum 2 szülője lehet.

Határozzuk meg a bemenő listából az összes szülőt! Minden szülő csak egyszer szerepeljen az eredményben.
Példa: szülők kapcsolat 
Eredmény: [1 2 6 7 8 10 13 14 16 18]

Készítsünk függvényt, amely megadja minden szülő gyerekeit!
Példa: gyerekeik kapcsolat 
Eredmény: [[1 [2 3 4]] [2 [5]] [6 [2]] [7 [3 4]] [8 [9]] [10 [11 12]] [13 [11 12]] [14 [15]] [16 [15 17]] [18 [17]]]

Adjuk meg minden szülőhöz a gyerekeik számát!
Példa: gyerekszámok kapcsolat 
Eredmény: [[1 3] [2 1] [6 1] [7 2] [8 1] [10 2] [13 2] [14 1] [16 2] [18 1]]

Adjuk meg minden szülő esetében, hogy a gyerekeiknek kik a másik szülei!
Példa: társak kapcsolat 
Eredmény: [[1 [6 7 7]] [2 []] [6 [1]] [7 [1 1]] [8 []] [10 [13 13]] [13 [10 10]] [14 [16]] [16 [14 18]] [18 [16]]]

DOMINÓ


Minden dominó két nem negatív egész számból, illetve annak megfelelő számú pöttyből áll.
A dominókészlet méretét az adja, hogy mennyi a maximális szám, ami egy dominón van. Egy N nagyságú készletben minden szám 0 és N közötti. Két dominó megegyezik, ha rajtuk a számok megegyeznek, az olvasási sorrendtől függetlenül. Egy dominókészlet nem tartalmaz azonos dominókat.
Egy 2-es méretű dominó készlet a következő dominókat tartalmazza: [0 0] [0 1] [0 2] [1 1] [1 2] [2 2]

Állítsunk elő N méretű dominókészletet!
Példa: dominó 3 
Eredmény: [[0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]]

Készítsünk függvényt, amely egy N nagyságú dominókészlet összes pöttyeinek számát adja meg!
Példa:
pöttyszám 2 
Eredmény: 12
pöttyszám 3 
Eredmény: 30

Állítsunk elő véletlenszerűen adott számú dominót, N nagyságú készletből (húzás :n :db)! A dominók ismétlődése nem megengedett. A paraméterek helyességét nem kell ellenőrizni!
Példa: húzás 3 5 
Eredmény: [[0 2] [2 2] [0 0] [1 1] [1 2]]

Próbáljunk meg kirakni szabályosan egy adott dominósorozatot!
Szabályok:
- csak a sorozat első dominóját tehetjük az eddigi részmegoldáshoz,
- az „érintkező” számoknak azonosnak kell lenni,
- az első dominót megfordíthatjuk, azaz a számait felcserélhetjük (így is írjuk ki), - a részmegoldás-sorozat mind a két végéhez tehetjük a dominót,
- ha a részmegoldás egyik végéhez sem tudjuk tenni a soron következő dominót, akkor írjuk ki, hogy „Részben rakható ki”!

Példa:
játék [[3 3] [0 3] [1 3] [0 1] [1 1]] 
Eredmény: [[1 1] [1 0] [0 3] [3 3] [3 1]]
játék [[0 2] [2 2] [0 0] [1 1] [1 2]] 
Eredmény: [Részben rakható ki: [0 0] [0 2] [2 2]]

RENDEZÉS BINÁRIS FÁVAL


A bináris fa olyan, hogy a gyökérből kiágazó baloldali részfa csupa olyan elemet tartalmaz, amely kisebb, vagy egyenlő az aktuális gyökérnél. A jobboldali részfa pedig csupa olyan elemet tartalmaz, amely nagyobb az aktuális gyökérben lévő elemnél. A bináris fa BKJ-bejárása a számok rendezett sorrendjét adja.
Építsük fel a bináris fát az adott elemekből és adjuk meg a rendezett sorrendet!

Példa: rendezés [2 4 7 1 5 3 6 8] 
Eredmény: [1 2 3 4 5 6 7 8]

A rendezőfa felépítése


A lista szerkezete elemenkénti beillesztéssel

1. [2]
2. [2 [4]]
3. [2 [4 [7]]]
4. [[1] 2 [4 [7]]]
5. [[1] 2 [4 [[5] 7]]]
6. [[1] 2 [[3] 4 [[5] 7]]]
7. [[1] 2 [[3] 4 [[5 [6]] 7]]]
8. [[1] 2 [[3] 4 [[5 [6]] 7 [8]]]]