Az **algoritmus** olyan elemi műveletekből kompozíciós szabályok szerint felépített összetett művelet, amelyet megadott feltételt teljesítő bemeneti adatra végrehajtva, a megkívánt kimeneti adatot eredményezi. A **számítási probléma** bemenet/kimenet feltételpárral meghatározott követelmény. Azt írja elő, hogy a bemeneti feltételt teljesítő adatra a kimeneti feltételt teljesítő adatot kell kiszámítani. Probléma bemenete: egy olyan (esetleg összetett) adat, amely teljesíti a bemeneti feltételt. Például, a rendezési probléma a következőt jelenti. Bemenet: Azonos típusú adatok $H = \{a_1,\ldots,a_n\}$ halmaza, amelyeken értelmezett egy $\leq$ lineáris rendezési reláció. Kimenet: A $H$ halmaz elemeinek egy rendezéstartó felsorolása, tehát olyan ${b_1,...,b_n}$ sorozat, amelyre $b_1 \leq b_2 \leq \cdots \leq b_n$, és $H = \{b_1,\ldots,b_n\}$. $\{B\}A\{K\}$ - $B$ logikai formula, a bemeneti feltétel, - $K$ logikai formula, a kimeneti feltétel, - $A$ az algoritmus, amelyre az állítás vonatkozik. Az $A$ algoritmus helyes a $\{B\}A\{K\}$ specifikációra nézve, ha minden $X$ bemeneti adatra, amelyre teljesül a $B$ bemeneti feltétel, az algoritmus végrehajtása véges sok elemi művelet végrehajtása után befejeződik, és a keletkezett kimeneti adatra teljesül a $K$ kimeneti feltétel. Az algoritmusokat gyakran olyan **pszeudókódban** írt programként írjuk le, amely nagyon hasonlít a klasszikus programozási nyelvekhez (pl. C, C++, Python stb.). Ellentétben a klasszikus programozási nyelvekkel, a pszeudókódban bármilyen kifejező eszközt alkalmazhatunk, amellyel világosan és tömören megadhatunk egy algoritmust. Néha a legjobb eszköz a magyar nyelv, így ne lepődjünk meg, ha magyar kifejezésekkel vagy mondattal találkozunk az "igazi" kódba ágyazva. Másik fontos különbség az "igazi kód" és a pszeudókód között, hogy rendszerint nem foglalkozik szoftvertervezési kérdésekkel. Pszeudókód megállapodások - A tagolást blokkszerkezet jelzi. Ez a tagolásos szerkezet vonatkozik a `for`, a `while` és az `if`-`else` utasításokra. - A `while` és a `for` ciklusutasítások, valamint az `if`-`else` feltételes szerkezetek értelmezése hasonlít a klasszikus programozási nyelvekben megszokotthoz. - A "$\trianglerightquot; jel azt mutatja, hogy a sor többi része megjegyzés - Az $i \leftarrow j \leftarrow e$ többszörös értékadás eredményeképpen az $i$ és $j$ egyaránt felveszi az $e$ kifejezés értékét; ez ekvivalens a $j \leftarrow e$, majd az azt követő $i \leftarrow j$ értékadással - A változók az adott eljárásra lokálisak. Külön jelzés nélkül nem használunk globális változókat. - Egy tömb elemeihez a tömb nevének megjelölésével és az index szögletes zárójelbe helyezésével férhetünk hozzá. Például az $A[i]$ az $A$ $i$-edik elemét jelenti. A ".." jelzést a tömbön belüli értékek tartományának jelzésére használjuk. Így a $A[1..j]$ az $A[1], A[2], \ldots , A[j]$ elemekből álló résztömböt jelöli. - Az összetett adatokat szokás objektumoknak is nevezni, amelyeket tulajdonságokkal (attribútumokkal vagy mezőkkel) jellemezhetünk. Egy bizonyos mezőhöz úgy férhetünk hozzá, hogy szögletes zárójelbe téve megadjuk az objektum nevét, majd elé írjuk a mező nevét. Például, ha egy tömböt objektumként kezelünk, a *hossz* tulajdonság jelöli, hány elemet tartalmaz és $hossz[A]$-t írunk. - Az eljárások paraméterei érték szerint adódnak át. - Az "és" és "vagy" operátorok gyors kiértékelésűek. # Források - https://www.inf.u-szeged.hu/~cimreh/n15oseload1.pdf (utolsó hozzáférés dátuma: 2025. 12. 12.) - Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Új algoritmusok. Scolar Kiadó, Budapest, 2003.