{"id":1921,"date":"2016-11-11T11:32:02","date_gmt":"2016-11-11T10:32:02","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1921"},"modified":"2017-01-18T08:03:32","modified_gmt":"2017-01-18T07:03:32","slug":"c-programozas-15-alap-algoritmusok","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1921","title":{"rendered":"C++ programoz\u00e1s 15. \u2013 Alap algoritmusok"},"content":{"rendered":"<h1>Alap algoritmusok, avagy mindenki tud programozni<\/h1>\n<p>A programoz\u00e1ssal sokszor az a baj \u2013 f\u0151leg ha k\u00f6telez\u0151 tant\u00e1rgy \u00e9s nem szeretj\u00fck \u2013 hogy gondolkodni kell. Igaz, mondhatn\u00e1m ezt a matematik\u00e1ra, fizik\u00e1ra is, de egyik tant\u00e1rgy sem annyira szerte\u00e1gaz\u00f3 a helyes megold\u00e1sok tekintet\u00e9ben, mint a programoz\u00e1s. Itt ugyanazt a probl\u00e9m\u00e1t sokf\u00e9lek\u00e9pp meg lehet oldani, \u00e9s minden megold\u00e1s helyes. M\u00e9gis, a megold\u00e1sok k\u00f6z\u00f6tt az \u00e1rnyalatnyi k\u00fcl\u00f6nbs\u00e9gek azok, amelyek eld\u00f6ntik azt, hogy helyes-e a megold\u00e1s, vagy sem.<\/p>\n<p>B\u00e1rmilyen bonyolult programot vesz\u00fcnk szem\u00fcgyre \u00e9s bontunk r\u00e9szekre, a v\u00e9g\u00e9n ugyanaz a 4 \u00e9p\u00edt\u0151elem marad:<\/p>\n<ol>\n<li>szekvencia (utas\u00edt\u00e1sok egym\u00e1s ut\u00e1ni sorozat\u00e1nak v\u00e9grehajt\u00e1sa)<\/li>\n<li><a title=\"Java programoz\u00e1s 3. \u2013 V\u00e1ltoz\u00f3k\" href=\"http:\/\/www.webotlet.hu\/?p=1726\">v\u00e1ltoz\u00f3haszn\u00e1lat<\/a><\/li>\n<li><a title=\"Java programoz\u00e1s 9. \u2013 Felt\u00e9telvizsg\u00e1latok\" href=\"http:\/\/www.webotlet.hu\/?p=1794\">el\u00e1gaz\u00e1sok<\/a><\/li>\n<li><a title=\"Java programoz\u00e1s 12. \u2013 Ciklusok\" href=\"http:\/\/www.webotlet.hu\/?p=1814\">ciklusok<\/a><\/li>\n<\/ol>\n<p>A sorrend nem v\u00e9letlen, ebben a sorrendben kell ezeket megtanulni haszn\u00e1lni, mert ezek egym\u00e1sra \u00e9p\u00fcl\u0151 darabok a programoz\u00e1snak nevezett kirak\u00f3 j\u00e1t\u00e9kban. Ha nem az \u00e9p\u00edt\u0151elemeit n\u00e9zz\u00fck a programoknak, akkor is tal\u00e1lhatunk olyan sablonokat, olyan m\u00e1r tanult megold\u00e1sokat, amelyek \u00fajra \u00e9s \u00fajra el\u0151fordulnak a programjainkban. Ezeket a sablonokat, k\u00e9sz megold\u00e1sokat nevezz\u00fck programoz\u00e1si t\u00e9teleknek.<\/p>\n<p>Ezek val\u00f3j\u00e1ban betanulhat\u00f3 k\u00e9sz algoritmusok, melyek egy adott probl\u00e9m\u00e1ra k\u00e9sz megold\u00e1st adnak. Nem mindig fordulnak el\u0151 tiszta form\u00e1ban, vagyis n\u00e9ha apr\u00f3 v\u00e1ltoztat\u00e1sokra sz\u00fcks\u00e9g van, hogy ezeket az algoritmusokat egy adott feladathoz igaz\u00edtsuk, de ha ezeket ismerj\u00fck \u00e9s biztosan haszn\u00e1ljuk, akkor sokf\u00e9le programoz\u00e1si feladatot meg tudunk oldani.<\/p>\n<p>Ezek az alap algoritmusok t\u00f6mb\u00f6kh\u00f6z kapcsol\u00f3dnak, vagyis sok egyforma adattal v\u00e9geznek valamit. Megkeresik egy t\u00f6mbb\u0151l a legnagyobb \u00e9rt\u00e9ket, sorba rendezik a sz\u00e1mokat, eld\u00f6ntik, hogy benne van-e egy adott \u00e9rt\u00e9k a t\u00f6mbben, megadj\u00e1k k\u00e9t halmaz metszet\u00e9t, stb. L\u00e1ssunk akkor n\u00e9h\u00e1ny alap algoritmust:<\/p>\n<ol>\n<li><a href=\"#Megsz\u00e1ml\u00e1l\u00e1s\">Megsz\u00e1ml\u00e1l\u00e1s<\/a><\/li>\n<li><a href=\"#\u00d6sszegz\u00e9s\">\u00d6sszegz\u00e9s<\/a><\/li>\n<li><a href=\"#Eld\u00f6nt\u00e9s\">Eld\u00f6nt\u00e9s<\/a><\/li>\n<li><a href=\"#Kiv\u00e1laszt\u00e1s\">Kiv\u00e1laszt\u00e1s<\/a><\/li>\n<li><a href=\"#Keres\u00e9s\">Keres\u00e9s<\/a><\/li>\n<li><a href=\"#Minimum\/maximum keres\u00e9s\">Minimum\/maximum keres\u00e9s<\/a><\/li>\n<li><a href=\"#Rendez\u00e9s\">Rendez\u00e9s<\/a><\/li>\n<li><a href=\"#Kiv\u00e1logat\u00e1s\">Kiv\u00e1logat\u00e1s<\/a><\/li>\n<li>Sz\u00e9tv\u00e1logat\u00e1s (hi\u00e1nyzik)<\/li>\n<li>Metszet (hi\u00e1nyzik)<\/li>\n<li>Uni\u00f3 (hi\u00e1nyzik)<\/li>\n<\/ol>\n<p>Ezen algoritmusok mindegyik\u00e9re igaz, hogy ciklusokhoz kapcsol\u00f3dnak, hiszen ha t\u00f6mb\u00f6kkel dolgozunk, akkor mindenk\u00e9ppen ciklusra van sz\u00fcks\u00e9g, hogy az elemeket egyenk\u00e9nt megvizsg\u00e1lhassuk, \u00f6sszehasonl\u00edthassuk, stb. Ezek az algoritmusok kicsit leegyszer\u0171s\u00edtik a programoz\u00e1st, hiszen ezekkel a megtanulhat\u00f3 k\u00e9sz receptekkel sokf\u00e9le feladatot megoldhatunk. A probl\u00e9ma az, hogy a feladatban fel kell ismerni, hogy val\u00f3j\u00e1ban mit is akarunk eredm\u00e9nyk\u00e9nt megkapni, \u00e9s az melyik algoritmusnak felel meg. Ha ez megvan, onnant\u00f3l szinte csak g\u00e9pel\u00e9si feladatt\u00e1 siker\u00fclt egyszer\u0171s\u00edteni a programoz\u00e1si feladatot.<\/p>\n<p>Az alap algoritmusok valamennyi fajt\u00e1j\u00e1hoz l\u00e9tezik pszeudok\u00f3d, olyan \u00e1ltal\u00e1nos le\u00edr\u00e1s, amely programoz\u00e1si nyelvt\u0151l f\u00fcggetlen. R\u00e1ad\u00e1sul, mivel 3 fajta ciklus l\u00e9tezik, ez\u00e9rt alapb\u00f3l szerte\u00e1gaz\u00f3 megold\u00e1sokat adhatunk ugyanarra a feladatra. Az alap algoritmusokat nagyon sok helyen ugyanazzal a megold\u00e1si form\u00e1val adj\u00e1k meg, \u00e9s biztos vagyok benne, hogy t\u00f6bb tan\u00e1r csak \u00edgy fogadja el megold\u00e1sk\u00e9nt. \u00c9n azt vallom, hogy b\u00e1rmilyen j\u00f3 megold\u00e1s elfogadhat\u00f3, a l\u00e9nyeg, hogy a di\u00e1k alkalmazni tudja azt, amit tanult. L\u00e9teznek lecsupasz\u00edtott, hat\u00e9kony \u00e9s egyszer\u0171 megold\u00e1sok, de sokszor \u00e9n sem azt alkalmazom, mert nem \u00edrunk olyan szint\u0171 programokat, hogy ennyire optimaliz\u00e1lt \u00e9s gyors algoritmusra lenne sz\u00fcks\u00e9g. Aki esetleg az alap algoritmusaimban hib\u00e1t tal\u00e1l, mondv\u00e1n, hogy \u0151 ezt nem \u00edgy tanulta, az nem felt\u00e9tlen\u00fcl hiba, egyszer\u0171en m\u00e1s a megold\u00e1s. Az p\u00e9ld\u00e1kn\u00e1l sok helyen k\u00e9sz t\u00e9nynek veszem azt, hogy rendelkez\u00e9sre \u00e1ll az a t\u00f6mb a megfelel\u0151 adatokkal, amelyekkel dolgozni kell. Ezeknek a t\u00f6mb\u00f6knek a felt\u00f6lt\u00e9s\u00e9vel, ellen\u0151rz\u00e9s\u00e9vel nem foglalkozok. Vegy\u00fck akkor sorra ezeket az algoritmusokat:<\/p>\n<h2><a name=\"Megsz\u00e1ml\u00e1l\u00e1s\"><\/a>Megsz\u00e1ml\u00e1l\u00e1s<\/h2>\n<p>Kezdj\u00fck valami egyszer\u0171vel. Az alapfeladat az, hogy sz\u00e1moljuk meg, hogy egy adott t\u00f6mbben h\u00e1ny darab adott tulajdons\u00e1g\u00fa elem van. Ez jelentheti azt is, hogy nincs ilyen tulajdons\u00e1g\u00fa elem a t\u00f6mbben, akkor a darabsz\u00e1m nyilv\u00e1n 0. Enn\u00e9l a feladatn\u00e1l minden esetben v\u00e9gig kell menni a t\u00f6mb\u00f6n, hiszen minden elemr\u0151l meg kell \u00e1llap\u00edtanom, hogy rendelkezik-e a tulajdons\u00e1ggal, vagy sem. Mivel megsz\u00e1molunk, ez\u00e9rt valahol t\u00e1rolnom kell, hogy \u00e9ppen hol j\u00e1rok a sz\u00e1mol\u00e1sban, h\u00e1ny olyat tal\u00e1ltam, ami megfelelt a felt\u00e9telemnek. Ehhez sz\u00fcks\u00e9g van egy \u00fagynevezett gy\u0171jt\u0151v\u00e1ltoz\u00f3ra. Az adott algoritmus egy darabsz\u00e1mot ad eredm\u00e9ny\u00fcl minden esetben, ami a [0;m\u00e9ret] intervallumban lesz, vagyis lehet, hogy egy elem sem felel meg a felt\u00e9telnek, de az is el\u0151fordulhat, hogy mindegyik. N\u00e9zz\u00fcnk p\u00e1r p\u00e9ld\u00e1t, hogy mikor alkalmazhat\u00f3 ez az algoritmus:<\/p>\n<ul>\n<li>H\u00e1ny 180 cm-n\u00e9l magasabb di\u00e1k j\u00e1r az oszt\u00e1lyba?<\/li>\n<li>H\u00e1ny napon esett az es\u0151 tavaly?<\/li>\n<li>H\u00e1ny f\u00e9rfi tan\u00e1r tan\u00edt az iskol\u00e1ban?<\/li>\n<\/ul>\n<p>L\u00e1thatjuk, hogy minden esetben egy darabsz\u00e1mra k\u00edv\u00e1ncsi minden k\u00e9rd\u00e9s. L\u00e1ssuk akkor azt az algoritmust, ami ezekre a k\u00e9rd\u00e9sekre v\u00e1laszt ad. A p\u00e9ld\u00e1ban az els\u0151 k\u00e9rd\u00e9sre keress\u00fck a v\u00e1laszt.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,3,5,7,11,12]; title: ; notranslate\" title=\"\">\r\nint szamlalo = 0;\r\n\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] &gt; 180 )\r\n    {\r\n        szamlalo = szamlalo + 1;\r\n    }\r\n}\r\n\r\ncout &lt;&lt; &quot;Az osztalyba &quot; &lt;&lt; szamlalo &lt;&lt; &quot; db 180 cm-nel &quot;\r\n                   &quot;magasabb diak jar.&quot; &lt;&lt; endl;\r\n<\/pre>\n<p>N\u00e9zz\u00fck akkor r\u00e9szletesebben, mi t\u00f6rt\u00e9nik.<\/p>\n<ul>\n<li>1- Deklar\u00e1lunk egy gy\u0171jt\u0151v\u00e1ltoz\u00f3t, ahol a felt\u00e9telnek megfelel\u0151 elemek darabsz\u00e1m\u00e1t t\u00e1roljuk. A gy\u0171jt\u0151v\u00e1ltoz\u00f3t 0 kezd\u0151\u00e9rt\u00e9kre \u00e1ll\u00edtjuk be. Ez egy\u00e9bk\u00e9nt \u00e1ltal\u00e1nos szab\u00e1ly, hogy minden gy\u0171jt\u0151v\u00e1ltoz\u00f3t legk\u00e9s\u0151bb a haszn\u00e1lata el\u0151tt (a ciklus el\u0151tt) null\u00e1zni kell!<\/li>\n<li>3- Ind\u00edtunk egy ciklust, ami a t\u00f6mb \u00f6sszes elem\u00e9n v\u00e9gigmegy.<\/li>\n<li>5- Megvizsg\u00e1ljuk, hogy az adott elem megfelel-e a felt\u00e9telnek<\/li>\n<li>7- Ha megfelel, a sz\u00e1ml\u00e1l\u00f3t eggyel megn\u00f6velj\u00fck.<\/li>\n<li>A ciklus ut\u00e1n ki\u00edrjuk az eredm\u00e9nyt.<\/li>\n<\/ul>\n<p>A kiemelt sorban a v\u00e1ltoz\u00f3 n\u00f6vel\u00e9s\u00e9t kicser\u00e9lhetj\u00fck a m\u00e1r tanult <a href=\"http:\/\/www.webotlet.hu\/?p=1735\">inkrement\u00e1l\u00f3 oper\u00e1torra<\/a>. Az\u00e9rt, mert lust\u00e1k vagyunk, \u00e9s nem akarunk sokat g\u00e9pelni \ud83d\ude42<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nszamlalo = szamlalo + 1;\r\n\/\/ helyett\r\nszamlalo++;\r\n<\/pre>\n<p>A t\u00f6bbi feladatn\u00e1l gyakorlatilag ugyanezt kell beg\u00e9pelni, igaz\u00e1b\u00f3l az egyetlen dolog ami v\u00e1ltozik az maga a <a href=\"http:\/\/www.webotlet.hu\/?p=1794\">felt\u00e9tel<\/a>, ami alapj\u00e1n megsz\u00e1molunk.<\/p>\n<h2><a name=\"\u00d6sszegz\u00e9s\"><\/a>\u00d6sszegz\u00e9s<\/h2>\n<p>Az \u00f6sszegz\u00e9s t\u00e9tele k\u00eds\u00e9rtetiesen hasonl\u00edt a megsz\u00e1ml\u00e1l\u00e1sra. Egyetlen k\u00fcl\u00f6nbs\u00e9g van csak, a gy\u0171jt\u0151v\u00e1ltoz\u00f3 n\u00f6vel\u00e9se. A feladatok is hasonl\u00f3ak, de az \u00f6sszegz\u00e9s csak sz\u00e1mszer\u0171 adatokra vonatkozik. N\u00e9h\u00e1ny p\u00e9lda ilyen k\u00e9rd\u00e9sekre:<\/p>\n<ul>\n<li>Mennyi a t\u00f6mbben tal\u00e1lhat\u00f3 p\u00e1ros sz\u00e1mok \u00f6sszege?<\/li>\n<li>Mennyi a negat\u00edv sz\u00e1mok \u00f6sszege?<\/li>\n<li>Mennyi a p\u00e1ratlan sz\u00e1mok \u00e1tlaga?<\/li>\n<\/ul>\n<p>L\u00e1ssuk akkor mondjuk az els\u0151 megold\u00e1s\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,3,5,7,11]; title: ; notranslate\" title=\"\">\r\nint osszeg = 0;\r\n\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] % 2 == 0 )\r\n    {\r\n        osszeg = osszeg + tomb&#x5B;i];\r\n    }\r\n}\r\n\r\ncout &lt;&lt; &quot;A tombben levo paros szamok osszege: &quot; &lt;&lt; osszeg &lt;&lt; endl;\r\n<\/pre>\n<p>L\u00e1thatjuk, hogy az \u00f6sszegz\u00e9s algoritmusa szinte ugyanaz, mint a megsz\u00e1ml\u00e1l\u00e1s\u00e9.<\/p>\n<ul>\n<li>1- Deklar\u00e1lunk egy gy\u0171jt\u0151v\u00e1ltoz\u00f3t, ahol a felt\u00e9telnek megfelel\u0151 elemek <span style=\"color: #ff0000;\">\u00f6sszeg\u00e9t<\/span> t\u00e1roljuk. A gy\u0171jt\u0151v\u00e1ltoz\u00f3t 0 kezd\u0151\u00e9rt\u00e9kre \u00e1ll\u00edtjuk be.<\/li>\n<li>3- Ind\u00edtunk egy ciklust, ami a t\u00f6mb \u00f6sszes elem\u00e9n v\u00e9gigmegy.<\/li>\n<li>5- Megvizsg\u00e1ljuk, hogy az adott elem megfelel-e a felt\u00e9telnek<\/li>\n<li>7- Ha megfelel, az \u00f6sszeghez <span style=\"color: #ff0000;\">hozz\u00e1adjuk<\/span> az aktu\u00e1lis elemet.<\/li>\n<li>11 &#8211; A ciklus ut\u00e1n ki\u00edrjuk az eredm\u00e9nyt.<\/li>\n<\/ul>\n<p>A l\u00e9nyegi k\u00fcl\u00f6nbs\u00e9get kiemeltem. L\u00e1that\u00f3, hogy szinte ugyanaz. Ett\u0151l f\u00fcggetlen\u00fcl ne keverj\u00fck a k\u00e9t algoritmust, mert teljesen m\u00e1s a feladatuk!<\/p>\n<p>A kiemelt sorban a v\u00e1ltoz\u00f3 n\u00f6vel\u00e9s\u00e9t kicser\u00e9lhetj\u00fck m\u00e1r tanult \u00f6sszead\u00e1ssal kombin\u00e1lt \u00e9rt\u00e9kad\u00f3 oper\u00e1torra. Ism\u00e9t csak az\u00e9rt, mert lust\u00e1k vagyunk, \u00e9s nem akarunk sokat g\u00e9pelni.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nosszeg = osszeg + tomb&#x5B;i];\r\n\/\/ helyett\r\nosszeg += tomb&#x5B;i];\r\n<\/pre>\n<p>A harmadik feladat kil\u00f3g a t\u00f6bbi k\u00f6z\u00fcl, ez nem csak tiszta \u00f6sszegz\u00e9s. Itt egyszerre kell az el\u0151z\u0151leg ismertetett megsz\u00e1ml\u00e1l\u00e1st \u00e9s \u00f6sszegz\u00e9st elv\u00e9gezni. Sz\u00fcks\u00e9g\u00fcnk van a p\u00e1ratlan sz\u00e1mok \u00f6sszeg\u00e9re, valamint a darabsz\u00e1m\u00e1ra is az \u00e1tlagol\u00e1shoz:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [8,9]; title: ; notranslate\" title=\"\">\r\nint osszeg = 0;\r\nint db = 0;\r\n\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] % 2 != 0 )\r\n    {\r\n        osszeg = osszeg + tomb&#x5B;i];\r\n        db++;\r\n    }\r\n}\r\ndouble atlag = (double)osszeg\/db;\r\ncout &lt;&lt; &quot;A tomb paratlan szamainak atlaga: &quot; &lt;&lt; atlag &lt;&lt; endl;\r\n<\/pre>\n<p>L\u00e1thatjuk, hogy a ciklussal ugyan\u00fagy v\u00e9gigmegy\u00fcnk az eg\u00e9sz t\u00f6mb\u00f6n. Ha tal\u00e1lunk egy megfelel\u0151 sz\u00e1mot, akkor hozz\u00e1adjuk az \u00f6sszeghez \u00e9s n\u00f6velj\u00fck a darabsz\u00e1mot is, hogy azt a k\u00f3dban kiemeltem. Az \u00e1tlag m\u00e1r csak egy oszt\u00e1s. De nem egyszer\u0171 oszt\u00e1s. Az osszeg \u00e9s db v\u00e1ltoz\u00f3k eg\u00e9sz t\u00edpusok. Mi lenne az eredm\u00e9nye annak, ha mondjuk az \u00f6sszeg 11 a darabsz\u00e1m pedig 5? 11\/5 = mennyi?<\/p>\n<p>Ne felejtsd el! Ha k\u00e9t eg\u00e9sz sz\u00e1mot osztunk egym\u00e1ssal, az <strong>eg\u00e9sz oszt\u00e1s<\/strong>! Az eredm\u00e9ny nem a sokszor v\u00e1rt 2,2 lenne, hanem 2,0. Az oszt\u00e1s akkor nem eg\u00e9sz oszt\u00e1s, ha legal\u00e1bb az egyik m\u0171veletben r\u00e9szt vev\u0151 sz\u00e1m nem eg\u00e9sz. A p\u00e9ld\u00e1ban m\u00e1r mutattam egy tr\u00fckk\u00f6t, de \u00edrhatn\u00e1nk \u00edgy is:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nosszeg\/(db+0.0)\r\n<\/pre>\n<p>A darabhoz ha hozz\u00e1adunk egy val\u00f3s sz\u00e1mot, akkor annak az eredm\u00e9nye m\u00e1r val\u00f3s lesz, \u00edgy az oszt\u00e1sban megjelennek a tizedesjegyek is.<\/p>\n<p>Helyette azonban legy\u00fcnk eleg\u00e1nsabbak, haszn\u00e1ljunk t\u00edpusk\u00e9nyszer\u00edt\u00e9st, amit a <a href=\"http:\/\/www.webotlet.hu\/?p=1798\">v\u00e9letlen sz\u00e1mok<\/a> t\u00e9mak\u00f6rben m\u00e1r bemutattam:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n(double)osszeg\/db\r\n<\/pre>\n<p>A t\u00edpusk\u00e9nyszer\u00edt\u00e9s sor\u00e1n az \u00f6sszeg v\u00e1ltoz\u00f3b\u00f3l kiolvasott \u00e9rt\u00e9ket lebeg\u0151pontos sz\u00e1mm\u00e1 alak\u00edtjuk, majd osztjuk egy eg\u00e9sszel. Ennek eredm\u00e9nye m\u00e1r megfelel\u0151: 2,2.<\/p>\n<p>Fontos, hogy ez a t\u00edpusk\u00e9nyszer\u00edt\u00e9s nem az eredeti \u00f6sszegv\u00e1ltoz\u00f3ban t\u00e1rolt \u00e9rt\u00e9ket v\u00e1ltoztatja meg, nincs \u00e9rt\u00e9kad\u00e1s! Nem is v\u00e1ltoztathatja meg az \u00f6sszegv\u00e1ltoz\u00f3 tartalm\u00e1t, mivel annak t\u00edpusa eg\u00e9sz. Csak a v\u00e1ltoz\u00f3b\u00f3l felhaszn\u00e1lt \u00e9rt\u00e9k\u00e9t alak\u00edtja \u00e1t a megadott t\u00edpusra.<\/p>\n<h2><a name=\"Eld\u00f6nt\u00e9s\"><\/a>Eld\u00f6nt\u00e9s<\/h2>\n<p>Enn\u00e9l a feladatt\u00edpusn\u00e1l azt vizsg\u00e1ljuk, hogy egy t\u00f6mbben tal\u00e1lhat\u00f3-e egy bizonyos tulajdons\u00e1g\u00fa elem. Nem \u00e9rdekel, hogy h\u00e1ny ilyen elem van, csak az a fontos, hogy van-e benne ilyen. Itt logikai eredm\u00e9nyt kapunk, vagyis a v\u00e1lasz igaz vagy hamis lehet. L\u00e1ssunk p\u00e1r p\u00e9ld\u00e1t olyan k\u00e9rd\u00e9sekre, amelyekre ezzel az algoritmussal kaphatunk v\u00e1laszt:<\/p>\n<ul>\n<li>Van-e az oszt\u00e1lyban l\u00e1ny?<\/li>\n<li>Van-e az oszt\u00e1lyban 190 cm-n\u00e9l magasabb di\u00e1k?<\/li>\n<li>Volt-e melegebb 38 fokn\u00e1l tavaly ny\u00e1ron?<\/li>\n<li>Van-e 30 \u00e9vn\u00e9l fiatalabb tan\u00e1r az iskol\u00e1ban?<\/li>\n<\/ul>\n<p>Ezekhez a feladatokhoz term\u00e9szetesen sz\u00fcks\u00e9g van t\u00f6mb\u00f6kre, melyek azokat az adatokat t\u00e1rolj\u00e1k, amelyek k\u00f6z\u00f6tt keress\u00fck azt a bizonyos tulajdons\u00e1g\u00fa elemet, azok k\u00f6z\u00fcl is a legels\u0151t. Eml\u00e9kezz, nem \u00e9rdekel h\u00e1ny ilyen elem van, csak az sz\u00e1m\u00edt, hogy van-e ilyen, \u00e9s ez nyilv\u00e1n a legels\u0151 megtal\u00e1lt elem lesz. Az els\u0151 p\u00e9ld\u00e1hoz sz\u00fcks\u00e9g van egy t\u00f6mbre, amely a tanul\u00f3k nem\u00e9t t\u00e1rolja, ak\u00e1r logikai t\u00edpusk\u00e9nt (l\u00e1ny \u2013 true, fi\u00fa \u2013 false). A m\u00e1sodik esetben kell egy t\u00f6mb, ami az oszt\u00e1lyba j\u00e1r\u00f3 di\u00e1kok magass\u00e1gait tartalmazza, a harmadikban egy t\u00f6mb, ami a ny\u00e1ri napok maximum h\u0151m\u00e9rs\u00e9klet\u00e9t tartalmazza, a negyedikn\u00e9l egy t\u00f6mb, amiben benne van az iskol\u00e1ban tan\u00edt\u00f3 tan\u00e1rok \u00e9letkora. Maradjunk a m\u00e1sodik p\u00e9ld\u00e1n\u00e1l, \u00e9s vegy\u00fck \u00fagy, hogy rendelkez\u00e9sre \u00e1ll egy \u201etomb\u201d nev\u0171 t\u00f6mb, ami az oszt\u00e1lyba j\u00e1r\u00f3 di\u00e1kok magass\u00e1gait r\u00f6gz\u00edti.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,3,8]; title: ; notranslate\" title=\"\">\r\nint i = 0;\r\n\r\nwhile( i &lt; meret &amp;&amp; !(tomb&#x5B;i] &gt; 190) )\r\n{\r\n    i++;\r\n}\r\n\r\nif( i &lt; meret )\r\n{\r\n    cout &lt;&lt; &quot;Van az osztalyban 190 cm-nel magasabb diak.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Na de mit is csin\u00e1l ez pontosan?<\/p>\n<ul>\n<li>1 &#8211; El\u0151sz\u00f6r deklar\u00e1lunk egy ciklusv\u00e1ltoz\u00f3t, amit arra fogunk haszn\u00e1lni, hogy indexelhess\u00fcnk (hivatkozhassunk) az egyes t\u00f6mbelemekre, jelen esetben a di\u00e1kok magass\u00e1gi adataira. Ez a sorsz\u00e1m term\u00e9szetesen 0-t\u00f3l indul, mert a Java nyelvben a t\u00f6mb\u00f6k indexei 0 sz\u00e1mmal kezd\u0151dnek.<\/li>\n<li>3 &#8211; Azt\u00e1n ind\u00edtunk egy ciklust, melynek az a feladata, hogy v\u00e9gigmehess\u00fcnk egyenk\u00e9nt a t\u00f6mb elemein. A ciklus feje viszont egy \u00f6sszetett felt\u00e9telt tartalmaz. Ennek els\u0151 fele azt vizsg\u00e1lja, hogy v\u00e9gig\u00e9rt\u00fcnk-e m\u00e1r a t\u00f6mb\u00f6n &#8211; vagyis, hogy az index kisebb-e, mint a t\u00f6mb m\u00e9rete. Ha az i egyenl\u0151 lenne a t\u00f6mbm\u00e9rettel, az m\u00e1r azt jelenten\u00e9, hogy t\u00faljutottunk az utols\u00f3 elemen, teh\u00e1t a ciklus meg\u00e1ll. Mivel a t\u00f6mb\u00f6k indexe 0-val kezd\u0151dik, ebb\u0151l k\u00f6vetkezik, hogy az utols\u00f3 elem indexe t\u00f6mbm\u00e9ret-1. A felt\u00e9tel m\u00e1sik r\u00e9sze a tulajdons\u00e1g vizsg\u00e1lat, amelyre csak akkor ker\u00fcl sor, ha m\u00e9g nem \u00e9rt\u00fcnk a t\u00f6mb v\u00e9g\u00e9re. Ezzel kihaszn\u00e1ljuk a <a href=\"http:\/\/www.webotlet.hu\/?p=1768#R\u00f6vidz\u00e1r\">logikai r\u00f6vidz\u00e1r<\/a> lehet\u0151s\u00e9g\u00e9t. Itt azt vizsg\u00e1ljuk, hogy a tomb[i] &#8211; vagyis az aktu\u00e1lis di\u00e1k magass\u00e1ga &#8211; NEM RENDELKEZIK a keresett tulajdons\u00e1ggal. Ez fura, nem pont ennek a ford\u00edtottj\u00e1t keress\u00fck? De igen, ez az algoritmus l\u00e9nyege. Addig kell keresni, am\u00edg NEM tal\u00e1ltuk meg, amit kerest\u00fcnk, hiszen ha megvan, akkor meg\u00e1llhatunk. Ha ez a k\u00e9t felt\u00e9tel egyszerre igaz (nem \u00e9rt\u00fcnk m\u00e9g a t\u00f6mb v\u00e9g\u00e9re \u00c9S nem rendelkezik az aktu\u00e1lis di\u00e1k a keresett tulajdons\u00e1ggal), akkor l\u00e9p\u00fcnk be a ciklusba, ami semmi m\u00e1st nem csin\u00e1l, csak l\u00e9pteti a sz\u00e1ml\u00e1l\u00f3t, vagyis j\u00f6het a k\u00f6vetkez\u0151 vizsg\u00e1land\u00f3 di\u00e1k. Az algoritmus nagyon fontos r\u00e9sze az, hogy a ciklus k\u00e9t felt\u00e9tel\u00e9nek sorrendje k\u00f6t\u00f6tt! El\u0151sz\u00f6r kell azt vizsg\u00e1lni, hogy nem \u00e9rt\u00fcnk-e a v\u00e9g\u00e9re, \u00e9s ha nem, csak akkor szabad megvizsg\u00e1lni, hogy az aktu\u00e1lis elem nem rendelkezik-e a keresett tulajdons\u00e1ggal. Hiszen ha m\u00e1r v\u00e9gign\u00e9zt\u00fck a t\u00f6mb\u00f6t, akkor m\u00e1r nincs mit vizsg\u00e1lni.<\/li>\n<li>8 &#8211; A ciklus befejez\u0151d\u00e9se ut\u00e1n m\u00e1r csak \u00e9rtelmezn\u00fcnk kell a kapott eredm\u00e9nyt. Az i v\u00e1ltoz\u00f3 \u00e9rt\u00e9ke az, ami a megold\u00e1st tartalmazza. Ha tal\u00e1ltunk olyan di\u00e1kot, aki rendelkezett a keresett tulajdons\u00e1ggal, akkor a ciklus id\u0151 el\u0151tt meg\u00e1llt, vagyis az i \u00e9rt\u00e9ke kisebb, mint a t\u00f6mb m\u00e9rete. Ha egyetlen di\u00e1k sem volt 190 cm-n\u00e9l magasabb, akkor a ciklus az\u00e9rt \u00e1llt meg, mert az i v\u00e1ltoz\u00f3 m\u00e1r nem kisebb a t\u00f6mb m\u00e9ret\u00e9n\u00e9l (vagyis egyenl\u0151), teh\u00e1t nem tal\u00e1ltunk olyat, aki a felt\u00e9telnek megfelelt volna.<\/li>\n<\/ul>\n<p>Term\u00e9szetesen a t\u00f6bbi feladatra is hasonl\u00f3 a megold\u00e1s, l\u00e1ssuk mondjuk a negyedik feladatot:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint i = 0;\r\n\r\nwhile( i &lt; meret &amp;&amp; tomb&#x5B;i] &gt;= 30 )\r\n{\r\n    i++;\r\n}\r\n\r\nif( i &lt; meret )\r\n{\r\n    cout &lt;&lt; &quot;Van az iskolaban 30 evnel fiatalabb tanar.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Nagyon fontos eleme teh\u00e1t az eld\u00f6nt\u00e9snek, hogy m\u00e1sodik r\u00e9szfelt\u00e9telnek azt adjuk meg, hogy az aktu\u00e1lis elem a keresett tulajdons\u00e1ggal nem rendelkezik! Mivel a felt\u00e9telek t\u00f6bbs\u00e9ge rel\u00e1ci\u00f3t tartalmaz, itt a rel\u00e1ci\u00f3k ellentettj\u00e9t kell haszn\u00e1lni!<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ 30 \u00e9vn\u00e9l fiatalabbat keres\u00fcnk\r\nwhile( ... &amp;&amp; tomb&#x5B;i] &lt; 30 )\r\n<\/pre>\n<p>helyett<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ 30 \u00e9vn\u00e9l nem fiatalabb kell a felt\u00e9telbe\r\nwhile( ... &amp;&amp; tomb&#x5B;i] &gt;= 30 )\r\n<\/pre>\n<p>\u00cdrhatn\u00e1m \u00fagy is, hogy val\u00f3ban tagadom az eredeti \u00e1ll\u00edt\u00e1st:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ 30 \u00e9vn\u00e9l nem fiatalabb\r\nwhile( ... &amp;&amp; !(tomb&#x5B;i] &lt; 30)\r\n<\/pre>\n<p>Az eredeti \u00e1ll\u00edt\u00e1s val\u00f3di tagad\u00e1s\u00e1t tomb[i] &lt; 30 -&gt; !( tomb[i] &lt; 30) \u00e9n ink\u00e1bb a rel\u00e1ci\u00f3 ellentettj\u00e9vel helyettes\u00edten\u00e9m, mivel ott egy rel\u00e1ci\u00f3 marad csak, \u00edgy csak egy m\u0171veletet kell v\u00e9grehajtani. Val\u00f3di tagad\u00e1s eset\u00e9n ott marad az eredeti rel\u00e1ci\u00f3, majd a rel\u00e1ci\u00f3 logikai \u00e9rt\u00e9k\u00e9nek tagad\u00e1sa is kell, ami k\u00e9t m\u0171velet, de ezekb\u0151l az egyik megsp\u00f3rolhat\u00f3.<\/p>\n<p>Itt visszautaln\u00e9k a rel\u00e1ci\u00f3s oper\u00e1torokn\u00e1l arra a <a href=\"http:\/\/www.webotlet.hu\/?p=391#relaciok_problemaja\">t\u00e1bl\u00e1zatra<\/a>, ahol ismertettem a rel\u00e1ci\u00f3k tagad\u00e1sait. Ne feledd: <span style=\"color: #ff0000;\">a kisebb tagad\u00e1sa nem a nagyobb!<\/span><\/p>\n<p>Mi az, amit m\u00e9g \u00e9szrevehett\u00e9l ebben az algoritmusban? Ezzel vissza is kanyarodtunk egy nagyon fontos r\u00e9szhez, a logikai kifejez\u00e9sekn\u00e9l. L\u00e1thatod, hogy a while ciklus fej\u00e9ben egy \u00f6sszetett kifejez\u00e9s szerepel. Ennek az els\u0151 fele az, hogy el\u00e9rt\u00fcnk-e m\u00e1r a t\u00f6mb v\u00e9g\u00e9ig, a m\u00e1sodik pedig az, hogy az aktu\u00e1lis elem nem rendelkezik a keresett tulajdons\u00e1ggal. L\u00e1that\u00f3, hogy a m\u00e1sodik felt\u00e9tel k\u00e9sz t\u00e9nyk\u00e9nt veszi azt, hogy ott csak val\u00f3di elemet vizsg\u00e1lhatok. Egy t\u00f6mbnek, ha eml\u00e9kszel, fix tulajdons\u00e1ga a m\u00e9rete. Vagyis csak akkora indexet lehet haszn\u00e1lni, amilyen elem m\u00e9g szerepel a t\u00f6mbben. Egy 10 elem\u0171 t\u00f6mbben nem lehet pl a tomb[12] elemre hivatkozni, mert ilyen elem nem l\u00e9tezik.<\/p>\n<p>Ez fut\u00e1si hib\u00e1t eredm\u00e9nyez. Na de itt hol ellen\u0151rz\u00f6m azt, hogy nehogy t\u00fal nagy indexet haszn\u00e1ljak? Az els\u0151 felt\u00e9telben. Ez egy <a href=\"http:\/\/www.webotlet.hu\/?p=1768#R\u00f6vidz\u00e1r\">logikai r\u00f6vidz\u00e1r<\/a>. Ha az els\u0151 r\u00e9szfelt\u00e9tel, hogy az i sz\u00e1ml\u00e1l\u00f3 kisebb, mint a t\u00f6mbm\u00e9ret (vagyis az i lehet a t\u00f6mb egy indexe) teljes\u00fcl, csak akkor vizsg\u00e1lja meg a m\u00e1sodik r\u00e9szfelt\u00e9telt, az adott elem keresett tulajdons\u00e1g\u00e1nak hi\u00e1ny\u00e1t. Ha az i el\u00e9rte a t\u00f6mbm\u00e9retet (vagyis nem kisebb), akkor a logikai r\u00f6vidz\u00e1r miatt a m\u00e1sodik felt\u00e9telt <strong>logikai \u00e9s<\/strong> eset\u00e9n m\u00e1r meg sem vizsg\u00e1lja. Nem fog olyan elemet vizsg\u00e1lni, ami nem l\u00e9tezik! Nagyon fontos eleme az algoritmusnak az, hogy a k\u00e9t r\u00e9szfelt\u00e9telnek pontosan ilyen sorrendben kell szerepelnie, mert \u00edgy oldja meg a r\u00f6vidz\u00e1r azt az ellen\u0151rz\u00e9st is, hogy csak val\u00f3di emelet vizsg\u00e1ljunk meg, \u00e9s ne kapjunk fut\u00e1si hib\u00e1t.<\/p>\n<h2><a name=\"Kiv\u00e1laszt\u00e1s\"><\/a>Kiv\u00e1laszt\u00e1s<\/h2>\n<p>Ezzel az algoritmussal azt adhatjuk meg, hogy egy adott elem pontosan hol szerepel a t\u00f6mbben. Ez term\u00e9szetesen az adott elem index\u00e9t jelenti, amellyel a t\u00f6mbben hivatkozunk r\u00e1. Ez az algoritmus felt\u00e9telezi azt, hogy az elem t\u00e9nyleg benne van a t\u00f6mbben, ez ugyanis nem keverend\u0151 \u00f6ssze a keres\u00e9s algoritmus\u00e1val, amit k\u00f6vetkez\u0151k\u00e9nt fogok ismertetni. L\u00e1ssunk erre egy p\u00e1r k\u00e9rd\u00e9st.<\/p>\n<ul>\n<li>V\u00e1lasszuk ki a t\u00f6mbb\u0151l az 50-es sz\u00e1mot (nem index, hanem \u00e9rt\u00e9k!).<\/li>\n<li>H\u00e1nyadik a sorban az a di\u00e1k, akinek a magass\u00e1ga 190 cm-n\u00e9l nagyobb.<\/li>\n<\/ul>\n<p>L\u00e1ssuk az els\u0151 p\u00e9lda megold\u00e1s\u00e1t:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint i = 0;\r\n\r\nwhile( tomb&#x5B;i] != 50 )\r\n{\r\n    i++;\r\n}\r\n\r\ncout &lt;&lt; &quot;Az 50-es sz\u00e1m indexe: &quot; &lt;&lt; i &lt;&lt; endl;\r\n<\/pre>\n<p>Ha megn\u00e9zz\u00fck, ez egy lecsupasz\u00edtott eld\u00f6nt\u00e9s algoritmusnak t\u0171nik, amikor ciklusban m\u0171k\u00f6d\u00e9si felt\u00e9telk\u00e9nt furcsa m\u00f3don azt adjuk meg, hogy a ciklus addig menjen, am\u00edg az aktu\u00e1lis elem NEM rendelkezik a tulajdons\u00e1ggal. Vagyis addig megy\u00fcnk, am\u00edg meg nem tal\u00e1ljuk. Hi\u00e1nyzik viszont a eld\u00f6nt\u00e9ses algoritmus \u00f6sszetett felt\u00e9tel\u00e9nek els\u0151 r\u00e9sze, ami azt vizsg\u00e1lja, hogy t\u00falszaladtunk-e a t\u00f6mb v\u00e9g\u00e9n. Itt erre nincs is sz\u00fcks\u00e9g, mivel abb\u00f3l indultunk ki, hogy a kiv\u00e1lasztand\u00f3 elem biztosan benne van a t\u00f6mbben.<\/p>\n<p>Kiv\u00e1laszt\u00e1sn\u00e1l lehets\u00e9ges, hogy t\u00f6bb elem is megfelel a felt\u00e9telnek, ez az algoritmus a legels\u0151 olyan elemet v\u00e1lasztja ki, akire a felt\u00e9tel\u00fcnk igaz lesz. Viszonylag k\u00f6nnyen megoldhat\u00f3 az is, hogy a legutols\u00f3 olyat v\u00e1lasszuk ki, ez csak a ciklus halad\u00e1si ir\u00e1ny\u00e1t\u00f3l \u00e9s az i kezd\u0151\u00e9rt\u00e9k\u00e9t\u0151l f\u00fcgg.<\/p>\n<h2><a name=\"Keres\u00e9s\"><\/a>Keres\u00e9s<\/h2>\n<p>A keres\u00e9s algoritmusa gyakorlatilag szinte ugyanaz, mint az eld\u00f6nt\u00e9s algoritmusa, mind\u00f6ssze az i v\u00e1ltoz\u00f3 ciklus ut\u00e1ni \u00e9rtelmez\u00e9s\u00e9n\u00e9l van k\u00fcl\u00f6nbs\u00e9g. Az\u00e9rt szerepeljen itt \u00fajra az algoritmus egy konkr\u00e9t p\u00e9ld\u00e1val. A feladatban azt keress\u00fck, hogy van-e 190 cm-n\u00e9l magasabb di\u00e1k \u00e9s hogy \u0151 h\u00e1nyadik a t\u00f6mbben:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint i = 0;\r\n\r\nwhile( i &lt; meret &amp;&amp; tomb&#x5B;i] &lt;= 190 )\r\n{\r\n    i++;\r\n}\r\n\r\nif( i &lt; meret )\r\n{\r\n    cout &lt;&lt; &quot;A 190 cm-n\u00e9l magasabb di\u00e1k helye: &quot; &lt;&lt; i &lt;&lt; endl;\r\n}\r\nelse\r\n{\r\n    cout &lt;&lt; &quot;Nincs ilyen di\u00e1k.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>L\u00e1that\u00f3 az, hogy ez biztons\u00e1gosabb algoritmus az el\u0151z\u0151n\u00e9l. Ez akkor is haszn\u00e1lhat\u00f3, ha nem tudjuk, hogy egy\u00e1ltal\u00e1n l\u00e9tezik-e ilyen di\u00e1k, ez\u00e9rt eggyel t\u00f6bb a felt\u00e9tel is, mert azt is figyelni kell, hogy a t\u00f6mb v\u00e9g\u00e9n ne szaladjunk t\u00fal. A ciklus ut\u00e1n pedig az i \u00e9rt\u00e9k\u00e9b\u0151l hat\u00e1rozhatjuk meg a keresett elem hely\u00e9t, ha ugyanis az i kisebb a t\u00f6mb m\u00e9ret\u00e9n\u00e9l (vagyis nem szaladtunk t\u00fal rajta, teh\u00e1t benne van), akkor az i m\u00e1r a keresett elem hely\u00e9t jelenti. Ha nem \u00edgy van, akkor nincs benne. Itt is logikai r\u00f6vidz\u00e1rat haszn\u00e1lunk, teh\u00e1t a k\u00e9t felt\u00e9tel sorrendje nagyon fontos. Az els\u0151 felt\u00e9tel biztos\u00edtja azt, hogy a m\u00e1sodik nem lehet hib\u00e1s. Keres\u00e9si algoritmusb\u00f3l t\u00f6bbf\u00e9le l\u00e9tezik, ez csak a legegyszer\u0171bb line\u00e1ris keres\u00e9s algoritmusa.<\/p>\n<h2><a name=\"Minimum\/maximum keres\u00e9s\"><\/a>Minimum\/maximum keres\u00e9s<\/h2>\n<p>Nagyon gyakori feladat az, amikor egy t\u00f6mbb\u0151l meg kell hat\u00e1rozni a legkisebb\/legnagyobb elemet. Ez nem csak egyszer\u0171 t\u00edpusokn\u00e1l haszn\u00e1lhat\u00f3, ak\u00e1r objektumok (t\u00f6bb tulajdons\u00e1ggal rendelkez\u0151 adatt\u00e1rol\u00f3k) k\u00f6z\u00fcl is kiv\u00e1laszthatjuk a legkisebb\/legnagyobb tulajdons\u00e1g\u00fat. Technikailag az, hogy a minimum vagy maximum \u00e9rt\u00e9ket keress\u00fck csak egy rel\u00e1ci\u00f3 megford\u00edt\u00e1s\u00e1t jelenti. N\u00e9zz\u00fck akkor, hogy n\u00e9z ki ez az algoritmus. Keress\u00fck meg a tomb nev\u0171 t\u00f6mbben a legnagyobb \u00e9rt\u00e9ket!<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [5]; title: ; notranslate\" title=\"\">\r\nint max = 0;\r\n\r\nfor( int i = 1; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] &gt; tomb&#x5B;max] )\r\n    {\r\n        max = i;\r\n    }\r\n}\r\n\r\ncout &lt;&lt; &quot;A tombben levo legnagyobb szam: &quot; &lt;&lt; tomb&#x5B;max] &lt;&lt; endl;\r\n<\/pre>\n<p>N\u00e9zz\u00fck akkor r\u00e9szenk\u00e9nt a programot. El\u0151sz\u00f6r is deklar\u00e1lunk egy max nev\u0171 v\u00e1ltoz\u00f3t, amelynek azonnal adunk is egy 0 kezd\u0151\u00e9rt\u00e9ket. Fontos, hogy ez nem egy v\u00e1ltoz\u00f3 null\u00e1z\u00e1s, mint a megsz\u00e1ml\u00e1l\u00e1s vagy \u00f6sszegz\u00e9s algoritmus\u00e1n\u00e1l tett\u00fck. Ennek a 0 \u00e9rt\u00e9knek jelent\u00e9se van. Azt jelenti, hogy a legnagyobb elem a legels\u0151, vagyis a 0 index\u0171! A max v\u00e1ltoz\u00f3ban teh\u00e1t nem a legnagyobb elem \u00e9rt\u00e9k\u00e9t, hanem a hely\u00e9t (index\u00e9t) t\u00e1roljuk. Mindj\u00e1rt vil\u00e1gos lesz, mi\u00e9rt. Azt mondjuk teh\u00e1t, hogy a legnagyobb elem a 0. helyen van, vagyis ez az els\u0151 elem. Ez teljesen egy\u00e9rtelm\u0171, hiszen am\u00edg meg nem vizsg\u00e1lom a t\u00f6mb\u00f6t, az els\u0151 elem tekinthet\u0151 a legnagyobbnak, mivel a t\u00f6bbit m\u00e9g nem ismerem. A ciklust, amivel v\u00e9gigmegyek az eg\u00e9sz t\u00f6mb\u00f6n term\u00e9szetesen a 2. elemt\u0151l indul (indexe 1) \u00e9s a t\u00f6mbm\u00e9ret-1 index\u0171 az utols\u00f3, amit vizsg\u00e1lnom kell. Ha az \u00e9ppen vizsg\u00e1lt elem (tomb[i]) nagyobb, mint az eddigi legnagyobb tomb[max], akkor az \u00faj maximum helye megv\u00e1ltozik az aktu\u00e1lisra -&gt; max = i.<\/p>\n<p>Fura lehet, hogy mi\u00e9rt a legnagyobb elem hely\u00e9t t\u00e1roljuk \u00e9s nem az \u00e9rt\u00e9k\u00e9t. Mi van akkor, ha ez a k\u00e9rd\u00e9s: H\u00e1nyadik elem a legnagyobb a t\u00f6mbben? Ha a maximumban a legnagyobb elem \u00e9rt\u00e9k\u00e9t t\u00e1roln\u00e1nk, abb\u00f3l nem tudn\u00e1nk megmondani, hogy az pontosan hol van. Az \u00f6sszes olyan k\u00e9rd\u00e9sre nem tudn\u00e1nk v\u00e1laszolni, ami a legnagyobb elem hely\u00e9re k\u00edv\u00e1ncsi.<\/p>\n<p>Ha a legkisebb elemet keress\u00fck (minimumkeres\u00e9s), akkor a kiemelt sorban fordul meg a rel\u00e1ci\u00f3s jel, \u00e9s m\u00e1ris a legkisebb elemet kapjuk meg a v\u00e9g\u00e9n. Term\u00e9szetesen minimum keres\u00e9sn\u00e9l c\u00e9lszer\u0171 a max v\u00e1ltoz\u00f3 nev\u00e9t min-re v\u00e1ltoztatni, hogy utaljon arra, mit is keresek.<\/p>\n<p>Ne felejtsd el teh\u00e1t, minimum \u00e9s maximum keres\u00e9sn\u00e9l a helyet t\u00e1rol\u00f3 v\u00e1ltoz\u00f3 kezd\u0151\u00e9rt\u00e9ke 0, mivel az els\u0151 elem lesz el\u0151sz\u00f6r a legkisebb vagy legnagyobb, ha elkezdem a keres\u00e9st.<\/p>\n<p>M\u00e1s oka is van annak, hogy a helyet \u00e9s nem az \u00e9rt\u00e9ket t\u00e1roljuk. T\u00e9telezz\u00fck fel, hogy csak negat\u00edv sz\u00e1mokat tartalmaz a t\u00f6mb\u00fcnk \u00e9s a legnagyobbat keress\u00fck k\u00f6z\u00fcl\u00fck. L\u00e9trehozunk egy max v\u00e1ltoz\u00f3t, azt null\u00e1zzuk, de ez most a legnagyobb elem \u00e9rt\u00e9k\u00e9t jelenten\u00e9. Tal\u00e1lhatunk negat\u00edv sz\u00e1mok k\u00f6z\u00f6tt olyat, ami nagyobb, mint 0? K\u00f6nnyen bel\u00e1that\u00f3, hogy csak pozit\u00edv sz\u00e1mokat tartalmaz a t\u00f6mb \u00e9s a legkisebbet keress\u00fck, akkor sem \u00e1llja meg a hely\u00e9t a null\u00e1z\u00e1s. A nulla nem pozit\u00edv, teh\u00e1t nem tal\u00e1lsz ett\u0151l kisebb pozit\u00edv sz\u00e1mot, vagyis a t\u00f6mb egyik eleme sem ker\u00fclhet a hely\u00e9re.<\/p>\n<h2><a name=\"Rendez\u00e9s\"><\/a>Rendez\u00e9s<\/h2>\n<p>Nagyon gyakori a programjainkban az a t\u00edpusfeladat, hogy sorba kell rendezni egy t\u00f6mb elemeit. Rendez\u00e9si algoritmusb\u00f3l nagyon sokf\u00e9le l\u00e9tezik, vannak egyszer\u0171bb, de lassabb t\u00edpusok, \u00e9s vannak nagyon hat\u00e9konyak. A val\u00f3di helyzet az, hogy a rendezend\u0151 adatokt\u00f3l mennyis\u00e9g\u00e9t\u0151l is f\u00fcgg az, hogy melyik rendez\u00e9si algoritmus a hat\u00e9kony, de k\u00f6z\u00e9piskolai szinten mindegy hogyan rendez\u00fcnk, csak oldjuk meg a feladatot. K\u00e9t rendez\u00e9si algoritmust fogok megmutatni, amelyeket haszn\u00e1lni\/tan\u00edtani szoktam, ha ezeket tudod, akkor b\u00e1rmilyen t\u00edpus\u00fa t\u00f6mb\u00f6t rendezni tudsz.<\/p>\n<p>A rendez\u00e9sek legt\u00f6bbje \u00f6sszehasonl\u00edt\u00e1sokon \u00e9s cser\u00e9ken alapul. \u00d6sszehasonl\u00edtunk k\u00e9t elemet, \u00e9s ha azok sorrendje nem megfelel\u0151, akkor megcser\u00e9lj\u00fck \u0151ket. Az algoritmusok sokszor abban k\u00fcl\u00f6nb\u00f6znek, hogy melyik kett\u0151t hasonl\u00edtjuk \u00f6ssze \u00e9s ut\u00e1na melyik kett\u0151t, stb. L\u00e9tezik olyan speci\u00e1lis rendez\u00e9s is, amelyik nem haszn\u00e1l \u00f6sszehasonl\u00edt\u00e1sokat \u00e9s cser\u00e9ket, de ezek csak bizonyos esetekben haszn\u00e1lhat\u00f3ak, akkor viszont hihetetlen gyorsak.<\/p>\n<p>A rendez\u00e9s eset\u00e9n m\u00e1r \u00f6sszetettebb m\u00f3don kell bej\u00e1rni a t\u00f6mb\u00f6t, amelynek elemeit rendezni szeretn\u00e9nk. Itt is igaz az, hogy nem csak egyszer\u0171 t\u00edpus\u00fa \u00e9rt\u00e9keket tartalmaz\u00f3 t\u00f6mb\u00f6ket lehet rendezni, az elemek lehetnek \u00f6sszetett objektumok is, melyek t\u00f6bbf\u00e9le t\u00edpus\u00fa \u00e9rt\u00e9ket tartalmazhatnak.<\/p>\n<p>A t\u00f6mb\u00f6k kezel\u00e9sekor, \u00e9s az alap algoritmusok haszn\u00e1latakor minden esetben ciklusokat haszn\u00e1lunk arra, hogy bej\u00e1rjuk az adott t\u00f6mb\u00f6t, \u00e9s annak \u00e9rt\u00e9keihez egym\u00e1s ut\u00e1n hozz\u00e1f\u00e9rj\u00fcnk. Abban vannak csak k\u00fcl\u00f6nbs\u00e9gek, hogy t\u00e9nylegesen bej\u00e1rjuk-e az eg\u00e9szet, vagy sem, esetleg a bej\u00e1r\u00e1s ir\u00e1nya v\u00e1ltozik. Itt azonban m\u00e1sr\u00f3l lesz sz\u00f3. Itt tal\u00e1lkozunk el\u0151sz\u00f6r az egym\u00e1sba \u00e1gyazott ciklusokkal.<\/p>\n<p>A rendez\u00e9sek, melyeket jellemz\u0151en haszn\u00e1lunk minden esetben azt az elvet k\u00f6vetik, hogy a t\u00f6mb bizonyos elemeit hasonl\u00edtj\u00e1k \u00f6ssze, hogy azok egym\u00e1shoz k\u00e9pest a k\u00edv\u00e1nt sorrendben helyezkednek-e el. Ha ez nem \u00edgy van, akkor ezt a k\u00e9t elemet meg kell cser\u00e9lni. Itt azonban nem csak az egym\u00e1s melletti szomsz\u00e9dokat vizsg\u00e1ljuk,<\/p>\n<h4>Egyszer\u0171 cser\u00e9s rendez\u00e9s<\/h4>\n<p>Ezt a rendez\u00e9st t\u00f6bb n\u00e9ven is megtal\u00e1lhatjuk az alap algoritmusok k\u00f6z\u00f6tt, \u00e9n ezt a nevet haszn\u00e1lom. Az elv, ami alapj\u00e1n dolgozik az az, hogy minden elemet \u00f6sszehasonl\u00edt az \u00f6sszes m\u00f6g\u00f6tte l\u00e9v\u0151vel, \u00e9s ha azok sorrendje nem megfelel\u0151, akkor megcser\u00e9li \u0151ket. K\u00e9t egym\u00e1sba \u00e1gyazott ciklust ig\u00e9nyel, ezeket tradicion\u00e1lisan <strong>i<\/strong> \u00e9s <strong>j<\/strong> ciklusv\u00e1ltoz\u00f3kkal haszn\u00e1ljuk. L\u00e1ssuk akkor mag\u00e1t az algoritmust, ahol felt\u00e9telezz\u00fck, hogy van egy <strong>tomb<\/strong> nev\u0171 t\u00f6mb\u00fcnk, amely v\u00e9letlen sz\u00e1mokkal van felt\u00f6ltve \u00e9s a <strong>meret<\/strong> nev\u0171 v\u00e1ltoz\u00f3ban a t\u00f6mb m\u00e9ret\u00e9t tal\u00e1ljuk meg:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,2,4,6,8,9,10]; title: ; notranslate\" title=\"\">\r\nint csere;\r\nfor( int i = 0; i &lt; meret-1; i++ )\r\n{\r\n    for( int j = i+1; j &lt; meret; j++ )\r\n    {\r\n        if( tomb&#x5B;i] &gt; tomb&#x5B;j] )\r\n        {\r\n            csere = tomb&#x5B;i];\r\n            tomb&#x5B;i] = tomb&#x5B;j];\r\n            tomb&#x5B;j] = csere;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>A ciklus \u00fagy dolgozik, hogy a j v\u00e1ltoz\u00f3 mindig az i ut\u00e1ni helyet jel\u00f6l, mivel a j kezd\u0151\u00e9rt\u00e9ke minden esetben i+1-r\u0151l indul. \u00c9ppen ez\u00e9rt az i soha nem mehet el a t\u00f6mb v\u00e9g\u00e9ig, mert akkor az utols\u00f3 elem ut\u00e1ni \u00f6sszehasonl\u00edt\u00e1st is elv\u00e9gezne, ami mindenk\u00e9pp hib\u00e1s.<\/p>\n<p>Teh\u00e1t m\u00e9g egyszer a l\u00e9nyeg: <strong>az i van el\u00f6l, a j van h\u00e1tul!<\/strong><\/p>\n<p>L\u00e1ssuk a kiemelt r\u00e9szek magyar\u00e1zat\u00e1t:<\/p>\n<ul>\n<li>1 &#8211; Kell egy csere v\u00e1ltoz\u00f3 az esetleges cser\u00e9khez seg\u00e9dv\u00e1ltoz\u00f3nak. A v\u00e1ltoz\u00f3 t\u00edpus\u00e1nak meg kell egyezni a t\u00f6mb elemeinek t\u00edpus\u00e1val, hiszen azon k\u00f6z\u00fcl fogjuk az egyiket elt\u00e1rolni benne.<\/li>\n<li>2 &#8211; Az i v\u00e1ltoz\u00f3 soha nem mehet el a t\u00f6mb v\u00e9g\u00e9ig, vagyis i &lt; meret-1;<\/li>\n<li>4 &#8211; A j mindig az i ut\u00e1n \u00e1ll, ez\u00e9rt int j = i+1;<\/li>\n<li>6 &#8211; Mindig \u00f6sszehasonl\u00edtjuk az el\u00f6l \u00e9s h\u00e1tul l\u00e9v\u0151 elemeket, \u00e9s ha ezek sorrendje nem megfelel\u0151&#8230;<\/li>\n<li>8-10 &#8211; Akkor j\u00f6n az elemek cser\u00e9je.<\/li>\n<\/ul>\n<p>A rendez\u00e9s ir\u00e1nya csak \u00e9s kiz\u00e1r\u00f3lag a 6. sorban megadott rel\u00e1ci\u00f3s jelt\u0151l f\u00fcgg. Ha az el\u00f6l l\u00e9v\u0151 nagyobb \u00e9s akkor cser\u00e9l\u00fcnk, akkor a nagyok ker\u00fclnek h\u00e1tra, vagyis n\u00f6vekv\u0151 rendez\u00e9st alkalmazunk. Ha az el\u0151l l\u00e9v\u0151 kisebb \u00e9s akkor cser\u00e9l\u00fcnk, akkor a kicsik ker\u00fclnek h\u00e1tra, \u00e9s cs\u00f6kken\u0151 rendez\u00e9st \u00edrunk. A fenti p\u00e9lda teh\u00e1t n\u00f6vekv\u0151 rendez\u00e9st val\u00f3s\u00edt meg, mivel az els\u0151 esetnek megfelel\u0151 a rel\u00e1ci\u00f3s jel.<\/p>\n<p>A cs\u00f6kken\u0151 rendez\u00e9s ehhez k\u00e9pest teh\u00e1t minim\u00e1lis v\u00e1ltoztat\u00e1ssal j\u00e1r:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [6]; title: ; notranslate\" title=\"\">\r\nint csere;\r\nfor( int i = 0; i &lt; meret-1; i++ )\r\n{\r\n    for( int j = i+1; j &lt; meret; j++ )\r\n    {\r\n        if( tomb&#x5B;i] &lt; tomb&#x5B;j] )\r\n        {\r\n            csere = tomb&#x5B;i];\r\n            tomb&#x5B;i] = tomb&#x5B;j];\r\n            tomb&#x5B;j] = csere;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<h4>Minimum\/maximum kiv\u00e1laszt\u00e1sos rendez\u00e9s<\/h4>\n<p>Ez a rendez\u00e9s az el\u0151z\u0151 tov\u00e1bbfejlesztett v\u00e1ltozata. Az el\u0151z\u0151 algoritmus \u00fagy dolgozik, hogy minden esetben megcser\u00e9li a k\u00e9t elemet, ha az aktu\u00e1lis k\u00e9t elem helyzete nem megfelel\u0151. Ez azt eredm\u00e9nyezi, hogy t\u00f6bb csere is lesz, mire a legkisebb a t\u00f6mb elej\u00e9re ker\u00fcl n\u00f6vekv\u0151 rendez\u00e9s eset\u00e9n. De ha m\u00e1r egyszer n\u00f6vekv\u0151 rendez\u00e9st akarunk megval\u00f3s\u00edtani, akkor nem lenne jobb, hogy ha el\u0151sz\u00f6r megkeresn\u00e9nk a legkisebb elemet, majd azt helyezn\u00e9nk a lista elej\u00e9re, majd ut\u00e1na megkeresn\u00e9k a m\u00e1sodik legkisebbet, azt berakn\u00e1nk az els\u0151 ut\u00e1n, \u00e9s \u00edgy tov\u00e1bb? J\u00f3val kevesebb cser\u00e9vel j\u00e1rna, mint az el\u0151z\u0151. Term\u00e9szetesen megoldhat\u00f3, az el\u0151z\u0151 rendez\u00e9si algoritmusa t\u00f6k\u00e9letesen kombin\u00e1lhat\u00f3 a m\u00e1r tanult minimum\/maximumkeres\u00e9si algoritmusokkal. L\u00e1ssuk akkor hogyan:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,2,5,8,10,13,15,16,17]; title: ; notranslate\" title=\"\">\r\nint csere;\r\nint min;\r\nfor( int i = 0; i &lt; meret-1; i++ )\r\n{\r\n    min = i;\r\n    for( int j = i+1; j &lt; meret; j++ )\r\n    {\r\n        if( tomb&#x5B;j] &lt; tomb&#x5B;min] )\r\n        {\r\n            min = j;\r\n        }\r\n    }\r\n    if( min != i )\r\n    {\r\n        csere = tomb&#x5B;i];\r\n        tomb&#x5B;i] = tomb&#x5B;min];\r\n        tomb&#x5B;min] = csere;\r\n    }\r\n}\r\n<\/pre>\n<p>L\u00e1ssuk akkor a magyar\u00e1zatot:<\/p>\n<ul>\n<li>1 &#8211; Kell egy csere v\u00e1ltoz\u00f3 az esetleges cser\u00e9khez seg\u00e9dv\u00e1ltoz\u00f3nak. A v\u00e1ltoz\u00f3 t\u00edpus\u00e1nak meg kell egyezni a t\u00f6mb elemeinek t\u00edpus\u00e1val, hiszen azon k\u00f6z\u00fcl fogjuk az egyiket elt\u00e1rolni benne.<\/li>\n<li>2 &#8211; Kell egy v\u00e1ltoz\u00f3, ahol a legkisebb elem hely\u00e9t t\u00e1roljuk (mint a minimumkiv\u00e1laszt\u00e1sn\u00e1l), de ennek itt m\u00e9g nem adunk kezd\u0151\u00e9rt\u00e9ket.<\/li>\n<li>5 &#8211; Miel\u0151tt elkezdj\u00fck a bels\u0151 ciklust, ami az el\u00f6l l\u00e9v\u0151 elem m\u00f6g\u00f6ttiek index\u00e9n megy v\u00e9gig, az el\u00f6l l\u00e9v\u0151 elemet felt\u00e9telezz\u00fck a legkisebbnek. Itt a bels\u0151 ciklus fut\u00e1s\u00e1t gyakorlatilag egy minimum kiv\u00e1laszt\u00e1snak \u00edrtuk meg. A tomb[i] az els\u0151 elem, ez\u00e9rt ennek a hely\u00e9t felt\u00e9telezz\u00fck a legkisebb elem hely\u00e9nek,<\/li>\n<li>8 &#8211; majd, ha az eddigi minimumt\u00f3l valamelyik m\u00f6g\u00f6tte l\u00e9v\u0151 (tomb[j]) t\u0151le kisebb,<\/li>\n<li>10 &#8211; akkor a h\u00e1tul l\u00e9v\u0151 elem hely\u00e9t (j) jegyezz\u00fck meg, mint aktu\u00e1lis legkisebbet.<\/li>\n<li>13 &#8211; Ha a bels\u0151 ciklussal v\u00e9gezt\u00fcnk, akkor a min v\u00e1ltoz\u00f3ban benne van a h\u00e1tul l\u00e9v\u0151 elemek k\u00f6z\u00fcl a legkisebbnek a helye. Ha ez a hely nem egyenl\u0151 az el\u00f6l l\u00e9v\u0151vel (vagyis nem \u00f6nmaga a legkisebb), akkor tal\u00e1ltunk az el\u00f6l l\u00e9v\u0151 (i) elem m\u00f6g\u00f6tt t\u0151le kisebbet, melynek helyet a min v\u00e1ltoz\u00f3ban t\u00e1roljuk.<\/li>\n<li>15-17 &#8211; Ebben az esetben a k\u00e9t elemet (i \u00e9s min helyen l\u00e9v\u0151ket) megcser\u00e9lj\u00fck.<\/li>\n<\/ul>\n<p>Ezt az algoritmust ink\u00e1bb csak \u00e9rdekess\u00e9gk\u00e9pp mutattam meg, \u00e9retts\u00e9gire t\u00f6k\u00e9letesen el\u00e9g, ha az egyszer\u0171 cser\u00e9s rendez\u00e9st megtanulod, mert csak az a k\u00f6vetelm\u00e9ny, hogy rendezni tudj, teljesen mindegy, melyik algoritmussal. Nyilv\u00e1n a legegyszer\u0171bbet c\u00e9lszer\u0171 megtanulni, a hat\u00e9konys\u00e1g nem k\u00f6vetelm\u00e9ny.<\/p>\n<h2><a name=\"Kiv\u00e1logat\u00e1s\"><\/a>Kiv\u00e1logat\u00e1s<\/h2>\n<p>Szint\u00e9n az alap algoritmusok k\u00f6z\u00e9 tartozik az a feladatt\u00edpus, amikor bizonyos tulajdons\u00e1gnak, vagy tulajdons\u00e1goknak megfelel\u0151 elemeket kell egy t\u00f6mbb\u0151l egy m\u00e1sik t\u00f6mbbe kiv\u00e1logatni. Tegy\u00fck fel, van egy eg\u00e9szeket tartalmaz\u00f3 t\u00f6mb\u00fcnk, melyet a [-9;9] intervallumb\u00f3l t\u00f6lt\u00f6tt\u00fcnk fel. Hogyan oldhatjuk meg, hogy ebb\u0151l a t\u00f6mbb\u0151l egy m\u00e1sik t\u00f6mbbe kigy\u0171jtj\u00fck a negat\u00edv sz\u00e1mokat? Minden esetben l\u00e9tre kell hozni egy m\u00e1sik t\u00f6mb\u00f6t, amibe a megfelel\u0151 elemeket m\u00e1soljuk. De mekkora legyen ez a t\u00f6mb? Ez az ami alapvet\u0151en meghat\u00e1rozza, hogy milyen megold\u00e1si m\u00f3dot alkalmazunk. K\u00e9tf\u00e9le esetet k\u00fcl\u00f6nb\u00f6ztet\u00fcnk meg:<\/p>\n<ol>\n<li>L\u00e9trehozunk egy eredeti t\u00f6mbnek megfelel\u0151 m\u00e9ret\u0171 t\u00f6mb\u00f6t, azt felt\u00e9telezve, hogy ak\u00e1r az \u00f6sszes elem lehet negat\u00edv, \u00edgy mindet \u00e1t kell m\u00e1solni. Ha azonban nem minden elem negat\u00edv, akkor az \u00faj t\u00f6mbben maradnak \u00fcres helyek, ahova nem rakunk \u00e1t semmit. \u00cdgy nyilv\u00e1n kell tartanunk, hogy h\u00e1ny elemet m\u00e1soltunk \u00e1t az \u00faj t\u00f6mbbe, \u00e9s mennyi maradt &#8220;\u00fcresen&#8221; a v\u00e9g\u00e9n.<\/li>\n<li>Megoldhatjuk \u00fagy is, hogy el\u0151sz\u00f6r megsz\u00e1moljuk, hogy h\u00e1ny elem felel meg a felt\u00e9telnek, ami alapj\u00e1n a kiv\u00e1logat\u00e1st el akarjuk v\u00e9gezni, \u00e9s az \u00faj t\u00f6mb\u00f6t pontosan akkor\u00e1nak \u00e1ll\u00edtjuk be. \u00cdgy a megold\u00e1s v\u00e9g\u00e9n az \u00faj t\u00f6mbben csak azok az elemek lesznek benne, amelyeket mi helyezt\u00fcnk el benne.<\/li>\n<\/ol>\n<p>A k\u00e9t megold\u00e1sb\u00f3l a m\u00e1sodik nyilv\u00e1n picivel t\u00f6bb munk\u00e1val j\u00e1r, mert kapcsol\u00f3dik hozz\u00e1 egy megsz\u00e1ml\u00e1l\u00e1s is, viszont ut\u00e1na m\u00e1r nem kell att\u00f3l tartanunk, hogy az eredm\u00e9ny t\u00f6mbben olyan elem is el\u0151fordul, ami nem felel meg a kiv\u00e1logat\u00e1s felt\u00e9tel\u00e9nek.<\/p>\n<p>L\u00e1ssuk akkor a k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 megold\u00e1st. Mindk\u00e9t esetben felt\u00e9telezz\u00fck, hogy van egy <strong>tomb<\/strong> nev\u0171 t\u00f6mb\u00fcnk, amely v\u00e9letlen sz\u00e1mokkal van felt\u00f6ltve, \u00e9s a <strong>meret<\/strong> nev\u0171 v\u00e1ltoz\u00f3ban a t\u00f6mb m\u00e9ret\u00e9t tal\u00e1ljuk meg. Az \u00faj t\u00f6mbbe a p\u00e1ratlan sz\u00e1mokat szeretn\u00e9nk kiv\u00e1logatni:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,3,4,6,8,9]; title: ; notranslate\" title=\"\">\r\nint paratlan&#x5B;meret] = {0};\r\n\r\nint db = 0;\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] % 2 != 0 )\r\n    {\r\n        paratlan&#x5B;db] = tomb&#x5B;i];\r\n        db++;\r\n    }\r\n}\r\n<\/pre>\n<p>L\u00e1ssuk akkor a kiemelt sorok magyar\u00e1zat\u00e1t:<\/p>\n<ul>\n<li>1 &#8211; L\u00e9trehozok egy ugyanakkora t\u00f6mb\u00f6t, mint az eredeti, lehet\u0151s\u00e9get adva arra, hogy ak\u00e1r minden elemet kiv\u00e1logathassak.<\/li>\n<li>3 &#8211; L\u00e9trehozok egy db nev\u0171 v\u00e1ltoz\u00f3t, ami jelen esetben az els\u0151 \u00fcres helyet fogja t\u00e1rolni, ahova a k\u00f6vetkez\u0151 kiv\u00e1logatott elemet elhelyezhetem, a kiv\u00e1logat\u00e1s v\u00e9gezt\u00e9vel pedig t\u00e1rolni fogja, hogy az \u00faj t\u00f6mbbe h\u00e1ny elem ker\u00fclt bele.<\/li>\n<li>4 &#8211; V\u00e9gigmegyek az eredeti t\u00f6mb\u00f6n,<\/li>\n<li>6 &#8211; \u00e9s ha az eredeti t\u00f6mbben p\u00e1ratlan sz\u00e1mot tal\u00e1lunk,<\/li>\n<li>8 &#8211; akkor az \u00faj t\u00f6mbben a els\u0151 \u00fcres helyre (db) elhelyezem az elemet,<\/li>\n<li>9 &#8211; majd megn\u00f6velem a db-ot, hogy az esetleges k\u00f6vetkez\u0151 \u00e1tm\u00e1solt elem ne \u00edrja fel\u00fcl az el\u0151z\u0151t.<\/li>\n<\/ul>\n<p>L\u00e1that\u00f3, hogy nem olyan bonyolult algoritmusr\u00f3l van sz\u00f3, a kulcs az, hogy mindig t\u00e1rolom egy v\u00e1ltoz\u00f3ban, hogy hol van az \u00faj t\u00f6mbben az els\u0151 \u00fcres hely, mert csak oda rakhatok bele a kiv\u00e1logat\u00e1s sor\u00e1n elemeket. A gond csak annyi, hogy ha van egy 1000 m\u00e9ret\u0171 t\u00f6mb\u00f6m, amibe 3 elemet kellene csak kiv\u00e1logatni, akkor is a mem\u00f3ri\u00e1ban foglalja az 1000 elemnyi helyet a 3 kedv\u00e9\u00e9rt.<\/p>\n<p>L\u00e1ssuk akkor a m\u00e1sik megold\u00e1st:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,2,3,4,5,6,7,8,10,12,13,14,15,16,17,18,19,20]; title: ; notranslate\" title=\"\">\r\nint db = 0;\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] % 2 != 0 )\r\n    {\r\n        db++;\r\n    }\r\n}\r\n\r\nint paratlan&#x5B;db] = {0};\r\n\r\ndb = 0;\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    if( tomb&#x5B;i] % 2 != 0 )\r\n    {\r\n        paratlan&#x5B;db] = tomb&#x5B;i];\r\n        db++;\r\n    }\r\n}\r\n<\/pre>\n<p>Ha j\u00f3l megn\u00e9zed nem sokkal bonyolultabb, picit t\u00f6bbet kell g\u00e9pelni, \u00e9s ki kellett eg\u00e9sz\u00edteni a megsz\u00e1ml\u00e1l\u00e1s alap algoritmus\u00e1val:<\/p>\n<ul>\n<li>1-8 &#8211; Megsz\u00e1moljuk, h\u00e1ny elemet kell majd kiv\u00e1logatni az \u00faj t\u00f6mbbe.<\/li>\n<li>10 &#8211; L\u00e9trehozunk egy pontosan akkora t\u00f6mb\u00f6t, \u00e9s felt\u00f6ltj\u00fck 0 \u00e9rt\u00e9kekkel. (ez a l\u00e9p\u00e9s val\u00f3j\u00e1ban felesleges, de nem baj ha megszokjuk, hogy egy l\u00e9trehozott t\u00f6mb\u00f6t illik 0 kezd\u0151\u00e9rt\u00e9kekkel felt\u00f6lteni)<\/li>\n<li>12-20 &#8211; Ez pontosan az els\u0151 megold\u00e1s.<\/li>\n<\/ul>\n<p><strong>Az eg\u00e9sz algoritmus kulcs momentuma a db v\u00e1ltoz\u00f3 haszn\u00e1lata!<\/strong> Ennek t\u00f6bb szerepe is van. El\u0151sz\u00f6r a kiv\u00e1logatand\u00f3 elemek darabsz\u00e1m\u00e1t gy\u0171jtj\u00fck bele, ut\u00e1na a k\u00f6vetkez\u0151 \u00fcres helyet jel\u00f6li az \u00faj t\u00f6mbben, v\u00e9g\u00fcl a kiv\u00e1logat\u00e1s v\u00e9gezt\u00e9vel az \u00faj t\u00f6mb m\u00e9ret\u00e9t jelenti, amit az \u00faj t\u00f6mb kezel\u00e9sekor (ki\u00edrat\u00e1s, rendez\u00e9s, stb) term\u00e9szetesen felhaszn\u00e1lhatunk.<\/p>\n<h2>Komplex feladat<\/h2>\n<p>L\u00e1ssunk egy komplexebb feladatot. Adott egy 10 elem\u0171 t\u00f6mb melyet v\u00e9letlen sz\u00e1mokkal t\u00f6lt\u00f6tt\u00fcnk fel a [-9;9] intervallumb\u00f3l. \u00cdrjuk ki n\u00f6vekv\u0151 sorrendben a t\u00f6mbben szerepl\u0151 p\u00e1ros sz\u00e1mokat.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2,3,9,11,12,13,14,15,16,17,19,20,21,22,24,26,27,28,29,30,31,32,33,35,37,38,39,40,41,42,43,44,45,47,48,49,50,51,52,53,54,55,56,57,58,59,61,62,63,64,66]; title: ; notranslate\" title=\"\">\r\n#include &lt;iostream&gt;\r\n#include &lt;ctime&gt;\r\n#include &lt;cstdlib&gt;\r\n\r\nusing namespace std;\r\n\r\nint main()\r\n{\r\n    srand(time(0));\r\n\r\n    int meret = 10;\r\n    int tomb&#x5B;meret];\r\n\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        tomb&#x5B;i] = rand() % 19 - 9;\r\n    }\r\n\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        cout &lt;&lt; tomb&#x5B;i] &lt;&lt; &quot; &quot;;\r\n    }\r\n\r\n    cout &lt;&lt; endl &lt;&lt; endl;\r\n\r\n    int db = 0;\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        if( tomb&#x5B;i] % 2 == 0 )\r\n        {\r\n            db++;\r\n        }\r\n    }\r\n\r\n    int paros&#x5B;db] = {0};\r\n\r\n    db = 0;\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        if( tomb&#x5B;i] % 2 == 0 )\r\n        {\r\n            paros&#x5B;db] = tomb&#x5B;i];\r\n            db++;\r\n        }\r\n    }\r\n\r\n    int csere;\r\n    for( int i = 0; i &lt; db-1; i++ )\r\n    {\r\n        for( int j = i+1; j &lt; db; j++ )\r\n        {\r\n            if( paros&#x5B;i] &gt; paros&#x5B;j] )\r\n            {\r\n                csere = paros&#x5B;i];\r\n                paros&#x5B;i] = paros&#x5B;j];\r\n                paros&#x5B;j] = csere;\r\n            }\r\n        }\r\n    }\r\n\r\n    for( int i = 0; i &lt; db; i++ )\r\n    {\r\n        cout &lt;&lt; paros&#x5B;i] &lt;&lt; &quot; &quot;;\r\n    }\r\n\r\n    cout &lt;&lt; endl;\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<p>Ez egy t\u00f6k\u00e9letes feladat arra, hogy az eddig tanultakat \u00f6sszefoglalja. Sok ismer\u0151s r\u00e9szletet l\u00e1thatunk benne, de l\u00e1ssuk akkor r\u00e9szenk\u00e9nt:<\/p>\n<ul>\n<li>2-3 &#8211; Sz\u00fcks\u00e9ges k\u00f3dok beilleszt\u00e9se a v\u00e9letlen sz\u00e1m sorsol\u00e1shoz.<\/li>\n<li>9 &#8211; Belekever\u00fcnk a v\u00e9letlen sz\u00e1m sorsol\u00e1sba.<\/li>\n<li>11-17 &#8211; Adott m\u00e9ret\u0171 t\u00f6mb l\u00e9trehoz\u00e1sa 0 kezd\u0151\u00e9rt\u00e9kekkel, majd felt\u00f6lt\u00e9se v\u00e9letlen sz\u00e1mokkal.<\/li>\n<li>19-22 &#8211; A kisorsolt t\u00f6mb ki\u00edrat\u00e1sa.<\/li>\n<li>24 &#8211; Sordob\u00e1s a sorsolt t\u00f6mb ki\u00edrat\u00e1sa ut\u00e1n, hogy ne folyjon egybe majd a rendezett t\u00f6mb ki\u00edrat\u00e1s\u00e1val.<\/li>\n<li>26-33 &#8211; A kiv\u00e1logat\u00e1shoz megsz\u00e1moljuk, h\u00e1ny elemet kell majd \u00e1trakni az \u00faj t\u00f6mbbe.<\/li>\n<li>35 &#8211; L\u00e9trehozzuk az \u00faj t\u00f6mb\u00f6t 0 kezd\u0151\u00e9rt\u00e9kekkel.<\/li>\n<li>37-45 &#8211; Kiv\u00e1logatjuki (\u00e1tm\u00e1soljuk) a p\u00e1ros sz\u00e1mokat az \u00faj t\u00f6mbbe.<\/li>\n<li>47-59 &#8211; Rendezz\u00fck az \u00faj t\u00f6mb\u00f6t.<\/li>\n<li>61-64 &#8211; Ki\u00edrjuk a kiv\u00e1logatott \u00e9s rendezett \u00faj t\u00f6mb\u00f6t.<\/li>\n<li>66 &#8211; Egy b\u00f3nusz sordob\u00e1s a v\u00e9g\u00e9re, hogy ha b\u0151v\u00edten\u00e9m a programot, akkor az \u00faj ki\u00edrat\u00e1s \u00faj sorban kezd\u0151dj\u00f6n.<\/li>\n<\/ul>\n<p>Adott teh\u00e1t egy els\u0151re bonyolultnak t\u0171n\u0151 feladat, amit sz\u00e9tbontottuk olyan r\u00e9szekre, melyeket m\u00e1r k\u00fcl\u00f6n-k\u00fcl\u00f6n meg tudunk oldani. Ezeket a k\u00e9sz megold\u00e1sokat (t\u00f6mb felt\u00f6lt\u00e9s, ki\u00edrat\u00e1s, megsz\u00e1ml\u00e1l\u00e1s, kiv\u00e1logat\u00e1s, rendez\u00e9s, stb) megfelel\u0151 sorrendben <strong>hib\u00e1tlanul<\/strong> \u00f6sszerakjuk, \u00e9s k\u00e9sz a feladat teljes megold\u00e1sa. Ugye \u00edgy jobban belegondolva nem is olyan neh\u00e9z? Felt\u00e9ve hogy az eddigi tananyagokat m\u00e1r k\u00e9szs\u00e9gszinten alkalmazni tudod. Sokszor az a legnehezebb feladat, hogy felismerj\u00fck azt, hogy az aktu\u00e1lis feladat milyen kisebb alkot\u00f3elemekre bonthat\u00f3, melyekre m\u00e1r k\u00e9sz megold\u00e1saink vannak. Ha ez a r\u00e9szekre bont\u00e1s megy, akkor gyakorlatilag sokszor g\u00e9pel\u00e9si feladatt\u00e1 tudjuk egyszer\u0171s\u00edteni a feladatok nagy r\u00e9sz\u00e9nek megold\u00e1s\u00e1t.<\/p>\n<h4>K\u00f6vetkez\u0151 lecke: <a href=\"http:\/\/www.webotlet.hu\/?p=1841\">String <\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Alap algoritmusok, avagy mindenki tud programozni A programoz\u00e1ssal sokszor az a baj \u2013 f\u0151leg ha k\u00f6telez\u0151 tant\u00e1rgy \u00e9s nem szeretj\u00fck \u2013 hogy gondolkodni kell. Igaz, mondhatn\u00e1m ezt a matematik\u00e1ra, fizik\u00e1ra is, de egyik tant\u00e1rgy sem annyira szerte\u00e1gaz\u00f3 a helyes megold\u00e1sok <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1921\">Tov\u00e1bb <span class=\"screen-reader-text\">  C++ programoz\u00e1s 15. \u2013 Alap algoritmusok<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[151],"tags":[],"class_list":["post-1921","post","type-post","status-publish","format-standard","hentry","category-cplusplus-alap-leckek"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1921"}],"version-history":[{"count":26,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1921\/revisions"}],"predecessor-version":[{"id":2027,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1921\/revisions\/2027"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}