Nemes Tihamér OKSzTV'90

Első forduló

11-13. osztályosok

1990.



1. feladat: (15 pont)
Az alábbi algoritmusok a képernyő egy tetszőleges vonallal határolt részének befestésére alkalmasak. Melyik eljárás milyen sorrendben fest be egy bekerített 5x5-ös "négyzetet" a közepéről indulva, ha a szélei már be vannak festve (9 befestetlen pontja van)?
 
A:
Festés(x,y):
  Pontrajz(x,y)
  Ha üres(x-1,y) akkor Festés(x-1,y)
  Ha üres(x,y-1) akkor Festés(x,y-1)
  Ha üres(x+1,y) akkor Festés(x+1,y)
  Ha üres(x,y+1) akkor Festés(x,y+1)
Eljárás vége
B:
Festés(x,y):
  Pontrajz(x,y): Sorba(x,y)
  Ciklus amíg Sor nem üres
    Sorból(x,y)
    Ha üres(x-1,y) akkor Pontrajz(x-1,y): Sorba(x-1,y)
    Ha üres(x,y-1) akkor Pontrajz(x,y-1): Sorba(x,y-1)
    Ha üres(x+1,y) akkor Pontrajz(x+1,y): Sorba(x+1,y)
    Ha üres(x,y+1) akkor Pontrajz(x,y+1): Sorba(x,y+1)
Eljárás vége
C:
Festés(x,y):
  Pontrajz(x,y): Verembe(x,y)
  Ciklus amíg Verem nem üres
    Veremből(x,y)
    Ha üres(x-1,y) akkor Pontrajz(x-1,y): Verembe(x-1,y)
    Ha üres(x,y-1) akkor Pontrajz(x,y-1): Verembe(x,y-1)
    Ha üres(x+1,y) akkor Pontrajz(x+1,y): Verembe(x+1,y)
    Ha üres(x,y+1) akkor Pontrajz(x,y+1): Verembe(x,y+1)
Eljárás vége

Sor: Olyan adatszerkezet, amelynek végére lehet új elemet betenni, illetve az elején állót lehet kivenni.
Verem: Olyan adatszerkezet, amelynek a végére lehet új elemet tenni, illetve az utoljára betettet lehet kivenni.



2. feladat: (6 pont)
Minek a közelítő értékét határozza meg a következő programrészlet?
 
100 S=0
110 FOR I=1 TO 1000
120   X=2*RND(1)-1: Y=2*RND(1)-1
130   IF X*X+Y*Y<1 THEN S=S+1
140 NEXT I
150 PRINT S/250


3. feladat: (11 pont)
Az a kijelentés, hogy "az egyszerű mondat alanyból és állítmányból áll", formális szabályokkal például így írható le:
 
 (1) <egyszerű mondat> ::= <alany><állítmány>
 (2) <egyszerű mondat> ::= <állítmány><alany>

Megadhatunk néhány további szabályt is:
 
 (3) <alany> ::= <névelő><főnév>
 (4) <alany> ::= <jelző><főnév>
 (5) <alany> ::= <főnév>
 (6) <állítmány> ::= <jelző>
 (7) <állítmány> ::= <jelző> vagyok
 (8) <névelő> ::= a
 (9) <főnév> ::= Pista
(10) <főnév> ::= tengeralattjáró
(11) <főnév> ::= fiú
(12) <jelző> ::= okos
(13) <jelző> ::= sárga

E szabályok alapján az alábbi mondatok közül melyek helyesek és melyek hibásak?
Válaszodban sorold föl azokat a szabályokat, amelyek alapján az egyes mondatok elfogadhatók!
A: Pista okos
B: Pista okos fiú
C: a tengeralattjáró sárga
D: sárga a tengeralattjáró
E: okos vagyok



4. feladat: (10 pont)
A következő algoritmus egy kifejezés zárójelezésének helyességét ellenőrzi. A kifejezésben gömbölyű és szögletes zárójelek is lehetnek. Milyen hibajelenségek tartoznak az egyes HIBAx utasításokhoz?
 
Ellenőrzés(X$):
  DB1:=0: DB2:=0
  Ciklus I=1-től hossz(X$)-ig
    Y$:=X$ I.betűje
    Ha Y$="(" akkor DB1:=DB1+1: Verembe(Y$)
    Ha Y$="[" akkor DB2:=DB2+1: Verembe(Y$)
    Ha Y$=")" akkor Ha DB1=0 akkor HIBA1
                    különben DB1:=DB1-1: Veremből(Z$)
                             Ha Z$="[" akkor HIBA2
                    elágazás vége
    Ha Y$="]" akkor Ha DB2=0 akkor HIBA3
                    különben DB2:=DB2-1: Veremből(Z$)
                             Ha Z$="(" akkor HIBA4
                    elágazás vége
  Ciklus vége
  Ha DB1>0 akkor HIBA5
  Ha DB2>0 akkor HIBA6
Eljárás vége.


5. feladat: (8 pont)
Számítógéppel titkosítottak egy értelmes magyar SZÓ-t. A program lefutása után közölték velünk az előállított KÓD-ot, de a használt KULCS-ot nem. A kódoláskor használt algoritmus a következő volt:
 
Kódolás:
  KÓD(0):=KULCS
  Ciklus I=1-től HOSSZ-ig
    KÓD(I):=SZÓ(I) művelet KÓD(I-1)
  Ciklus vége
Eljárás vége.

