Vissza az előzőleg látogatott oldalra (nem elérhető funkció)Vissza a tananyag kezdőlapjára (P)Ugrás a tananyag előző oldalára (E)Ugrás a tananyag következő oldalára (V)Fogalom megjelenítés (nem elérhető funkció)Fogalmak listája (nem elérhető funkció)Oldal nyomtatása (nem elérhető funkció)Oldaltérkép megtekintése (D)Keresés az oldalon (nem elérhető funkció)Súgó megtekintése (S)

Informatika oktatása / Az informatika tanítási módszerei /2. Programozási nyelv tanítási módszerek

Az informatika tanítási módszerei

2. Programozási nyelv tanítási módszerek

A magasszintű programozási nyelvek megjelenése után nem sokkal megkezdődött a programozási nyelvek tanítása. Először inkább „művészetként”, később azonban egyre tudatosabban, módszeresebben történt. Meg kell azonban állapítani, hogy a programozási nyelvek, mint „nyelvek” tanításának módszerei kidolgozottságban, melységben és sajnos hatásosságban meg sem közelítik a természetes nyelvek tanításának módszereit.

Az alábbiakban a legelterjedtebb programozási nyelv tanítási módszereket tekintjük át:

A. Utasításorientált

Az utasításorientált módszer a programozási nyelvet, mint utasítások halmazát definiálja [AD]. A nyelv megtanítását, mint a halmaz elemeinek megtanítását képzeli el. (Legrosszabb esetben ráadásul ábécé sorrendben.) A halmazként elképzelés arra is utal, hogy a halmaz összes elemét, azaz a nyelv összes utasítását meg kell tanítani (ami egy közismert informatika oktatási téveszméhez vezet). Mindemellett könnyen megjósolható a nyelv elsajátításának mélysége: az utasítások egymással és a felhasználás mikéntjével való kapcsolat híján csupán lexikális ismeretek halmaza.

Megjegyzés

Ez az elképzelés programozási nyelvekről szóló könyvek alapján alakult ki. A programozási nyelvkönyvek ugyanis még nem érték el azt a fejlettségi fokot, amit a természetes nyelveknél megszokott. Itt legtöbbször ugyanaz a könyv szolgál a nyelv hivatkozási kézikönyveként (ez célszerűen ábécésorrendű), nyelvtankönyvként, szótárként, ...

Ez az elképzelés abban sem segít, hogy mely elemek fontosak és melyek nem, nem garantált az sem, hogy a megtanult elemeket a későbbiekben újra fel fogjuk használni valamire.

Ha így képzeljük el a nyelvet, akkor azt is állítjuk, hogy a nyelv elemek strukturálatlan egysége, az elemekből való programépítéshez nincs szükség semmi újabb ismeretre, az majd „magától kialakul”.

Vissza a tartalomjegyzékhez

B. Segédeszközként alkalmazás

Sok olyan programozás tanítási módszer van, ahol a kódolás többé-kevésbé automatizált tevékenység, kódolási szabályok, kódolási konvenciók segítségével végezhető. Ebben az esetben a programozási nyelv, mint a kódolási folyamat végeredménye jelenik meg. Mindig csak annyira van szükség belőle, mint amennyire az algoritmusaink kódolásához feltétlenül szükségünk van [SzPZsLTT1].

Nézzünk erre néhány példát (Pascal kódolási szabályok):

Algoritmikus utasítás (magyar kulcsszavakkal)

Pascal kódmegfelelő

Be: változók [feltételek]

Repeat
write('kérdés?');
readln(változók)
until feltételek;

Ha feltétel akkor
utasítások

különben
utasítások
Elágazás vége

If feltétel then begin
utasítások
end
else begin
utasítások
end;

Ciklus amíg feltétel
utasítások
Ciklus vége

While feltétel do begin
utasítások
end;

Ennél a módszernél garantált, hogy a megtanult nyelvi elemeket használni is fogjuk. Mivel a programozási ismeretekben a struktúrák, algoritmikus elemek, adattípusok rendszeresen ismétlődnek, ezért még azt is elmondhatjuk, hogy a megtanult elemeket gyakran kell használni.

Vissza a tartalomjegyzékhez

C. Szoftvertechnológia-orientált

Temesvári Tibor ezen az elven építi fel az objektumorientált programozást és annak megvalósítását Pascal és C++ programozási nyelven. Elsőként áttekinti az objektumorientált programozást általában (1. OOP jellemzői, 1.1. Osztályok és objektumok, 1.2. Egységbe zárás – Encapsulation, 1.3. Öröklés – Inheritance, 1.4. Az öröklés megvalósítása, 1.5. Az öröklés haszna, 1.6. Többszörös öröklés, 1.7. Típuskompatibilitás, 1.8. Többalakúság – Polimorfizmus, 1.9. Dinamikus kötés – Dinamic Binding, 1.10. Virtuális metódus, 1.11. Metódusok végrehajtása, 1.12. Objektum-orientált programozási nyelvek), amiben nem tér ki konkrét programozási nyelvi ismeretekre, hanem csak az objektumorientált technológiával foglalkozik.

