Középiskolai Matematikai és Fizikai Lapok
Informatika rovattal
Kiadja a MATFUND Alapítvány
Már regisztráltál?
Új vendég vagy?

A 2002. áprilisi informatika feladatok megoldása

A közöltek csak megoldásvázlatok, esetleg csak végeredmények. A maximális pontszám eléréséhez általában ennél részletesebb megoldás szükséges. A részletes megoldásokat a beküldött dolgozatok alapján a KöMaL-ban folyamatosan közöljük.


I. 22. Egy asztal szélén egymásra helyeztünk N kártyalapot. A feljebb levő lapokat kifelé elcsúsztatjuk úgy, hogy a lapok ne billenjenek le az asztalról.

Készítsünk programot (I22.PAS, ...), amely a kártyák száma alapján kiszámolja, hogy a legfelső kártya jobb széle legfeljebb milyen messze lehet az asztal szélétől. A kártyalapok hossabbik oldalát tekintsük egységnyinek. (10 pont)

Megoldás:
Végezzük el a kísérletet gondolatban. Egy kártya esetén a távolság 1/2, hiszen a kártya a feléig kilóghat az asztal szélén, mivel a tömegközéppontja éppen az asztal szélére kerül, és még nem billen le. Ha alá teszünk egy újabb kártyát úgy, hogy a második kártya vége pont az asztal szélénél van, vagyis még nem lóg ki, akkor észrevehetjük, hogy ki lehet húzni az asztalról. Mégpedig addig, hogy a közös tömegközéppont éppen az asztal szélén legyen. Az előző TKP-t merőlegesen vetítjük az újabb kártyalap végére (egy egység), illetve a közepén van a saját TKP-ja. Így a közös TKP a negyedénél lesz (két egység), azért mert ez a TKP-k tömeggel súlyozott arányban osztja az összekötő szakaszt. A harmadik kártyalap berakásánál a (hármas) közös TKP a kártyalap felét 1:2-höz arányban osztja. És így tovább. Tehát a maximális kilógás távolságára a képlet:

Amit ki kell számolni n-től függően. Íme az egyszerű kis algoritmus:
változók
  n,i:Egész;
  d:Valós;

  be: n;
  d:=0;
  Ciklus i:=1-től n-ig
    d:=d+1/i;
  ciklus vége
  d:=(d)/2;
  Ki: d;
A megoldás Delphiben: Letöltés


I. 23. Egy fa úgy növekszik, hogy az első időegységben egy H hosszúságú törzse nő. A következő időegységben a törzs végéből két X-szer akkora hosszúságú ágat növeszt, szimmetrikusan, egymással ALFA fokos szöget bezárva. A következő időegységben ezek végéből újra X-szer akkora ág nő, és így tovább.

Készítsünk programot (I23.PAS, ...), amely beolvassa H, X, Alfa értékét, valamint az időegységek számát, majd kirajzolja azt a fát, ami az adott időtartam alatt nőtt!

Az alábbi ábrákon X=3/4, ALFA=60.

FA(50,3)FA(50,6)FA(75,11)
FA(75,13)

Megoldás:

Rekurzív megoldást adunk a feladatra. Az adatok bekérése után meghívjuk a rekurzív eljárást a következő paraméterekkel: xpos, ypos a grafikus kurzor kezdő pozíciója (kezdetben 320,480), irany amerre kell rajzolni (függőlegesen felfelé, pozitív irányban elforgatva 90°-kal), H a törzs hossza, X a csökkenés aránya, alfa a következő mélységű ágak bezárt szöge, N a mélységszám.
Eljárás sz23;
  Be: H,X,alfa,N;
  AgRajzolas(320,480,Pi/2,H,X,alfa,N);
Eljárás vége;
Az AgRajzolas eljárás pedig a következő:
Eljárás AgRajzolas(xpos,ypos,irany,H,X,alfa:Valós;N:Egész);
A rekurzív eljárás leállását az N (mélység) csökkentésével biztosítjuk.
  Ha N>0
    akkor