Az 1-től HOSSZ-ig indexelt SZÓ tömb a kódolandó, a 0-tól HOSSZ-ig indexelt KÓD tömb pedig a kódolt szót tartalmazza.

A KÓD (1-től HOSSZ-ig) ez lett: HIKJFG. Az alábbi igazságtáblával megadott műveletet a számítógép az operandusokon bitenként végzi el (A és B az operandusok, C az eredmény).

Művelet:
 
A 0 1 0 1
B 0 0 1 1
C 0 1 1 0

A használható betűk és kódjaik:
 
- 0000 A 0001 B 0010 C 0011
D 0100 E 0101 F 0110 G 0111
H 1000 I 1001 J 1010 K 1011
L 1100 M 1101 N 1110 O 1111

Mi volt az eredeti, értelmes magyar szó (megjegyzés: az első betű kitalálásához az algoritmus nem ad segítséget), és mi volt a KULCS? Magyarázd meg, hogyan jöttél rá a megoldásra!



6. feladat: (16 pont)
A következő kártyakeverő programban a megjelölt helyen 4 különböző programrész állhat:

A négy beilleszthető rész a következő:
 

FOR I:=1 TO 32 DO LAP[I]:=I;
FOR I:=1 TO 32 DO
  BEGIN
    (* *)
    KIRAJZOL(J)
  END

A program egy 32 lapból álló, megkevert pakli lapjait rajzolja ki. Az egyes kártyalapokat az 1, 2, ..., 32 számok képviselik, a KIRAJZOL eljárás egy lapot rajzol ki a képernyőre, a VÉLETLEN(SZÁM) függvény pedig egy 0-nál nagyobb és SZÁM-nál nem nagyobb véletlen egész számot állít elő. Szabályosnak akkor számít a keverés, ha minden lap egyszer és csak egyszer fordul elő, mégpedig bármelyik helyen azonos eséllyel.
 

(*1*) J:=VÉLETLEN(32);
(*2*) REPEAT
  J:=VÉLETLEN(32)
UNTIL LAP[J]>0;
LAP[J]:=0;
(*3*) K:=VÉLETLEN(32);
J:=LAP[K];
LAP[K]:=LAP[I];
LAP[I]:=J;
(*4*) IF I<32 THEN BEGIN
  K:=VÉLETLEN(32-I)+I;
  J:=LAP[K];
  LAP[K]:=LAP[I];
  LAP[I]:=J;
END
ELSE J:=LAP[I];

A: Melyik algoritmus kever szabályosan, és melyik nem?

B: A szabálytalanul keverő változatokról írd le, hogy mit csinálnak!

C: Tudsz-e valamit mondani arról, hogy a szabályosan keverő változatok, a FOR-ciklus magjának egy-egy végrehajtása során hányszor hívják meg a VÉLETLEN() függvényt?



7. feladat: (7 pont)
Adott a következő BASIC nyelvű program:
 
10 DIM D(300) : FOR I=1 TO 300 : D(I)=0 : NEXT I
20 INPUT "Hány szám lesz"; N
30 FOR I=1 TO N
40   INPUT J: IF J<>INT(J) OR J<1 OR J>300 THEN PRINT "HIBÁS!" : GOTO 40
50   D(J)=D(J)+1
60 NEXT I
70 FOR I=1 TO 300
80  IF D(I)>0 THEN FOR J=1 TO D(I) : PRINT I : NEXT J
90 NEXT I

Mit csinál a program a beadott számokkal (egy mondatban, a lényeget)?



8. feladat: (14 pont)
A FONTOSKODÓ vállalat nyilvántartásában szerepel ez a 2 táblázat:
 
Alkalmazottak
azon név munkakör főnöke fizu oszt
544 Álmos szállító 545 7000 2
545 Éber osztvez 550 9800 2
546 Élő osztvez 550 15000 3
547 Dolgos munkás 546 11000 3
550 Főfő igazgató NULL 20000 4
551 Buzgó munkavéd 550 10500 2
osztályok
kód osztnév hely
2 szállítás Pécs
3 termelés Pécs
4 igazgatás Győr

Lekérdezésükre használható a SELECT utasítás:

 
SELECT oszlopnév, osztlopnév, ...
  FROM táblázatnév, táblázatnév, ...
  WHERE logikai kifejezés;
A logikai kifejezésben állhat konstans (pl. "Pécs"), oszlopnév (pl. hely) vagy zárójelben újabb, beágyazott SELECT utasítás.
A lekérdezés azokat a sorokat (két táblázat esetén sorpárokat) választja ki a táblázat(ok)ból, amelyekre a logikai kifejezés teljesül. Minden kiválasztott sorból, illetve sorpárból csak a megnevezett oszlopokba eső adatokat kapjuk eredményül. A nem beágyazott SELECT utasítás eredménye kiíródik a képernyőre. Például
 
SELECT osztnév 
  FROM osztályok
  WHERE hely="Pécs" OR hely="Győr";
kiírja a pécsi és a győri osztályok nevét.

A: Milyen parancs írja ki

A1: a 10000-nél többet kereső osztályvezetők nevét és fizetését?
A2: a Pécsett dolgozók nevét és osztályuk nevét?
B: Mit ír ki?
 
SELECT név
  FROM alkalmazottak
  WHERE főnöke=(SELECT azon
                FROM alkalmazottak
                WHERE név="Főfő");

Elérhető összpontszám: 87 pont