10. Programelemzés


   A programozástanulás során  az  önálló  feladatmegoldással
egyenrangú módszer lehet  mások  által  írt,  kész  programok
elemzése,  vizsgálata,  átalakítása  valamilyen  szempontból.
Mindez megtehető algoritmusokkal, illetve valamilyen  nyelven
kódolt programokkal.
   Ez a programelemzés hasznos saját programok készítése köz-
ben is, ugyanis így tudjuk programjaink minőségét garantálni.
Éppen ezért e fejezetben olyan kérdésekre  próbálunk  választ
adni, hogy:

   - mit csinál a program (algoritmus)?
   - milyen adatokkal kell kipróbálni a programot?
   - mi a hiba a programban?
   - hogyan lehet a programot (algoritmust) hatékonyabbra ír-
     ni, azaz időben gyorsabbra, kevesebb memóriát használóra
     (rövidebb  programszöveg,  kevesebb  változó),  valamint
     egyszerűbbre?

   Egy program helyes működését teszteléssel ellenőrizhetjük,
amely nem garantálja a program hibamentességét, csupán  való-
színűsíti azt. Ha a tesztelés során azt látjuk, hogy a  prog-
ram hibásan működik, akkor meg kell keresnünk a hibát.  Ez  a
hibakeresés. Ha megtaláltuk, majd  kijavítottuk,  a  folyamat
újra kezdődik, hiszen meg kell győződnünk róla, hogy most már
helyesen működik programunk.
   Szükségünk lehet más által  írt  eljárásokra,  programokra
is. Ebben az esetben el kell tudnunk dönteni, hogy mit csinál
a program, esetleg tesztelnünk is kell.


Javasolt irodalom:

1. Várkonyi Zs.: Bevezetés a modern programtesztelésbe
   Műszaki Könyvkiadó, 1979.
2. Varga L.: Programok analízise és szintézise
   Akadémiai Kiadó, 1981.
3. Szlávi P. - Zsakó L.: Módszeres programozás
   Műszaki Könyvkiadó, 1986.
4. Számítástechnika középfokon
   OMIKK, 1987.


10.1 Mit csinál a program?


   Más által írt programok használatakor, vagy hibásan működő
programrészek hibáinak megfejtéséhez szükségünk  lehet  annak
felderítésére, hogy mit csinál az adott programrész. Hosszabb
program esetén ez meglehetősen bonyolult feladat, ezért  cél-
szerű  részekre  bontani.  Néhány  soros  programrészletekről
könnyebben eldönthetjük, hogy milyen bemenő  adatokra  milyen
utasításokat végez el a gép és milyen  kimenő  értékeket  ka-
punk.
   Ugyanaz a programrész természetesen más  ágon  futhat  le,
más eredményt adhat attól függően, hogy melyek a bemenő  ada-
tok. Ezért a program működését nem csak kitalálni kell, hanem
lehetőleg szabatos matematikai gondolkodás alapján belátni.


10.2 Tesztelés


   A program megírása után meg kell vizsgálnunk, hogy azt te-
szi-e amit elvárunk tőle. Ezt nevezzük tesztelésnek. A  tesz-
telésnek két logikailag eltérő módszere van:

   1. Statikus tesztelés, amikor a program szövegét  vizsgál-
      juk. Eközben kódellenőrzést,  formai és tartalmi ellen-
      őrzést végzünk.

   2. Dinamikus tesztelés:  a program végrehajtását  vizsgál-
      juk.  Ezt  a módszert még két további csoportra szoktuk
      osztani aszerint,  hogy a program adatait vizsgáljuk-e,
      s eszerint próbálunk tesztadatokat gyártani (fekete do-
      boz módszer) vagy a szerkezete, a logikája alapján (fe-
      hér doboz módszer).

   Egy program ellenőrzését célszerű az első módszerrel  kez-
deni, mert így a hibák jelentős része kiszűrhető.


10.3 Hibakeresés

   Hibakeresésről akkor beszélünk, ha már  tudjuk,  hogy  van
hiba a programban, csak még nem tudjuk, hogy  milyen  jellegű
és hol található. Az első 19 feladatban algoritmusnyelven írt
programok szerepelnek. Ezekről is tudjuk,  hogy  hibásak,  de
nem futtatuk őket, tesztadatok tehát nem állhatnak  rendelke-
zésünkre. Ezen feladatokat próbáljuk először gondolkodva  vé-
gigkövetni, bennük a hibákat megtalálni! Ha így nem sikerült,
akkor kódoljuk, majd futtassuk le őket és a tesztadatok alap-
ján keressük a hibát! Módszerek:

   1. Az  indukciós  módszer  szerint rendezzük a rendelkezé-
      sünkre álló tesztadatokat.
   2. A dedukciós módszer lényege: a hiba lehetséges okai kö-
      rének szűkítése.
   3. Visszalépéses módszer:  a hiba előfordulásának helyétől
      visszafelé követi  a  program  végrehajtását mindaddig,
      amíg az adatok hibásak.

Hibakeresési eszközök:

   1. Kiírás
   2. Töréspontok elhelyezése
   3. Nyomkövetés
   4. Változófigyelés
   5. Lépésenkénti végrehajtás
   6. Memoriakiírás
   7. llapotellenőrzés
   8. Tartalmi ellenőrzés

Programozási típushibák:

   1. Gépelési, névválasztási hibák
   2. ltalános vezérlési hibák
   3. Elágazásszervezési hibák
   4. Ciklusszervezési hibák
   5. Bemeneti adatok hibái
   6. Változókkal kapcsolatos hibák
   7. Aritmetikai kifejezések hibái
   8. Tömbökkel kapcsolatos hibák
   9. Eljárások használatának, paraméterezésének hibái


10.4 Hatékonyabbra írás

rjunk algoritmust az első N természetes szám négyzete össze-
gének kiszámítására!

   Eljárás:
      S:=0
      Ciklus I=1-től N-ig
         S:=S+I^2
      Ciklus vége
   Eljárás vége.

Az eljárás helyes eredményt ad, de nem elég hatékony. I^2 he-
lyett I*I-t használva máris gyorsabbá tehetjük.  A  feladatot
sokkal egyszerűbben is meg lehet oldani egy matematikai tétel
felhasználásával:

   Eljárás:
      S:=N*(N+1)*(2*N+1)/6
   Eljárás vége.

   Az ilyen és ehhez hasonló esetekben van  szükség  a  haté-
konyság vizsgálatára. Egész sor olyan módszer  létezik,  ame-
lyek alkalmazásával a programot hatékonyabbá írhatjuk.
   Hatékonyabbra íráson a végrehajtási  idő,  a  helyfoglalás
(programszöveg és adatok), valamint a bonyolultság  (elkészí-
tési-, megértési idő, szükséges tudás) csökkentését értjük.