Megrajzoljuk az ágat, vagyis a szakaszt, amely adatai közül a kezdőpont koordinátáit megkapjuk paraméterként, míg a végpont koordinátáit ki tudjuk számolni a hosszból és a bezárt szögből.
      PozícióhozUgrás(xpos,ypos);
      xpos:=xpos+H*cos(irany);
      ypos:=ypos-H*sin(irany);
      SzakaszrajzolásPozícióig(xpos,ypos);
Rekurzívan rajzoljuk meg a két gyermek ágat, melyek bezárt szöge Pi*alfa/180. Vagyis most ugyanezt az eljárást hívjuk meg mégegyszer, de a mostani x illetve y kezdőkoordinátákkal, és az új irányokkal.
Vagyis az egyiknél az irány az eredeti irány mínusz a bezárt szög fele.
      irany:=irany-Pi*alfa/360;
      AgRajzolas(xpos,ypos,irany,X*H,X,alfa,N-1);
Míg a másiknál az irány az eredeti irány plusz a bezárt szög fele, de mivel egy felet már kivontunk, így az egész szöget hozzáadva kapjuk meg a helyes irányt.
      irany:=irany+Pi*alfa/180;
      AgRajzolas(xpos,ypos,irany,X*H,X,alfa,N-1);
    Elágazás vége;
Eljárás vége;
A megoldás Delphiben: Letöltés


I. 24. A Kukutyin-Piripócs vasútvonalon a két végállomást is beleértve 9 állomás található. Ismerjük a szomszédos állomások közötti menetidőket. Két vonat indul egymással szembe a két végállomásról. A vonatok minden állomáson 1 percet várnak a le- és felszállás miatt. Mivel az állomások között csak egyetlen vágány pár van, akkor is várniuk kell, ha éppen szembe jön vonat. (Ha egyszerre indulnának, akkor a Kukutyinból indulónak van elsőbbsége.)

Készítsünk táblázatot (I24.XLS), amely a menetidők és az elindulási idők (Vastagon keretezett számok változtatása nyomán kiírja az egyes állomásokon az érkezési és az indulási időket! A megoldásban minden időpontot percben kell megadni. (10 pont)

Állomás:
1
2
3
4
5
6
7
8
9
Idő:
10
 
10
 
5
 
10
 
10
 
5
 
10
 
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
i
é
i
é
i
é
i
é
i
é
i
é
i
é
i
é
Kukutyinból:
23
33
34
44
45
50
51
61
62
72
73
78
79
89
90
98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
é
i
é
i
é
i
é
i
é
i
é
i
é
i
é
i
Piripócsról:
99
89
88
78
77
72
71
61
51
41
40
35
34
24
23
15

Megoldás:

B5=23
Q8=15
A kezdő állomásokról való indulás ideje.
J8=K8+J$2
Az érkezés mindig az előző állomásról való indulásnál annyival több, mint amennyi időt vesz el az adott szakasz megtétele.
I8=HA(VAGY(J8+1>I5;J8<G5);J8+1;I5)
Az indulás mindig egy perccel több, mint az odaérkezés, vagy megegyezik a szemből érkező szerelvény befutási idejével, attól függően, hogy az adott szakaszon közlekedhet-e szabadon a vonat. Ezt a feltételt részletezve vagy akkor mehet tovább, ha már várt egy percet, az ellenvonat meg már beért, vagyis J8+1>I5, vagy akkor, ha az itteni indulás hamarabb megtörténik, mintha a következő állomásról indulna szembe a másik vonat, vagyis J8+1<G5+1. Persze a második esetben egyszerűsíthetünk 1-vel. Így egyszerűbb, illetve nem kell külön lekezelni a C8-as cellát, hiszen B5 adott és nem számolt érték. A5 viszont nullaként viselkedik és így meg fog felelni a feltételnek.
J5=HA(VAGY(I5<=L8;I5+1<>J8);I5+1;J8)
Értelemszerűen, a másik vonat indulási ideje hasonlóképpen függ a beérkezési időtől, vagyis a beérkezési idő plusz egy az indulási idő, akkor, ha ez nagyobb (később van), mint a másik beérkezési ideje; vagy ha ez nem nagyobb (korábban van), mint a másik vonat indulása a következő állomásról.
A megoldás Excelben: Letöltés