A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere



Hasonló dokumentumok
Programozás 5. Dr. Iványi Péter

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Információs Technológia

Bevezetés a C++ programozási nyelvbe

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Elôszó a magyar kiadáshoz A Kiadó Elôszó

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Objektumorientált programozás C# nyelven

3. Gyakorlat Ismerkedés a Java nyelvvel

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Objektumorientált programozás C# nyelven

15. Programok fordítása és végrehajtása

Információs Technológia

Osztály és objektum fogalma

2.3. A C nyelv utasításai

Programozás C++ -ban 2007/4

Feladat: Hogyan tudunk létrehozni egy olyan vector nevű tömb típust, amely egy háromdimenziós térbeli vektort reprezentál?

Szupermikroprocesszorok és alkalmazásaik

Java II. I A Java programozási nyelv alapelemei

Internet programozása. 3. előadás

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Máté: Számítógép architektúrák

Bevezetés a C++ programozásba

Operációs rendszerek előadás Multiprogramozott operációs rendszerek

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

1. Az utasítás beolvasása a processzorba

4. Programozási nyelvek osztályozása. Amatőr és professzionális

Dr. Schuster György október 14.

Programozás alapjai 1. (BMEVIEEA100)

Programozás I gyakorlat. 5. Struktúrák

C# gyorstalpaló. Készítette: Major Péter

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozás 1. Dr. Iványi Péter

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás I. 5. Előadás: Függvények

Programozás C és C++ -ban

Budapesti Műszaki és Gazdaságtudományi Egyetem Automatizálási és Alkalmazott Informatikai Tanszék INFORMATIKA 2 ADATBÁZISOK

Információs Technológia

Programozás 3. Dr. Iványi Péter

Objektumorientált programozás C# nyelven III.

Memóriakezelés, dinamikus memóriakezelés

Programozás alapjai. 10. előadás

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

C programozási nyelv

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Java II. I A Java programozási nyelv alapelemei

C programnyelv 1. Kedves Kollegina, Kolléga!

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Pénzügyi algoritmusok

Bevezetés a programozásba 2

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Országzászlók (2015. május 27., Sz14)

Körkörös listák. fej. utolsó. utolsó. fej

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

C programozási nyelv

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

A programozás alapjai 1 Rekurzió

Programozás II gyakorlat. 4. Öröklődés

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

1. Alapok. Programozás II

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

C++ programok fordítása

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Bevezetés a programozásba Előadás: A const

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

INFORMATIKAI ALAPISMERETEK

Programozás. Programozás villamosmérnököknek

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

2014 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

AVR assembly és AVR C modulok együttes használata AVR C projektben. Összeállította: Sándor Tamás

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Óbudai Egyetem. C programozási nyelv

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Ipari Robotok Programozása

Csak felvételi vizsga: csak záróvizsga: közös vizsga: Mérnök informatikus szak BME Villamosmérnöki és Informatikai Kar május 30.

Objektumorientált programozás C# nyelven

10. gyakorlat. Pointerek Tárolási osztályok

Dr. Illés Zoltán

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Csak felvételi vizsga: csak záróvizsga: közös vizsga: Mérnökinformatikus szak BME Villamosmérnöki és Informatikai Kar május 27.

Szoftvertechnológia alapjai Java előadások

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Bevezetés, a C++ osztályok. Pere László

10. gyakorlat Tömb, mint függvény argumentum

Programozható logikai vezérlõk

Fordítóprogramok felépítése, az egyes programok feladata. A következő jelölésmódot használjuk: program(bemenet)(kimenet)

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Átírás:

