{"id":1997,"date":"2017-01-17T22:30:51","date_gmt":"2017-01-17T21:30:51","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1997"},"modified":"2017-01-23T08:01:00","modified_gmt":"2017-01-23T07:01:00","slug":"c-halado-leckek-17-sajat-fuggvenyek","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1997","title":{"rendered":"C++ halad\u00f3 leck\u00e9k 17. &#8211; Saj\u00e1t f\u00fcggv\u00e9nyek"},"content":{"rendered":"<h1>Saj\u00e1t f\u00fcggv\u00e9nyek, avagy lustas\u00e1g f\u00e9l eg\u00e9szs\u00e9g<\/h1>\n<p>Programjaink \u00edr\u00e1sakor sokszor futunk bele olyan helyzetbe, hogy bizonyos k\u00f3d r\u00e9szeket t\u00f6bbsz\u00f6r kell haszn\u00e1lni. Gondoljunk csak arra, hogy ha egy t\u00f6mbbel dolgozunk, azt nyilv\u00e1n szeretn\u00e9nk ki\u00edratni. Ut\u00e1na mondjuk rendezni szeretn\u00e9nk, de szint\u00e9n szeretn\u00e9nk ki\u00edratni, hogy l\u00e1ssuk az eredm\u00e9nyt. A ki\u00edrat\u00e1s igaz ugyan, hogy csak egy g\u00e9pel\u00e9si feladat, de akkor is \u00fajra meg kell \u00edrni egym\u00e1st\u00f3l f\u00fcggetlen\u00fcl k\u00e9tszer. \u00c9s ha csak egyszer \u00edrn\u00e1nk meg, de ak\u00e1rh\u00e1nyszor haszn\u00e1lhatn\u00e1nk? A saj\u00e1t f\u00fcggv\u00e9nyek pontosan erre val\u00f3k. Visszautaln\u00e9k a <a href=\"http:\/\/www.webotlet.hu\/?p=1846\">f\u00fcggv\u00e9nyek<\/a> leck\u00e9re, an\u00e9lk\u00fcl ne is olvass tov\u00e1bb. Ha az a t\u00e9mak\u00f6r tiszta, akkor l\u00e1ssunk neki.<\/p>\n<p>N\u00e9zz\u00fck meg, hogy n\u00e9z ki egy saj\u00e1t f\u00fcggv\u00e9ny. Tegy\u00fck fel, sz\u00fcks\u00e9g\u00fcnk van egy f\u00fcggv\u00e9nyre, amely ki\u00edrja egy sz\u00e1mtani sorozat els\u0151 15 elem\u00e9t egym\u00e1s mell\u00e9 sz\u00f3k\u00f6zzel elv\u00e1lasztva. Egy sz\u00e1mtani sorozathoz sz\u00fcks\u00e9g van a sorozat els\u0151 elem\u00e9re \u00e9s a differenci\u00e1ra (az elemek k\u00f6z\u00f6tti k\u00fcl\u00f6nbs\u00e9gre).<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,3,5,7,8,10]; title: ; notranslate\" title=\"\">\r\nvoid szamtani( int a1, int d )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; 15; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>L\u00e1ssuk akkor a kiemelt r\u00e9szek magyar\u00e1zat\u00e1t:<\/p>\n<ul>\n<li>1 &#8211; A f\u00fcggv\u00e9ny\u00fcnk nem eredm\u00e9nyt \u00e1ll\u00edt el\u0151, hanem egy ki\u00edrat\u00e1st hajt v\u00e9gre, ki\u00edrja a sorozat elemeit, ez\u00e9rt a f\u00fcggv\u00e9ny t\u00edpusa void.<\/li>\n<li>3 &#8211; L\u00e9trehozok egy elem nev\u0171 v\u00e1ltoz\u00f3t, ami a sorozat aktu\u00e1lis elem\u00e9t fogja t\u00e1rolni, ennek kezd\u0151\u00e9rt\u00e9ke a kapott a1, a sorozat els\u0151 eleme lesz.<\/li>\n<li>5 &#8211; Ind\u00edtok egy ciklust, ami 15x v\u00e9grehajt valamit.<\/li>\n<li>7 &#8211; El\u0151sz\u00f6r ki\u00edrja az aktu\u00e1lis elemet (ami els\u0151 esetben a kezd\u0151\u00e9rt\u00e9k lesz),<\/li>\n<li>8 &#8211; ut\u00e1na kisz\u00e1m\u00edtja a k\u00f6vetkez\u0151 \u00e9rt\u00e9ket. Term\u00e9szetesen \u00edgy a ciklus v\u00e9g\u00e9n az elem m\u00e1r a 16. elemet t\u00e1rolja, de azt m\u00e1r nem \u00edrja ki.<\/li>\n<li>10 &#8211; Egy sordob\u00e1s a ki\u00edrat\u00e1s ut\u00e1n, hogy a k\u00f6vetkez\u0151 esetleges ki\u00edrat\u00e1s ne ennek a sornak a v\u00e9g\u00e9n kezd\u0151dj\u00f6n.<\/li>\n<\/ul>\n<p>Ha mondjuk ehhez hasonl\u00f3 a feladat, de nem ki\u00edrni kell a sorozat els\u0151 15 elem\u00e9t, hanem esetleg azok \u00f6sszeg\u00e9re van sz\u00fcks\u00e9g\u00fcnk, akkor egy kis m\u00f3dos\u00edt\u00e1ssal ez is megoldhat\u00f3. Term\u00e9szetesen a sz\u00e1mtani sorozatokn\u00e1l ismert \u00f6sszegk\u00e9plettel is megadhat\u00f3 lenne az els\u0151 n elem \u00f6sszege, de most tekints\u00fcnk el ett\u0151l, \u00e9s l\u00e1ssuk be, \u00edgy sem t\u00fal bonyolult.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,8]; title: ; notranslate\" title=\"\">\r\nvoid szamtani( int a1, int d )\r\n{\r\n    int elem = a1;\r\n    int osszeg = 0;\r\n\r\n    for( int i = 0; i &lt;&lt; 15; i++ )\r\n    {\r\n        osszeg += elem;\r\n        elem += d;\r\n    }\r\n    return osszeg;\r\n}\r\n<\/pre>\n<ul>\n<li>4 &#8211; Az \u00f6sszegz\u00e9shez sz\u00fcks\u00e9g van egy null\u00e1zott \u00f6sszeg v\u00e1ltoz\u00f3ra.<\/li>\n<li>8 &#8211; Az elemeket pedig \u00f6sszeadjuk az \u00f6sszeg v\u00e1ltoz\u00f3ba.<\/li>\n<\/ul>\n<p>L\u00e1ssunk akkor m\u00e1st. \u00cdrjunk f\u00fcggv\u00e9nyt, mely a kapott 3 eg\u00e9sz sz\u00e1mr\u00f3l eld\u00f6nti, hogy szerkeszthet\u0151-e bel\u0151l\u00fck h\u00e1romsz\u00f6g.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,5,9]; title: ; notranslate\" title=\"\">\r\nbool haromszog( int a, int b, int c )\r\n{\r\n    if( a + b &gt; c &amp;&amp; a + c &gt; b &amp;&amp; b + c &gt; a )\r\n    {\r\n        return true;\r\n    }\r\n    else\r\n    {\r\n        return false;\r\n    }\r\n}\r\n<\/pre>\n<ul>\n<li>1 &#8211; A f\u00fcggv\u00e9ny egy logikai eredm\u00e9nyt ad, mert vagy szerkeszthet\u0151, vagy nem.<\/li>\n<li>5 &#8211; Ha b\u00e1rmely k\u00e9t oldal \u00f6sszege nagyobb, mint a harmadik oldal, akkor igen,<\/li>\n<li>9 &#8211; egy\u00e9bk\u00e9nt nem szerkeszthet\u0151.<\/li>\n<\/ul>\n<p>Ez a feladat is megoldhat\u00f3 r\u00f6videbben, legal\u00e1bbis a felt\u00e9telvizsg\u00e1latos r\u00e9sze. Gondoljunk arra, hogy a return true sor csak akkor hajthat\u00f3 v\u00e9gre, ha az if()-ben megadott felt\u00e9tel igaz. Vagyis ha a felt\u00e9tel igaz, akkor az m\u00e1r \u00f6nmag\u00e1ban lehetne visszat\u00e9r\u00e9si \u00e9rt\u00e9k. Mi v\u00e1ltozik akkor ha ezt \u00e9szrevessz\u00fck?<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nbool haromszog( int a, int b, int c )\r\n{\r\n    return (a + b &gt; c &amp;&amp; a + c &gt; b &amp;&amp; b + c &gt; a);\r\n}\r\n<\/pre>\n<p>Az\u00e9rt j\u00f3val r\u00f6videbb lett, nem? Az \u00f6sszetett kifejez\u00e9s k\u00f6r\u00fcli z\u00e1r\u00f3jel is elhagyhat\u00f3 lenne, mert a t\u00e9nyleges visszat\u00e9r\u00e9s (return) el\u0151tt ki\u00e9rt\u00e9kel\u0151dik a kifejez\u00e9s, \u00e9s annak az egyetlen eredm\u00e9nye ker\u00fcl vissza a return utas\u00edt\u00e1ssal a f\u00fcggv\u00e9nyt h\u00edv\u00f3 r\u00e9szhez a vez\u00e9rl\u00e9s.<\/p>\n<p>A f\u00fcggv\u00e9nyek t\u00falterhelhet\u0151ek. Ez azt jelenti, hogy azonos nev\u0171, de k\u00fcl\u00f6nb\u00f6z\u0151 szignat\u00far\u00e1j\u00fa f\u00fcggv\u00e9nyek is k\u00e9sz\u00fclhetnek, ha a sz\u00fcks\u00e9g \u00fagy k\u00edv\u00e1nja. B\u0151v\u00edts\u00fck ki az egyik el\u0151z\u0151 feladatot. Ha eml\u00e9kszel, k\u00e9sz\u00edtett\u00fcnk egy f\u00fcggv\u00e9nyt, amely egy sorozatnak ki\u00edrja az els\u0151 15 elem\u00e9t. K\u00e9sz\u00edts\u00fcnk olyan f\u00fcggv\u00e9nyt is, amely egy sorozat tetsz\u0151leges, \u00e1ltalunk megadott darabnyi elem\u00e9t \u00edrja ki. Ezt \u00fagy oldjuk meg, hogy a m\u00e1r meg\u00edrt 15 elemet ki\u00edr\u00f3 f\u00fcggv\u00e9nyt ne b\u00e1ntsuk, k\u00e9sz\u00edts\u00fck el k\u00fcl\u00f6n f\u00fcggv\u00e9nyben az \u00e1ltal\u00e1nos megold\u00e1st azonos n\u00e9ven, \u00e9s csak a szignat\u00far\u00e1ban legyen k\u00fcl\u00f6nbs\u00e9g.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [13,17]; title: ; notranslate\" title=\"\">\r\nvoid szamtani( int a1, int d )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; 15; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n\r\nvoid szamtani( int a1, int d, int n )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; n; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A k\u00e9t v\u00e1ltoztat\u00e1s az azonos nev\u0171 f\u00fcggv\u00e9nyben a k\u00f6vetkez\u0151:<\/p>\n<ul>\n<li>13 &#8211; A f\u00fcggv\u00e9ny kapott param\u00e9terei k\u00f6z\u00f6tt utols\u00f3k\u00e9nt megjelent egy n is, ami az elemsz\u00e1mot jelenti, hogy h\u00e1ny elem\u00e9t szeretn\u00e9d ki\u00edrni a sorozatnak.<\/li>\n<li>17 &#8211; Ez az n pedig megjelenik a ciklusban is, mert ennyi darab elemet szeretn\u00e9nk ki\u00edrni, teh\u00e1t ez lesz a hat\u00e1r a ciklus fut\u00e1s\u00e1nak darabsz\u00e1m\u00e1ban.<\/li>\n<\/ul>\n<p>Van egy nagyon fontos elv a programoz\u00e1skor, amelyet j\u00f3, ha az ember megtanul, mert ezzel nagyon-nagyon sok gondt\u00f3l k\u00edm\u00e9lheti meg mag\u00e1t. Ez az elv els\u0151dlegesen nem k\u00f6z\u00e9piskolai tanulm\u00e1nyaink sor\u00e1n kap szerepet, hanem a majdani esetleges programoz\u00f3i munk\u00e1nkban. Ott is f\u0151leg akkor, amikor nem egyed\u00fcl, hanem csapatban kell dolgozni, az elv a k\u00f6vetkez\u0151:<\/p>\n<p><em><span style=\"color: #000000;\"><strong>Logik\u00e1t nem duplik\u00e1lunk!<\/strong><\/span><\/em><\/p>\n<p>Vagyis, az azonos logik\u00e1t haszn\u00e1l\u00f3 programr\u00e9szek minden tov\u00e1bbi n\u00e9lk\u00fcl hivatkozhatnak egym\u00e1sra, s\u0151t, ez elv\u00e1rt k\u00f6vetelm\u00e9ny!<\/p>\n<p>Ha jobban megn\u00e9zed, a fenti k\u00e9t f\u00fcggv\u00e9ny a t\u00falterhel\u00e9s miatt nagyon hasonl\u00f3 k\u00f3dr\u00e9szleteket tartalmaz. Amire nek\u00fcnk f\u00fcggv\u00e9ny szinten sz\u00fcks\u00e9g\u00fcnk van:<\/p>\n<ul>\n<li>egy f\u00fcggv\u00e9ny, mely egy sz\u00e1mtani sorozat els\u0151 <strong>15<\/strong> elem\u00e9t \u00edrja ki egym\u00e1s mell\u00e9, az els\u0151 elem \u00e9s differencia ismeret\u00e9ben<\/li>\n<li>egy f\u00fcggv\u00e9ny, mely egy sz\u00e1mtani sorozat els\u0151 <strong>n<\/strong> elem\u00e9t \u00edrja ki egym\u00e1s mell\u00e9, az els\u0151 elem \u00e9s differencia ismeret\u00e9ben<\/li>\n<\/ul>\n<p>M\u00e9g a megfogalmaz\u00e1suk is egyetlen helyen t\u00e9r el. A m\u00e1sik k\u00fcl\u00f6nbs\u00e9g, hogy a m\u00e1sodik f\u00fcggv\u00e9ny v\u00e1r egy 3. param\u00e9tert is, ahol a sorozat ki\u00edratni sz\u00e1nt elemsz\u00e1m\u00e1t adjuk meg. Akkor hogy lehet kiszedni a logika dupl\u00e1z\u00e1s\u00e1t?<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [3,6]; title: ; notranslate\" title=\"\">\r\nvoid szamtani( int a1, int d )\r\n{\r\n    szamtani( a1, d, 15 );\r\n}\r\n\r\nvoid szamtani( int a1, int d, int n )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; n; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A k\u00e9t f\u00fcggv\u00e9ny megold\u00e1sa k\u00f6z\u00fcl a m\u00e1sodik az \u00e1ltal\u00e1nos megold\u00e1s, az els\u0151 specifikus, ami konkr\u00e9t darabsz\u00e1m ki\u00edr\u00e1s\u00e1ra vonatkozik. Itt csak a sorozat els\u0151 elem\u00e9t \u00e9s differenci\u00e1j\u00e1t adom meg, a k\u00edv\u00e1nt fix darabsz\u00e1mot k\u00e9zzel adom meg. Tov\u00e1bbpasszolom a feladatot az \u00e1ltal\u00e1nos megold\u00e1snak \u00fagy, hogy a v\u00e9g\u00e9re oda\u00edrom a ki\u00edratni sz\u00e1nt elemek sz\u00e1m\u00e1t. A feladat logikai megold\u00e1sa \u00edgy csak egyszer szerepel. Nem is olyan neh\u00e9z igaz? Egyszer\u0171en megh\u00edvjuk az els\u0151 f\u00fcggv\u00e9nyb\u0151l a m\u00e1sodikat a sz\u00fcks\u00e9ges fix \u00e9rt\u00e9kkel. A k\u00e9t kiemelt sorban ezt l\u00e1thatod.<\/p>\n<p>Nyilv\u00e1n nem az volt a c\u00e9lom, hogy 7 sorral r\u00f6videbb legyen a k\u00f3dom. A l\u00e9nyege az, hogy az egyetlen helyen szerepl\u0151 logik\u00e1ban k\u00f6nnyebb hib\u00e1t jav\u00edtani, vagy ak\u00e1r v\u00e1ltoztatni is. Mi van ha az elemeket nem sz\u00f3k\u00f6zzel elv\u00e1lasztva egy sorba, hanem egym\u00e1s al\u00e1 k\u00fcl\u00f6n sorokba kellene \u00edrni? Akkor egy helyen kell m\u00f3dos\u00edtani. Nyilv\u00e1n ha olyat szeretn\u00e9nk megv\u00e1ltoztatni, ami csak az egyik fajta megold\u00e1sra jellemz\u0151, akkor a k\u00e9t megold\u00e1st k\u00fcl\u00f6n kell szedni. Valljuk be, ez az\u00e9rt nem t\u00fal \u00e9letszer\u0171.<\/p>\n<p>Kipr\u00f3b\u00e1ltad? Nem m\u0171k\u00f6dik&#8230; T\u00f6bbek k\u00f6z\u00f6tt azzal van gondja, hogy a szamtani() nev\u0171 f\u00fcggv\u00e9nynek t\u00fal sok param\u00e9tere van. 3-at kap, de csak kett\u0151t k\u00e9rne. Hogy mi van? Vil\u00e1gosan ott van a m\u00e1sodik f\u00fcggv\u00e9nyben, hogy 3 param\u00e9tert v\u00e1r.<\/p>\n<p>A probl\u00e9ma a k\u00e9t f\u00fcggv\u00e9ny sorrendj\u00e9vel van. Ha k\u00e9t f\u00fcggv\u00e9ny k\u00f6z\u00fcl az egyik haszn\u00e1lna egy m\u00e1sikat, akkor ezt csakis abban az esetben teheti meg, ha tud a m\u00e1sikr\u00f3l. Ez technikailag azt jelenti, hogy haszn\u00e1lat el\u0151tt meg kell ismernie az adott f\u00fcggv\u00e9ny szignat\u00far\u00e1j\u00e1t.<\/p>\n<ol>\n<li>mi r\u00f6gz\u00edtett\u00fck a haszn\u00e1lni k\u00edv\u00e1nt f\u00fcggv\u00e9ny szignat\u00far\u00e1j\u00e1t m\u00e9g a haszn\u00e1lat el\u0151tt<\/li>\n<li>a haszn\u00e1lni k\u00edv\u00e1nt f\u00fcggv\u00e9ny el\u0151tte van a forr\u00e1sk\u00f3dban, teh\u00e1t &#8220;l\u00e1tja&#8221;<\/li>\n<\/ol>\n<p>Formailag a k\u00e9t eset a k\u00f6vetkez\u0151:<\/p>\n<p><strong>El\u0151re megadott szignat\u00fara:<\/strong><\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [5,9]; title: ; notranslate\" title=\"\">\r\n#include &lt;iostream&gt;\r\n\r\nusing namespace std;\r\n\r\nvoid szamtani( int, int, int );\r\n\r\nvoid szamtani( int a1, int d )\r\n{\r\n    szamtani(a1,d,15);\r\n}\r\n\r\nvoid szamtani( int a1, int d, int n )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; n; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    szamtani( 2,6 );\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<ul>\n<li>5 &#8211; A k\u00f3d elej\u00e9n megadjuk annak a f\u00fcggv\u00e9nynek a szignat\u00far\u00e1j\u00e1t, amelyiket egy m\u00e1sik f\u00fcggv\u00e9ny \u00fagy szeretne haszn\u00e1lni, hogy az nem el\u0151tte, hanem m\u00f6g\u00f6tte tal\u00e1lhat\u00f3, teh\u00e1t sz\u00e1m\u00e1ra a szignat\u00fara n\u00e9lk\u00fcl ismeretlen lenne.<\/li>\n<li>9 &#8211; Itt pedig t\u00e9nylegesen haszn\u00e1ljuk a m\u00f6g\u00f6tte l\u00e9v\u0151, de ismert szignat\u00far\u00e1j\u00fa f\u00fcggv\u00e9nyt.<\/li>\n<\/ul>\n<p><strong>K\u00e9t f\u00fcggv\u00e9ny megfelel\u0151 sorrendje:<\/strong><\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [5,17,19]; title: ; notranslate\" title=\"\">\r\n#include &lt;iostream&gt;\r\n\r\nusing namespace std;\r\n\r\nvoid szamtani( int a1, int d, int n )\r\n{\r\n    int elem = a1;\r\n\r\n    for( int i = 0; i &lt; n; i++ )\r\n    {\r\n        cout &lt;&lt; elem &lt;&lt; &quot; &quot;;\r\n        elem += d;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n\r\nvoid szamtani( int a1, int d )\r\n{\r\n    szamtani(a1,d,15);\r\n}\r\n\r\n\r\nint main()\r\n{\r\n    szamtani( 2,6 );\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<p>Itt a h\u00e1tul l\u00e9v\u0151 f\u00fcggv\u00e9ny sz\u00e1m\u00e1ra nem ismeretlen az el\u0151tte l\u00e9v\u0151, \u00edgy el\u0151re megadott szignat\u00fara n\u00e9lk\u00fcl haszn\u00e1lhatja. A szignat\u00far\u00e1t egy\u00e9bk\u00e9nt a programon bel\u00fcl b\u00e1rhol megadhatjuk. Amire oda kell figyelni:<\/p>\n<ul>\n<li>Mindenk\u00e9pp valamilyen f\u00fcggv\u00e9nyen k\u00edv\u00fcli ter\u00fclet legyen<\/li>\n<li>Mindenk\u00e9pp azel\u0151tt adjuk meg a szignat\u00far\u00e1t, hogy sz\u00fcks\u00e9g lenne arra a f\u00fcggv\u00e9nyre.<\/li>\n<\/ul>\n<p>A f\u00fcggv\u00e9nyeket nem csak meg\u00edrni, haszn\u00e1lni is kell, erre a fent m\u00e1r eml\u00edtett f\u00fcggv\u00e9nyek leck\u00e9ben l\u00e1thatsz p\u00e9ld\u00e1kat, de az\u00e9rt \u00e1lljon itt is egy \u00f6sszetett feladat.<\/p>\n<h4>Komplex feladat:<\/h4>\n<p>Term\u00e9szetesen a programunk b\u00e1rmilyen r\u00e9sz\u00e9t kiszervezhetj\u00fck, p\u00e9ld\u00e1ul az \u00e1tl\u00e1that\u00f3s\u00e1g miatt. K\u00e9ts\u00e9gtelen, hogy az egyszer haszn\u00e1latos k\u00f3dokat nem felt\u00e9tlen\u00fcl logikus minden \u00e1ron f\u00fcggv\u00e9nyekben elhelyezni. Ennek ellen\u00e9re most gyakorl\u00e1sk\u00e9pp egy t\u00f6mbh\u00f6z kapcsol\u00f3d\u00f3 alap algoritmusokkal megoldhat\u00f3 feladatsort val\u00f3s\u00edtsunk meg f\u00fcggv\u00e9nyekk\u00e9nt.<\/p>\n<ol>\n<li>Adott egy 10 elem\u0171 t\u00f6mb, t\u00f6lts\u00fck fel \u00e9rt\u00e9kekkel az [5;10] intervallumb\u00f3l.<\/li>\n<li>\u00cdrjuk ki az elemeit egym\u00e1s mell\u00e9 sz\u00f3k\u00f6zzel elv\u00e1lasztva.<\/li>\n<li>\u00cdrjuk ki a t\u00f6mb elemeinek \u00f6sszeg\u00e9t<\/li>\n<li>\u00cdrjuk ki a t\u00f6mbben l\u00e9v\u0151 p\u00e1ratlan sz\u00e1mok darabsz\u00e1m\u00e1t<\/li>\n<li>\u00cdrjuk ki a t\u00f6mb legnagyobb elem\u00e9t<\/li>\n<li>Rendezz\u00fck, majd \u00edrjuk ki a t\u00f6mb elemeit n\u00f6vekv\u0151 sorrendben<\/li>\n<\/ol>\n<p>K\u00e9sz\u00edts\u00fcnk f\u00fcggv\u00e9nyeket, melyek ki\u00edrja a t\u00f6mb elemeit egym\u00e1s mell\u00e9 sz\u00f3k\u00f6zzel elv\u00e1lasztva, kisz\u00e1m\u00edtja az adott t\u00f6mb elemeinek \u00f6sszeg\u00e9t, megadja a benne l\u00e9v\u0151 p\u00e1ratlan sz\u00e1mok darabsz\u00e1m\u00e1t, \u00e9s rendezi az adott t\u00f6mb\u00f6t n\u00f6vekv\u0151 sorrendbe. L\u00e1ssuk akkor a komplett megold\u00e1st<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2,3,8,9,10,11,12,13,14,15,16,18,19,20,21,22,23,24,25,28,29,30,31,32,33,34,35,36,38,39,40,41,42,43,44,45,46,47,48,49,50,52,53,54,55,56,57,58,59,60,61,62,63,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,89,92,96,97,100,101,104,105,106,109,110]; 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\n\r\nvoid feltolt( int szamok&#x5B;], int meret )\r\n{\r\n    srand(time(0));\r\n\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        szamok&#x5B;i] = rand() % 6 + 5;\r\n    }\r\n}\r\n\r\nvoid kiir( int szamok&#x5B;], int meret )\r\n{\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        cout &lt;&lt; szamok&#x5B;i] &lt;&lt; &quot; &quot;;\r\n    }\r\n    cout &lt;&lt; endl;\r\n}\r\n\r\n\r\nint osszeg(int szamok&#x5B;], int meret )\r\n{\r\n    int ossz = 0;\r\n    for( int i = 0; i &lt; meret; i++ )\r\n    {\r\n        ossz = ossz + szamok&#x5B;i];\r\n    }\r\n    return ossz;\r\n}\r\n\r\nint ptdb(int tomb&#x5B;], int meret )\r\n{\r\n    int db = 0;\r\n    int ossz = 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    return db;\r\n}\r\n\r\nint tmax( int tomb&#x5B;], int meret )\r\n{\r\n    int max = 0;\r\n    for( int i = 0; 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    return max;\r\n}\r\n\r\nvoid tombrendez(int tomb&#x5B;], int meret)\r\n{\r\n    int csere;\r\n    for( 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}\r\n\r\n\r\nint main()\r\n{\r\n    int meret = 10;\r\n    int tomb&#x5B;meret];\r\n\r\n\/\/ 1. feladat\r\n    feltolt(tomb,meret);\r\n\r\n\/\/ 2. feladat\r\n    kiir(tomb,meret);\r\n\r\n\r\n\/\/ 3. feladat\r\n    int osszeg = osszeg( tomb, meret );\r\n    cout &lt;&lt; &quot;A tombben levo szamok osszege: &quot; &lt;&lt; osszeg &lt;&lt; endl;\r\n\r\n\/\/ 4. feladat\r\n    cout &lt;&lt; &quot;A tombben levo paratlan szamok darabszama: &quot; &lt;&lt;\r\n            ptdb(tomb,meret) &lt;&lt; endl;\r\n\r\n\/\/ 5. feladat\r\n    int max = tmax( tomb, meret );\r\n    cout &lt;&lt; &quot;A tomb legnagyobb eleme: &quot; &lt;&lt;\r\n            tomb&#x5B; max ] &lt;&lt; endl;\r\n\r\n\/\/ 6. feladat\r\n    tombrendez(tomb,meret);\r\n    kiir(tomb,meret);\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<ul>\n<li>2-3 &#8211; szok\u00e1sos dolgok a v\u00e9letlensz\u00e1m sorsol\u00e1shoz<\/li>\n<li>8-16 &#8211; a t\u00f6mb felt\u00f6lt\u00e9se<\/li>\n<li>18-25 &#8211; a t\u00f6mb elemeinek ki\u00edr\u00e1sa a megfelel\u0151 m\u00f3don<\/li>\n<li>28-36 &#8211; a t\u00f6mb elemeinek \u00f6sszead\u00e1sa<\/li>\n<li>38-50 &#8211; a t\u00f6mb p\u00e1ratlan elemeinek megsz\u00e1ml\u00e1l\u00e1sa<\/li>\n<li>52-63 &#8211; a t\u00f6mb legnagyobb elem\u00e9nek megkeres\u00e9se (a hely\u00e9t)<\/li>\n<li>65-80 &#8211; a t\u00f6mb elemeinek n\u00f6vekv\u0151 rendez\u00e9se<\/li>\n<li>89, 92, 96-97, 100-101, 104-106, 109-110 &#8211; a feladatok megold\u00e1s\u00e1hoz sz\u00fcks\u00e9ges megfelel\u0151 f\u00fcggv\u00e9nyek megh\u00edv\u00e1sa, \u00e9s azok eredm\u00e9ny\u00e9nek esetleges felhaszn\u00e1l\u00e1sa.<\/li>\n<\/ul>\n<h4>A param\u00e9ter \u00e1tad\u00e1s k\u00e9t t\u00edpusa<\/h4>\n<p>A f\u00fcggv\u00e9nyek param\u00e9terei arra szolg\u00e1lnak, hogy azok seg\u00edts\u00e9g\u00e9vel, vagy pontosan azokon hajtsunk v\u00e9gre valami m\u0171veletet. A kett\u0151 k\u00f6z\u00f6tt fontos k\u00fcl\u00f6nbs\u00e9g van.<\/p>\n<ol>\n<li>A sz\u00e1mtani sorozatos p\u00e9lda eset\u00e9n a f\u00fcggv\u00e9nynek meg kellett adni a ki\u00edrand\u00f3 sorozat f\u0151 adatait, de nem konkr\u00e9tan az eredetileg \u00e1tadott sz\u00e1mokat akartuk megv\u00e1ltoztatni, hanem azok seg\u00edts\u00e9g\u00e9vel hajtottunk v\u00e9gre egy feladatot. Ebben az esetben a f\u00fcggv\u00e9ny h\u00edv\u00e1sakor \u00e1tadott sz\u00e1moknak az \u00e9rt\u00e9k\u00e9t haszn\u00e1ltuk fel a feladat megold\u00e1s\u00e1hoz. Ha az \u00e1tadott param\u00e9terekkel a f\u00fcggv\u00e9ny b\u00e1rmilyen v\u00e1ltoztat\u00e1st v\u00e9grehajt, az a h\u00edv\u00e1s hely\u00e9n l\u00e9v\u0151 \u00e9rt\u00e9keket nem v\u00e1ltoztatja meg. Ezt nevezz\u00fck \u00e9rt\u00e9k szerinti param\u00e9ter \u00e1tad\u00e1snak.<\/li>\n<li>A komplex feladatban a t\u00f6mb felt\u00f6lt\u00e9sekor vagy rendez\u00e9sekor az eredeti main() f\u00fcggv\u00e9nyben l\u00e9v\u0151 t\u00f6mb\u00f6t akartuk megv\u00e1ltoztatni. L\u00e1thatod, hogy az 1-es feladat eset\u00e9n a felt\u00f6lt\u0151 f\u00fcggv\u00e9nynek odaadjuk a main()-ben l\u00e9trehozott t\u00f6mb\u00f6t, amit fel szeretn\u00e9nk t\u00f6lteni. Itt azonban az t\u00f6rt\u00e9nik, hogy az \u00e1tadott t\u00f6mb\u00f6t a f\u00fcggv\u00e9ny \u00fagy m\u00f3dos\u00edtja, hogy az az eredeti hely\u00e9n is megv\u00e1ltozik, nem csak a felt\u00f6lt f\u00fcggv\u00e9nyben. Ezt nevezz\u00fck c\u00edm szerinti param\u00e9ter \u00e1tad\u00e1snak. A t\u00f6mb, mint \u00f6sszetett adatt\u00edpus a c\u00edm\u00e9vel ker\u00fcl \u00e1tad\u00e1sra b\u00e1rmilyen f\u00fcggv\u00e9nynek, ami ha megv\u00e1ltoztatja a kapott t\u00f6mb\u00f6t, az val\u00f3j\u00e1ban az eredeti t\u00f6mb\u00f6t v\u00e1ltoztatja meg.<\/li>\n<\/ol>\n<h4>Megjegyz\u00e9sek:<\/h4>\n<ul>\n<li>Ha valamilyen v\u00e1ltoz\u00f3t szeretn\u00e9k \u00e1tadni egy f\u00fcggv\u00e9nynek, akkor az \u00e1tad\u00e1s-\u00e1tv\u00e9tel folyamat\u00e1ban csak annyi a k\u00f6vetelm\u00e9ny, hogy az \u00e1tadott v\u00e1ltoz\u00f3 t\u00edpusa meg kell egyezzen az \u00e1tvett v\u00e1ltoz\u00f3 t\u00edpus\u00e1val. Erre l\u00e1thatsz p\u00e9ld\u00e1t a p\u00e9ld\u00e1ul az osszeg f\u00fcggv\u00e9ny h\u00edv\u00e1sakor. A tomb-ot adom \u00e1t, \u00e9s szamok n\u00e9ven veszem \u00e1t az eg\u00e9szeket tartalmaz\u00f3 t\u00f6mb\u00f6t. Az esetleges n\u00e9v egyez\u00e9s (l\u00e1sd tmax f\u00fcggv\u00e9ny) semmilyen hat\u00e1ssal nincs arra, hogy van-e a f\u00fcggv\u00e9nynek visszahat\u00e1sa a h\u00edvott oldalon l\u00e9v\u0151 v\u00e1ltoz\u00f3ra. Ez att\u00f3l f\u00fcgg, hogy egyszer\u0171, vagy \u00f6sszetett adatt\u00edpus a param\u00e9ter.<\/li>\n<li>A void (visszat\u00e9r\u00e9si \u00e9rt\u00e9k n\u00e9lk\u00fcli) f\u00fcggv\u00e9nyekben a return elhagyhat\u00f3, de sz\u00fcks\u00e9g szerint haszn\u00e1lhatod. A f\u00fcggv\u00e9nyben a return utas\u00edt\u00e1s megszak\u00edtja a f\u00fcggv\u00e9ny fut\u00e1s\u00e1t, \u00e9s a vez\u00e9rl\u00e9s az \u0151t h\u00edv\u00f3 k\u00f3dr\u00e9szhez ker\u00fcl.<\/li>\n<li>Az esetleges saj\u00e1t f\u00fcggv\u00e9nyeket c\u00e9lszer\u0171 a main () el\u00e9 \u00edrni, hogy a haszn\u00e1latuk miatt ne kelljen felt\u00e9tlen\u00fcl mindegyik szignat\u00far\u00e1j\u00e1t ki\u00edrni a k\u00f3d elej\u00e9re. Ha a f\u00fcggv\u00e9nyek egym\u00e1st is haszn\u00e1lj\u00e1k, akkor a szignat\u00fara indokolt lehet, de ez is kiker\u00fclhet\u0151, ha el\u0151bb \u00edrod meg azokat a f\u00fcggv\u00e9nyeket, amelyeket a t\u00f6bbi haszn\u00e1lni szeretne.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Saj\u00e1t f\u00fcggv\u00e9nyek, avagy lustas\u00e1g f\u00e9l eg\u00e9szs\u00e9g Programjaink \u00edr\u00e1sakor sokszor futunk bele olyan helyzetbe, hogy bizonyos k\u00f3d r\u00e9szeket t\u00f6bbsz\u00f6r kell haszn\u00e1lni. Gondoljunk csak arra, hogy ha egy t\u00f6mbbel dolgozunk, azt nyilv\u00e1n szeretn\u00e9nk ki\u00edratni. Ut\u00e1na mondjuk rendezni szeretn\u00e9nk, de szint\u00e9n szeretn\u00e9nk ki\u00edratni, <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1997\">Tov\u00e1bb <span class=\"screen-reader-text\">  C++ halad\u00f3 leck\u00e9k 17. &#8211; Saj\u00e1t f\u00fcggv\u00e9nyek<\/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":[153],"tags":[158,159,62,143,164],"class_list":["post-1997","post","type-post","status-publish","format-standard","hentry","category-c-halado-leckek","tag-c","tag-c-programozas","tag-fuggveny","tag-programozas","tag-sajat-fuggveny"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1997","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=1997"}],"version-history":[{"count":16,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1997\/revisions"}],"predecessor-version":[{"id":3177,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1997\/revisions\/3177"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1997"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1997"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1997"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}