Megjegyzések az 1. Zh-hoz

Az alábbi visszatérő hibákkal találkoztam a zh javítása során.

 

1.      Nem tiszta még mindig mindenki előtt az algoritmikus nyelv 'amíg-os ciklus’-ának sze­mantikája. Vagyis, hogy addig kell a ciklusmagot végrehajtani, amíg a feltétel logikai értéke IGAZ, más szóval akkor kell a ciklust elhagyni, amikor a feltétel HAMIS. Nem csökkenti az elírást az a tény, hogy van olyan programozási nyelv, amelyben van olyan ciklusféle, amiben a kilépés feltételét kell megfogalmazni.

2.      A ’számlálós’ ciklus (mint a Pascal-beli ’For’-ciklus) ciklusváltozójának direkt módosítás tilos, mivel ezt a ciklust szervező kód automatikusan és definíciószerűen végzi. Ha ok van arra. hogy a ciklusváltozó értéke időnként „szabálytalanul” módosuljon, akkor ’amíg-os ciklus’-sal kell az algoritmust (és a kódot) megvalósítani.

Helytelen

Helyes


Változó i,N
:Egész

Ciklus i=1-től N-ig
 
  Ha f(i) akkor i:=N+1 [
a Szerző ki
                       
akar lépni]
Ciklus vége

Ciklus i=1-től N-ig
 
  i:+2 [
a Szerző kettesével szeretne
        haladni a feldolgozásban]
Ciklus vége


Változó
i,N:Egész

i:=1
Ciklus amíg i
£N és nem f(i)
 
Ciklus vége

Ciklus i=1-től N-ig 2-esével
 
Ciklus vége

 

Helyes Pascal kód

 


Var
i,N:Integer;

i:=1;
While (i
£N) and not f(i) do
Begin

 
End;

i:=1;
While i
£N do
Begin

 
  Inc(i,2);
End;

3.      Nem mindegy –sokszor– a több tényezős vagy tagos feltételek részkifejezéseinek sorrendje!

Helytelen

Helyes

Ciklus amíg T(x(i)) és i£N
 
Ciklus vége

Ciklus amíg i£N és T(x(i))
 
Ciklus vége

Magyarázat: mivel a logikai műveletek (többnyire[1]) nem szimmetrikusak, azaz ha a feltétel logikai értéke már kiderült, akkor a továbbiak kiértékelése elhagyandó. Így a helyes példában i>N-re a T(x(i)) nem értékelődik ki, azaz index-túllépési hiba nem történik, amint a helytelen esetében.

4.      Az eljárás (függvény és operátor) hívásakor[2] felesleges, sőt tilos az aktuális paraméterek típusának explicit kiírása.

Helytelen

Helyes


Változó
aktPar1:Típus1
        aktPar2:Típus2
 
 
Elj(aktPar1:Típus1, aktPar2:Típus2)
 


Változó
aktPar1:Típus1
        
aktPar2:Típus2
 
 
Elj(aktPar1, aktPar2)
 

Megjegyzem: a híváskor persze a hozzáférési jog (Változó/Konstans) megadása éppen úgy tilos, mint a típusé! Az persze természetes, hogy az eljárás (függvény és operátor) definiálásakor viszont szükségesek:

Helytelen

Helyes


Eljárás
Elj(aktPar1,aktPar2):
  eljárás törzse
Eljárás vége.


Eljárás
Elj(Konstans aktPar1:Típus1,
            Változó aktPar2:Típus2):
  eljárás törzse
Eljárás vége.

5.      Sokak számára az utófeltétel célja (s nem „csupán” a formalizmusa) homályos. Az utófeltétel NEM az ALGORITMUS leírás szavakkal! Célja, hogy precízen (ezért leginkább formális eszközökkel) fogalmazzuk meg a program (részprogram=eljárás/függvény/operátor) által elérendő célt (=adatváltozást), nem a célhoz vezető utat.

6.      Az operátor olyan függvény vagy eljárás, amely hívási szintaxisa eltér a függvényekétől, vagy eljárásokétól. Vannak „hagyományos” bináris, infix jelöléssel használatosak (pl. „=”, vagy „:=”), de vannak „szokatlanabb” szintaxissal alkalmazandók is (pl. „Be:”, vagy tömb-indexe­lés).

Helytelen

Helyes

Függvény Kisebb(Konstans s1,
                   s2:Szöveg):Logikai
 
  Kisebb:=…
Függvény vége.

ekkor az illeszkedő hívás alakja:


  Ha Kisebb(s,ss) akkor

Infix Operátor Kisebb(Konstans s1,
                   s2:Szöveg):Logikai
  Másként s1<s2 [
itt derül ki a hívás-
                   kori műveleti jel
]
 
  Kisebb:=…
Operátor vége.

ekkor az illeszkedő hívás alakja:


  Ha s<ss akkor

7.      Sajnálatos módon sokan nem ismerik a Szöveg-típust. Közhiedelem, hogy karaktertömb, aminek értelmes dolog adottadik elemére hivatkozni. Ki kell jelentenem, a Szöveg olyan típus, amelyhez azon műveletgarnitúra egyike van hozzárendelve, amelyek az előadáson elhangzottak (vagy a mikrológiában, PowerPoint-os bemutatón olvashatók).

 

Nagy-nagy tisztelettel hívom föl a Hallgató figyelmét, hogy az 1-4. hibák bármelyikének elkövetésének egyes gyakorlati jegyet von maga után.



[1] Ha mást nem mondunk. L. a ’Programtranszformációk’-ról szóló (2001.11.12-i) előadást.

[2] Remélem, itt és most definiálás nélkül is világos a ’hívás’ szó jelentése