Ezt követi a második fejezetben a megvalósítási lehetőségek, azaz a programozási nyelvi ismeretek tanítása (2. OOP Pascalban, 2.1. Tervezés, 2.2. Osztály definiálása, 2.3. Interface rész, 2.4. Implementációs rész, 2.5. Self, 2.6. Objektumok deklarálása, 2.7. Objektumok használata, 2.8. Öröklés, 2.9. Az ősben definiált eljárások hívása, 2.10. Újradefiniált metódusok, 2.11. Virtuális metódustábla – VMT, 2.12. Konstruktor eljárások, 2.13. Dinamikus metódusok, 2.14. Dinamikus metódustábla (DMT), 2.15. Típuskompatibilitás, 2.16. Dinamikus objektumok, 2.17. Dinamikus objektumok felszabadítása, destruktor eljárás). [SzPZsLTT2]

Hasonlóan valamely szoftvertechnológia (az OOP-t, az adatbázis-kezelést, a COM-, és a web-programozást) jelenti a Delphi nyelv feldolgozás vezérfonalát Marco Cantů könyvében: [MC]. A web-fejlesztés témakörben láthatunk erre jó példát Kris Jamsa és társai művében [JKLSWS]. Olyan új paradigmák is hathatnak a programozási nyelvoktatásra, mint az aspektus-orientált és a generikus programozás. [PZKTZsV]

Vissza a tartalomjegyzékhez

D. Feladattípus-orientált

Ebben az esetben a programozási nyelv elemeit azért vezetjük be, mert a feladatmegoldás során szükségünk van rá. Az egyes elemek nem azért kerülnek elő, mert valamilyen oktatási cél vezérel minket, hanem azért, mert nélkülük a soron következő feladat nem oldható meg. [TSzMZsL]

Az alábbi feladatsor egy általunk kidolgozott PROLOG bevezető óráról származik (Turbo PROLOG rendszerre építve, de magyar nyelvű pszeudokódot használva):

1. lépés: tények

apja(apa,gyerek).

anyja(anya,gyerek).

2. lépés: szabályok

szülője(X,Y) ha anyja(X,Y).

szülője(X,Y) ha apja(X,Y).

3. lépés: vagy művelet a szabályokban

szülője(X,Y) ha anyja(X,Y) vagy apja(X,Y).

4. lépés: és művelet a szabályokban

nagyszülője(X,Y) ha szülője(X,Z) és szülője(Z,Y).

5. lépés: rekurzió a szabályokban

őse(X,Y) ha szülője(X,Y) vagy szülője(X,Z) és őse(Z,Y).

6. lépés: „akármi” érték a paraméterek helyén

szülő(X) ha szülője(X,_).

7. lépés: nem művelet, azaz tagadás a szabályokban

nemszülő(X) ha szülője(_,X) és nem(szülője(X,_)).

8. lépés: vágás művelet a szabályokban

egyszülő(X) ha szülő(X) és !.

9. lépés: kiírás, valamint azonosan hamis formula a szabályokban

összesszülő ha szülő(X) és write(X) és fail or nl.

10. lépés: egyenlőségvizsgálat a szabályokban

kétgyerekes(X) ha szülője(X,Y) és szülője(X,Z) és nem(Y=Z).

11. lépés: új programozási ismeret, újabb nyelvi elem nélkül

egygyerekes(X) ha szülője(X,_) és nem(kétgyerekes(X)).

Hasonló példákat találhatunk az ELTE-n kidolgozott Logo programozási nyelv tanításáról szóló tananyagban, melynek témái (és mögöttük zárójelben a megtanulandó új nyelvi elemek):

Fontos fejlődés a programozási nyelvek tanításában, hogy az utasításorientált módszert sokszor összeolvasztják ezzel a módszerrel [VCsJI], hiszen az előbbi elképzelés elvont, programozási problémáktól mentes, „vegytiszta” ismeretei kiegészülnek az utasítások valós helyzetbeli előfordulás tapasztalataival. Így érik el, hogy a nyelvtanítás színvonala jelentősen emelkedjen!

Vissza a tartalomjegyzékhez

E. Nyelvorientált

A nyelvorientált változat a nyelvet, mint strukturált egységet tekinti. Megvizsgálja a nyelvhez tartozó számítási modellt [HE] (a közoktatásban jelenleg Neumann-elvű, automataelvű, funkcionális, valamint logikai nyelvek fordulhatnak elő). Ezután áttekinti a programok felépítésének fő vázát, pl. a Pascal nyelv esetén:

