{"id":1814,"date":"2016-09-22T20:29:36","date_gmt":"2016-09-22T18:29:36","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1814"},"modified":"2017-01-23T08:03:45","modified_gmt":"2017-01-23T07:03:45","slug":"c-programozas-13-ciklusok","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1814","title":{"rendered":"C++ programoz\u00e1s 13. &#8211; Ciklusok"},"content":{"rendered":"<h1>Ciklusok, avagy &#8220;na m\u00e9g egyszer&#8221;<\/h1>\n<p>Programoz\u00e1s eset\u00e9n nagyon sok esetben el\u0151fordul az, hogy valamilyen tev\u00e9kenys\u00e9get (utas\u00edt\u00e1sokat) t\u00f6bbsz\u00f6r meg kell ism\u00e9telni. Ilyenek a val\u00f3 \u00e9letben is sokszor el\u0151fordulnak.<\/p>\n<ul>\n<li>Sz\u00farj be 5 \u00fcres sort a t\u00e1bl\u00e1zatba.<\/li>\n<li>K\u00e9sz\u00edts 3 szendvicset<\/li>\n<li>Dobj 3 kock\u00e1val (egyszer dobunk, de 3 sz\u00e1mot sorsolunk)<\/li>\n<li>\u00cdrd le 100x, hogy nem felejtem el a h\u00e1zi feladatomat<\/li>\n<\/ul>\n<p>Ezek a t\u00f6bbsz\u00f6r ism\u00e9telt tev\u00e9kenys\u00e9gek megegyeznek abban, hogy el\u0151re tudjuk, h\u00e1nyszor kell elv\u00e9gezni \u0151ket. Persze olyan is el\u0151fordul, hogy addig kell v\u00e9gezni valamit, am\u00edg lehet.<\/p>\n<ul>\n<li>H\u00e1mozz meg 2 kg alm\u00e1t<\/li>\n<li>Mosogass el<\/li>\n<li>K\u00e9sz\u00edts annyi szendvicset, am\u00edg el nem fogy a felv\u00e1gott<\/li>\n<\/ul>\n<p>Ezeket a tev\u00e9kenys\u00e9geket is t\u00f6bbsz\u00f6r kell ism\u00e9telni, de nem tudom h\u00e1nyszor. Lehetnek kisebb alm\u00e1k, abb\u00f3l t\u00f6bbet kell h\u00e1mozni, de ha nagyobbak, kevesebb darabb\u00f3l is kij\u00f6n a 2 kg. Addig mosogatok, am\u00edg van ed\u00e9ny. Addig k\u00e9sz\u00edtem a szendvicseket, am\u00edg van mit r\u00e1tenni.<\/p>\n<p>A programoz\u00e1sban is ezek az elvek \u00e9rv\u00e9nyes\u00fclnek. Ezek szerint 3 k\u00fcl\u00f6nf\u00e9le ciklus t\u00edpust k\u00fcl\u00f6n\u00edthet\u00fcnk el:<\/p>\n<ol>\n<li><a href=\"#for\">N\u00f6vekm\u00e9nyes ciklus<\/a><\/li>\n<li><a href=\"#while\">El\u00f6l tesztel\u0151 ciklus<\/a><\/li>\n<li><a href=\"#do-while\">H\u00e1tul tesztel\u0151 ciklus<\/a><\/li>\n<\/ol>\n<p>A m\u0171k\u00f6d\u00e9s alapelve szerint az els\u0151 k\u00fcl\u00f6nb\u00f6zik a t\u00f6bbit\u0151l. Ebben az esetben el\u0151re tudjuk, hogy h\u00e1nyszor akarjuk ism\u00e9telni a teend\u0151inket, m\u00edg az ut\u00f3bbi k\u00e9t esetben az ism\u00e9tl\u00e9s darabsz\u00e1ma felt\u00e9telhez k\u00f6t\u00f6tt. Ett\u0151l a k\u00e9p val\u00f3j\u00e1ban kicsit \u00e1rnyaltabb, mert a Java nagyon rugalmas a ciklusaival, de az alapelvek ezek.<\/p>\n<h2><a name=\"for\"><\/a>N\u00f6vekm\u00e9nyes ciklus &#8211; for<\/h2>\n<p>Kezdj\u00fck az els\u0151vel, a n\u00f6vekm\u00e9nyes ciklussal. Az ilyen t\u00edpus\u00fa ciklus a k\u00f6vetkez\u0151k\u00e9pp n\u00e9z ki formailag:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( ciklusv\u00e1ltoz\u00f3 be\u00e1ll\u00edt\u00e1sa; fut\u00e1si felt\u00e9tel; ciklusv\u00e1ltoz\u00f3 n\u00f6vel\u00e9se )\r\n{\r\n    utas\u00edt\u00e1s1;\r\n    utas\u00edt\u00e1s2;\r\n    ...\r\n    utas\u00edt\u00e1sN;\r\n}\r\n<\/pre>\n<p>Konkr\u00e9t p\u00e9ld\u00e1val:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 20; i++ )\r\n{\r\n    cout &lt;&lt; i &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A for kulcssz\u00f3 vezeti be a ciklust. Ezut\u00e1n j\u00f6n a ciklus feje, ahol 3 dolog \u00e1ll\u00edthat\u00f3 be:<\/p>\n<ol>\n<li>a haszn\u00e1land\u00f3 ciklusv\u00e1ltoz\u00f3 kezd\u0151\u00e9rt\u00e9ke<\/li>\n<li>a fut\u00e1si felt\u00e9tel, vagyis mikor kezd\u0151dj\u00f6n \u00fajabb &#8220;k\u00f6r&#8221;<\/li>\n<li>a ciklusv\u00e1ltoz\u00f3 n\u00f6vel\u00e9se<\/li>\n<\/ol>\n<p>A sz\u00e9p (vagy \u00e9pp cs\u00fanya, de ez n\u00e9z\u0151pont k\u00e9rd\u00e9se) a dologban az, hogy ebb\u0151l a 3 dologb\u00f3l semmi nem k\u00f6telez\u0151. B\u00e1rmelyik, vagy ak\u00e1r mind elhagyhat\u00f3, az egyetlen megk\u00f6t\u00e9s, hogy a 3 r\u00e9szt elv\u00e1laszt\u00f3 ; jelek mindegyike megmaradjon:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint i = 0;\r\nfor( ; ; )\r\n{\r\n    if( i &gt;= 20 ) break;\r\n    cout &lt;&lt; i &lt;&lt; endl;\r\n    i++;\r\n}\r\n<\/pre>\n<p>Igaz, ez kicsit kiford\u00edtja a feladatot \u00e9s eddig ismeretlen utas\u00edt\u00e1st is tartalmaz, de l\u00e1tjuk azt, hogy lehets\u00e9ges.<\/p>\n<p>Nos, a for ciklus teh\u00e1t alapesetben arra szolg\u00e1l, hogy egyes\u00e9vel n\u00f6velve egy v\u00e1ltoz\u00f3t valamilyen tev\u00e9kenys\u00e9get addig hajtsunk v\u00e9gre, ameddig azt az \u00e1ltalunk megadott felt\u00e9tel engedi. P\u00e9ld\u00e1kon kereszt\u00fcl ez \u00e9rthet\u0151bb lesz:<\/p>\n<p>Sz\u00e1moljunk el 1-t\u0151l 50-ig \u00e9s \u00edrjuk ki a k\u00e9perny\u0151re a sz\u00e1mokat:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 1; i &lt;= 50; i++ )\r\n{\r\n    cout &lt;&lt; i &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Ha megn\u00e9zz\u00fck a ciklusfejet, a k\u00f6vetkez\u0151ket l\u00e1thatjuk:<\/p>\n<ol>\n<li>a ciklusv\u00e1ltoz\u00f3t 1-t\u0151l ind\u00edtjuk<\/li>\n<li>addig megy\u00fcnk, am\u00edg el nem \u00e9rj\u00fck az 50-et<\/li>\n<li>a ciklusv\u00e1ltoz\u00f3t egyes\u00e9vel n\u00f6velj\u00fck<\/li>\n<\/ol>\n<p>Persze ezt \u00edgy is \u00edrhattam volna:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 50; i++ )\r\n{\r\n    cout &lt;&lt; i+1 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>0-t\u00f3l megyek 49-ig, de mindig eggyel nagyobb sz\u00e1mot \u00edrok ki.<\/p>\n<p>Sorsoljunk ki 10 v\u00e9letlen sz\u00e1mot az [1;50] intervallumb\u00f3l \u00e9s \u00edrjuk ki \u0151ket:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 10; i++ )\r\n{\r\n    cout &lt;&lt; rand() % 50 + 1 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A fenti ciklusfej nagyon er\u0151s t\u00edpusfeladat \u00e9s egy alapszab\u00e1lyt l\u00e1thatsz benne: Az i-t ind\u00edtsd 0-r\u00f3l \u00e9s addig menj, am\u00edg kisebb, mint az a sz\u00e1m, amennyiszer a ciklust futtatni akarod:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 10; i++ )  \/\/ 10-szer\r\nfor( int i = 0; i &lt; 20; i++ )  \/\/ 20-szor\r\nfor( int i = 0; i &lt; 100; i++ ) \/\/ 100-szor\r\n<\/pre>\n<p>\u00cdrjuk ki 2-t\u0151l indulva 20 p\u00e1ros sz\u00e1mot:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 1; i &lt;= 20; i++ )\r\n{\r\n    cout &lt;&lt; i*2 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Itt annyi tr\u00fckk\u00f6t alkalmazok, hogy 1-t\u0151l sz\u00e1molok el 20-ig (ennyi sz\u00e1m kell), de ezeket 2-vel szorozva mindig p\u00e1ros sz\u00e1mot kapok. Persze ha az alapszab\u00e1lyt tekintem, amikor 0-t\u00f3l ind\u00edtom a ciklust, \u00e9s a hat\u00e1r-1-n\u00e9l \u00e1llok meg, akkor \u00edgy is \u00edrhatn\u00e1m ugyanezt:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 20; i++ )\r\n{\r\n    cout &lt;&lt; (i+1)*2 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>\u00c9s ha az 1-t\u0151l indulva kell 20 p\u00e1ratlan?<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 1; i &lt;= 20; i++ )\r\n{\r\n    cout &lt;&lt; i*2-1 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A p\u00e1rosokb\u00f3l 1-et kivonva p\u00e1ratlanokat kapunk. Vagy 0-t\u00f3l indulva:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; 20; i++ )\r\n{\r\n    cout &lt;&lt; i*2+1 &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>De csak hogy l\u00e1ssuk milyen rugalmas is a for ciklus, l\u00e1ssunk a p\u00e1rosokra egy m\u00e1sik megold\u00e1st:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfor( int i = 2; i &lt;= 40; i += 2 )\r\n{\r\n    cout &lt;&lt; i &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Na j\u00f3, kicsit csaltam. Tudom, hogy a 40 lesz az utols\u00f3, viszont nem szorozgatok, hanem a ciklusv\u00e1ltoz\u00f3t most nem 1-gyel, hanem 2-vel n\u00f6velgetem. Itt egy j\u00f3 p\u00e9lda a += oper\u00e1torra.<br \/>\nEgy sz\u00f3, mint sz\u00e1z, a for ciklus egy rugalmas \u00e9s hat\u00e9kony eszk\u00f6z akkor, ha el\u0151re tudom, hogy h\u00e1nyszor akarok valamit v\u00e9grehajtani. De az m\u00e1r egy\u00e9rtelm\u0171, mi\u00e9rt olyan szerte\u00e1gaz\u00f3 az eg\u00e9sz, mert ugyanarra a probl\u00e9m\u00e1ra rengeteg fajta megold\u00e1st adhatok, \u00e9s mindegyik t\u00f6k\u00e9letesen megoldja a feladatot. Annyira \u00e1rnyalatnyi k\u00fcl\u00f6nbs\u00e9gek vannak k\u00f6z\u00f6tt\u00fck, hogy ezzel k\u00f6z\u00e9piskolai szinten egy\u00e1ltal\u00e1n nem kell foglalkozni, a l\u00e9nyeg: helyes megold\u00e1st adjon.<\/p>\n<h2><a name=\"while\"><\/a>El\u00f6l tesztel\u0151 ciklus &#8211; while<\/h2>\n<p>Az el\u00f6l tesztel\u0151 ciklust jellemz\u0151en akkor haszn\u00e1ljuk, ha nem tudjuk el\u0151re, hogy h\u00e1nyszor kell az ism\u00e9tl\u0151d\u0151 tev\u00e9kenys\u00e9get v\u00e9grehajtani. Azzal nincs gond, ha ki kell sorsolni 10 sz\u00e1mot egy intervallumb\u00f3l. Ez egy for ciklusnak megfelel\u0151 t\u00edpusfeladat. De ha az a feladat, hogy egy adott intervallumb\u00f3l 10 darab p\u00e1ratlan sz\u00e1mot kell sorsolni? Akkor ha v\u00e9letlen\u00fcl p\u00e1ros sz\u00e1mot kapt\u00e1l azt figyelmen k\u00edv\u00fcl kell hagyni. L\u00e1ssuk el\u0151sz\u00f6r a while ciklus \u00e1ltal\u00e1nos alakj\u00e1t:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nwhile( felt\u00e9tel )\r\n{\r\n    utas\u00edt\u00e1s1;\r\n    utas\u00edt\u00e1s2;\r\n    ...\r\n    utas\u00edt\u00e1sN;\r\n}\r\n<\/pre>\n<p>Mint l\u00e1thatod itt is van egy ciklusfej, ami a fut\u00e1si felt\u00e9telt tartalmazza. Ez m\u0171k\u00f6d\u00e9si szempontb\u00f3l azt jelenti, hogy a ciklus akkor fut le (hajtja v\u00e9gre a ciklusmagot), ameddig a felt\u00e9tel igaz. Term\u00e9szetesen arra figyelni kell, hogy a felt\u00e9tel egyszer teljes\u00fclhessen, vagy a ciklusmagban szak\u00edtsuk meg a fut\u00e1st, nehogy v\u00e9gtelen ciklusba fussunk. Ez azt jelenti, hogy soha nem \u00e1llhat le, mert vagy nem \u00e1ll\u00edtjuk meg, vagy a fut\u00e1si felt\u00e9tel soha nem lehet hamis. A legegyszer\u0171bb v\u00e9letlen ciklus:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nwhile( true )\r\n{\r\n    cout &lt;&lt; &quot;fut&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>L\u00e1ssuk akkor az el\u0151z\u0151 p\u00e9ld\u00e1t, sorsoljunk ki 10 p\u00e1ratlan sz\u00e1mot egy adott intervallumb\u00f3l [1;100]<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint db = 0;\r\nint szam;\r\nwhile( db != 10 )\r\n{\r\n    szam = rand() % 100 + 1;\r\n    if( szam % 2 != 0 )\r\n    {\r\n        cout &lt;&lt; szam &lt;&lt; endl;\r\n        db++;\r\n    }\r\n}\r\n<\/pre>\n<p>N\u00e9zz\u00fck akkor sorban, mit is csin\u00e1l ez a program:<\/p>\n<ol>\n<li>kell egy v\u00e1ltoz\u00f3, ami azt sz\u00e1molja majd, hogy h\u00e1ny p\u00e1ratlan sz\u00e1mot sorsoltunk, mert a p\u00e1rosokkal nem foglalkozunk<\/li>\n<li>deklar\u00e1ltam egy szam nev\u0171 v\u00e1ltoz\u00f3t, ahol az aktu\u00e1lisan kisorsolt sz\u00e1mot t\u00e1roljuk<\/li>\n<li>a ciklust fut\u00e1si felt\u00e9tele az, hogy am\u00edg nincs 10 p\u00e1ratlan sz\u00e1m, addig sorsolgasson<\/li>\n<li>a ciklusban sorsolok egy sz\u00e1mot, \u00e9s elt\u00e1rolom<\/li>\n<li>miut\u00e1n kisorsoltam, megvizsg\u00e1lom, hogy p\u00e1ratlan-e<\/li>\n<li>ha p\u00e1ratlan, akkor ki\u00edrom a sorsolt sz\u00e1mot, \u00e9s n\u00f6velem eggyel a sz\u00e1ml\u00e1l\u00f3t<\/li>\n<li>ha nem p\u00e1ratlan, akkor a ciklusmagb\u00f3l semmi nem hajt\u00f3dik v\u00e9gre, mert nem megfelel\u0151 a sz\u00e1m \u00e9s ism\u00e9t pr\u00f3b\u00e1lkozik egy sorsol\u00e1ssal<\/li>\n<\/ol>\n<p>J\u00f6jj\u00f6n egy m\u00e1sik j\u00f3 p\u00e9lda az el\u00f6l tesztel\u0151 ciklusra. Sz\u00e1m\u00edtsuk ki k\u00e9t eg\u00e9sz sz\u00e1m oszt\u00f3j\u00e1t. Nem, nem a pr\u00edmt\u00e9nyez\u0151s alakra bont\u00e1ssal oldjuk meg, hanem egy j\u00f3l programozhat\u00f3 megold\u00e1st adunk, mely a k\u00f6vetkez\u0151 &#8211; egy\u00e9bk\u00e9nt m\u00e1r megl\u00e9v\u0151 &#8211; algoritmust takarja:<br \/>\nAddig kell kivonni a k\u00e9t sz\u00e1m k\u00f6z\u00fcl a nagyobb\u00f3l a kisebbet, am\u00edg a k\u00e9t sz\u00e1m egyenl\u0151 nem lesz. Ha a k\u00e9t sz\u00e1m egyenl\u0151, az az eredeti sz\u00e1mok legnagyobb k\u00f6z\u00f6s oszt\u00f3ja. Az k\u00f6nnyen bel\u00e1that\u00f3, hogy megj\u00f3solhatatlan, h\u00e1nyszor kell az eml\u00edtett kivon\u00e1st elv\u00e9gezni, teh\u00e1t for ciklust nem igaz\u00e1n alkalmazhatunk. (lehetne, de el\u00e9g kitekert megold\u00e1s lenne)<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint szam1 = 660;\r\nint szam2 = 366;\r\nwhile( szam1 != szam2 )\r\n{\r\n    if( szam1 &gt; szam2 )\r\n    {\r\n        szam1 = szam1 - szam2;\r\n    }\r\n    else\r\n    {\r\n        szam2 = szam2 - szam1;\r\n    }\r\n}\r\ncout &lt;&lt; &quot;A ket szam legnagyobb kozos osztoja: &quot; &lt;&lt; szam1 &lt;&lt; endl;\r\n<\/pre>\n<p>Na, n\u00e9zz\u00fck, mit is csin\u00e1l ez a program:<\/p>\n<ol>\n<li>deklar\u00e1lunk 2 v\u00e1ltoz\u00f3t a vizsg\u00e1lt sz\u00e1moknak<\/li>\n<li>kell egy ciklus azzal a fut\u00e1si felt\u00e9tellel, hogy addig kell a kivon\u00e1sokat ism\u00e9telni, am\u00edg a k\u00e9t sz\u00e1m nem egyenl\u0151<\/li>\n<li>ha a szam1 a nagyobb, akkor abb\u00f3l vonjuk ki a szam2-\u0151t<\/li>\n<li>ford\u00edtott esetben a szam2-b\u0151l vonjuk ki a szam1-et<\/li>\n<li>amikor a ciklus befejez\u0151dik, akkor a k\u00e9t sz\u00e1m b\u00e1rmelyike (mivel egyenl\u0151ek) a legnagyobb k\u00f6z\u00f6s oszt\u00f3t jelenti, amit ki is \u00edratunk<\/li>\n<\/ol>\n<p>Ha \u00e9szrevetted, az is el\u0151fordulhat, hogy a ciklus egyszer sem fut le. Mi van akkor, ha a k\u00e9t sz\u00e1m alapb\u00f3l egyenl\u0151? Akkor is ki\u00edrathatom b\u00e1rmelyiket, vagyis a ciklus ut\u00e1ni sorra l\u00e9p a program \u00e9s ki\u00edrja az egyiket. Az el\u00f6l tesztel\u0151 ciklusn\u00e1l lehets\u00e9ges, hogy a ciklus egyszer sem fut le.<\/p>\n<h2><a name=\"do-while\"><\/a>H\u00e1tul tesztel\u0151 ciklus &#8211; do-while<\/h2>\n<p>A do-while ciklus az el\u0151z\u0151leg ismertetett while-ra hasonl\u00edt abban a tekintetben, hogy ezt a fajta ciklust is akkor haszn\u00e1ljuk, amikor nem tudjuk el\u0151re, hogy h\u00e1nyszor kell egy utas\u00edt\u00e1s sorozatot v\u00e9grehajtani. Azonban m\u00e9gis van egy fontos k\u00fcl\u00f6nbs\u00e9g a kett\u0151 k\u00f6z\u00f6tt. L\u00e1ssuk az \u00e1ltal\u00e1nos alakot, akkor egy\u00e9rtelm\u0171 lesz:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ndo\r\n{\r\n    utas\u00edt\u00e1s1;\r\n    utas\u00edt\u00e1s2;\r\n    ...\r\n    utas\u00edt\u00e1sN;\r\n}\r\nwhile( felt\u00e9tel );\r\n<\/pre>\n<p>Mint a neve is mutatja, itt a ciklus feje h\u00e1tul van (a felt\u00e9tellel egy\u00fctt) \u00e9s a ciklusmagba tartoz\u00f3 utas\u00edt\u00e1sok el\u00f6l. Ez azt jelenti, hogy a ciklusmag 1-szer mindenk\u00e9ppen lefut, mert ez a ciklus el\u0151sz\u00f6r v\u00e9grehajt, ut\u00e1na vizsg\u00e1lja meg, hogy sz\u00fcks\u00e9ges-e t\u00f6bbsz\u00f6r! Jellemz\u0151en olyan feladatokn\u00e1l haszn\u00e1ljuk, amikor egyszer mindenk\u00e9pp v\u00e9gre kell hajtani valamit, de ut\u00e1na ellen\u0151rizni kell, hogy amit kaptunk megfelel\u0151-e, mert ha nem, csin\u00e1ljuk meg \u00fajra. Ilyen p\u00e9ld\u00e1ul az a sz\u00e1msorsol\u00e1s, ami valamilyen felt\u00e9telhez k\u00f6t\u00f6tt:<\/p>\n<p>Sorsolj ki egy p\u00e1ros sz\u00e1mot a [10;50] intervallumb\u00f3l. Azt m\u00e9g egyszer\u0171en megoldjuk, hogy az adott intervallumb\u00f3l sorsoljunk, de azzal a plusz felt\u00e9tellel m\u00e1r nem tudunk mit kezdeni, hogy ez p\u00e1ros is legyen. Ez\u00e9rt addig sorsolunk, hogy a felt\u00e9telnek megfelel\u0151 sz\u00e1mot kapjunk:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nint szam;\r\ndo\r\n{\r\n    szam = rand() % 41 + 10;\r\n}\r\nwhile( szam % 2 != 0 );\r\n<\/pre>\n<p>N\u00e9zz\u00fck akkor a programot r\u00e9szenk\u00e9nt:<\/p>\n<ul>\n<li>sorsolunk egy sz\u00e1mot<\/li>\n<li>ha a sz\u00e1m 2-vel osztva nem 0 marad\u00e9kot ad (p\u00e1ratlan), akkor a ciklus \u00fajraindul, vagyis megint sorsol egyet<\/li>\n<li>a ciklus akkor \u00e1ll meg, ha a felt\u00e9tel hamis lesz (p\u00e1ros)<\/li>\n<\/ul>\n<p>Az\u00e9rt j\u00f3 itt a do-while ciklus, mert mindenk\u00e9ppen sorsolnom kell egy sz\u00e1mot ahhoz, hogy megvizsg\u00e1lhassam, meg kell-e ism\u00e9telni a sorsol\u00e1st. Term\u00e9szetesen \u00f6sszetett felt\u00e9telt is megadhatok. Mondjuk olyan sz\u00e1mot sorsoljunk az adott intervallumb\u00f3l, ami 2-vel \u00e9s 5-tel is oszthat\u00f3:<\/p>\n<pre class=\"brush: cpp; highlight: [6]; title: ; notranslate\" title=\"\">\r\nint szam;\r\ndo\r\n{\r\n    szam = rand() % 41 + 10;\r\n}\r\nwhile( !(szam % 2 == 0 &amp;&amp; szam % 5 == 0) );\r\n<\/pre>\n<p>Itt a ciklus fut\u00e1si felt\u00e9telek\u00e9nt a kiemelt sorban egy \u00f6sszetett felt\u00e9telt l\u00e1thatsz, ami az\u00e9rt nem biztos, hogy annyira egy\u00e9rtelm\u0171, mint amilyennek els\u0151re t\u0171nik. A ciklus ugye akkor m\u0171k\u00f6dik, ha a felt\u00e9tel igaz. De itt eredetileg k\u00e9t r\u00e9szfelt\u00e9tel\u00fcnk van, 2-vel \u00e9s 5-tel oszthat\u00f3 sz\u00e1m kell. Az m\u00e1r nem j\u00f3, ha esetleg egyik, vagy az sem, ha mindk\u00e9t r\u00e9szfelt\u00e9tel hamis. Igen \u00e1m, de a ciklus fut\u00e1si felt\u00e9telek\u00e9nt nem azt kell megadni nek\u00fcnk, amilyen sz\u00e1mra nek\u00fcnk sz\u00fcks\u00e9g\u00fcnk van, hanem pont az ellenkez\u0151j\u00e9t. Azt kell megadni, hogy milyen sz\u00e1m nem j\u00f3 nek\u00fcnk! N\u00e9zz\u00fck akkor l\u00e9p\u00e9senk\u00e9nt:<\/p>\n<ul>\n<li>szerkessz\u00fck meg azt a felt\u00e9telt, ami nek\u00fcnk megfelel\u0151 (ami \u00f6sszetett felt\u00e9tel is lehet)<\/li>\n<li>neg\u00e1ljuk az eg\u00e9szet<\/li>\n<\/ul>\n<p>Term\u00e9szetesen itt is igaz, hogy ha akarjuk, egyszer\u0171s\u00edthetj\u00fck az \u00f6sszetett felt\u00e9telt a m\u00e1r tanult m\u00f3don:<\/p>\n<pre class=\"brush: cpp; highlight: [6]; title: ; notranslate\" title=\"\">\r\nwhile( !(szam % 2 == 0 &amp;&amp; szam % 5 == 0) ); \/\/ 1. verzi\u00f3\r\n\/\/ helyett\r\nwhile( szam % 2 != 0 || szam % 5 != 0 );    \/\/ 2. verzi\u00f3\r\n<\/pre>\n<h2>Akkor milyen ciklust v\u00e1lasszunk?<\/h2>\n<p>Azt, hogy milyen ciklust v\u00e1lasszunk egy feladat megold\u00e1s\u00e1hoz hossz\u00fa t\u00e1von ink\u00e1bb a tapasztalatunk mondja majd meg. A programoz\u00e1s saj\u00e1toss\u00e1ga, mint el\u0151z\u0151leg m\u00e1r eml\u00edtettem, hogy ugyanazt a feladatot nagyon sokf\u00e9le m\u00f3don lehet helyesen megoldani. Gyakorlatilag a ciklusokn\u00e1l is minden feladat megoldhat\u00f3 mindh\u00e1rom ciklussal, n\u00e9ha val\u00f3ban \u00e1rnyalatnyi k\u00fcl\u00f6nbs\u00e9gek vannak k\u00f6z\u00f6tt\u00fck. M\u00e9gis, az alap t\u00e1mpontot a k\u00f6vetkez\u0151k adj\u00e1k:<\/p>\n<ul>\n<li>Ha tudom h\u00e1nyszor fusson a ciklus, akkor for ciklus.<\/li>\n<li>Ha nem tudom h\u00e1nyszor fusson a ciklus \u00c9S lehet, hogy egyszer sem kell, akkor while ciklus.<\/li>\n<li>Ha nem tudom h\u00e1nyszor fusson a ciklus \u00c9S egyszer mindenk\u00e9ppen kell, akkor do-while ciklus.<\/li>\n<\/ul>\n<p>Maradjunk az egyik el\u0151z\u0151 p\u00e9ld\u00e1n\u00e1l, ahol a legnagyobb k\u00f6z\u00f6s oszt\u00f3t kerest\u00fck. Ha eml\u00e9kszel, addig vonjuk ki a nagyobb sz\u00e1mb\u00f3l a kisebbet, am\u00edg a k\u00e9t sz\u00e1m egyenl\u0151 nem lesz. Melyik ciklussal c\u00e9lszer\u0171 megoldani?<\/p>\n<ul>\n<li>Mivel nem tudjuk h\u00e1ny kivon\u00e1s kell, ez\u00e9rt ne for ciklus legyen.<\/li>\n<li>Lehet, hogy a k\u00e9t sz\u00e1m m\u00e1r az elej\u00e9n egyforma, akkor egyszer sem kell kivonni a nagyobb\u00f3l a kisebbet, ez\u00e9rt do-while se legyen (mert az egyszer felt\u00e9tel n\u00e9lk\u00fcl lefut).<\/li>\n<li>Vagyis maradt a while ciklus.<\/li>\n<\/ul>\n<p>Ha mondjuk tudom, hogy 10-szer kell futni a ciklusnak, mert 10 sz\u00e1mot kell sorsolni, akkor adja mag\u00e1t, hogy for ciklus legyen, mivel abban egyszer\u0171bb egy sz\u00e1ml\u00e1l\u00f3t kezelni.<\/p>\n<p>Saj\u00e1t tapasztalat szerint azt mondom, hogy tal\u00e1n a do-while ciklus a legritk\u00e1bb, \u00e9s a for ciklus a leggyakrabb a programoz\u00e1sban. A for ciklust is ink\u00e1bb a t\u00f6mb\u00f6k miatt haszn\u00e1ljuk gyakrabban, ezt egy k\u00e9s\u0151bbi leck\u00e9ben majd l\u00e1thatod.<\/p>\n<h4>K\u00f6vetkez\u0151 lecke: <a href=\"http:\/\/www.webotlet.hu\/?p=1821\">T\u00f6mb\u00f6k<\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>Ciklusok, avagy &#8220;na m\u00e9g egyszer&#8221; Programoz\u00e1s eset\u00e9n nagyon sok esetben el\u0151fordul az, hogy valamilyen tev\u00e9kenys\u00e9get (utas\u00edt\u00e1sokat) t\u00f6bbsz\u00f6r meg kell ism\u00e9telni. Ilyenek a val\u00f3 \u00e9letben is sokszor el\u0151fordulnak. Sz\u00farj be 5 \u00fcres sort a t\u00e1bl\u00e1zatba. K\u00e9sz\u00edts 3 szendvicset Dobj 3 kock\u00e1val <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1814\">Tov\u00e1bb <span class=\"screen-reader-text\">  C++ programoz\u00e1s 13. &#8211; Ciklusok<\/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":[158,159,31,47,68,169,66,170,143,67],"class_list":["post-1814","post","type-post","status-publish","format-standard","hentry","category-cplusplus-alap-leckek","tag-c","tag-c-programozas","tag-ciklus","tag-ciklusok","tag-do-while","tag-eloltesztelo","tag-for","tag-hatultesztelo","tag-programozas","tag-while"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1814","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=1814"}],"version-history":[{"count":5,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1814\/revisions"}],"predecessor-version":[{"id":2036,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1814\/revisions\/2036"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}