Ismerkedjünk az algoritmusokkal!

2022-06-01
Mai IT bejegyzésünkben az algoritmusokról lesz szó. Egyszerű példákon keresztül mutatjuk a mibenlétüket.

Írásainkat olyan, az informatika iránt érdeklődőknek szánjuk, akik egyelőre még szinte semmit vagy csak nagyon keveset tudnak az IT, weboldal készítés, internet, hálózatok, programozás, stb. világáról. Az általunk használt kifejezések és magyarázatok a nem szakmabelieknek szólnak. Cserébe közérthetően szeretnénk bemutatni az informatika különböző területeit és fogalmait.

***


Az algoritmus fogalma elsődlegesen a matematikában ismert, de a számítástechnika is használja. Ahogy az IT világ egyre inkább a hétköznapok részévé válik, a köznyelv is különösebb idegenkedés nélkül egyre inkább ‘belfogadja’ ezt a szót. Ma már mindenki tudja, hogy a számítógépet különböző programok vezérlik, azok pedig algoritmusok szerint működnek.

De mit is jelent ez a szó? Mi az az algoritmus? Röviden meghatározva: az algoritmus egy megengedett lépésekből álló (vagy úgy is mondhatnánk, hogy egy terv alapján történő) utasítássorozat, mely egy probléma megoldására alkalmas.

Anélkül, hogy észrevennénk, a mindennapi életünk során mi, emberek is folyamatosan algoritmizálunk: problémákat oldunk meg lehetséges tervek alapján. Amikor éhesek vagyunk, kitaláljuk, hogy mit és hogyan együnk / főzzünk és végrehajtjuk; amikor reggel munkába kell mennünk, terv alapján teljesítjük a feladatot - aztán ha esetleg lekéssük a buszt, belső algoritmusunk újratervezi, hogy megvárjuk-e a következőt vagy menjünk-e inkább villamossal.
Ezek a feladatok és megoldásuk természetesek számunkra, sokszor nem is tudatosul, hogy milyen sok apró lépés sorozatán megy az agyunk keresztül, milyen feltételeket mérlegelünk.

Amikor viszont egy géptől várjuk el, hogy megoldjon egy problémát, azaz végrehajtson egy műveletet, nem várhatjuk el, hogy a fejünkbe lásson, az utasítást bizony nagyon pontosan ki kell adni és a feltételeket jól és teljeskörűen kell meghatározni. Mielőtt a tényleges kódolásra sor kerülne, kell egy precíz, logikai terv.

Az algoritmus felállításához tudnunk kell

  • a problémát (Mit kell megoldanunk?)
  • a kezdőpontot (Honnan induljunk?)
  • a végpontot (Mi a cél? Mikor mondhatjuk, hogy készen vagyunk?)

És szükségünk van szabályokra, úgymint:

  • Ha egy feltétel teljesül, akkor ezt tedd
  • ha nem teljesül, akkor pedig ezt

Ezt a feltételrendszert a programozásban az IF- ELSE kifejezésekkel szoktuk jelölni.
Ezek a szabályok határozzák meg az algoritmus által követett utat.


Nézzünk egy példát!

Tegyük fel, hogy egy autós / motoros iskola - amely kismotor jogosítványra szakosodott - szeretne a weboldalára egy olyan felületet, aminek címe “Vezethetek kismotort?”. Az elképzelés szerint a látogató egy mezőbe beírja az életkorát, majd pedig megkapja a választ, hogy “igen” vagy “nem”. Az iskola elmondja a programozónak, hogy 14 éves kortól lehet kismotort vezetni, ez alapján kalkuláljon a rendszer.

Nos, íme az algoritmusunk (nem teljes kódban persze, csak amolyan “beszédes” formában):

OUTPUT - Kiírjuk a kérdést: 'Hány éves vagy?'
INPUT - Beviteli mező: Felhasználó beírja az életkorát
STORE - Tárolás: Letároljuk a felhasználó által megadott számot
Innentől kezdődik a kalkuláció:
IF életkor > 14 THEN
OUTPUT: 'Igen, elég idős vagy ahhoz, hogy kismotort vezess!'
ELSE IF életkor < 14 THEN
OUTPUT: ‘Nem, még nem vagy elég idős vagy ahhoz, hogy kismotort vezess!'

Remek. Kész is vagyunk.

Biztosan? Jó ez így? Nem hagytunk valamit figyelmen kívül? Az algoritmusunk két feltételt tartalmaz: szépen megmondja, hogy mi van ha az életkor kisebb, mint 14 év, és azt is, hogy mi van, ha nagyobb, mint 14 év.
Nade, mi van ha épp 14 éves a kitöltő? Azt kihagytuk a szabály felállításakor. Az algoritmusunk hibát jelezne - jogosan -, hogy erre vonatkozóan ő nem kapott utasítást, ezért bizony ha azt az INPUT-ot kapja, hogy 14, akkor kénytelen ERROR-t adni.


