A MIDI (Musical Instrument Digital Interface) számítógépek és szintetizátorok között adatcserére kidolgozott szabvány. A szabvány részben parancsokat tartalmaz a szintetizátor számára egy hang megszólaltatásának elkezdésére vagy befejezésére.
Ez a program például 3 hangot szólaltat meg egyszerre:
0 ON 60
0 ON 70 0 ON 80 10 OFF 60 10 OFF 80 10 OFF 70 10 ON 62 12 OFF 62 |
10 időegységig fog szólni a 60-as, a 70-es és a 80-as hang, majd két időegységig a 62-es. A program egy sora tehát a következő információkat tartalmazza: először azt az időpillanatot, amikor a parancsot végre kell hajtani, aztán magát a parancsot (ON esetén bekapcsoltni, OFF esetén kikapcsolni kel a hangot), majd annak a hangnak a sorszámát, amire a parancs vonatkozik |
A MIDI programba ötféle probléma fordulhat elő:
a) Tekintsük az alábbi példát:
0 ON 60
10 ON 60 12 OFF 60 20 OFF 60 |
Ha meghallgatjuk ezt a programot, akkor nem fogunk két különálló hangot hallani, csak egyet, mégpedig 12 időegységig. Ezen úgy segíthatünk, hogy OFF parancsot illesztünk a programba 1 időegységgel a második ON parancs elé, az eredeti OFF parancsok közül pedig csak a másodikat hagyjuk meg. Így egy rövid szünetet hallunk a két hang között. |
b) Egy másik probléma adódik akkor, ha ugyanazon időponthoz tartozó ON és OFF parancs is van a programban:
0 ON 60
10 ON 60 10 OFF 60 20 OFF 60 |
0 ON 60
10 OFF 60 10 ON 60 20 OFF 60 |
A bal oldali példában 10 időegységig lesz hallható a hang, a jobb oldaliban 20 időegységig, folyamatosan. (Ebben a példában a problémát okozó utasítások egymás mellett találhatók, de nem kizárt az sem, hogy legyen közöttük ugyanehhez az időponthoz tartozó más utasítás.) |
A megoldás mindkét esetben ugyanaz: a problémát okozó OFF parancsot 1 időegységgel a a megfelelő ON parancs elé kell áthelyezni. Ez is egy rövid szünetet eredményez a hang második megszólaltatása előtt.c) Ha a program véget ér, és valamelyik hang még szól, akkor azt az utolsó időpont után 1 időegységgel ki kell kapcsolni.
d) Ha OFF parancsot nem előz meg neki megfelelő ON parancs, akkor az OFF-ot el kell hagyni.
e) Ha ugyanahhoz az időponthoz több ON parancs is tartozik, akkor közülük csak egyet kell megtartani.
Feladat:Írj programot, ami tetszőleges számú MIDI programot beolvas a MIDI.BE nevű állományból, és a fenti változtatások elvégzése után kiírja MIDI.KI állományba. Az egyes MIDI programokat olyan sorok választják el egymástól, amik csak a sor elején álló -1 számot tartalmazzák. Az utolsó program után -2 áll. A kimenet formátuma a bemenetével egyező.
Bemenet:Az időpont 0 és 65535 közötti egész szám lehet, a parancsokat (ON, OFF) mindig nagybetűvel írjuk, a hangok sorszámai 1 és 127 közötti egész számok. Egy soron belül az időpontot és a parancsot, valamint a parancsot és a hang sorszámát pontosan egy szóköz választja el.Kimenet:
A sorok az időpont szerint nem csökkenő rendben vannak, de az egy adott időponthoz tartozó parancsok sorrendje tetszőleges.A megoldás során feltehetjük, hogy kezdetben semmilyen hang nem szól, egy hiba kijavítása nem okoz újabb hibát, valamint, hogy nincs hiba a nulladik időpontban.
Példa:
Bemenet | Kimenet |
0 ON 60
10 ON 60 12 OFF 60 20 OFF 60 -1 0 ON 60 5 ON 70 10 ON 60 10 OFF 60 15 OFF 70 15 ON 70 15 OFF 80 15 ON 70 20 OFF 60 -2 |
0 ON 60
9 OFF 60 10 ON 60 20 OFF 60 -1 0 ON 60 5 ON 70 9 OFF 60 10 ON 60 14 OFF 70 15 ON 70 20 OFF 60 21 OFF 70 -2 |
2. feladat: 80 nap alatt a Föld körül (50 pont)
Bizonyára ismered Verne Gyula regényét, melyben Phileas Fogg, az angol lord fogadásból 80 nap alatt körülutazta a Földet. Ebben a feladatban az ő útját kell végigkövetned és segítened kell őt a fogadás megnyerésében.Az egyes részfeladatok legyenek önállóan végrehajthatók egy menüből vezérelve.
1. rész: Szimuláció (25 pont)
A VAROSx.BE állomány a XIX. századi világtérkép néhány (<=10) nagyobb városát tartalmazza (nem feltétlenül azokat, amelyek az eredeti történetben szerepelnek, x egy 0 és 9 közötti számjegy, ez azonosítja az egy teszthez tartozó állományokat). Az állomány minden sora egy városra vonatkozó adatokat tartalmaz, egy-egy szóközzel elválasztva:
városnév hosszúsági_fok szélességi_fok A hosszúsági, illetve szélességi fokokat az égtáj (K, É, Ny, D), valamint a fok (0 és +180 közötti egész szám) azonosítja.
Példa:London K0 É51
A JARATx.BE nevű állományban megtalálhatók a városok között igénybe vehető közlekedési járatok. Minden sora egy járat adatait tartalmazza egy-egy szóközzel elválasztva:
indulás cél eszköz első_járat menetidő várakozás díj
Példa:
New-York London hajó 3 5 1 5000
Az első járat indulása, a várakozás és a menetidő (egész) napban értendő az egyszerűség kedvéért az utazó Phileas Fogg saját idejében mérve (a 0 időpont a Londonból történő elindulás). A járatok oda-vissza közlekednek, a végpontokon valamennyit várakozva. A fenti példában ez azt jelenti, hogy New-Yorkból Londonba a 3., 15., 27., ... napokon indul hajó, visszafelé pedig a 9., 21., 33., ... napokon. A járatok díja egységesen angol fontban van megadva. A járat mindig a két város közötti legrövidebb úton halad.
Phileas Fogg tervezett útját az UTITERVx.BE állomány tartalmazza:
cél eszköz Példa:
Alexandria hajó
Szuez tevekaraván
Feladatod lépésenként végigkövetni Phileas Fogg útját, az eredményeket az UTx.KI állományba írva. Minden lépésben ki kell írnod az alábbi adatokat egy sorba:
cél eszköz érkezés készpénz Példa:
London hajó 81 100
Az érkezési időpontot Phileas Fogg saját idejében mérve kell számítani. A készpénz Phileas Fogg, mint tudjuk 80000 font készpénzzel indul Londonból.
A szimuláció az alábbi üzenetekkel (állapotokban) érhet véget:
A körbeutazásnál ne feledkezz meg arról, hogy az abszolút (Londoni)
idő Phileas Fogg saját idejéhez képest keleti irányú körbejárásnál 1 nappal
kevesebbet, nyugati felé viszont 1 nappal többet jelez.
2. rész: Optimális
útiterv (25 pont)
Készítsd el a VAROSx.BE ás a JARATx.BE adatainak ismeretében az optimális útitervet és írd ki az OPTTERVx.KI állományba. Ennek formátuma egyezzen meg az UTITERVx.BE formátumával.
Ha Phileas Fogg nem tud időben (80 nap alatt) célba érni, illetve útközben elfogy a pénze, akkor az állomány első sorába ki kell írni, hogy 'VESZTETT'.Ha van 80 nap alatt célba vivő út, akkor közülük ki kell választani az optimálisat. Az optimális útiterv az alábbi követelményeknek kell, hogy eleget tegyen:
Ha több útiterv is kínálkozik, melyben 80 napnál hamarabb célba érhet, akkor ezek közül azt kell választani, amelyik a legolcsóbb (Phileas Fogg-nak a legtöbb készpénze marad). Ha a készpénz megegyezik, akkor a leggyorsabb útitervet kell választani.