Pascal példa

ForráskódProgram név;
deklarációk
Begin
utasítások
End.

Deklarációk:

A programok felépítéséhez szorosan hozzátartozik a programozási nyelvben használt alapfogalmak megismerése, azok megvalósulási lehetőségei az adott nyelvben (pl. fordítási egység, programegység, blokkstruktúra, memóriakezelés, deklarációkiértékelés, változókkal kapcsolatos fogalmak, típussal kapcsolatos fogalmak, paraméterátadás, ...) [SzPZsLTT2].

Következő lépés lehet, hogy megvizsgáljuk a nyelv egyes elemeit, megadjuk, hogy a programozási struktúrák hogyan valósulnak meg az adott nyelven. Például Pascal esetén a feltételes ciklusokról a következőt mondhatjuk (a konkrét szintaktikai szabályok megadása előtt):

A Pascal nyelv feltételes ciklusai lehetnek elöl-, illetve hátultesztelősek. Az elöltesztelős ciklusnál a bent maradás, a hátultesztelősnél pedig a kilépés feltételét kell megmondani. Az elöltesztelős ciklus magja egyetlen utasítás lehet, ha ennél több utasításra lenne szükség, akkor azokat utasítás-zárójelbe kell fogni. A hátultesztelős ciklus magja ezzel szemben akárhány utasítást tartalmazhat.

Végül csak ezek után következhet az egyes utasítások szintaktikájának és szemantikájának megadása. A felsőoktatással szemben a közoktatásban erre általában nem formális módszert, hanem példákon keresztüli bemutatást használnak. A szintaxis megadására csak az utasítás formátumát adják meg (pl. While feltétel do utasítás), a szemantikához pedig kisebb programokat használnak, amelyeken keresztül az adott utasítás működése megérthető (a következő fejezetben leírt módszerrel).

Fontos megjegyeznünk, hogy a felsőoktatásban egyre jobban terjed ez a módszer programozási nyelvek lehetséges elemeinek bemutatására, párhuzamosan többféle nyelvből véve a példákat [NyGJ,SzPZsLTT2]. Ilyen felépítésű például az ELTE Informatikai Karán a programtervező informatikus alapszakon Horváth Zoltán által tanított Funkcionális nyelvek tantárgy. Természetesen itt a cél és a feltételezett alapismeret is más, mint a közoktatásban.

Vissza a tartalomjegyzékhez

F. Működésalapú

Itt az elsődleges szempont az, hogy megértsük az utasítások működését, azaz el tudjuk képzelni, hogy mi történik a végrehajtásuk alatt. A legegyszerűbb esetben megadjuk a nyelv utasításait más, ismert nyelven, esetleg assembly nyelven.

Egy klasszikus FORTRAN tankönyvből származik az alábbi, a DO utasítást magyarázó példa [LGyVJ]:

Ciklus GOTO-val

Ciklus DO utasítással

Forráskód K=1
17 T=0.0
J=1
18 T=T+A(I,J)*B(J,K)
J=J+1
IF(J-N)18,18,20
20 C(I,K)=T
K=K+1
IF(K-N)17,17,21
21
Forráskód DO 20 K=1,N
T=0.0
J=1
18 T=T+A(I,J)*B(J,K)
J=J+1
IF(J-N)18,18,20
20 C(I,K)=T
21

Egy C# könyvben például az alábbi magyarázat olvasható a ++ operátorról [IZ]:

C# példa

Forráskóda = ++b;// hatása: b=b+1; a=b;
a = b++;// hatása: a=b; b=b+1;

A fenti példákból kitűnik, hogy az egyes utasítások működésének leírásához nem kell feltétlenül egy másik nyelvre visszavezetni, hanem megadható az ugyanazon nyelv más elemeinek segítségével is.

Bizonyos értelemben ide tartozó megoldás az is, amikor az új programozási nyelvi elemek szemantikáját a „jól ismert” algoritmikus nyelv elemeivel definiálják. Ez azzal a többlet oktatási haszonnal jár, hogy miközben a nyelv elemeit bemutatjuk, az algoritmikus nyelven történő programozást is gyakoroltatjuk.

Vissza a tartalomjegyzékhez

G. Mintapélda alapján

Ez az elképzelés azt állítja, hogy ha a tanuló elég sok példát lát, akkor jól meg tud tanulni egy programozási nyelvet [MZs]. Idézet a Márkusz Zsuzsanna: PROLOG-ban programozni könnyű című könyvéből:

„A PROLOG oktatási gyakorlatom alapján meggyőződtem arról, hogy példaprogramokon keresztül lehet a legkönnyebben programozni tanulni. Ezért a könyv minden tudományos bevezetés (jelölések, definíciók, tételek) helyett közöl tizenkét példaprogramot, amelyeket részletesen elmagyaráz.”

