A 2003. januári 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. 40. Az ábrán egy 5x5-ös táblázat minden sora, minden oszlopa és a két főátlója egy-egy ötjegyű prímszámnak olvasható. A sorokat balról jobbra, az oszlopokat fölülről lefelé, a két főátlót pedig balról jobbra kell kiolvasni.
|
Írjunk programot (I40.pas, ...), amely beolvassa a prímszámok számjegyeinek összegét, valamint a bal felső sarokba írandó számjegyet, s ezek alapján egy ilyen táblázatot készít.
Példa: Számjegyek összege=11, bal felső sarok számjegye=1.
(10 pont)
Megoldás:
Típus PrímTömb = Tömb(0..49999:Egész); Konstans Divisor : Tömb(0..4:Egész)=(10000,1000,100,10,1); Bits : Tömb(0..9:Egész)=(1,2,4,8,16,32,64,128,256,512); Változó Prime : PrímTömb; NextNumber : Tömb(0..9999:Egész); Sum,nPrimes : Egész; FirstNumber,i,j,k : Egész; VerticalPrimeStart : Tömb(0..5,0..5:Egész); Kvadrat : Tömb(0..4:Egész); w : Egész;Az adatok beolvasása, majd a páratlan prímek kiszámítása.
Be: Sum; Be: FirstNumber; i:=3; ciklus Ha Prime^[i SHR 1] akkor j:=i*i; ciklus amíg j<100000 Prime^[j SHR 1]:=False; Inc(j,i+i); ciklus vége; Elágazás vége; i:=i+2; amíg i<=320 ciklus vége;A jegyek összegének ellenőrzése.
ciklus i:=0-től 49999-ig Ha Prime^[i] akkor Ha DigitSum(i+i+1)<>Sum akkor Prime^[i]:=HAMIS különben nPrimes:=nPrimes+1; elágazás vége; elágazás vége; ciklus vége;Megkeressük az összes lehetséges jegyet, amivel a prímszám kezdődhet.
ciklus i:=1-től 4-ig ciklus j:=5000-től 49999-ig Ha Prime^[j] akkor k:=(j+j+1) DIV Divisor[i-1]; w:=Bits[((j+j+1) DIV Divisor[i]) MOD 10]; NextNumber[k]:=NextNumber[k] vagy w; elágazás vége; ciklus vége; ciklus vége; NextNumber[0]:=1023-1; VerticalPrimeStart[1,0]:=FirstNumber;Végül legeneráljuk a prímeket.
GenPrime(FirstNumber,1,0); algortimus vége.A szám számjegyeinek összegét adja vissza.
Függvény DigitSum(i : Egész) : Egész;A GenPrime eljárás generálja a prímeket. Paraméterkent átadjuk a p prím első részét, az n hosszát illetve az aktuális sor számát (-1).
Eljárás GenPrime(p,n,nn : Egész); Változók a,i,vp : Egész; vp:=VerticalPrimeStart[nn,n];Kiszámítjuk az összes lehetséges számot a következő számjegyhez.
a:=NextNumber[vp] and NextNumber[p]; vp:=vp*10; Ha n<4 akkorLegeneráljuk a következő számot.
p:=p*10; Ciklus i:=0-től 9-ig Ha (a és Bits[i])>0 akkor VerticalPrimeStart[nn+1,n]:=vp+i; GenPrime(p+i,n+1,nn); elágazás vége; ciklus vége; különbenVagy rekurzívan kitöltjük a következő sort.
ciklus i:=0-től 9-ig Ha (a és Bits[i])>0 akkor VerticalPrimeStart[nn+1,n]:=vp+i; Kvadrat[nn]:=p*10+i; TryLine(nn+1); elágazás vége; ciklus vége; elágazás vége; eljárás vége;
Eljárás TryLine(n : Egész); Változók i,j,k : Egész; s : Szöveg; Ha n<5 akkorLegeneráljuk a következő sort.
GenPrime(0,0,n) különbenKészen vagyunk a generálással, ezért leellenőrizzük a négyzetet. Ha jó, akkor megvan az eredmény.
j:=0; k:=0; Ciklus i:=0-től 4-ig j:=j*10+(Kvadrat[i] DIV Divisor[i]) MOD 10; k:=k*10+(Kvadrat[4-i] DIV Divisor[i]) MOD 10; ciklus vége; Ha Prime^[j SHR 1] és Prime^[k SHR 1] akkor Ciklus i:=0-tól 4-ig Ki: Kvadrat[i]; ciklus vége; Eláagzás vége; elágazás vége; eljárás vége;
I. 41. Egy négyzetet sötét és világos mezőkre osztunk. A négyzet tükörtengelyeire tükrözésével, valamint a négyzet forgatásával újabb ábrákat kaphatunk (nem biztos, hogy nem egyezik meg a kiinduló ábrával, vagy valamelyik másik transzformáció, transzformációk eredményével).
Készítsünk programot (I41.pas, ...), amely beolvassa egy NxN-es négyzet kitöltését (sorfolytonosan S vagy V betűket írhatunk be), majd kirajzolja a négyzetet és az összes különböző képet.
Példa: N=3, négyzet=((S,S,V),(V,V,V),(V,S,S)) esetén a kezdőkép és a transzformáltak:
(10 pont)
Megoldás:
Maximum 50x50-es lehet a négyzet. Egy három dimenziós tömbben tároljuk az állapotokat, ahol az első index mutatja meg, hogy melyik transzformált állapotról van szó.Algoritmus Jan2; Típus Tnegyzet=Tömb(1..8,1..50,1..50:Karakter); Változó n,i,j,t,t2:Egész; negyzet:Tnegyzet;Beolvassuk a négyzet méretét illetve a mezők színeit.
Be: A négyzet mérete (0<N<51): N;; t:=1; Ciklus i:=1-től N-ig ciklus j:=1-től N-ig Be: A mező színe (S,V): negyzet[t,i,j]; ciklus vége; ciklus vége;Transzformálunk majd kirajzoltatjuk a négyzeteket.
Transzformal; Kirajzol; algoritmus vége.Egy négyzetet 8 féle képpen lehet transzformálni. Tükrözni illetve 90°-kal elforgatni. Ebben az eljárásban az összes lehetséges állapotot előállítjuk.
Eljárás Transzformal; Változók i,j:Egész; t2:=t; ciklus amíg t<8 t:=t+1; t2:=t2+1;Egyszer tükrözünk. Az első állapotot.
Ha t=5 akkor {tukrozes - elsoe} ciklus i:=1-től n-ig ciklus j:=1-től n-ig negyzet[t2,i,j]:=negyzet[1,i,N+1-j]; ciklus vége; ciklus vége;Máskor forgatjuk az előzőt.
különben {forgatas - elozoe} ciklus i:=1-től n-ig ciklus j:=1-től n-ig negyzet[t2,i,j]:=negyzet[t2-1,j,N+1-i]; ciklus vége; ciklus vége; elágazás vége; ciklus vége; eljárás végeA következő eljárásban ellenőrizzük, hogy az aktuális állapotot már kirajzoltuk-e vagy sem, és ha nem akkor most megtesszük.
Eljárás Kirajzol; ciklus t:=1-től t2-ig Ha kulonbozik(t) akkor ciklus i:=1-től n-ig ciklus j:=1-től n-ig Ki: negyzet[t,i,j]; ciklus vége; ciklus vége; elágazás vége; ciklus vége; Eljárás vége;A kulonbozik nevű függvény ellenőrzi le, hogy a t2-edik négyzetet rajzoltuk-e már, vagyis szerepelt-e már ez a festés az előtte levő állapotok között (más-e, mint a többi).
Függvény kulonbozik(t2:Egész):Logikai; Változók t3:Egész; k:Logikai; k:=TRUE; t3:=1; ciklus amíg (t3<t2) és mas(t3,t2) t3:=t3+1; ciklus vége; Ha (t3<t2) akkor k:=HAMIS; elágazás vége; kulonbozik:=k; függvény vége;Akkor más a t3 indexű négyzet, mint a t2, ha az összes, mind az n-négyzet helyen különbözik tőle.
Függvény mas(t3,t2:Egész):Logikai; Változók m:Logikai; k:Egész; m:=HAMIS; k:=0; ciklus amíg (k<n*n) és (negyzet[t3,(k div n)+1,k mod n+1]= negyzet[t2,(k div n)+1,k mod n+1]) k:=k+1; ciklus vége; Ha k<n*n akkor m:=TRUE; elágazás vége; mas:=m; függvény vége;
I. 42. Egy táblázatban tároljuk néhány valutáról, hogy 100 egység belőle hány forintot ér. Például 100 ausztrál dollár (AUD) 13 279 forint.
Készítsünk táblázatot (I42.xls), amelyben konstans valutatáblázatot használva a harmadik oszlopba bármelyik (de csak egy) valuta mellé beírva tetszőleges összeget, a táblázatkezelő kiszámolja, hogy ennyiért melyik valutából mennyit lehet kapni.
Példa:
|
|
(10 pont)
Megoldás:
Az első oszlopban tároljuk a valutákat, a másodikban azt, hogy ezek 100 egysége mennyi forintot ér. A harmadik oszlopba kell írni, hogy valamelyik valutából mennyit váltunk. A negyedikben oszlopban jelenik meg az eredmény. Míg a "G" és "H" jelű oszlopokat segítségül hívjuk.A "G"-be 0-t vagy 1-t írunk a szerint, hogy a harmadik oszlopba írtunk-e valamit, vagyis abban a sorban szereplő valutát akarjuk-e váltani. A "H"-ba pedig átmásoljuk a harmadik oszlopbeli értékeket. Így:
G8:=HA(C8="";0;1) H8:=C8A "D" jelű oszlopba pedig kiszámoljuk az eredményt. Először az átváltandó valuta értéke kell. Ezt átmásoltuk a H oszlopba, és azzal kell számolni, ahol a G oszlopban egyes (1) szerepel (FKERES). Megkeressük választott valuta forintbeli értékét és összeszorozzuk a valuta mennyiségével, így mostantól forintban számolunk (INDEX). Ezt a szorzatot el kell osztanunk a megfelelő sorban szereplő valuta forintbeli értékével vagyis a második sozlopbeli értékkel.
D8:=FKERES(1; $G$5:$H$14; 2; HAMIS ) * INDEX($B$5:$B$14; HOL.VAN(1; $G$5:$G$14; 0); 1 )/ B8