10.1 Mit csinál a következő program? 10 INPUT A,B,C 20 C=A=B 30 IF A=B=C THEN PRINT "EGYENLOK" 10.2 Mit csinál a következő program? ( X, Y egész számok! ) 10 INPUT X,Y 20 Z=0 30 IF Y=0 THEN 60 40 IF Y/2=INT(Y/2) THEN X=2*X : Y=Y/2 ELSE Z=Z+X : Y=Y-1 50 GOTO 30 60 PRINT Z 10.3 Mit csinál a következő program? ( X, Y pozitív egészek! ) 10 INPUT X,Y 20 Z=1 30 IF Y=0 THEN 60 40 IF Y/2<>INT(Y/2) THEN Y=Y-1 : Z=Z*X ELSE X=X*X : Y=Y/2 50 GOTO 30 60 PRINT Z 10.4 Mit csinál a következő program? ( X>0 ! ) 10 INPUT X 20 A=0 : B=1 : C=1 30 IF B<=X THEN A=A+1 : C=C+2 : B=B+C : GOTO 30 40 PRINT A 10.5 Mit csinál a következő program? ( A>0, egész! ) 10 INPUT A 20 C=0 30 FOR I=5 TO 1 STEP -1 40 C=10*C-1 : K=10**I 50 IF A>=0 THEN C=C+1 : A=A-K : GOTO 50 60 A=A+K 70 NEXT I 80 PRINT C 10.6 Mit csinál a következő program? ( A, B pozitív egészek! ) 10 INPUT A,B 20 IF A=B THEN 50 30 IF AB THEN X=A : A=B : B=X 30 IF A"," THEN 70 50 PRINT X$ 60 IF A$="," THEN 10 ELSE STOP 70 IF A$=" " THEN 90 80 X$=X$+A$ 90 GOTO 20 10.10 * Mit csinál a következő Pascal nyelvű programrészlet? READLN(A,B); IF A1 THEN ALFA(ROUND(I)); END; BEGIN I:=1; J:=5; K:=1; ALFA(K); ... 10.12 * Mit csinál a következő eljárás? Program: Szóolvas(szó, elválasztó) Ki: szó Ciklus amíg elválasztó="," Szóolvas(szó, elválasztó) Ki: szó Ciklus vége Program vége Szóolvas(szó, elválasztó) szó:= üres Betűolvas(betű) Ciklus amíg betű<>"," és betű<>"." Szó végére betű Betűolvas(betű) Ciklus vége Elválasztó:= betű Eljárás vége Betűolvas(betű) Be: betű Ciklus amíg betű=" " Be: betű Ciklus vége Eljárás vége 10.13 ** A lista alapján (futtatás nélkül) állapítsuk meg, hogy mit csinál a következő program! (a program C=Plus/4 gépre készült) 10 X=1 : Y=2 : E=1000 : DIM V(300) 20 Z=2*Y : Z=Z-E*INT(Z/E) 30 B(X)=Z : IF X=1 THEN X=X+1 : Y=Z : GOTO 20 40 FOR L=1 TO X-1 50 IF V(L)<>V(X) THEN 60 ELSE 80 60 NEXT L 70 Y=Z : X=X+1 : GOTO 20 80 PRINT X-L 10.14 ** A lista alapján állapítsuk meg, hogy mit csinál a következő program! (a program C=Plus/4 gépre készült) 5 SCNCLR 10 DIM B(500) 20 I=1 : A=2 30 A=2*A-1000*INT(2*A/1000) 40 B(I)=A 50 IF I=1 THEN I=I+1 : GOTO 30 60 FOR K=1 TO I-1 70 IF B(K)<>B(I) THEN 100 80 NEXT K 90 I=I+1 : GOTO 30 100 PRINT : PRINT"A PERIODUS ";I-K;"ELEMU." : PRINT 110 PRINT" A PERIODUS ELSO ELEME A SOROZAT ";K+1; ". TAGJA." : PRINT 120 PRINT"A PERIODUS ELEMEI:" 130 Q$="####" 140 FOR L=K TO I-1 150 PRINTUSINGQ$;B(L); 160 NEXT L 10.15 Állapítsuk meg, hogy miben különbözik az alábbi két program futási képe! (C= Plus/4 gépen!) 10 SCNCLR : S$="" 20 INPUT N : IF N<2 OR N>8 OR N<>INT(N) THEN 20 30 FOR I=1 TO N : S$=S$+"*" : NEXT I 40 FOR K=1 TO N : PRINTTAB(4*K);S$ : NEXT K 10 SCNCLR : S$="" 20 INPUT N : IF N<2 OR N>8 OR N<>INT(N) THEN 20 30 FOR K=1 TO 2*N : S$=S$+"*" : NEXT K 40 FOR L=1 TO N : PRINTTAB(2*L);S$ : NEXT L 10.16 Állapítsuk meg, hogy miben különbözik az alábbi két program futási képe! (C= Plus/4 gépen!) 10 SCNCLR : S$="" 20 INPUT N : IF N<2 OR N>8 OR N<>INT(N) THEN 20 30 FOR I=1 TO 2*N : S$=S$+"*" : NEXT I 40 FOR K=1 TO N : PRINTTAB(N-K+1);S$ : NEXT K 10 SCNCLR : S$="" 20 INPUT N : IF N<2 OR N>8 OR N<>INT(N) THEN 20 30 FOR K=1 TO N : S$=S$+"**" : NEXT K 40 FOR L=N TO 1 STEP -1 : PRINTTAB(L);S$ : NEXT L 10.17 * Fejezzük be a 20 cimkéjű sort - újabb utasítás felhasználása nélkül! - úgy, hogy ha N értéke 2 és 7 közötti egész szám, akkor a szám négyzetét írja ki a képernyőre, más szám esetén 0-t! 10 INPUT N 20 PRINT 10.18 * Fejezzük be a 20 cimkéjű sort - újabb utasítás felhasználása nélkül! - úgy, hogy ha A, B, C értékei lehetnek egy háromszög oldalainak mérőszámai, akkor írja ki a képernyőre a szám ab- szolut értékének 1 tizedesre kerekített értékét! 10 INPUT A,B,C 20 PRINT 10.19 * Fejezzük be a 20 cimkéjű sort - újabb utasítás és az ABS- függvény felhasználása nélkül! - úgy, hogy a beírt szám elő- jelétől függetlenül írja ki a képernyőre a szám abszolut ér- tékének 1 tizedesre kerekített értékét! 10 INPUT X 20 PRINT 10.20 ** A következő BASIC utasítássorokat számozzuk meg (10-150-ig, 10-esével) úgy, hogy értelmes és hibátlan programot kapjunk! Minden sort használjunk fel, a sorokban lévő hivatkozási szá- mokat ne változtassuk meg! FOR J=LEN(A$) TO 1 STEP -1 A$="" B$=B$+" " IF K=0 THEN PRINT A$;" " ; : GOTO 40 GOTO 40 PRINT MID$(A$,J,1); I=I+1 K=1-K NEXT J IF I=LEN(B$) THEN PRINT"." : END PRINT " "; K=1 : I=0 IF A$="" THEN 50 INPUT B$ IF MID$(B$,I,1)<>" " THEN A$=A$+MID$(B$,I,1) : GOTO 50 10.21 * Oldjuk meg az előbbi feladatot a következő futtatási képek segítségével!: (1) RUN ?VASKEZ+ UTAS HAVAT RAKAT VASKEZ+ SATU HAVAT TAKAR. (2) RUN ?BARMIT IROK MINDIG KEVER BARMIT KORI MINDIG REVEK. 10.22 Írjunk olyan tesztadatokat, amellyel a következő programok összes utasítása legalább egyszer végrehajtható! Olyan teszt- adatokat is készítsünk, amellyel minden feltétel igaz és ha- mis értékű is lehet! 10 INPUT A,B 20 IF A=B THEN 60 30 IF AINT(Y/2) THEN Y=Y-1 : Z=Z*X : PRINT "40/1" ELSE X=X*X : Y=Y/2 : PRINT "40/2" 50 GOTO 30 60 PRINT Z : PRINT "60" 10.24 Írjunk olyan tesztadatokat, amellyel a következő programok összes utasítása legalább egyszer végrehajtható! Olyan teszt- adatokat is készítsünk, amellyel minden feltétel igaz és ha- mis értékű is lehet! 10 INPUT N : IF N<1 OR N>100 THEN PRINT "10" : GOTO 10 20 DIM A(N) 30 FOR I=1 TO N 40 INPUT A(I) : PRINT "40" 50 NEXT I 60 M=A(1) 70 FOR I=1 TO N 80 IF M0 THEN E=E+1 : PRINT "70" : GOTO 70 80 IF A(U)<>0 THEN U=U-1 : PRINT "80" : GOTO 80 100 IF E<=U AND A(E)=0 THEN E=E+1 : PRINT "100" : GOTO 100 110 IF E<=U THEN PRINT E : PRINT "110" 120 IF E<=U AND A(E)<>0 THEN E=E+1 : PRINT "120" : GOTO 120 130 IF E<=U THEN PRINT E : PRINT "130" 140 GOTO 90 200 STOP 10.26 * Írjunk tesztadatokat mindegyik fehér doboz módszerrel a loga- ritmikus keresés algoritmushoz! 10.27 * Írjunk tesztadatokat mindegyik fehér doboz módszerrel a szét- válogatás helyben algoritmushoz! 10.28 * Készítsünk tesztadatokat a beillesztéses rendezés feladathoz úgy, hogy: 1. Minden utasítást legalább egyszer végrehajtsunk! 2. Minden feltétel lehessen igaz és hamis értékű is! 10.29 * Készítsünk tesztadatokat az utasításlefedés, illetve a rész- feltétel-lefedés elve segítségével a visszalépéses keresés (backtrack) tételhez! A következő 3 feladat a helyességbizonyítás témakörébe tartozik. Ilyen bizonyításokat már a fejezet első feladatai- nál (10.2, 10.3, 10.4, ...) is végezhettünk volna. A 10.4. feladatban például a következő programrészletről kellett eldönteni, hogy mit csinál: 10 INPUT X 20 A=0 : B=1 : C=1 30 IF B<=X THEN A=A+1 : C=C+2 : B=B+C : GOTO 30 40 PRINT A A 30-as címkére igaz a következő invariáns állítás: C=2*A+1 és B=(A+1)*(A+1) és A*A<=X. Ha a címke valamelyik elérésekor valamely egész k>0 és k*k<= X-re A értéke k-1, C=2*(k-1)+1 és B=k*k, akkor ugyanennek a címkének a következő elérésekor A=k, C=2*k+1 és és B=k*k+ 2*k+1=(k+1)*(k+1). A 30-as címke első elérésekor az invariáns állítás k=1 érték mellett igaz. Ez megalapozza az indukció elve alapján, hogy A értéke az az utolsó k-1, amelyre már k*k>X, vagyis az A érté- ke INT(SQR(X)) lesz. A 30-as sorban levő ciklus befejeződésének bizonyítására más módszert kell keresni! Készítsünk egy un. variáns függvényt, amelyre az invariáns állításból következik, hogy nemnegatív egész értékű, és a ciklusmag egyszeri végrehajtása alatt ér- téke legalább eggyel csökken! Mivel ennek kezdőértéke egy vé- ges szám, ez a tulajdonsága garantálja, hogy a ciklusmagot csak véges sokszor hajtjuk végre. Ez a variáns függvény lehet például a következő: X-A*A. Az invariáns tulajdonság utolsó tagjából következik, hogy ez mindig nemnegatív értékű, a ciklusmagban pedig van egy A=A+1 utasítás, ami ennek az értékét legalább eggyel csökkenti. Így tehát beláttuk, hogy ez nem lehet végtelen ciklus. 10.30 ** Írjunk állításokat az összefuttatás tétel algoritmusába, va- lamint variáns függvényt a ciklus befejeződésének igazolásá- hoz! 10.31 ** Írjunk állításokat a visszalépéses keresés tétel (backtrack) algoritmusába, valamint variáns függvényt a külső ciklus be- fejeződésének igazolásához! 10.32 ** A következő algoritmus két szám maradékos osztását végzi el. Írjunk a ciklushoz invariáns állítást, variáns függvényt és adjuk meg, hogy milyen tételeket kell bizonyítani a helyesség belátásához! Eljárás: A,B := 0,X Ciklus amíg B>=Y A,B := A+1,B-Y Ciklus vége H,M := A,B Eljárás vége. Előfeltétel: X>=0 és Y>=0 Utófeltétel: X=H*Y+M és 0<=M A(J) J:=J+1 Ciklus vége Ha J>N akkor B(K):=A(I) : K:=K+1 Ciklus vége Ki: K, B() Eljárás vége. 10.36 Adott egy számsorozat, válogassuk ki a különböző elemeit! Ke- ressünk hibát a következő algoritmusban! Eljárás: K:=0 Ciklus I=1-től N-ig J:=I+1 Ciklus amíg J<=N és A(I)<>A(J) J:=J+1 Ciklus vége Ha A(I)<>A(J) akkor K:=K+1 : C(K):=A(I) Ciklus vége Eljárás vége. 10.37 Adott egy számsorozat, rendezzük át úgy, hogy a negatív ele- mei előzzék meg a pozitívakat! Keressünk hibákat a következő algoritmusban! Eljárás: Ciklus I=1-től N-ig Ha A(I)>0 akkor P:=A(I) Ciklus J=I+1-től N-ig A(J+1):=A(J) Ciklus vége I:=I-1 A(N):=P Elágazás vége Ciklus vége Eljárás vége. 10.38 Adott egy számsorozat, rendezzük át úgy, hogy a negatív ele- mei előzzék meg a pozitívakat! Keressünk hibákat a következő algoritmusban! Eljárás: Ciklus I=1-től N-ig Ha A(I)<0 akkor B(I):=A(I) különben B(N+1-I):=A(I) Ciklus vége Eljárás vége. 10.39 * Adott egy számsorozat, rendezzük át úgy, hogy a negatív ele- mei előzzék meg a pozitívakat! Keressünk hibákat a következő algoritmusban! Eljárás: L:=1 : K:=1 Ciklus I=1-től N-ig Ha A(I)<0 akkor B(L):=A(I) : L:=L+1 különben C(K):=A(I) : K:=K+1 Ciklus vége Ciklus I=1-től L-ig A(I):=B(I) Ciklus vége Ciklus J=L+1-től K-ig A(J):=C(J) Ciklus vége Eljárás vége. 10.40 Adott egy számsorozat, határozzuk meg a szélső értékei szá- mát! Keressünk hibákat a következő algoritmusban! Eljárás: MAX:=A(1) : MAXDB:=1 MIN:=A(1) : MINDB:=1 Ciklus I=2-től N-ig Ha A(I)>MAX akkor MAX:=A(I) : MAXDB:=1 Ha A(I)=MAX akkor MAXDB:=MAXDB+1 Ha A(I)=MIN akkor MINDB:=MINDB+1 Ha A(I) I akkor Ki: I Ciklus vége Elágazás vége Ciklus vége Eljárás vége. 10.42 A program számok mértani közepét számolja ki, az utolsó után 10 000-et kell beadni! Keressünk hibákat a következő algo- ritmusban! Eljárás: S:=1 : I:=0 Be: N Ciklus amíg N<>10000 S:=S*N : I:=I+1 Ciklus vége Ha S<0 és N/2<>INT(N/2) akkor Ki: "Nem valos" különben A:=SGN(S)*ABS(S)**(1/I) : Ki: A Elágazás vége Eljárás vége. 10.43 Mik a hibák a következő programrészletben, amely egy mátrix sormaximumainak minimumát számolja? Eljárás: R:=A(1,1) Ciklus I=1-től N-ig S:=A(I,1) Ciklus J=1-től K-ig Ha SS akkor R:=S Ciklus vége Ki: R Eljárás vége. 10.44 * Mik a hibák a következő programban, amely egy vektor összes maximális értékű elemének az indexét írná ki, ha jól működne? Eljárás: Be: N Ciklus I=1-től N-ig Be: A(I) : L(I):=I Ciklus vége Ciklus I=1-től N-ig Ciklus J=I+1-től N-ig Ha A(I)L akkor S:=S+1 : L:=A(J) : K(S):=J Ha A(J)=L akkor S:=S+1 : K(S):=J Ciklus vége Eljárás vége. 10.46 * Keressünk hibákat a következő algoritmusban, amely egy vektor elemei közül a második legnagyobbat választja ki! Eljárás: Be: N [N>1 és egész] Tömb A(N) Be: A() IM:=1 : M:=A(IM) Ciklus I=2-től N-ig Ha A(I)>A(M) akkor IM:=A(I) : M:=I Ciklus vége UVK:=1 : KUL:=A(IM)-A(1) Ciklus I=2-től N-ig SEG:=M-A(I) Ha SEG 0 akkor UVK:=I : KUL:=SEG Ciklus vége Ha KUL>0 akkor Ki:A(UVK) különben Ki: "Mind egyenlok" Eljárás vége. 10.47 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. (összesen N mérés volt) A mérést szárazföld fölött kezdtük és ott is fejeztük be. Ott van tenger, ahol a mérés értéke 0. Határozzuk meg a mért szakaszon a tenger szélessé- gét! Keressünk hibákat a következő algoritmusban! Eljárás: E:=1 Ciklus amíg A(E)>0 E:=E+1 Ciklus vége U:=N Ciklus amíg A(U)>0 U:=U-1 Ciklus vége Ki: (U-E)*5 Eljárás vége. 10.48 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. (összesen N mérés volt) A mérést szárazföld fölött kezdtük és ott is fejeztük be. Ott van tenger, ahol a mérés értéke 0. Határozzuk meg a mért szakaszon azon szigeteket, amelyeken nincs 100 méternél magasabb hely! Keressünk hibákat a következő algoritmusban! Eljárás: [E=Bal part helye, U=Jobb part helye, A(E)=0, A(U)=0 ] Ciklus I=E-től U-ig Ha A(I-1)=0 és A(I)>0 akkor X:=I Ha A(I-1)>0 és A(I)=0 akkor Ha H<100 akkor Ki: X,I Ha A(I)>H akkor A(I):=H Ciklus vége Eljárás vége. 10.49 * Egy repülőgéppel repültünk Európából Amerikába, s az út során X kilométerenként mértük a felszín tengerszint feletti magas- ságát. Feltételezésünk szerint a mérés tenger felett 0, szi- get felett >0 értékű. Keressünk hibákat abban az algoritmus- ban, amely megadja azt a szigetet, amelytől a legtávolabb van szomszéd sziget! (A közelebbi szomszéd sziget legtávolabb van. 1 ilyet kell megadni!) Szigetek eljárás: I:=1 : DB:=0 Ciklus amíg I<=N Ciklus amíg I<=N és (A(I)>0 vagy A(I+1)=0) I:=I+1 Ciklus vége Ha I<=N akkor DB:=DB+1 : SZKEZD(DB):=I+1 Ciklus amíg A(I)=0 vagy A(I+1)>0 I:=I+1 Ciklus vége DB:=DB+1 : SZVÉG(DB):=I Ciklus vége TÁV:=0 Ciklus I=2-től DB-ig Ha SZVÉG(I-1)-SZKEZD(I)>TÁV és SZKEZD(I+1)-SZVÉG(I)>TÁV akkor TÁV:=SZVÉG(I-1)-SZKEZD(TÁV) : H:=I Ciklus vége Ki: H, SZKEZD(H), SZVÉG(H) Eljárás vége. 10.50 * Egy repülőgéppel repültünk Európából Amerikába, s az út során X kilométerenként mértük a felszín tengerszint feletti magas- ságát. Feltételezésünk szerint a mérés tenger felett 0, szi- get felett >0 értékű. A méréssorozatot tenger felett kezdtük és fejeztük be. Keressünk hibákat abban az algoritmusban, amely megadja azokat a szigeteket, ahol a legmagasabb csúcs található! (Csúcs minden olyan pont, amely magasabb a 2 szom- szédjánál. Az adatok az A(N) vektorban találhatók.) Szigetek eljárás: MAG :=-20000 Ciklus I=2-től N-ig Ha A(I)>A(I-1) vagy A(I)>A(I+1) akkor Ha A(I)>MAG akkor MAG:=A(I) Ciklus vége DB:=0 Ciklus I=2-től N-ig Ha A(I)=MAG akkor DB:=DB+1 : X(DB):=I Ciklus vége Ciklus I=0-tól DB-ig E:=A(I) Ciklus amíg A(E)>0 E:=E+1 Ciklus vége V:=A(I) Ciklus amíg A(V)>0 V:=V-1 Ciklus vége Ki: "Sziget eleje:",E,"Sziget vege:",V Ciklus vége Eljárás vége. 10.51 Egy H hosszúságú rudat bevonunk N réteggel egyenletesen (a végét is). D(I) jelenti az I. bevonás utáni átmérőt, D(0) a kezdeti átmérő. Keressük meg a hibát a következő algoritmus- ban amely meghatározza az egyes felhasznált anyagok térfoga- tát! Eljárás: V:=D(0)*D(0)/4*PI*H Ciklus I=1-től N-ig U:=D(I)*D(I)/4*PI*H Ki: V-U V:=VU : H:=H+D(I) Ciklus vége Eljárás vége. 10.52 A program egy szám összes valódi nem prím osztóit írja ki. Keressünk hibákat a programban! 10 INPUT N 20 FOR I=4 TO N/2 30 IF N/I=INT(N/I) THEN 40 ELSE 80 40 FOR J=1 TO SQR(I) 50 IF J/I=INT(J/I) THEN PRINT I 60 NEXT J 70 NEXT I 80 STOP 10.53 A program számok mértani közepét számolja ki, az utolsó után 10000-et kell beadni. Keressünk hibát a következő programban! 10 S=1 : I=0 20 INPUT N 30 IF N=10000 THEN 50 40 S=S*N : I=I+1 : GOTO 20 50 IF S<0 AND N/2<>INT(N/2) THEN PRINT "Nem valos" : STOP 60 A=SGN(S)*ABS(S)**(1/I) 70 PRINT A : STOP 10.54 A programrészlet egy vektor 0 elemeinek számát adja meg. Ke- ressünk hibákat a következő programban! 100 I=1 : S=0 : D=0 110 IF A(I)>0 THEN 120 ELSE 150 120 I=I+1 130 GOTO 110 140 S=D+1 150 IF I S THEN R=S 160 NEXT I 170 PRINT R 10.56 A programrészlet hőmérsékleti adatokat dolgoz fel, jelzi, hogy az illető beteg, ha a mérés eredménye kisebb 35 foknál, vagy nagyobb 40 foknál, vagy pedig két mérés között a hőmér- séklet több mint egy fokkal változott. Keressünk hibákat a következő programban! 100 FOR I=1 TO N 110 INPUT A(I) 120 NEXT I 130 FOR I=1 TO N 140 IF A(I)>40 OR A(I)<35 OR A(I)-A(I-1)>1 THEN PRINT "BETEG" 150 NEXT I 10.57 A programrészlet A és B nem közös osztóit írja ki. Keressünk hibákat a következő megoldásban! 100 S=0 110 D=INT(A/2) 120 FOR I=2 TO D 130 IF INT(A/I)=A/I THEN S=S+1 140 IF INT(B/I)=B/I THEN S=S+1 150 IF S=1 THEN PRINT I; 160 NEXT I 10.58 A program két szám legnagyobb közös osztóját számolja ki. Ke- ressünk hibákat a következő megoldásban! 10 INPUT A,B 20 X=A : Y=B 30 IF X=Y THEN 60 40 IF X A(I+1) THEN X=A(I) : A(I+1)=A(I) : A(I)=X : K=1 90 NEXT I 100 IF K>0 THEN N=N-1 : GOTO 60 110 FOR I=K TO 1 STEP -1 120 IF A(I)=A(I-1) THEN PRINT I : NEXT I 130 STOP 10.61 A program egy vektor összes maximális értékű elemének az in- dexét írná ki, ha jól működne. Keressünk hibákat a program- ban! 10 INPUT N,E 20 FOR I=2 TO N 30 INPUT M 40 IF M=E THEN PRINT I : GOTO 70 50 IF M =A(J) THEN 140 120 X=A(I) : A(J)=A(I) : A(I)=X 130 X=L(I) : L(I)=L(J) : L(J)=X 140 NEXT J : NEXT I 150 PRINT L(1); 160 Q=2 170 IF L(Q)=L(1) THEN PRINT L(Q); ELSE END 180 Q=Q+1: GOTO 170 10.63 A program egy vektor összes maximális értékű elemének az in- dexét írná ki, ha jól működne. Keressünk hibákat a program- ban! 10 INPUT N : DIM A(N) : K=N 20 FOR I=O TO N : INPUT A(I) : NEXT I 30 K=0 40 FOR I=0 TO N-1 50 IF A(I)>A(I+1) THEN X=A(I) : A(I)=A(I+1) : A(I+1)=X : K=1 60 NEXT I 70 IF K>0 THEN N=N-1 : GOTO 30 80 FOR I=K TO 0 STEP -1 90 IF A(I)=A(I-1) THEN PRINT I : NEXT I 95 STOP 10.64 A program egy vektor összes maximális értékű elemének az in- dexét írná ki, ha jól működne. Keressünk hibákat a program- ban! 10 INPUT N : DIM A(N),B(N) 20 FOR I=1 TO N 30 INPUT A(I) : B(I)=I 40 NEXT I 50 FOR K=N-1 TO 1 STEP -1 60 FOR B=1 TO K 70 IF A(B)>=A(B+1) THEN 100 80 X=A(B) : A(B)=A(B+1) : A(B+1)=X 90 Y=B(B) : B(B)=B(B+1) : B(B+1)=X 100 NEXT B : NEXT K 110 FOR F=1 TO 10 120 PRINT B(F) 130 NEXT F 140 STOP 10.65 A program egy vektor összes maximális értékű elemét gyüjtené ki, ha jól működne. (Dimenzionálási hibák nincsenek!) Keres- sünk hibákat a programban! 100 S=0 : L=S 110 FOR J=1 TO N 120 IF A(J)>L THEN S=S+1 : L=A(J) : K(S)=J 130 IF A(J)=L THEN S=S+1 : K(S)=J 140 NEXT J 10.66 A következő program véletlen, de szimmetrikus ábrát rajzolna a képernyőre. A szimmetriatengelyek (a képernyő koordináta- rendszerében) az X=20, Y=20, Y=X, Y=40-X egyenesek. Milyen két SET utasítás hiányzik a programból, hogy a szimmetria teljes legyen? 10 X=RND(41)-1 : Y=RND(41)-1 20 SET(X,Y) : SET(X,40-Y) 30 SET(Y,X) : SET(40-Y,X) 40 SET(40-X,Y) : SET(Y,40-X) 50 GOTO 10 10.67 Mik a hibák a következő rendező szubrutinban? 100 DIM A(N) ... 200 REM Rendezés 210 FOR I=N TO 1 STEP -1 220 FOR J=1 TO I 230 IF A(J)>A(J+1) THEN X=A(I) : A(I+1)=A(I) : A(I)=A(I+1) 240 NEXT J 250 NEXT I 260 ... 10.68 A Balatonra egy négyzethálót fektettünk és minden pontjában megmértük a víz átlaghőmérsékletét. Ha egy mérés parton volt, akkor az értéke=0, egyébként>0. A négyzetháló szélső pontjai parton voltak. Keressünk hibákat a következő programban, amely a partmenti víz átlaghőmérsékletét határozná meg, ha működne! 100 FOR I=2 TO N-1 : FOR J=2 TO M-1 110 IF X(I,J)=0 THEN 120 ELSE 150 120 FOR K=I-1 TO I+1 : FOR L=J-1 TO J+1 130 IF X(K,L)<>0 THEN D=D+1 : S=S+X(K,L) 140 NEXT L : NEXT K 150 NEXT J : NEXT I 10.69 A Balatonra egy négyzethálót fektettünk és minden pontjában megmértük a víz átlaghőmérsékletét. Ha egy mérés parton volt, akkor az értéke=0, egyébként>0. A négyzetháló szélső pontjai parton voltak. Keressünk hibákat a következő programban, amely a leghidegebb pont hőmérsékletét határozná meg, ha mű- ködne! 100 X=10000 110 FOR I=1 TO N 120 FOR J=1 TO M 130 IF A(I,J) 0 THEN E=E+1 : GOTO 110 120 U=N 130 IF A(U)>0 THEN U=U-1 : GOTO 130 140 PRINT (U-E)*5 10.71 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. (összesen N mérés volt) A mérést szárazföld fölött kezdtük és ott is fejeztük be. Ott van tenger, ahol a mérés értéke=0. Keressünk hibákat a következő programban, amely a hegycsúcsok helyét és magasságát határozná meg a mért szaka- szon, ha működne! 100 FOR I=1 TO N 110 IF A(I-1) < A(I) AND A(I) > A(I+1) THEN PRINT I,A(I) 120 NEXT I 10.72 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. (összesen N mérés volt) A mérést szárazföld fölött kezdtük és ott is fejeztük be. Ott van tenger, ahol a mérés értéke=0. Keressünk hibákat a következő programban, amely a szigetek számát határozná meg a mért szakaszon, ha működne! 100 S=0 110 FOR I=2 TO N 120 IF A(I-1)=0 AND A(I) > 0 THEN S=S+1 130 NEXT I 140 PRINT S 10.73 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. (összesen N mérés volt) A mérést szárazföld fölött kezdtük és ott is fejeztük be. Ott van tenger, ahol a mérés értéke=0. Keressünk hibákat a következő programban, amely azon szigeteket határozná meg a mért szakaszon, amelyeken nincs 100 méternél magasabb hely, ha működne! 100 REM E=Bal part helye, U=Jobb part helye (A(E)=0, A(U)=0) 110 FOR I=E TO U 120 IF A(I-1)=0 AND A(I)>0 THEN X=I 130 IF A(I-1)>0 AND A(I)=0 THEN IF H<100 THEN PRINT X,I 140 IF A(I)>H THEN A(I)=H 150 NEXT I 10.74 Egy H hosszúságú rudat bevonunk N réteggel egyenletesen (a végét is). D(I) jelenti az I. bevonás utáni átmérőt, D(0) a kezdeti átmérő. Keressünk hibákat a következő programban, amely az egyes felhasznált anyagok térfogatát határozza meg! 100 V=D(0)*D(0)/4*PI*H 110 FOR I=1 TO N 120 U=D(I)*D(I)/4*PI*H 130 PRINT V-U 140 V=VU : H=H+D(I) 150 NEXT I 10.75 N napig mértük, naponta K alkalommal a hőmérsékletet. Keres- sünk hibákat a következő programban, amely a napi maximumok minimumát határozná meg, ha jól működne! 100 L=A(1,1) 110 FOR I=1 TO N 120 M=A(I,1) 130 FOR J=1 TO K 140 IF A(I,J)>M THEN M=A(I,J) 150 NEXT J 160 IF M S THEN PRINT I-1 180 F=E : E=S 190 NEXT I 10.77 Egy V0 térfogatú, M0 tömegű jégtábla úszik a vízen. N darab tárggyal terheljük, amelyek tömegeit a T(N) vektorban helyez- tük el. Mindegyik tárgy R0 sűrűségű. Keressünk hibákat a kö- vetkező programban, amely megadja, hogy elsüllyed-e a jégtáb- la, s ha igen, akkor mikor! 100 FOR I=1 TO N 110 V=V0+T(I)/R0 120 IF (M0+T(I)/V)<1 THEN PRINT "Elsullyed az";I; ". targy utan" 130 M=M+T(I) 140 NEXT I 150 PRINT "Nem sullyed el!" 160 STOP 10.78 Melyik programrészlet lehet Pascal, melyik Elan0 nyelvű, me- lyik mindkettő, és melyik egyik sem? (Amelyik nem lehet, az miért nem?) A. A:=B-C+D[I]; D[3]:=24; IF A>D[3] THEN D[3]:=A ELSE A:=D[3]; B:=A; B. N:=100 ; K:=3.5 ; A:=K ; FOR K:=1 TO N A:=A+K; Z:=A*A; C. A:=1 ; B:=2 ; C:=30 REPEAT A:=A*B UNTIL A>C ENDREPEAT; X:=A-C; 10.79 * A következő szubrutin helyesen működik. Szövegek rendezett sorozatába beilleszt egy új szöveget. Milyen kezdőértékadást kell alkalmazni ahhoz, hogy a szubrutin akkor is helyesen mű- ködjön, amikor a rendezett sorozatban még egyetlen elem sincs (N=0)? 1000 REM Beillesztés (X$) 1010 N=N+1 : T$(N)=X$ 1020 B=0 : A=T(B) 1030 IF A=-1 THEN 1070 1040 IF X$<=T$(A) THEN 1070 1050 B=A : A=T(B) 1060 GOTO 1030 1070 T(B)=N : T(N)=A 1080 RETURN 10.80 A következő programrészlet két növekvően rendezett számsoro- zat közös elemeit írja ki. Mi a feltétele annak, hogy egy elemet sem ír ki többször? 100 I=1 : J=1 110 IF I>N OR J>M THEN 150 120 IF A(I)=B(J) THEN PRINT A(I) 130 IF A(I)I2 THEN H=I1 ELSE H=I2 80 X=X1 : Y=Y1 90 S1=H1/H 100 S2=H2/H 110 FOR I=1 TO H+1 120 SET(X,Y) 130 X=X+S1 : Y=Y+S2 140 NEXT I 150 RETURN 10.82 * Az alábbi program feladata, hogy meghatározza: hány helyen lesz olajfoltos két, egymáshoz kapcsolódó fogaskerék, ha az első kerék egyetlen fogára egy olajcseppet teszünk. (Feltesz- szük, hogy a szerkezet 'elég sokáig' működik és az eredeti olajcsepp elég nagy ahhoz, hogy akárhány foltot okozzon.) Futtatáskor kiderült, hogy a program nem ad jó eredményt. Ke- ressük meg a hibát, vagy a hibákat! 10 SCNCLR : PRINT : PRINT 20 INPUT "AZ ELSO KEREK FOGAINAK SZAMA ";B : IF B<2 OR B<>INT(B) THEN 30 40 X=A : Y=B 50 IF X=Y THEN 80 60 IF X>Y THEN X=A-X : ELSE Y=B-Y 70 GOTO 40 80 PRINT : PRINT "AZ OLAJOS FOGAK SZAMA" 90 PRINT : PRINTTAB(5);"AZ ELSO KEREKEN: ";X;"," 100 PRINT : PRINTTAB(5);"A MASODIK KEREKEN: ";Y;"." 110 GETKEY A$ : PRINT : PRINT : PRINT : PRINT : "KER-E UJ SZAMOLAST (I/N)" : GETKEY A$ 120 IF A$=I THEN 10 : ELSE END 10.83 Írjuk át hatékonyabbá a következő programot, ami egy termé- szetes szám legnagyobb osztóját adja meg. A legnagyobb osztó nem maga a szám. Eljárás: I:=N Ciklus amíg I nem osztója N-nek I:=I-1 Ciklus vége Ki: I Eljárás vége. 10.84 Írjuk át hatékonyabbá a következő programot, ami két termé- szetes szám legnagyobb közös osztóját számolja ki, felhasz- nálva, hogy A és B közös osztói A-B-nek is osztói, ha A>B. Eljárás: Ciklus amíg A<>B Ha A0 K:=K+E Ciklus vége Gyökhely:=K Eljárás vége. 10.86 Írjuk át hatékonyabbra az N-ig található ikerprímeket előál- lító algoritmust! Ikerprímek eljárás: Ciklus I=2-től N-ig Ha prímszám(I) és prímszám(I+2) akkor Ki: I,I+2 Ciklus vége Eljárás vége. 10.87 Adott egy szimmetrikus mátrix (A(I,J)=A(J,I)). Írjuk át haté- konyabbá a legnagyobb értékű elem indexeit meghatározó eljá- rást! Eljárás: MS:=1 : MO:=1 Ciklus I=1-től N-ig Ciklus J=1-től M-ig Ha A(I,J) > A(MS,MO) akkor MS:=I : MO:=J Ciklus vége Ciklus vége Ki: MS,MO,A(MS,MO) Eljárás vége. 10.88 Írjuk át hatékonyabbá a következő eljárást, amely egy mátrix- ban egy X érték helyét adja meg. A mátrix sorainak elemei nagyság szerint rendezettek. Az egyes sorokhoz tartozó szám- intervallumok nem fedik át egymást. A sorok egymáshoz képest nincsenek sorrendben. Eljárás: I:=1 : TALÁLT:=HAMIS Ciklus amíg I<=N és nem TALÁLT J:=1 Ciklus amíg J<=M és A(I,J)<>X J:=J+1 Ciklus vége Ha J<=M akkor TALÁLT:=IGAZ különben I:=I+1 Ciklus vége Ki: I,J Eljárás vége. 10.89 * Írjuk át a következő eljárást hatékonyabbá, amely egy Pascal- háromszög N. sorának elemeit határozza meg minden K-ra (K=0, 1, ..., N). Az N. sor K. elemének értéke: N! N alatt a K = ----------- K! * (N-K)! Eljárás: Ciklus I=0-tól N-ig Pascal-háromszög: S1:=1 : S2:=1 : S3:=1 Ciklus I=1-től N-ig 1 S1:=S1*I Ciklus vége 1 2 1 Ciklus I=1-től K-ig S2:=S2*I 1 3 3 1 Ciklus vége Ciklus I=1-től N-K-ig 1 4 6 4 1 S3:=S3*I Ciklus vége 1 5 10 10 5 1 Ki: S1/(S2*S3) Ciklus vége Eljárás vége. 10.90 Írjuk át hatékonyabbá a következő eljárást, amely egy vektor- ban megkeresi egy X érték helyét. Tudjuk, hogy a vektor min- den elemére igaz, hogy IX I:=I+1 Ciklus vége Ha I<=N akkor Ki: I Eljárás vége. 10.91 * Írjuk át hatékonyabbra az első N (N>2) Fibonacci-számot elő- állító eljárást! Fibonacci eljárás: Ciklus I=0-tól N-ig Elágazás I=0 esetén F(0):=1 I=1 esetén F(1):=1 egyéb esetben Fibonacci előállítás(I) Elágazás vége Ciklus vége Eljárás vége. Fibonacci előállítás:(I) F1:=1 : F2:=1 Ciklus J=2-től I-ig F:=F1+F2 : F2:=F1 : F1:=F Ciklus vége F(I):=F Eljárás vége. 10.92 * A K-Fibonacci-számokat a következőképpen képezzük: F(N):=F(N-1)+F(N-2)+...+F(N-K) Írjuk át hatékonyabbá a következő eljárást! Eljárás: Ciklus I=0-tól K-1-ig F(I):=1 Ciklus vége Ciklus I=K-tól N-ig F(I):=0 Ciklus J=N-K-tól N-1-ig F(I):=F(I)+F(J) Ciklus vége Ciklus vége Ki: F(N) Eljárás vége. 10.93 Írjuk át hatékonyabbá a következő eljárást, amely adott N mé- résből meghatározza a tengerben levő szigetek kezdetét és vé- gét. A mérések tengerszint feletti magasságokat tartalmaz- nak. A 0 értékű mérések tengert jelentenek. Eljárás: Ciklus I=1-től N-ig Ha I=1 és A(I)>0 vagy I>1 és A(I-1)=0 és A(I)>0 akkor Ki: "KEZDET:",I Ha I=N és A(I)>0 vagy I 0 és A(I+1)=0 akkor Ki: "VEG:",I Ciklus vége Eljárás vége. 10.94 Írjuk át gyorsabbra a következő eljárást! 5 kilométerenként megmértük a felszín tengerszint feletti magasságát. A mérés- sorozatot szárazföld fölött kezdtük és fejeztük be. Volt köz- ben tenger is. Ott van tenger, ahol a mérés értéke: 0. Hatá- rozzuk meg minden egyes szigeten a legmagasabb pontokat! Eljárás: S:=0 Ciklus I=2-től N-1-ig Ha A(I-1)=0 és A(I)>0 akkor S:=S+1 : K(S):=I Ha A(I)>0 és A(I+1)=0 akkor V(S):=I Ciklus vége Ciklus I=1-től S-1-ig M:=K(I) Ciklus J=K(I)+1-től V(I)-ig Ha A(J)>A(M) akkor M:=J Ciklus vége Ki: K(I),V(I),M,A(M) Ciklus vége Eljárás vége. 10.95 * Írjuk át gyorsabbra a következő eljárást! 5 kilométerenként megmértük a felszín tengerszint feletti magasságát. A mérés- sorozatot szárazföld fölött kezdtük és fejeztük be. Volt köz- ben tenger is. Ott van tenger, ahol a mérés értéke: 0. Hatá- rozzuk meg az X méternél magasabb szigetek kezdeteit és vége- it! Eljárás: E:= Első 0 helye : U:= Utolsó 0 helye : I:=E Ciklus amíg I<=U Ciklus amíg A(I) 0 K:=K-1 Ciklus vége V:=I+1 Ciklus amíg A(V)>0 V:=V+1 Ciklus vége Ki: K, V I:=V Elágazás vége Ciklus vége Eljárás vége. 10.96 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. A méréssorozatot szárazföld fölött kezdtük és fe- jeztük be. Volt közben tenger is. Ott van tenger, ahol a mé- rés értéke: 0. Adjuk meg az egyes szigetek hosszait! Írjuk át a következő algoritmust kevesebb helyet foglalóra! Eljárás: DB:=0 Ciklus I=E+1-től V-1-ig Ha MAG(I)>0 és MAG(I-1)=0 akkor DB:=DB+1 : KEZDET(DB):=I Elágazás vége Ha MAG(I)>0 és MAG(I+1)=0 akkor VÉG(DB):=I Ciklus vége Ciklus I=1-től DB-ig HOSSZ(I):=VÉG(I)-KEZDET(I)+1 Ciklus vége Eljárás vége. 10.97 * 5 kilométerenként megmértük a felszín tengerszint feletti ma- gasságát. A méréssorozatot szárazföld fölött kezdtük és fe- jeztük be. Volt közben tenger is. Ott van tenger, ahol a mé- rés értéke: 0. A tenger E-től V-ig tart. Adjuk meg azon szi- getek kezdeteit és végeit, ahol a legmagasabb pont van! Írjuk át hatékonyabbra a következő megoldást! Szigetek eljárás: MAX:=E Ciklus I=E+1-től V-ig Ha MAG(I)>MAG(MAX) akkor MAX:=I Ciklus vége DB:=0 Ciklus I=E-től V-ig Ha MAG(I)=MAG(MAX) akkor DB:=DB+1 : X(DB):=I Ciklus vége SZDB:=0 Ciklus I=1-től DB-ig K:=X(I)-1 Ciklus amíg MAG(K)>0 K:=K-1 Ciklus vége V:=X(I)+1 Ciklus amíg MAG(V)>0 V:=V-1 Ciklus vége Ha SZDB=0 akkor SZDB:=1 : SZK(SZDB):=K : SZV(SZDB):=V különben Ha SZV(SZDB)<>V akkor SZDB:=SZDB+1 : SZK(SZDB):=K SZV(SZDB):=V Elágazás vége Elágazás vége Ciklus vége Eljárás vége. 10.98 Írjuk át hatékonyabbra (végrehajtási idő) a következő felada- tot megoldó algoritmust! Két rádióadó adásidőit mértük. Az első adáskezdeteit az EK(N) adásvégeit az EV(N) vektorban tá- roljuk, a másodikét pedig az MK(M), illetve az MV(M) vekto- rokban. Mindkettő az adáskezdetek szerint sorba van rendez- ve. Állapítsuk meg, hogy a két adássorozatot adhatta-e ugyan- az az adó! Az eredményt az eljárás végén az 'Adhatta' nevű változó tartalmazza! Adhatta-e eljárás: Adhatta:=Igaz Ciklus I=1-től N-ig Ciklus J=1-től M-ig Ha EK(I)>=MK(J) és EK(I) MK(J) és EV(I)<=MV(J) vagy MK(J)>EK(I) és MK(J) 0 akkor A(I):=A(I)*N/2 Ha A(I)=0 akkor F:=I*I*I Ha A(I)<0 akkor A(I):=A(I)-F HA A(I)=0 akkor A(I):=F**2 Ciklus vége Ciklus I=1-től N-ig Ha A(I)<0 akkor A(I):=-A(I) Ciklus vége Ciklus I=1-től N-ig Ha A(I) 0 akkor A(I):=F Ciklus vége Eljárás vége. 10.100 * A Balatonra egy négyzethálót fektettünk és minden rácspontban megmértük a víz hőmérsékletét. A parton a mért érték 0, a vízben >0. MAX tartalmazza a viz maximális hőmérsékletét. Ír- juk át gyorsabbra a parthoz legközelebbi maximumhelyet kereső eljárást! Keresés eljárás: TMIN:=+végtelen Ciklus I=1-től N-ig Ciklus J=1-től M-ig Ciklus K=1-től N-ig Ciklus L=1-től M-ig Ha X(I,J)=MAX és X(K,L)=0 és TÁV(X(I,J),X(K,L)) 38 akkor DB:=DB+1 Ha I>1 és ABS(H(I)-H(I-1))>1 akkor DB:=DB+1 Ciklus vége Eljárás vége. 10.102 * Egy kutyaszépségversenyen N kutya indult, mindegyik M kategó- riában. Az egyes kategóriák maximális pontszámát a MAX(M), az értékeléshez szükséges minimális pontszámot a MIN(M) vektor tartalmazza. Írjuk át hatékonyabbra azt az algoritmust, amely megadja azokat a kutyákat, amelyek egy kategóriában sem estek ki, de nem is nyertek sehol! Kiválogatás eljárás: DB:=0 Ciklus I=1-től N-ig J:=1 Ciklus amíg J<=M és KU(I,J)>=MIN(J) J:=J+1 Ciklus vége Ha J>M akkor DB:=DB+1 : K(DB):=I Ciklus vége Ciklus J=1-től M-ig L:=MAX(J) : VAN:=Hamis Ciklus amíg nem VAN Ciklus I:=1-től N-ig Ha KU(I,J)=L akkor VAN:=Igaz : P:=1 Ciklus amíg P<=DB és K(P)<>I P:=P+1 Ciklus vége Ha P<=DB akkor Ciklus amíg P =1 és K<=N és L>=1 és L<=N és (K<>I vagy L<>J) akkor Ha A(K,L)=1 akkor S:=S+1 Ciklus vége Ciklus vége Eljárás vége. 10.105 Egy méréssorozatban a hibákat úgy szeretnénk javítani, hogy minden értéket helyettesítünk önmaga, valamint a két szomszé- dos mérés súlyozott átlagával. Írjuk át időben gyorsabbra, valamint kevesebb helyet foglalóra a következő megoldást! Hibajavítás eljárás: Ciklus I=1-től N-ig Elágazás I=1 esetén Y(I):=(4*X(I)+X(I+1))/5 I=N esetén Y(I):=(X(I-1)+4*X(I))/5 Egyéb esetben Y(I):=(X(I-1)+4*X(I)+X(I+1))/6 Elágazás vége Ciklus vége Eljárás vége. 10.106 Egy étteremben minden nap kiszámolják, hogy mennyi az aznapi bevétel. Számítsuk ki, hogy mennyi a munkanapi bevételek át- laga, valamint, hogy mennyi a munkaszünetes napok bevételei- nek átlaga (ilyen a szombat és a vasárnap)! Írjuk át hatéko- nyabbra a következő megoldást! Átlagok(N) eljárás: MATL:=0 : M:=0 : MSZATL:=0 : MSZ:=0 Ciklus I=1-től N-ig Ha (I MOD 7)=0 vagy (I MOD 7)=6 akkor MSZ:=MSZ+1 : MSZATL:=MSZATL+BEVÉTEL(I) különben M:=M+1 : MATL:=MATL+BEVÉTEL(I) Ciklus vége MATL:=MATL/M : MSZATL:=MSZATL/MSZ Eljárás vége. 10.107 Olvassunk be hónap sorszámokat, majd adjuk meg, hogy hány té- li, tavaszi, nyári, őszi hónap volt! Írjuk át a következő megoldást időben gyorsabbra! Eljárás: Ciklus I=1-től N-ig Be: H Ha H=1 vagy H=2 vagy H=12 akkor DB(1):=DB(1)+1 Ha H=3 vagy H=4 vagy H=5 akkor DB(2):=DB(2)+1 Ha H=6 vagy H=7 vagy H=8 akkor DB(3):=DB(3)+1 Ha H=9 vagy H=10 vagy H=11 akkor DB(4):=DB(4)+1 Ciklus vége Eljárás vége. 10.108 * A XX. század néhány egymást követő évében naponta megmértük a napi középhőmérsékletet. Írjuk át hatékonyabbra azt az al- goritmust, amely eldönti, hogy a szökőévek átlaga nagyobb-e a nem szökőévek átlagánál! (Legalább 4 évet vizsgáltunk!) Eljárás: SZ:=0 : SZDB:=0 : NSZ:=0 : NSZDB:=0 Ciklus I=K-tól V-ig Ha (I MOD 4)=0 akkor NAP:=366 különben NAP:=365 ÖSSZ:=0 Ciklus J=1-től NAP-ig ÖSSZ:=ÖSSZ+A(I,J) Ciklus vége ÖSSZ:=ÖSSZ/NAP Ha (I MOD 4)=0 akkor SZ:=SZ+ÖSSZ : SZDB:=SZDB+1 különben NSZ:=NSZ+ÖSSZ : NSZDB:=NSZDB+1 Ciklus vége NAGYOBB:= (SZ/SZDB > NSZ/NSZDB) Eljárás vége. 10.109 * Adott N darab mérés, adjuk meg a legmagasabb csúcsot! Írjuk át a következő megoldást hatékonyabbra! Legmagasabb csúcs: DB:=0 Ciklus I=2-től N-1-ig Ha A(I-1)A(I+1) akkor DB:=DB+1 : CSCS(DB):=I Ciklus vége ACSM:=0 Ciklus J=1-től DB-ig Ha A(CSCS(J)) > ACSM akkor ACSM:=A(CSCS(J)) : MAX:=J Ciklus vége MAXCSCS:=CSCS(MAX) Eljárás vége. 10.110 * Európából Amerikába repültünk repülőgéppel, s az út során X kilométerenként mértük a felszín tengerszint feletti magassá- gát. Elképzelésünk szerint ott van tenger, ahol a mérés 0, s ott föld, ahol a mérés >0. Írjuk át hatékonyabbá a szigetek kezdeteit és végeit megadó eljárást! Eljárás: I:=2 : DB:=0 Ciklus amíg I 0 és A(I-1)=0) I:=I+1 Ciklus vége Ha I 0 és A(I+1)=0) I:=I+1 Ciklus vége Ha I " " vagy I=1 és A$ első karaktere<>" " akkor DB:=DB+1 Ciklus vége Eljárás vége. 10.112 Adott egy számsorozat orgonasíp elrendezésben. Írjuk át haté- konyabbra azt az algoritmust, amely az egymást követő elemek egymástól való eltérését írja ki! Eljárás: Ciklus I=1-től N-1-ig Ha A(I+1) > A(I) akkor Ki: A(I+1)-A(I) különben Ki: A(I)-A(I+1) Ciklus vége Eljárás vége. 10.113 Adott egy számsorozat. A páros sorszámú elemeinek adjuk meg a négyzetét, a páratlanoknak a-1-szeresét! Írjuk át hatéko- nyabbra a következő megoldást! Eljárás: Ciklus I=1-től N-ig Ha I páros akkor B(I):=A(I)*A(I) különben B(I):=-A(I) Ciklus vége Eljárás vége. 10.114 * Adott két rendezett sorozat. Emberek személyi számait tartal- mazzák születési idő szerint sorbarendezve. Írjuk át időben rövidebbre azt az algoritmust, amely a két sorozat összefut- tatását végzi! Eljárás: A(N+1, ):=(9,9,9,9,9,9,9,9,9,9,9) B(M+1, ):=(9,9,9,9,9,9,9,9,9,9,9) I:=1 : J:=1 : K:=0 Ciklus amíg I JJ esetén C(K, ):=B(J, ) : J:=J+1 Elágazás vége Ciklus vége Eljárás vége. 10.115 * Egy táblázatban "*" és " " jelek találhatók. A táblázat ele- meit az algoritmusban látható szabály szerint kell átalakíta- ni! Írjuk át időben gyorsabbra az eljárást! Eljárás: Ciklus I=1-től N-ig Ciklus J=1-től M-ig S:= szomszédos csillagok száma(I,J) Elágazás T(I,J)="*" és S<2 vagy S>3 esetén T(I,J):=" " T(I,J)=" " és S=3 esetén T(I,J):="*" T(I,J)="*" és (S=2 vagy S=3) esetén T(I,J):="*" Elágazás vége Ciklus vége Ciklus vége Eljárás vége. 10.116 Egy síkon pontokat ábrázoló programhoz szükséges véletlensze- rűen választani a 4 síknegyed között. Írjuk át időben rövi- debbre a következő megoldást! Eljárás: Q:=RND(0) Ha Q<0.25 akkor L:=1 különben Ha Q<0.5 akkor L:=2 különben Ha Q<0.75 akkor L:=3 különben L:=4 Elágazások vége Eljárás vége. 10.117 Egy síkon pontokat ábrázoló programhoz szükséges véletlensze- rűen választani a 4 síknegyedből pontot. Írjuk át időben rö- videbbre a következő megoldást! Eljárás: X:=RND(0)*A : Y:=RND(0)*B : L:=RND(4) Ha L=2 akkor X:=-X különben Ha L=3 akkor X:=-X : Y:=-Y különben Ha L=4 akkor Y:=-Y Elágazások vége Eljárás vége. 10.118 Írjuk át gyorsabbra a következő programrészletet! 110 FOR X=1 TO N : FOR Y=1 TO N 120 B(X)=0 : F(X,Y)=0 130 NEXT Y : NEXT X 10.119 Írjuk át gyorsabbra, helyben rövidebbre a következő program- részletet! 10 IF I=1 AND (J=1 OR J=M) OR I=N AND (J=1 OR J=M) THEN 20 ELSE 40 20 IF (F*8/3)-INT(F*8/3) < 0.5 THEN F=INT(F*8/3) ELSE F=INT(F*8/3+1) 30 GOTO 60 40 IF I=1 OR I=N OR J=1 OR J=M THEN 50 ELSE 60 50 IF (F*8/5)-INT(F*8/5) < 0.5 THEN F=INT(F*8/5) ELSE F=INT(F*8/5+1) 10.120 Írjuk át kevesebb helyet foglalóra a következő programrészle- tet! 10 PRINT "P(A)"; : INPUT P(1) 20 IF P(1)>=1 THEN 10 30 PRINT "P(B)"; : INPUT P(2) 40 IF P(2)>=1 THEN 30 50 PRINT "P(C)"; : INPUT P(3) 60 IF P(3)>=1 THEN 50 70 PRINT "P(D)"; : INPUT P(4) 80 IF P(4)>=1 THEN 70 90 PRINT "P(E)"; : INPUT P(5) 100 IF P(5)>=1 THEN 90 110 ... 10.121 Írjuk át kevesebb helyet foglalóra a következő programrészle- tet! 20 ... 30 FOR I=1 TO N 40 FOR J=1 TO M 50 K=RND(0) 60 IF K 3 OR S(X,Y)<2) THEN A$(X,Y)=" " 150 ... 10.123 Írjuk át gyorsabbra a következő programrészletet! 100 ... 110 FOR I=1 TO 9 120 IF S(I)=3 THEN S(I)=0 : GOTO 170 130 FOR J=1 TO 7 140 IF Q(J)=3 THEN Q(J)=0 : GOTO 170 150 NEXT J 160 NEXT I 170 STOP 10.124 Írjuk át kevesebb helyet foglalóra a következő programrészle- tet! 10 R=RND(0) 20 IF R
N OR J>M THEN 150 120 IF A(I)=B(J) THEN PRINT A(I) 130 IF A(I)=0 AND Y>=0 THEN PRINT "1. siknegyed" 120 IF X<0 AND Y>=0 THEN PRINT "2. siknegyed" 130 IF X<0 AND Y<0 THEN PRINT "3. siknegyed" 140 IF X>=0 AND Y<0 THEN PRINT "4. siknegyed" 150 ... 10.133 Írjuk át hatékonyabbra a következő programrészletet! 90 ... 100 INPUT A,B 110 IF A5 OR A<>INT(A) THEN 100 110 IF A=1 THEN X1=X1+1 : GOTO 160 120 IF A=2 THEN X2=X2+1 : GOTO 160 130 IF A=3 THEN X3=X3+1 : GOTO 160 140 IF A=4 THEN X4=X4+1 : GOTO 160 150 IF A=5 THEN X5=X5+1 : GOTO 160 160 IF A>0 THEN 100 170 PRINT X1, X2, X3, X4, X5 180 ...