Többféle programozási módszer létezik, mint ahogy több programozási nyelv is. A programozási nyelvek általában megvalósítanak egy programozási módszert, van amelyik kombinál több módszert is (ami nem feltétlenül jó). Nézzük a legelterjedtebb módszereket röviden! ====== Strukturált programozás ====== A strukturált programozás elve azt jelenti, hogy a programot szétbontjuk kisebb részfeladatokra, melyek egy konkrét, jól meghatározható résztevékenységeket végeznek. Ha lehet és érdemes, akkor a részfeladatokat is tovább bontjuk. A lényeg hogy olyan kis egységeket alkotunk, mely mindig egy meghatározható feladat megoldására használható, ha lehet általánosítva hogy később más programban is fel tudjuk használni. Majd ezeket egy jól meghatározott logika szerint alkalmazva az úgynevezett vezérlő szerkezetek használatával építjük fel a programunkat. A strukturált programozásnak három eszköze van: * Szekvencia - utasítások, műveletek egymás után __sorban__ történő végrehajtása * Szelekció - valamilyen feltétel alapján több lehetséges végrehajtási ág közül az egyik __kiválasztása__ és végrehajtása * Iteráció - valamilyen feltétel teljesüléséig egy utasítás, vagy utasítások __ismételt__ végrehajtása. Bebizonyították hogy ennek a három elemnek a felhasználásával bármilyen algoritmus leírható. Így nekünk programozóknak csupán ezt a három eszközt kell megfelelő módon kombinálva használni és bármilyen programot el tudnunk készíteni. A szép az egészben hogy ez tényleg így van és tényleg ennyire egyszerű is! Amint a [[gondolatok_a_programozasrol|bevezetőben]] írtam a programozás nem más mint adatokon végrehajtott műveletek meghatározott logikai sorrend szerint. Ahhoz hogy programot tudjunk írni, mindenképp szükségünk lesz adatra és ezeket az adatokat valahogy kezelnünk kell majd a programunkban. Az alábbiakban nézzük ezeket egy picit részletesebben. A programokat le is fogjuk írni, terveim szerint három nyelven. Az egyik egy pszeudo nyelv melyet én találtam ki és arra jó hogy egyszerűen le lehessen írni vele egy algoritmust. Fordítóprogram nincs hozzá, ez csak egy tervezést segítő eszköz. Ennek a [[Pszeudo-nyelv|pszeudó nyelvnek]] a leírása itt található. A másik két nyelv a Pascal és a C nyelvek. A példák általában mindkét nyelven megtalálhatók lesznek. ===== Adatok ===== Egy programot minden esetben meg kell tervezni. A tervezés első lépése az adatszerkezet meghatározása, azaz fel kell tárni hogy mik a bemenő adataink és mik lesznek a kimenő adatok. Ez mellett keletkezhet a feldolgozás kapcsán adat, mely átmenetileg tárol értékeket. Az adat jellege tehát három féle lehet: * Bemenő (input) adat * Kimenő (output) adat * Munka (work) adat Programozás során az adatokat tárolni kell tudni. Ehhez használjuk az úgynevezett változókat, melyet a programozási nyelvek rendelkezésünkre bocsátanak. A változó nem más mint egy hivatkozás a számítógép memóriájának egy pontjára, mégpedig arra a pontra ahol a tárolt adat megtalálható. Ide tudjuk beírni illetve innen tudjuk kiolvasni az adatot, azaz a változó értékét. Ez mellett meg kell határoznunk az adatok típusát is. Nem mindegy hogy egy adattal számolni szeretnénk, esetleg valamilyen logikai műveletet kell végeznünk vele, vagy valamilyen szöveges adatként jelentkezik. A típus azért is fontos mert a memóriában a különféle adatok különféle méretű helyet igényelnek. Pl. egy numerikus egész szám tárolása másképp történik mint egy szöveges adaté. Tehát programozáskor meg kell tudnunk mondani hogy milyen típusú adattal fogunk dolgozni és hogy arra az adatra hogyan fogunk tudni hivatkozni. Ezt hívjuk változó deklarációnak. Az alábbi példa egy egész számot (i), egy szöveget (s) és egy logikai értéket (b) deklarál. Pszeudó kód: <code> VARIABLES INTEGER i; STRING s; BOOLEAN b; ENDVAR; </code> Pascal kód: <code pascal> var i:integer; s:string; b:boolean; </code> C nyelvű kód: <code c> int i; char* s; int b; </code> ===== Szekvencia ===== Akkor használjuk ezt a strukturált programozási alapelemet, amikor mindenféle feltétel nélkül utasításokat egymásután sorban szeretnénk végrehajtani. Például a háromszög kerületének kiszámítása az alábbi szekvencia szerint történhet: <code> VARIABLES INTEGER a,b,c; ENDVAR PROGRAM INPUT: a; INPUT: b; INPUT: c; t := a + b + c; OUTPUT: t; ENDPROG </code> ===== Szelekció ===== Valamilyen feltétel alapján több végrehajtási ág közül kiválasztunk egyet amit végrehajtunk. Az alábbi kódban bekérünk két számot, majd összehasonlítjuk azokat és kiírjuk az összehasonlítás eredményét eredményét. <code> VARIABLES INTEGER a,b; ENDVAR PROGRAM INPUT: a, b; IF (a==b) THEN OUTPUT: "A két szám egyenlő"; ELSE IF (a<b) THEN OUTPUT: "A b nagyobb mint az a!"; ELSE OUTPUT: "Az a nagyobb mint a b!"; ENDIF ENDIF ENDPROG </code> A példában két szelekció van egymásba ágyazva. Az elsőben azt vizsgáljuk hogy egyenlő-e a két szám. Ha nem egyenlő (ELSE ág) akkor egy újabb szelekció következik, mely megvizsgálja hogy az a kisebb-e mint a b. ===== Iteráció ===== Amikor ciklikusan, többször ismétlődve kell végrehajtani egy tevékenységet, vagy tevékenység sorozatot, akkor ciklusszervező utasítást használunk. Minden ciklus két fő részből áll. A ciklus fejből és a ciklus magból. A ciklus fej egy feltételt tartalmaz, mely vezérli a ciklust. A ciklus mag tartalmazza azokat az utasításokat amiket a ciklusban végre kell hajtani. Háromféle ciklusszervező szerkezet van, melyet sorban végignézünk. ==== Elől tesztelő ciklus ==== A leggyakoribb és legáltalánosabb ciklusszerkezeta az elöltesztelő ciklus. Ebben az esetben először a ciklusfejben megadott feltétel kiértékelődik, majd ha ez igaz akkor végrehajtódik a ciklus mag. Ezek a lépések addig ismétlődnek amig a ciklusfejben lévő kifejezés igaz. Ha hamis, akkor vége a ciklusnak és a program végrehajtása a ciklust lezáró utasítás után folytatódik. A ciklusszervezésnél figyelni kell arra, hogy nehogy végtelen ciklust készítsünk. Ez a programozó felelőssége. A végtelen ciklus azt jelenti, hogy olyan eset alakul ki, mely kapcsán a feltétel nem változik meg és mindig igaz értéket fog adni. Például ha a fenti ciklusban az a változó értékét nem növeljük, akkor végtelen ciklus alakul ki, ugyanis az a változó sosem fogja elérni a 100-at, így a feltétel mindig igaz lesz. Példaként nézzük a számok kiíratását 1-100 között: <code> VARIABLES INTEGER a; ENDVAR; PROGRAM a=1; WHILE (a<=100) OUTPUT: a; a=a+1; ENDWHILE OUTPUT: "Vége a programnak"; ENDPROG </code> ==== Hátul tesztelő ciklus ==== A hátultesztelő ciklusban először végrehajtódik a ciklusmag, majd a ciklusfeltétel kiértékelődik. Programozási nyelvtől függ hogy a feltétel hogyan értelmezendő. Pascalban a ciklusfeltétel a kilépés feltételét határozza meg, ellentétben a C nyelvvel, ahol a ciklusban maradás feltételét jelenti. A pszeudó nyelvben mindkét megvalósítás létezik (lásd a [[pszeudo-nyelv|leírásban]]). <code> VARIABLES INTEGER a; ENDVAR; PROGRAM a=1; DO OUTPUT: a; a=a+1; WHILE (a<=100) OUTPUT: "Vége a programnak"; ENDPROG </code> ==== Növekményes ciklus ==== A harmadik ciklusszervező lehetőség, melyet általában minden nyelv megvalósít arra ad lehetőséget, hogy adott számszor hajtsunk végre egy utasítássorozatot. Én azt szoktam mondani ha tudjuk hogy hányszor kell végrehajtani valamit akkor a növekményes ciklust használjuk, ellenkező esetben az előző kettő típus valamelyikét. Egyszóval a példaként használt számkiíró programo tipikusan növekményes ciklussal szokás programozni. <code> VARIABLES INTEGER a; ENDVAR; PROGRAM FOR a=1 TO 100 OUTPUT: a; NEXT OUTPUT: "Vége a programnak"; ENDPROG </code> Vegyük észre hogy ebben a ciklusban nem kellett az a változónak értéket adni a ciklus előtt, és a ciklus magban sincs utasítás amivel növeljük a változó értékét. Ugyanis aciklus fejben szerepel a változó és éppen arról szól ez a ciklus hogy a változónk sorra felveszi az értékeket a megadott intervallumban.