Van némi hasonlósága a feladattípus-orientált módszerrel, azonban alapgondolatában különbözik tőle. Ott az volt a lényeg, hogy a feladatsor teszi szükségessé az új nyelvi elemek bevezetését. Ennél a módszernél ez fordítva van: adottak a nyelvi elemek a példákban, ezek felépítése a nyelv elemeit követi. Emiatt nem biztos, hogy a megtanult nyelvi elemek használatára a későbbiekben is szükség lesz, s a gyakorlás hiányában elfelejthető.

Vissza a tartalomjegyzékhez

Az egyes módszerek rövid értékelése

Úgy gondoljuk, hogy az utasításorientált módszer alkalmatlan a programozási nyelvek megismertetésére, mert a programozási nyelvek nem utasítások halmazai. Egy programozási nyelv mögött mindig felfedezhető egy gondolatvilág, a programozási nyelv jó alkalmazásához ennek megismerése nélkülözhetetlen.

Megjegyzés

Épp e gondolatvilág felfedezhetőségének „ára” minősíti magát a nyelvet. Ennek ezért van különleges jelentősége az oktatásban. [SzP2]

A programozási nyelvek nyelvi alapfogalmakat használnak (pl. típusosság, blokkstruktúra, paraméterátadás, ...), melyek nyelvtípusonként, sőt nyelvenként különbözőek lehetnek, s ezek ismerete elsősorban nem utasításhoz, hanem nyelvhez kötött. Minden programozási nyelven van a programnak valamilyen struktúrája, felépítési szabálya.

A segédeszközként alkalmazás az, amelyre a programozás algoritmus-, illetve adatorientált tanításában szükség van, így ez a módszer a fenti programozás tanítási módszerekkel párhuzamosan használható, azaz informatikai pályára készülő középiskolásoknál.

A szoftvertechnológia-orientált módszer tulajdonképpen az előző (segédeszközként alkalmazás) továbbfejlesztése a felsőoktatás, az informatikus szakemberképzés számára, így ott nagyon erőteljes módszer lehet. A közoktatásban viszont legfeljebb az informatikai szakképzésben kaphat szerepet.

A feladattípus-orientált módszer az, amelyet egyetlenként szabad alkalmazni a közoktatás minden olyan szintjén (általános és középiskolák), ahol elsősorban az algoritmusok megvalósítása, kipróbálása a fontos, és nem a programozási nyelv teljes megismerése (idézet a Nemzeti Alaptanterv indoklásából: egy programozási nyelvből csak annyit kell megtanítani, amennyi az algoritmusok megvalósításához, kipróbálásához szükséges, s a nyelv nem központi része az informatika tantervnek [ZsL1]).

A nyelvorientált elképzelés kiváló lehet a nyelv tanulásának lezárásaként, a nyelv elemeinek összefoglalására. Informatikus pályára készülőknél elképzelhető még egy új, a korábban ismertekhez nagyon hasonló nyelv bevezetésére is. (Például Pascal után így tanítható a Delphi, a C++; vagy a C++ után a C#, ...) Ekkor ugyanis hatékonyan fel lehet használni a korábbi nyelvi ismereteket.

A működésalapú elképzelés nagyban hasonlít az utasításorientált változatra, hiszen szintén utasításokat tanít, de itt az utasítások „specifikáció” szintje (ti. hogy mit kell tennie) helyett az utasítások „működés” szintjén fogalmaz (azaz hogy hogyan működik). Kezdők számára kizárólagosan alkalmazni sikerrel nem lehet.

A mintapélda alapján tanítás egy „középkori” gondolat, így a programozás „művészeit” lehet képezni, tudatos művelőit nem.

Megjegyzés

A nyelvek tanítási módszerei bemutatása némileg veszélyes a programozási nyelvekről szóló könyvek alapján. Ennek oka, hogy a programozási nyelvekről szóló könyvek módszertani háttere ma még jóval szűkebb, mint a természetes nyelvekről szólóké. Emiatt ugyanaz a könyv többféle módon, többféle szempontból is szól a nyelvről. Legtöbbször ugyanaz a könyv használható a programozási nyelv hivatkozási kézikönyveként, nyelvtankönyvként, sőt sokszor még programozási ismereteket is tartalmaz. Vessük össze ezt a természetes nyelvekkel, ott találhatunk egynyelvű szótárt, kétnyelvű szótárt, nyelvtankönyvet, munkafüzetet, társalgási nyelvkönyvet, ...

Vissza a tartalomjegyzékhez

Új Széchenyi terv
A projekt az Európai Unió támogatásával, az Európai Szociális Alap társfinanszirozásával valósul meg.

A tananyag az ELTESCORM keretrendszerrel készült