2012. április 10. A PROGAMOZÁS ALAPJAI 1 Vitéz András egyetemi adjunktus BME Híradástechnikai Tanszék vitez@hit.bme.hu Miről lesz ma szó? alaki szabályok használata - mintapélda használata - mintapélda Bitmezők tipikus felhasználása Változók tárolása Tárolási osztályok Függvény lokális változói Változók élettartama Változók láthatósága. program modulok tesztelés hibalehetőségek hibakezelés, const és assert használata dokumentáció megjegyzések Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül!). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk. Legyen egy típusunk síkbeli pontok ábrázolására! Két ilyen pont alkosson egy szakaszt! Írjunk függvényt annak a pontnak a meghatározására, amely a szakaszt adott arányban osztja! oszt() A függvénynek legyen paramétere egy függvény, amely két érték közötti interpolációt számol! arany() Az osztópont koordinátáit ennek segítségével számítsuk ki! typedef struct{double x,y;pont; double arany(double also,double felso,double c) {return also+c*(felso-also); pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; int main(){ pont q1,q2,q3;... q3=oszt(q1,q2,0.4,arany);... Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül!). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk. 1

typedef struct{double x,y;pont; double arany(double also,double felso,double c) {return also+c*(felso-also); pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; int main(){ pont q1,q2,q3;... q3=oszt(q1,q2,0.4,arany);... Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül!). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk. typedef struct{double x,y;pont; double arany(double also,double felso,double c) {return also+c*(felso-also); pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; int main(){ pont q1,q2,q3;... q3=oszt(q1,q2,0.4,arany);... Függvény paramétere függvény is lehet. Láttuk, hogy ilyenkor a függvényre mutató mutatót adunk át. Formális paraméterként a függvény fejlécét kell megadni. Aktuális paraméterként csak a függvény azonosítóját kell megadni (zárójelek nélkül!). Hivatkozni rá a formális paraméter zárójeles alakjával tudunk. typedef struct{double x,y;pont; double arany(double also,double felso,double c) {return also+c*(felso-also); pont oszt(pont p1,pont p2,double r, double f(double,double,double)){ pont p; p.x=f(p1.x,p2.x,r); p.y=f(p1.y,p2.y,r); return p; int main(){ pont q1,q2,q3;... q3=oszt(q1,q2,0.4,arany);... Megkülönböztetett egyesítés (diszjunkt unió) logikailag azonos értelemben használt akár különböző típusú adatokból álló egyszerű adattípus 2

Deklarációja: Ha tejet vásárolunk, a zsírtartalom, ha kenyeret, a gabona fajtája jellemzi. Alakilag megegyezik a struktúráéval, csak struct helyett union kulcsszó kell. typedef enum {arpa,buza,rozs,zab gabona; typedef enum {vizes,tejes,sos,sajtos iz; union etel { gabona kenyer; float tej; iz kifli; e1,*ep; Tagok elérése: Alakilag megegyezik a struktúra tagokéval. e1.tej = 3.6; Belső ábrázolása: A tárolás helyigényét a leghosszabb változat határozza meg. 9.c AAAA Balogh Buda Kiss Döme Rák Emil ZZZZ felelet 3 röpdolgozat 2 témazáró 5 témazáró 4 felelet 4 röpdolgozat 5 röpdolgozat 4 3

9.c 9.c AAAA Balogh Buda Kiss Döme Rák Emil ZZZZ AAAA Balogh Buda Kiss Döme Rák Emil ZZZZ felelet 3 röpdolgozat 2 témazáró 5 felelet 3 röpdolgozat 2 témazáró 5 témazáró 4 felelet 4 témazáró 4 felelet 4 röpdolgozat 5 röpdolgozat 5 röpdolgozat 4 röpdolgozat 4 9.c 0 Eöregh Elemér -1 0 7.a...... 1 7.b 174 Balogh Buda 6 2 8.a 175 Tulok Ferdinánd -2 3 8.b...... 4 9.a 190 Kiss Döme 6 5 9.b...... 6 9.c 203 Rák Emil 6 7 10.a...... 8 10.b... AAAA 174 190 203 ZZZZ felelet 3 röpdolgozat 2 témazáró 5 témazáró 4 felelet 4 röpdolgozat 5 röpdolgozat 4 typedef enum{ felelet, ropdolgozat, temazaro jegy_tipus; typedef struct x{ jegy_tipus miert; short osztalyzat; struct x *kovetkezo_jegy; jegy,*jegy_mutato; typedef struct y{ char nev[48]; jegy_mutato jegyek; struct y *kovetkezo_tanulo; tanulo,*tanulo_mutato; typedef struct { char osztaly_neve[4]; tanulo_mutato tanulok; osztaly; typedef enum{felelet,ropdolg,dolgjegy_tipus; typedef union z{ struct{ unsigned index; union z *jegyek; union z *kovetkezo_tanulo; tanulo; struct{ jegy_tipus miert; short osztalyzat; union z *kovetkezo_jegy; jegy; diak,*diak_mutato; typedef struct { char osztaly_neve[4]; diak_mutato tanulok; osztaly; Bitmezők Egy változóban valójában több (néhány bites) változót tárolunk. Elsősorban eszközök státuszregisztereinek kényelmes kezelésére találták ki. Nem kell kimaszkolni a kezelni kívánt biteket. Nem kell léptetni ahhoz, hogy a változó igazi értékével dolgozhassunk. 4

Bitmezők Bitmezők Megvalósítása struktúraként! Megvalósítása struktúraként! A tag típusaként int vagy unsigned int típust kell megadni. : után elő kell írni a bitben értendő mezőszélességet. Bitmezők Bitmezők struct { unsigned a : 1; unsigned b : 2; unsigned c : 1; statusz; statusz.b = 3; statusz.a = statusz.c = 0; Megjegyzések: A megvalósítástól függ, hogy balról-jobbra, vagy jobbról-balra történik a bitek kiosztása. Névtelen mezők is megadhatók, de később nem hivatkozhatunk rájuk. 0 mezőszélesség megadása jelenti a mező szóhatárra illesztését, ha az adott rendszerben a szóhatár átlépése egyáltalán megengedett. Tárolási osztályok Külső A program bármely függvényéből elérhető (a függvényeken kívül deklarált) Automatikus Csak az adott függvényen belül elérhető (a függvényen belül deklarált) Tárolási osztályok Statikus Külső A többi modul elől elrejtett Automatikus Egyetlen közösen használt példány static int a=0; Ebben a változóban számlálhatjuk pl., hogy a függvényt hány alkalommal hívták meg a program futása során, vagy megjegyezhetjük a futás során előforduló legnagyobb számított értéket, stb. 5

Tárolási osztályok Tárolási osztályok Regiszter Regiszterben tárolandó, ha lehet gyakran akarunk hivatkozni rá csak, ha a belső ábrázolás lehetővé teszi csak, ha van elég regiszter figyelmeztetés nélkül figyelmen kívül hagyható változó és függvényparaméter is lehet register int a; double d(register int b){... Kezdőérték hozzárendelése a változóhoz kezdetiérték adás kezdeti értékadás Külső Garantáltan kinullázódik (bármit is jelentsen) Konstans kifejezés előírható Automatikus Kezdőérték bizonytalan lehet Tetszőleges kifejezés előírható Statikus Csak az első belépéskor hajtódik végre Függvény lokális változói A függvények lokális változói két csoportot alkotnak: - a függvény paraméterei - a függvény automatikus változói (ezeket a függvényen belül deklaráltuk) A két csoportban használt azonosítók nem ütközhetnek! Függvény lokális változói A függvények lokális változóit a veremben (stack) tároljuk. Az elnevezés arra utal, hogy ez egy LIFO szervezésű memória terület (Last In First Out) Eredetileg arra szolgál, hogy itt tároljuk a szubrutinok visszatérési címét, illetve adatokat átmenetileg tároljunk. Magasszintű nyelveknél általában a veremben történik: - a kifejezések kiértékelése - paraméterek átadása a függvénynek - a függvény adminisztratív információjának tárolása - helyfoglalás a függvény belső változóinak Függvény lokális változói Az egy függvényhez tartozó adatokat együtt tartjuk egy szegmens mezőnek (stack frame) nevezett területen. Függvény lokális változói A függvény lokális változóit az adminisztratív blokkhoz képest relatív címzéssel érjük el. (Ezt a báziscímet az Intel processzorokban külön erre a célra szolgáló regiszter a bázis pointer tárolja.) automatikus változók adminisztratív blokk átvett paraméterek 6

Változók élettartama A külső változók élettartama a program teljes futási ideje. A dinamikus változók létrehozásuktól megszüntetésükig léteznek. (illetve addig hivatkozhatók, amíg mutat rájuk érvényes pointer) Azt a memória területet, ahol dinamikus változókat tárolhatunk, heap-nek nevezzük, ezért szokásos a dinamikus változókról mint kazal -változókról beszélni. A blokkokban deklarált változók élettartama a blokkhoz kötött (függetlenül attól, hogy a függvény blokkja, vagy azon belüli) Ezeket a változókat szokás verem -változóknak nevezni. Változók élettartama Az átvett paraméterek fizikailag akkor jönnek létre, amikor a hívó programrészlet az aktuális paramétereket kiértékeli, és ennek során elhelyezi a veremben. Változóként a függvény végrehajtásának kezdetétől a visszatéréséig hivatkozhatók. Fizikailag a visszatérés után a hívó programrészlet feladata, hogy a vermet felszabadítsa. Változók láthatósága Általános szabály, hogy a fordító nem lát bele a blokkokba. Változókra csak kifejezésben hivatkozhatunk, kifejezés csak utasítás része lehet, utasítás pedig csak blokkon belül állhat. A blokkok korlátlanul egymásba skatulyázhatók. Mindezek alapján elegendő azt vizsgálnunk, hogy mely változók hivatkozhatók egy blokkon belül. Változók láthatósága Ha a fordító a hivatkozott azonosító deklarációját a blokkon belül megtalálja, nem keres tovább. Ha nem találja meg, egy blokkal kijjebb keresi. Ha ott sincs, tovább halad kifelé, majd a függvény paraméterei következnek, azután a külső változók. Ha nem találja, azt feltételezi, hogy másik modulban van. Változók láthatósága Találat esetén a fordító a megtalált változóra vonatkozónak tekinti a hivatkozást, ezért, ha a keresésben később következő helyen is van egyező azonosítójú változó, az az adott blokk utasításai számára nem látható. Azt mondjuk, hogy a blokkban deklarált változó elfedi a másikat. Változók láthatósága A blokkra nézve lokális változók: - a blokkban deklarált változók - a blokkot tartalmazó függvény paraméterei A blokkra nézve globális változók: - a blokkot magába foglaló blokkokban deklarált változók - a külső változók - a társ modulok külső változói közül a nem statikusak A globális változók közül csak az el nem fedettek hivatkozhatók. 7

Változók láthatósága #include <stdio.h> int i; int a(int i){ return i+1; void b(int*q){ int i; i=*q+3; *q=2*i; int main(){ int*p; i=a(4); p=&i; { int i; for(i=0;i<3;i++) b(p); printf("%d\n",i); return 0; Attól, hogy helyes algoritmust választottunk, még nem biztos, hogy hibátlanul is kódoltuk. A program részleteit alulról felfelé haladva teszteljük. Csak a már tesztelt függvények működésében bízhatunk. A program minden lehetséges ágát ki kell próbálni. A teszteléshez használt bemenő adatsor alkalmas megválasztása nem mindig egyszerű feladat. Azt, hogy a program kívánt pontjára eljutottunk-e, és ott kritikus változóink az elvárt értéket mutatják-e, két szokásos módon tudhatjuk meg. Ha van debugger segédprogramunk, break point-okat helyezhetünk el a programban. A futást átmenetileg megállítva, megvizsgálhatjuk a változók értékét. Lehetőség van a megállást feltételhez kötni, például adott kifejezésnek egy kijelölt tartománybeli értékéhez, vagy az adott pont érintésének számának minimális vagy pontos értékéhez. A másik szokásos eljárás a trace-elés. A program adott pontjain kiíratjuk a kritikus változók pillanatnyi értékét. Mivel erre a kódra a tesztelés végeztével nem lesz szükségünk, feltételes fordítást alkalmazunk. #define TESZT... #ifdef TESZT printf( A hűtés hatására a hőfok %d\n,t); #endif 8

Ha egy vezérlési ágba túl bonyolult módon lehetne eljuttatni a programot, a többi változó érintetlenül hagyása mellett csalhatunk is. Erre is a feltételes fordítás teremt lehetőséget. #define TESZT 8... #if TESZT==8 a=171; #endif switch(a){... case 171:... Hibalehetőségek: Hibás adatok fájlból: az adatok szerkezete vagy alakja nem felel meg a feltételezésnek (előírásnak) felhasználótól: téves adatokat visz be (elnézi a sort, elírja, stb.) Hibalehetőségek: Programhibák tervezési hibák kódolási hibák A beolvasott adatokat mindig ellenőrizzük! Hibalehetőségek: A leggyakoribb kódolási hibák == helyett = ritkán használt operátorok precedenciájának téves feltételezése for zárójele után ; utólagos utasítás beszúráskor { elmardása ciklus végrehajtása nem érinti a leállási feltételt mutató mutatója függvény paramétereként Tipikus programozói hibák The last C bug of the world: while (1) { status = GetRadarStatus(); if (status = 1) LaunchMissiles(); 9

Hibalehetőségek: A leggyakoribb kódolási hibák túl sok átláthatatlan mellékhatás,ezért M I S S Make It Simple and Straight (Stupid) Hibakezelés: Ha futás közben kiderül, hogy valami elromlott, de nem azonosítható, hogy mi okozta a hibát, legjobb azonnal abbahagyni a végrehajtást, mielőtt a hiba továbbterjed! Az assert makro használatával egy feltételhez kötötten kiválthatjuk a program azonnali elhalását. Hibamegelőzés: A C nyelvben nincs szükség konstansokra, mert ezt a szerepet a makro tölti be. Ha azonban egy adatot a const kulcsszó segítségével állandónak minősítünk, elejét vehetjük annak, hogy véletlenül megváltoztassuk az értékét. Ezt még mutatón keresztüli indirekcióval sem lehet megtenni. Hibamegelőzés: Ha ugyanazokat a header fájlokat több modul használhatja, megakadályhatjuk a bennük előforduló elemek többszöri deklarációját: Például: a korábbi példánkban látott P20.h tartalma legyen: #ifndef P20_H #define P20_H void egyesit(char**,char*); #endif Dokumentáció: Dokumentáció: Ha a programunk termék, akkor számos vázlatot, tervet, kézikönyvet kell elkészíteni, hogy átadható legyen. Ha csak a karbantartás és a későbbi fejlesztések lehetővé tétele a cél, akkor minimalizálhatjuk a szükséges dokumentáció mértékét. Ilyen esetben is dokumentálni kell azonban az alkalmazott adatszerkezteket. Ha az érthetőség megkívánja, ábrával is szemléltetni kell. Rögzíteni kell a programban megvalósított algoritmusokat (ábra és/vagy pszeudokód) A program forráskódját kommentezni kell. Részletesen jegyzőkönyvezni kell a program tesztelését (teszt adatsorok és a program válasza) 10

Kommentezés: Minden modul fejlécében szerepelnie kell: Ki fejlesztette? Utolsó módosítás dátuma Esetleges verziószám Mely modulokkal működik együtt? Ha vannak globális változók, mi a szerepük? Kommentezés: Minden függvény fejlécében szerepelnie kell: Mit csinál a függvény? Az átvett paraméterek szerepe. A belső változók szerepe A függvény törzsében olyan mértékben kell kommentezni, hogy az algoritmus lépései azonosíthatók legyenek. 11