1. ALGORITMUS és a program 1.1. Mielőtt számítógépet programoznánk... Mielőtt mélyebben belemerülnénk a számítógép programozásába, tudomásul kell vennünk a számítógép sajátosságát, vagyis azt hogy mit ért meg, és mit nem. Sokat beszélnek az okos és az intelligens számítógépről. Ez megfogal-mazás így nem egészen igaz. Maga a számítógép nem okos, viszont ezt a hiányosságát pótolni igyekszik a gyorsaságával és a pontosságával. Okossá a számítógépet a rajta futó programok teszik. Jó programot viszont csak akkor tudunk írni, ha tudjuk, hogy a számítógép megérti a szándékainkat, és nem fogja félreérteni azokat. Ehhez viszont jól át kell gondolni, hogy mit szeretnénk csinálni és azt hogyan tudjuk véghezvinni. 1.2. A program megtervezése Tisztázzunk a témakörrel kapcsolatos néhány fontosabb alapfogalmat, mielőtt a számítógépes problémamegoldás főbb lépéseinek tárgyalására rátérnénk. 1.2.1. A programozás alapjai A programozás azt a folyamatot jelenti, amikor a feladatot a számítógép számára érthető formában írjuk le. A programozás eredményeként létrejön a program. A program legkisebb funckionális egysége az utasítás. A program az utasítások olyan sorozatából áll, amely a meghatározott feladatot tartalmazza. A leírás nyelvét programozási nyelvnek nevezzük. A programozási nyelvek szolgálnak arra, hogy a programozó munkáját megkönnyítsék a feladat megfogalmazásakor. Például a Pascal egy magasszintű programozási nyelv, amelyet könnyű megtanulni. Mivel a számítógép csak a gépikódú információkat tudja közvetlenül feldolgozni, ezért a kész programot át kell alakítani, le kell fordítani a gép nyelvére. A fordítóprogramokat (compiler) erre a célra készítették. A programozási nyelvnek mint, minden nyelvnek, pontosan meghatározott szabályai, lényegében nyelvtana van, amit szintaxisnak nevezünk. Szintaktikus hibáról beszélünk, ha a szabályoktól eltérő módon írjuk meg a program valamelyik utasítását. Szemantikus hiba akkor lép fel, ha a nyelv elemi szabályai ellen nem vétünk (a program szintaktikusan helyes), azonban az utasítás, vagy utasítások sorozata a megoldandó feladat szempontjából helytelen (például előjelhiba, elsőbbségi szabály megsértése, stb). 1.2.2. A program folyamatábrája Számítógépes programok és a szervezési folyamatok tervezésénél használjuk a folyamatábrát, amely segíti a programok áttekinthetőségét, kiegészíti a dokumentálást, a programban esetleges későbbi javításokat is megkönnyíti. A folyamatábra bemutatja a program folyamatát minden elágazásával - rendszerint anélkül, hogy magát az utasítássorrendet is részletezné. Ha a programot utasításokra bontva ábrázoljuk, akkor utasításdiagramról beszélünk. Ismerkedjünk meg a leglényegesebb szimbólumokkal, amelyeknek felhaszná-lásával rajzoljuk meg a folyamatábrákat (1.1. ábra). Bemutatjuk a szimbólumokat az - elágazás, - művelet, - Input/Ouput (be-/kimenet) művelet, - program kezdete és vége, - folyamat iránya, - összekapcsolás tervezésére. 1.2.3. A számítógépes program készítése A megoldandó probléma egyértelmű megfogalmazásától a gépi megoldásig a következő főbb lépéseket kell megtenni: 1) A feladat megfogalmazása és elemzése. (meglepő, de talán ez a legnehezebb) 2) A matematikai modell kialakítása. Milyen módszert alkalmazunk, milyen részekre lehet a feladatot bontani? 3) Az adatstruktúra kialakítása. Milyen adatokra van szükség a program futásához? 4) A program eredményközlése. Meg kell tervezni, hogy a program a legjobban kiértékelhető formában adja vissza az eredményt. 5.) A program folyamatábrájának elkészítése. 6.) A program megírása. 7.) A program tesztelése, hibakeresése, futtatási eredmények kiértékelése. 8.) A program dokumentálása. A feladat megfogalmazásán azt a folyamatot értjük, amikor a rendelkezésre álló bemenő és kimenő adatok figyelembevételével mindennapi nyelven részletesen leírjuk. A feladatot elemezni kell, meg kell határozni a lehetséges megoldások módját, egyáltalán létezik-e megoldás. Ha a feladatnak vannak olyan részei, amely a programozás szempontjából kritikus, azokat külön feljegyezzük. Ezután következik a feladat matematikai modelljének kialakítása. Meg kell határozni a számítógépre a leginkább alkalmas matematikai megoldási módszereket. Ezeknek megalkotása a programozás egyik legnehezebb és legszerteágazóbb feladata. A programozónak sokrétű ismeretekkel kell rendelkeznie, hogy a legmegfelelőbb matematikai modellt építse fel. Természetesen a feladattól függően lehet, hogy utána kell nézni a numerikus analízis megfelelő módszereinek. Az első négy pontot algoritmizálásnak nevezzük. Az algoritmus olyan előírás, amely szerint valamely feladat véges számú lépésben megoldható. Sok éves tapasztalat mutatja, hogy a program írásánál a jó algoritmus megszer-kesztésére fordított idő bőven megtérül. Ha az algoritmus megszerkesztésével készen vagyunk, akkor következik a program megírása. A program valójában nem más, mint az algoritmusban megadott feladatok szövegének számítógép számára érthető formája. Itt már az adott programnyelv - általában igen szigorú - szabályainak pontos betartására van szükség. Éppen a szabályok szigorúsága, valamint az, hogy a számítógép maga nem gondolkozik, csak végrehajtja az utasításokat, mutatja azt is, hogy bár jó algoritmusból könnyű jó programot írni, de azért lehet rosszat is. A programok írásánál kétfajta hibát követhetünk el, az egyiket a nyelv szabályainak megsértésével (szintaktikai hiba), a másikat pedig a helytelen algoritmussal illetve elvileg helytelen programlépés eredményével (szemantikai hiba). A szintaktikai hiba eredményeképp a programunkat nem tudjuk lefordítani, azaz nem tudjuk olyan állapotba hozni, hogy az a számítógépen futtatható legyen, a szemantikai hiba eredménye pedig az, hogy a programunk futni fog ugyan a számítógépünkön, de a futás eredménye nem az lesz, mint amit a mi szándékaink szerint eredményként kapnunk kellett volna. A program tervezésének lépései Start 1.) A probléma megfogalmazása, a probléma elemzése. 2.) Matematikai modell kialakítása. 3.) Adatstruktura létrehozása. 4.) Folyamatábra készítése. 5.) A program megírása. 6.) A program fordítása. 7.) Szintakikusan jó? Ha nem javítsd ki majd menj vissza a 6. ponthoz. 8.) A program futtatása. 9.) Szemantikusan jó? Ha nem javítsd ki majd menj vissza a 6. ponthoz. 10.) A megoldás kiértékelése. Stop Példaként vizsgáljuk meg egy levél feladásának algoritmusát. Start 1.) Boríték vétele 2.) Boríték megcímzése 3.) A levél összehajtása 4.) A levél borítékba tétele 5.) Bélyeg van? Ha nincs vegyél bélyeget majd menj tovább. 6.) Bélyeg borítékra ragasztása. 7.) A levél feladása. Stop 1.3. Mintafeladat Nézzünk meg egyszerű numerikus feladatot, amely adatokat olvas és eredményt ír ki. Feladat: Az a és b oldal ismeretében számítsuk ki a téglalap területét. Megoldás: A feladat megoldásához ismerni kell az a és b oldal adatait és a téglalap területét meghatározó matematikai képletet. A téglalap területe az a és b oldal ismeretében: t = a. b Algoritmus: Bontsuk lépésekre a feladatot Start 1.) A program fejlécének kiírása. 2.) '"A" oldal:' kiírása. 3.) A változó beolvasása. 4.) '"B" oldal:' kiírása. 5.) B változó beolvasása. 6.) Számítás: T:=A*B. 7.) Teület kiírása. T STOP A feladat Pascal programja: (* demo.pas *) { a téglalap területének kiszámítása az a és b oldalból } program teglalap; var a,b,t: real; begin writeln('A téglalap területének számítása'); writeln; write('a oldal: '); readln(a); write('b oldal: '); readln(b); t:=a*b; writeln('A téglalap területe: ',t:6:1); end. A program futási eredménye: A téglalap területének számítása a oldal: 12.5 b oldal: 10 A téglalap területe: 125.0 A mintaprogramok és a játékprogramok fejezetben bonyolultabb algoritmusok leírásával is megismerkedünk. Ellenőrző kérdések: 1. Mit értünk programozás alatt? 2. Miből áll a program? 3. Mire szolgál a programozási nyelv? 4. Milyen célból készítenek különféle felhasználói nyelveket? 5. Miért van szükség a fordító programra? 6. Mit jelent a szintaktikus hiba? 7. Jelzi-e a fordító program a szemantikus hibát? 8. Milyen jellegű a szemantikus hiba? 9. Mire használható a folyamatábra? 10. Egy bonyolultabb számítógépes program tervezéséhez milyen lépéseket kell megtenni? 11. Mit jelent az algoritmizálás?