Két módon is kijavíthatjuk a hiányosságot:


1.) Hozzáadhatunk még egy plusz szabályt:

ELSE IF életkor = 14 THEN
OUTPUT: 'Igen, elég idős vagy ahhoz, hogy kismotort vezess!'


2.) Vagy kiegészíthetjük az első, meglévő szabályt:

IF életkor >= 14 THEN
OUTPUT: ‘Igen, elég idős vagy ahhoz, hogy kismotort vezess!'


Hasonló algoritmust használunk például abban az esetben is, amikor mondjuk egy osztály dolgozatot ír, aminek eredménye “megfelelt” vagy “nem megfelelt” lehet. A “megfelelt” szinthez 50%-ot el kell érni. A tanár felrögzíti az elért százalékos eredményeket a programba és szeretné látni a diákok eredményeinek besorolását. Itt sem szabad megfeledkezni a pontosan 50%-ot elért diákokról, vagyis az egyenlőséget is be kell építeni az algoritmusba.


Lépések száma egy algoritmusban

Vessünk egy pillantást az alábbi egyszerű algoritmusra (A), mely által megtudható, hogy a felhasználó jogosult-e egy bizonyos kedvezményre.

(A)

OUTPUT 'Hány éves vagy?'
INPUT Felhasználó beírja az életkorát
STORE Letároljuk a felhasználó által megadott számot
IF életkor < 18 THEN
OUTPUT 'Jogosult vagy kedvezményre!'
ELSE IF életkor > 18 THEN
OUTPUT 'Már nem vagy jogosult kedvezményre!'
ELSE IF életkor = 18 THEN
OUTPUT 'Jogosult vagy kedvezményre!'

A kedvezmény tehát 18 éves és annál fiatalabb egyéneknek jár. A fenti algoritmus három feltételt alkalmaz: az első ellenőrzi, hogy a felhasználó fiatalabb-e, mint 18, a második ellenőrzi, hogy idősebb-e, a harmadik pedig megnézi, hogy az életkor pontosan 18-e. Teljesen logikus és helyes, minden élethelyzet le van fedve.

Ugyanerre a problémára létezhet egy másik megoldás is, felállíthatjuk az alábbi algoritmust is:

(B)

OUTPUT 'Hány éves vagy?'
INPUT Felhasználó beírja az életkorát
STORE Letároljuk a felhasználó által megadott számot
IF életkor <= 18 THEN
OUTPUT 'Jogosult vagy kedvezményre!'
ELSE
OUTPUT 'Már nem vagy jogosult kedvezményre!'

Ez jóval rövidebb. Itt csak egyetlen egy feltételt szabtunk, egy szabállyal dolgozunk. A szabály: nézd meg, hogy az életkor kevesebb vagy egyenlő-e mint 18. Ha igen, akkor jár a kedvezmény. Minden más esetben nincs jogosultság. Ez az algoritmus is jó, és biztos, hogy minden esetben megfelelő eredményt ad.

Logikailag (A) és (B) algoritmus is egyaránt jó.

Ha azonban célszerűségi szempontok alapján kell választanunk, akkor van egy egyértelmű favorit. Igaz, hogy mindkettő tökéletesen elvégzi a feladatot, de míg (A) három feltétellel dolgozik, (B) csupán eggyel. (B) tehát rövidebb, hatékonyabb és egyszerűbb leprogramozni, vagyis programozói szemmel nézve jobb választás.


További szempontok

A fenti algoritmusok feltételezik a felhasználók együttműködő szándékát, vagyis azt, hogy valós életkorukat adják meg.

Természetesen akkor is jó eredményt kapunk, ha a felhasználó vicces kedvében pl. negatív számot vagy irreálisan magas számot ad meg, pl. 325 év. Noha az eredmény ekkor is igazat mond (“'Már nem vagy jogosult kedvezményre!”), ez mindenképpen hitelteleníti némileg az algoritmust, mert irreális adatokkal is képes dolgozni.

Ilyenkor érdemes további feltételeket megadni, amely túl alacsony vagy túl magas érték esetén az alábbi üzenetet mutatja: “Kérünk, adj meg valós életkort!”

Ezzel sokat javíthatunk az algoritmus hitelességén.


Ha a témát érdekesnek találod, érdemes megnézned  IT képzéseinket: Junior Java backend fejlesztő, Junior frontend fejlesztő, Junior szoftvertesztelő.