{"id":40208,"date":"2020-02-01T06:04:35","date_gmt":"2020-02-01T03:04:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly"},"modified":"2020-02-01T06:04:35","modified_gmt":"2020-02-01T03:04:35","slug":"kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","title":{"rendered":"Kuidas \u00f5petada \u00fcletama raskusi ja samal ajal kirjutama ts\u00fckleid","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hoolimata sellest, et jutt on \u00fche algteema \u00fcmber, on see artikkel kirjutatud kogenud spetsialistidele. Eesm\u00e4rk on n\u00e4idata, millised eksimused esinevad algajate seas programmeerimises. Praktiseerivatele arendajatele on need probleemid juba ammu lahendatud, unustatud v\u00f5i isegi m\u00e4rkamata j\u00e4\u00e4vad. Artikkel v\u00f5ib osutuda kasulikuks, kui peaksid kellegi teisega selle teema osas aitama. Artiklis tehakse paralleele erinevate programmeerimisraamatute, autoriteks Shildt, Stroustrup, Okulov, materjalidega.<\/p>\n<p>Ts\u00fcklite teema on valitud, kuna selle t\u00f5ttu j\u00e4\u00e4b programmeerimise \u00f5ppimise k\u00e4igus k\u00f5rvale p\u00e4ris palju inimesi.<\/p>\n<p>See meetod on suunatud n\u00f5rkadele \u00fcli\u00f5pilastele. \u00dcldiselt ei j\u00e4\u00e4 tugevad selle teema juurde ja neile ei pea eriti meetodeid v\u00e4lja m\u00f5tlema. Artikli teiseks eesm\u00e4rgiks on viia see meetod klassist \"toimib k\u00f5igis \u00fcli\u00f5pilastes, kuid vaid \u00fche \u00f5petaja juures\" klassi \"toimib k\u00f5igis \u00fcli\u00f5pilastes, k\u00f5ikide \u00f5petajate juures\". Absoluutseid originaalsuse ambitsioone mul ei ole. Kui sa juba kasutad sarnast meetodit selle teema \u00f5petamiseks, palun kirjuta, millega sinu variant erineb. Kui otsustad seda rakendada, jaga palun tulemusi, kuidas k\u00f5ik sujus. Kui sarnane meetod on m\u00f5nes raamatus kirjas, palun too v\u00e4lja pealkiri.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSeda meetodit olen arendanud 4 aastat, tehes individuaalset t\u00f6\u00f6d eri tasemega \u00fcli\u00f5pilastega. Kokku umbes viisk\u00fcmmend \u00fcli\u00f5pilast ja kaks tuhat tundi tunde. Alguses takerdusid \u00fcli\u00f5pilased selle teema juurde l\u00f5putult ja lahkusid. Iga \u00fcli\u00f5pilase j\u00e4rel kohandati meetodit ja materjale. Viimase aasta jooksul ei j\u00e4\u00e4 \u00fcli\u00f5pilased enam selle teema juurde kinni, nii et otsustasin oma kogemusi jagada.<\/p>\n<h4>Miks nii palju t\u00e4hti? Ts\u00fcklid on ju elementaarsed!<\/h4>\n<p>\nNagu ma juba varem mainisin, v\u00f5ib praktiseerivatele arendajatele ja tugevatele \u00fcli\u00f5pilastele ts\u00fcklite kontseptsiooni keerukust alahinnata. N\u00e4iteks v\u00f5ib pidada pikka loengut, n\u00e4ha noogutavaid peade ja nutikaid silmi. Kuid proovides lahendada mingit \u00fclesannet, tekib ummik ja seletamatud probleemid. P\u00e4rast loengut on \u00fcli\u00f5pilastel kindlasti ainult osaline arusaam. Ootus s\u00fcveneb seisukorraga, et \u00fcli\u00f5pilased ei oska ise v\u00e4lja tuua, milles t\u00e4pselt nende eksimus seisneb.<br \/>\n\u00dchel p\u00e4eval taipasin, et \u00fcli\u00f5pilased k\u00e4sitlevad minu n\u00e4iteid kui hierog\u00fc\u00fcfe. St kui jagamatuid tekstikilde, kuhu tuleb lisada mingi \"maagiline\" t\u00e4ht ja k\u00f5ik t\u00f6\u00f6tab.<br \/>\nM\u00f5nikord m\u00e4rkasin, et \u00fcli\u00f5pilased arvavad, et konkreetse \u00fclesande lahendamiseks on vajalik <i>mingi teine<\/i> konstruction, millest ma veel r\u00e4\u00e4kinud pole. Kuigi lahendamiseks oli vaja vaid natuke n\u00e4idet kohandada.<\/p>\n<p>Seep\u00e4rast j\u00f5udsin ideeni, et peamine t\u00e4helepanu tuleks p\u00f6\u00f6rata mitte avaldise s\u00fcntaksile, vaid m\u00f5ttele refaktoreerida korduvat koodi silmustega. Kui \u00f5pilased omandavad selle idee, siis iga s\u00fcntaks tuleb v\u00e4ikeste harjutuste abil omandatuks.<\/p>\n<h4>Kellele ja milleks ma \u00f5petan<\/h4>\n<p>\nKuna sisseastumiseksameid ei ole, v\u00f5ivad tundides olla nii tugevad kui ka v\u00e4ga n\u00f5rgad tudengid. Rohkem minu \u00fcli\u00f5pilaste kohta saab lugeda artiklist <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">\u00d5htuste kursuste kuulajate portree<\/a><\/noindex><br \/>\nP\u00fc\u00fcdsin, et programmeerimist \u00f5piksid k\u00f5ik, kes seda soovivad.<br \/>\nMinu tunnid toimuvad individuaalselt ja \u00fcli\u00f5pilane maksab iga tunni eest. Tundub, et \u00fcli\u00f5pilased peaksid kulusid optimeerima ja n\u00f5udma minimaalseid n\u00f5udmisi. Siiski k\u00e4ivad inimesed kontakt\u00f5ppes elava \u00f5petajaga mitte teadmiste, vaid kindluse nimel, et nad on midagi \u00f5ppinud, progressitunde ja eksperdi (\u00f5petaja) heakskiidu p\u00e4rast. Kui \u00fcli\u00f5pilased ei tunne oma \u00f5pingutes progressi, lahkuvad nad. \u00dcldiselt on v\u00f5imalik tunde struktureerida nii, et \u00fcli\u00f5pilased tunneksid progressi tuttavate konstruktsioonide arvu suurenemises. Esiteks uurime p\u00f5hjalikult while-silmust, seej\u00e4rel uurime for-silmust, siis do while ja meil on valmis kursus tuhat ja \u00fcks \u00f6\u00f6d, kus kahes kuus uuritakse ainult silmuseid ja l\u00f5pus on \u00fcli\u00f5pilane, kes dikteerides kirjutas standardteegi. Siiski, et lahendada praktilisi \u00fclesandeid, on vajalik mitte ainult materjali tundmine, vaid ka iseseisvus selle rakendamisel ja uue teabe otsimisel. Seet\u00f5ttu pean kontaktkursuste jaoks \u00f5igeks p\u00f5him\u00f5tte, et \u00f5petada miinimum ja julgustada iseseisvat teema ja sellega seotud aiat\u00f6\u00f6 \u00f5ppimist. Silmuste teema puhul pean miinimumiks konstruktsiooni while. Selle abil saab arusaama p\u00f5him\u00f5ttest. Tunnes p\u00f5him\u00f5tet saab omandada ka for ja do-while ise.<\/p>\n<p>Materjali omandamine n\u00f5rkade \u00fcli\u00f5pilaste poolt ei piirdu ainult s\u00fcntaksiga. Tuleb anda rohkem lihtsaid, kuid mitmekesiseid \u00fclesandeid ja tuua n\u00e4iteid p\u00f5hjalikumalt. L\u00f5ppude l\u00f5puks piirab omandamise kiirus \u00fcli\u00f5pilase v\u00f5imet v\u00e4ljendeid muuta ja mustreid otsida. Arvestades nutikaid \u00fcli\u00f5pilasi, on enamik \u00fclesandeid igavad. Nende \u00f5petamise ajal ei tasu n\u00f5uda 100% \u00fclesannete lahendamist. Minu materjali saab vaadata <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">minu GitHub'is<\/a><\/noindex>. T\u00f5si, repositoorium sarnaneb rohkem musta maagia grimuarile \u2014 keegi peale minu ei saa aru, kus miski asub, ja kui kontrolli l\u00e4bi kukkuda, v\u00f5ib hulluks minna.<\/p>\n<h4>Metoodika on suunatud praktikale.<\/h4>\n<p>\nTeooriat selgitatakse probleemi lahendamise n\u00e4itena. Programmeerimise aluste tundides, kus \u00f5ppitakse harunemisi ja ts\u00fckleid, ei \u00f5nnestu lihtsalt veeta kasulikku loengut \u00fche teema kohta terve tunni. 15-20 minutit piisab, et m\u00f5isted selgeks teha. Peamised raskused tekivad praktiliste \u00fclesannete t\u00e4itmisel.<br \/>\nAlgajad \u00f5petajad v\u00f5ivad esitada operaatorid, harunemised, ts\u00fcklid ja massiivid \u00fche loengu jooksul. Ent nende \u00fcli\u00f5pilased seisavad silmitsi selle teabe omandamise probleemiga.<br \/>\nOluline on mitte ainult materjali r\u00e4\u00e4kida, vaid ka veenduda, et kuulejad on sellest aru saanud.<\/p>\n<p>Teema omandamine m\u00e4\u00e4ratakse kindlaks selle j\u00e4rgi, kuidas \u00fcli\u00f5pilane iseseisva t\u00f6\u00f6ga hakkama saab. <br \/>\nKui \u00fcli\u00f5pilane suudab teemat k\u00e4sitleva \u00fclesande iseseisvalt lahendada, t\u00e4hendab see, et teema on omandatud. Iga \u00fclesande puhul on soovitatav kirjeldada teststsenaariumide tabelit. \u00dclesannetel on selgelt m\u00e4\u00e4ratletud j\u00e4rjekord. \u00dclesandeid ei ole soovitatav vahele j\u00e4tta. Kui praegune \u00fclesanne on liiga keeruline, on j\u00e4rgmise peale \u00fcleminek m\u00f5ttetu. See on veel keerulisem. Et \u00fcli\u00f5pilane saaks hakkama praeguse keerulise \u00fclesandega, selgitatakse talle mitu tehnikaid esimese \u00fclesande n\u00e4itel. Tegelikult koondub teema sisu raskuste \u00fcletamise tehnikatele. Ts\u00fcklid on pigem k\u00f5rvaltegemine.<\/p>\n<p>Esimene \u00fclesanne on alati n\u00e4idistus. Teine erineb pisut ja tehakse 'iseseisvalt' kohe p\u00e4rast esimest \u00f5petaja j\u00e4relevalve all. K\u00f5ik j\u00e4rgnevate \u00fclesannete eesm\u00e4rk on p\u00f6\u00f6rata t\u00e4helepanu erinevatele pisiasjadele, mis v\u00f5ivad eksitusi tekitada.<\/p>\n<p>N\u00e4ide selgitab dialooge, kus \u00f5pilane peab rakendama tagasivoolu ja ristvalidatsiooni, et veenduda, et ta on materjali \u00f5ppimisega hakkama saanud.<\/p>\n<p>Olen banaalne ja \u00fctlen, et esimene n\u00e4ide teema kohta on v\u00e4ga oluline. Kui on olemas materjali laialdaseks iseseisvaks t\u00f6\u00f6ks, saab esimest n\u00e4idet hiljem parandada. Kui lisaks n\u00e4itele ei ole midagi muud, ei pruugi \u00f5pilane teemat omandada.<\/p>\n<h4>While v\u00f5i for?<\/h4>\n<p>\n\u00dcks vaieldav k\u00fcsimus on konstruktsiooni valik n\u00e4ite jaoks: while v\u00f5i for. \u00dcks kord veenis mind mu tuttav praktiseeriv arendaja, kellel ei olnud \u00f5petamiskogemust, tund aega, et for-ts\u00fckkel on k\u00f5ige lihtsam m\u00f5ista. Tema argumendid piirdusid v\u00e4itega, et \u2018k\u00f5ik on selge ja kohale paigutatud\u2019. Siiski on algajate t\u00f5eliselt keeruliste probleemide p\u00f5hjuseks ts\u00fckli idee, mitte selle kirjutamine. Kui inimene ei m\u00f5ista seda ideed, siis on tal raske ka s\u00fcntaksiga. Kui idee on m\u00f5istetud, kaovad koodivormi probleemid iseenesest.<\/p>\n<p>Minu materjalides j\u00e4rgneb ts\u00fcklite teema haru v\u00f5rdlemise teemale. if ja while v\u00e4line sarnasus v\u00f5imaldab teha otse\u00fclekande: \u2018kui tingimus pealkirjas on t\u00f5ene, siis t\u00e4idetakse keha\u2019. Ts\u00fckli erip\u00e4ra seisneb aga selles, et keha t\u00e4idetakse mitmeid kordi.<\/p>\n<p>Teine minu argument on, et while n\u00f5uab v\u00e4hem vormistust kui for. V\u00e4hem vormistust t\u00e4hendab v\u00e4hem rumalaid vigu, nagu puuduvaid komasid ja sulge. Algajatel ei ole veel piisavalt t\u00e4helepanelikkust ja p\u00f5hjalikkust, et automaatselt v\u00e4ltida s\u00fcntaksivigu.<br \/>\nKolmas argument on see, et paljudes heades raamatutes selgitatakse while konstruktsoone esimesena.<\/p>\n<p>Kui \u00f5pilasel \u00f5nnestub kergesti rakendada v\u00e4ljendeid, siis v\u00f5ib for-st \u00f5hust r\u00e4\u00e4kida. \u00d5pilane valib ise, mis talle rohkem meeldib. Kui aga rakendamine on keeruline, siis on parem mitte hajutada t\u00e4helepanu. Las \u00f5pilane lahendab esmalt k\u00f5ik while konstruktsiooni abil. Kui ts\u00fcklite teema on omandatud, v\u00f5ib lahendusi \u00fcmber kirjutada, et harjutada while'i muutmist for-iks.<br \/>\nPosttingimusega ts\u00fcklid on \u00fcsna haruldased. Ma ei raiska sellele aega \u00fcldse. Kui \u00f5pilane on m\u00f5istnud mustrite tuvastamise ideed ja v\u00e4ljendite muutmist, suudab ta ilma minu abita toimetada.<\/p>\n<p>Esitluses esimesest n\u00e4itest tugeva \u00fcli\u00f5pilaskonnaga r\u00f5hutan, et esimeses n\u00e4ites on oluline fikseerida mitte ainult lahendus, vaid ka kogu tegevuste ahel, mis tulemuse saavutamiseks viis. Laiskadel \u00fcli\u00f5pilastel v\u00f5ib olla kiusatus ignoreerida kirjutamist ja kanda endale ainult l\u00f5plik algoritm. Tuleb neid veenda, et \u00fchel hetkel seisavad nad silmitsi keerulise \u00fclesandega. Selle lahendamiseks tuleb j\u00e4rgida samme, nagu antud n\u00e4ites. Just seep\u00e4rast on oluline fikseerida k\u00f5ik etapid. J\u00e4rgmistes \u00fclesannetes v\u00f5ib j\u00e4tta alles vaid l\u00f5pliku lahenduse variandi.<\/p>\n<p>Automaatimise p\u00f5hieesm\u00e4rk on see, et me delegoime arvutile rutiinse t\u00f6\u00f6 tegemise inimese asemel. \u00dcks p\u00f5hilisi tehnikaid on ts\u00fcklite kirjutamine. Seda rakendatakse, kui programmis korduvad j\u00e4rjepidevalt sama laadi tegevused.<\/p>\n<h4>Selge on parem kui ebaselge<\/h4>\n<p>\nEsimeses ts\u00fcklite \u00fclesandes v\u00f5ib tunduda hea m\u00f5te ekraanile kuvada m\u00f5ni sama fraas korduvalt. N\u00e4iteks:<\/p>\n<blockquote><p>Hurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!<br \/>\nHurra, see t\u00f6\u00f6tab!\n<\/p><\/blockquote>\n<p>\nSelline variant on halb, kuna v\u00e4ljundis ei ole n\u00e4htav arvesti v\u00e4\u00e4rtus. See on probleem algajatele. Seda ei tohi alahinnata. Alguses oli see \u00fclesanne esimene ja j\u00e4rjestikuste arvude v\u00e4ljundamise \u00fclesanne teine. Tuli tutvustada t\u00e4iendavaid termineid 'ts\u00fckkel N korda' ja 'ts\u00fckkel A-st B-ni', mis on sisuliselt sama. Liigsete \u00fcksuste v\u00e4ltimiseks otsustasin n\u00e4idata ainult n\u00e4idet j\u00e4rjestuse v\u00e4ljundist. Ainult v\u00e4hestel \u00f5nnestub esmat\u00e4htsat ettevalmistust omamata hoida arvestit peas ja modelleerida programmi k\u00e4itumist m\u00f5ttes. M\u00f5ned \u00fcli\u00f5pilased puutuvad 'meeles modelleerimisega' esmakordselt kokku just ts\u00fcklite teemal.<br \/>\nP\u00e4rast teatavat praktikat annan \u00fclesande korduva sama teksti iseseisvaks lahendamiseks. Kui alguses anda n\u00e4htav arvesti ja seej\u00e4rel n\u00e4htamatu, tekib \u00fcli\u00f5pilastel v\u00e4hem probleeme. M\u00f5nikord piisab vihjest '\u00e4rge printige arvestit ekraanile'.<\/p>\n<h4>Kuidas see teiste juures seletatakse?<\/h4>\n<p>\nEnamikus veebimaterjalides antakse ts\u00fckli s\u00fcntaks \"loengus\". N\u00e4iteks developer.mozilla.org-is (hetkel) koos while-ts\u00fckliga kirjeldatakse veel mitmeid konstruktsioone. Samuti antakse lihtsalt konstruktsioonid mallide kujul. Nende k\u00e4ivitamise tulemust kirjeldatakse s\u00f5nadega, kuid illustratsioon puudub. Minu arvates v\u00e4hendab selline teema esitamine nende materjalide kasulikkust nullini. \u00d5pilane v\u00f5ib koodi \u00fcmber kirjutada ja ise selle k\u00e4ivitada, kuid viidatud n\u00e4idis on ikkagi vajalik. Kuidas m\u00f5ista, et n\u00e4idis on \u00f5igesti \u00fcmber kirjutatud, kui pole millegi tulemusega v\u00f5rrelda?<br \/>\nKui antakse vaid mall, ilma n\u00e4idiseta, siis \u00f5pilasel on veel raskem. Kuidas m\u00f5ista, et koodifragmendid on mallis \u00f5igesti paigutatud? V\u00f5ib-olla proovida kirjutada <i>mingil viisil<\/i>, ja siis k\u00e4ivitada. Kuid kui ei ole viidatud n\u00e4idist tulemuse v\u00f5rdlemiseks, siis k\u00e4ivitamine ei aita samuti.<\/p>\n<p>C++ kursis, ringi s\u00fcntaks on peidetud loengu 4 kolmandal lehek\u00fcljel teema \"operaatorid\" all. Ringi s\u00fcntaksi selgitamisel pannakse erilist r\u00f5hku m\u00f5istele \"operaator\". See m\u00f5iste esitatakse faktide kogumina nagu \"s\u00fcmbol; see on operaator\", \"{} on koosneval operaator\" ja \"ringa keha peab olema operaator\". Selline l\u00e4henemine ei meeldi mulle, kuna see peidab olulisi seoseid \u00fche termini taha. Allika koodi anal\u00fc\u00fcs sellisel tasemel on vajalik kompilaatorite arendajatele keele spetsifikatsiooni rakendamiseks, kuid mitte \u00fcli\u00f5pilastele esialgu. Algajad programmeerijad ei oma harva piisavalt peenmeelt, et selliseid termineid p\u00f5hjalikult k\u00e4sitleda. Harva keegi m\u00e4letab ja m\u00f5istab uusi s\u00f5nu esimesel katsel. Peaaegu keegi ei suuda \u00f5igesti rakendada s\u00f5na, mille nad just \u00f5ppinud on. Seet\u00f5ttu tekivad \u00fcli\u00f5pilastel palju vigu nagu \"kirjutasin while(a&lt;7);{, aga programm ei t\u00f6\u00f6ta&quot;.<br \/>\nMinu arvates on k\u00f5ige parem alustada konstruktsiooni s\u00fcntaksist kohe koos sulgudega. Ilma sulgudeta varianti tuleks selgitada ainult siis, kui \u00f5pilasel tekib konkreetne k\u00fcsimus \"miks siin pole sulgude ja see t\u00f6\u00f6tab\".<\/p>\n<p>O\u043a\u0443\u043b\u043e\u0432'in \u00abProgrammeerimise alused\u00bb 2012. aastast tutvustab ts\u00fcklite kasutamist for-malli kaudu, seej\u00e4rel antakse soovitusi selle kasutamiseks ning kohe p\u00e4rast seda algab eksperimentaalne osa. Ma arvan, et raamat kirjutati v\u00e4ga andekatele \u00f5pilastele, kes harva minu tundides osalevad.<\/p>\n<p>Populaarsetes raamatutes kirjutatakse alati v\u00e4lja koodifragmendi tulemus. N\u00e4iteks \u0160ildti \u00abJava 8. T\u00e4ielik juhend\u00bb 2015. aastast. Esiteks antakse mall, siis programmikood ja kohe p\u00e4rast seda \u2013 selle k\u00e4ivitamise tulemus.<\/p>\n<blockquote><p>N\u00e4iteks vaatame while-ts\u00fcklit, kus toimub tagurpidi<br \/>\nloetelu alustades numbrist 10 ja tr\u00fckitakse v\u00e4lja t\u00e4pselt 10 \u00abtakti\u00bb: <\/p>\n<pre><code class=\"java\">\/\/\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0446\u0438\u043a\u043b\u0430 while\nclass While {\n    public static void main(String args []) {\n        int n = 10;\n        while (n &gt; 0) {\n            System.out.println(&quot;\u0442\u0430\u043a\u0442 &quot; + n);\n            n--;\n        }\n    }\n}<\/code><\/pre>\n<p>\nK\u00e4ivitamisel prindib see programm k\u00fcmme \u00abtakti\u00bb j\u00e4rgmises vormis:<br \/>\n<code>takti 10<br \/>\ntakti 9<br \/>\ntakti 8<br \/>\ntakti 7<br \/>\ntakti 6<br \/>\ntakti 5<br \/>\ntakti 4<br \/>\ntakti 3<br \/>\ntakti 2<br \/>\ntakti 1<\/code><\/p><\/blockquote>\n<p>\nMallide, programmikoodide ja nende tulemuste kirjeldamise l\u00e4henemist kasutatakse ka raamatus \u00abJavascript lastele\u00bb ja w3schools.com'i js kursusel. Veebilehe vorming lubab isegi teha sellest n\u00e4itest interaktiivse.<\/p>\n<p>Stroustrup'i raamatus \u00abC++ p\u00f5him\u00f5tted ja praktika\u00bb 2016. aastast l\u00e4ks autor veelgi kaugemale. Esiteks selgitatakse, milline tulemus peaks olema, ja seej\u00e4rel n\u00e4idatakse programmikoodi. Kiidetakse, et n\u00e4idetena ei ole kasutatud lihtsalt juhuslikku programmi, vaid antakse ajalooline \u00fclevaade. See aitab t\u00e4helepanu juhtida: \u00abVaata, see ei ole lihtsalt kasutu tekst. Sa n\u00e4ed midagi olulist\u00bb.<\/p>\n<blockquote><p>Iteratsiooni n\u00e4iteks vaatame esimest programmi, mis on kirjutatud salvestatud programmi masinasse (EDSAC). See kirjutati David Wheeler'i poolt Cambridge'i \u00fclikooli arvutilaboris 6. mail 1949. aastal. See programm arvutab v\u00e4lja ja printib lihtse ruutude nimekirja.<br \/>\n<code>0 0<br \/>\n1 1<br \/>\n2 4<br \/>\n3 9<br \/>\n4 16<br \/>\n...<br \/>\n98 9604<br \/>\n99 9801<\/code><br \/>\nSiin igas reas on number, millele j\u00e4rgneb tabulaator (&#8216;t&#8217;) ja selle numbri ruut. Selle programmi versioon C++ keeles n\u00e4eb v\u00e4lja selline:<\/p>\n<pre><code class=\"cpp\">\/\/\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0447\u0438\u0441\u0435\u043b 0-99\nint main()\n{\n    int i = 0; \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043d\u0443\u043b\u044f\n    while(i &lt; 100){\n        cout &lt;&lt; i &lt;&lt; 't' &lt;&lt; square(i) &lt;&lt; 'n';\n        ++i;\n    }\n}<\/code><\/pre>\n<\/blockquote>\n<p>\nHuvitav on see, et selle raamatu s\u00fcntaksimall ei ole kirjeldatud. Stroustrup juhendmaterjalis (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">t\u00f5lge<\/a><\/noindex>) r\u00f5hutab, et hindab oma \u00f5pilaste intelligentsust. V\u00f5ib-olla peetakse oskust mallide \u00e4ratundmiseks mitmest n\u00e4itest sellise intelligentsuse v\u00e4ljenduseks.<\/p>\n<h4>Kuidas ma ise selgitan<\/h4>\n<p>\nStroustrup'i l\u00e4henemine: k\u00f5igepealt tulemuse kirjeldus, seej\u00e4rel probleemi lahendamine ja siis iseseisev anal\u00fc\u00fcs, n\u00e4ib olevat k\u00f5ige l\u00e4bim\u00f5eldum. Seet\u00f5ttu otsustasin selle aluseks v\u00f5tta, kuid r\u00e4\u00e4kida v\u00e4hem ajaloolisest n\u00e4itest \u2013 \u00fclesandest, mis k\u00e4sitleb \"sisukorda\". See loob tuntava m\u00e4rgise, et hiljem \u00f6elda \"m\u00e4leta \u00fclesannet sisukorra kohta\" ja et tudengid m\u00e4letaksid just seda. Oma n\u00e4ites p\u00fc\u00fcdsin hoiatada ka kahe k\u00f5ige levinuma eksituse eest. Edasi kirjutan neist l\u00e4hemalt.<\/p>\n<blockquote><p>Selle \u00fclesande kaudu tutvume keeruliste probleemide lahendamise tehnikatega. Esmalt tuleb lahendus teha primitiivne ja lihtne. Seej\u00e4rel saab m\u00f5elda, kuidas seda lahendust t\u00e4iustada.<br \/>\n<code>Sissejuhatus<br \/>\nPeat\u00fckk 1<br \/>\nPeat\u00fckk 2<br \/>\nL\u00fchipeat\u00fckk 3<br \/>\nL\u00fchipeat\u00fckk 4<br \/>\nL\u00fchipeat\u00fckk 5<br \/>\nL\u00fchipeat\u00fckk 6<br \/>\nL\u00fchipeat\u00fckk 7<br \/>\nKokkuv\u00f5te<\/code><\/p><\/blockquote>\n<p>\nOma t\u00e4helepanekute p\u00f5hjal toob l\u00e4henemine \"mall-n\u00e4ide-tulemus\" erinevates kombinatsioonides siiski kaasa, et \u00fcli\u00f5pilased tajuvad ringi kui hierogl\u00fc\u00fcfi. See v\u00e4ljendub selles, et nad ei m\u00f5istnud, miks sinna tingimus kirjutada, kuidas valida i++ ja i&#8212; vahel ja muid n\u00e4iliselt ilmseid asju. Neid eksimusi v\u00e4ltida, tuleks ringide k\u00e4sitlemisel r\u00f5hutada sama tegevuse kordamise m\u00f5tet ja alles seej\u00e4rel - nende vormimist konstruktsiooni abil. Seet\u00f5ttu peab enne ringi s\u00fcntaksi andmist lahendama \"otsekui\" probleemi. Primitiivne lahendus sisukorra kohta n\u00e4eb v\u00e4lja selline:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Sissejuhatus\");\nConsole.WriteLine(\"Peat\u00fckk 1\");\nConsole.WriteLine(\"Peat\u00fckk 2\");\nConsole.WriteLine(\"Peat\u00fckk 3\");\nConsole.WriteLine(\"Peat\u00fckk 4\");\nConsole.WriteLine(\"Peat\u00fckk 5\");\nConsole.WriteLine(\"Peat\u00fckk 6\");\nConsole.WriteLine(\"Peat\u00fckk 7\");\nConsole.WriteLine(\"J\u00e4reldus\");\n<\/code><\/pre>\n<p>\nKuidas seda saaks parandada?<br \/>\nAsendada \u00fchesugused tegevused ts\u00fckliga.<br \/>\nMillised tegevused korduvad j\u00e4rjest ilma muutusteta?<br \/>\nSelles fragmentis selliseid ei ole. Kuigi k\u00e4sud s\u00f5na \"Lugu\" koos numbriga on omavahel v\u00e4ga sarnased.<br \/>\nSeega on j\u00e4rgmine etapp fragmentide vahelise erinevuse leidmine. Ainult selles \u00fclesandes on k\u00f5ik selge, hiljem korduvad mitte \u00fcksikute k\u00e4skude, vaid 5 v\u00f5i rohkem rida koodi plokid. Otsima peab mitte ainult k\u00e4skude loendist, vaid ka haru- v\u00f5i ts\u00fckli konstruktsioonidest.<br \/>\nN\u00e4ites on k\u00e4skude vahe numbris s\u00f5na \"Lugu\" j\u00e4rel.<br \/>\nNii kui erinevus on leitud, tuleb m\u00f5ista muutuse seadusp\u00e4ra. Kas erinev fragment on number? Kas see suureneb v\u00f5i v\u00e4heneb pidevalt? Kuidas muutub numbri v\u00e4\u00e4rtus kahe k\u00f5rvuti oleva k\u00e4su vahel?<br \/>\nN\u00e4ites suureneb numbri \"Peat\u00fckk\" j\u00e4rel iga\u00fche sammuga 1. Erinevus on leitud, mustreid on avastatud. N\u00fc\u00fcd saab eristuva fragmendi asendada muutujaga.<br \/>\nSellist muutujat tuleks deklareerida enne esimest korduvat fragmenti. Seda muutujat nimetatakse tavaliselt I v\u00f5i j, v\u00f5i m\u00f5ne muu pikema nimega. Selle algv\u00e4\u00e4rtus peaks olema v\u00f5rdne ekraanile v\u00e4ljatr\u00fckitava esimese v\u00e4\u00e4rtusega. N\u00e4ites on esimene v\u00e4\u00e4rtus 1. <br \/>\nMillist algv\u00e4\u00e4rtust tuleks v\u00f5tta arvude seeria \"100, 101, 102, 103, 104, 105\" kuvamiseks?<br \/>\nSelles seerias on esimene number 100.<br \/>\nP\u00e4rast iga v\u00e4ljundik\u00e4su peab selle muutuva v\u00e4\u00e4rtust suurendama 1 v\u00f5rra. See \u00fchik on muutmise samm.<br \/>\nMis samm on arvude seeria \"100, 102, 104, 106\" puhul?<br \/>\nSelles seerias on samm 2.<br \/>\nP\u00e4rast eristuva fragmendi asendamist muutujaga n\u00e4eb kood v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Sissejuhatus\");\nint i;\ni = 0;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"Peat\u00fckk \" + i);\ni = i + 1;\nConsole.WriteLine(\"J\u00e4reldus\");\n<\/code><\/pre>\n<p>\nP\u00e4rast meetodi \"mustri v\u00e4ljendamine muutujaga\" rakendamist sisaldab kood mitmeid r\u00fchmi identsest toimingutest, mis j\u00e4rgnevad \u00fcksteisele. N\u00fc\u00fcd saab korduvad toimingud asendada ts\u00fckliga.<\/p>\n<p>Probleemi lahendamise j\u00e4rjestus, kus tuleb kasutada ts\u00fckleid, koosneb etappidest:<\/p>\n<ol>\n<li>Lahendada \"lamades\" hulga eraldi k\u00e4skudega<\/li>\n<li>Leida muster<\/li>\n<li>V\u00e4ljendada mustrit muutujaga<\/li>\n<li>Kujundada ts\u00fcklina<\/li>\n<\/ol>\n<p>Edasi tutvustatakse uusi termineid, et \u00fcli\u00f5pilane ei j\u00e4\u00e4ks olukorda \"k\u00f5ike m\u00f5istan, aga ei oska \u00f6elda\":<br \/>\n \u2014 loendur \u2014 alati muutuja, mis on vajalik ts\u00fckli sammude arvu j\u00e4lgimiseks. \u00dcldjuhul t\u00e4isarv, mida v\u00f5rreldakse piiranguga.<br \/>\n \u2014 loenduri samm \u2014 loenduri muutumise mustri kirjeldus.<br \/>\n \u2014 piirang \u2014 number v\u00f5i muutuja, millega loendurit v\u00f5rreldakse, et algoritm oleks l\u00f5plik. Loenduri v\u00e4\u00e4rtus muutub nii, et see l\u00e4heneb piirangule.<br \/>\n \u2014 ts\u00fckli keha \u2014 k\u00e4skude kogum, mida korratakse. Kui \u00f6eldakse \"k\u00e4sk kirjutatud ts\u00fckli sisse\", siis m\u00f5eldakse just keha.<br \/>\n \u2014 ts\u00fckli iteratsioon \u2014 ts\u00fckli keha \u00fcksik t\u00e4itmine.<br \/>\n \u2014 ts\u00fckli tingimus \u2014 loogiline v\u00e4ljend, millest s\u00f5ltub, kas j\u00e4rgmine iteratsioon toimub. (Siin v\u00f5ib olla segadust harutimise konstruktsioonidega)<br \/>\nOluline on olla valmis selleks, et esialgu kasutavad \u00f5pilased termineid valesti. See kehtib nii tugevate kui ka n\u00f5rkade kohta. \u00dchise keele loomine on \u00fcks tervet kunstivormi. Kirjutan n\u00fc\u00fcd l\u00fchidalt: tuleb seada \u00fclesanne \"toota koodifragmendi &lt;termin&gt;\" ja kasutada neid termineid vestluses \u00f5igesti.<br \/>\nP\u00e4rast transformatsiooni ts\u00fckliga saadakse fragment:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Sissejuhatus\");\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Peat\u00fckk &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;Kokkuv\u00f5te&quot;);<\/code><\/pre>\n<h4>Peamine eksimus<\/h4>\n<p>\n\u00dcks populaarsemaid eksimusi \u00f5pilaste seas on see, et nad panevad ts\u00fckli konstruktsiooni sisse sellised tegevused, mida tuleb teha vaid \u00fcks kord. N\u00e4iteks nii:<\/p>\n<pre><code class=\"cs\">;\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Sissejuhatus&quot;);\n    Console.WriteLine(&quot;Peat\u00fckk &quot; + i);\n    i = i + 1;\n    Console.WriteLine(&quot;Kokkuv\u00f5te&quot;);\n}\n<\/code><\/pre>\n<p>\n\u00d5pilased puutuvad selle probleemiga pidevalt kokku, nii alguses kui ka keerulisemates \u00fclesannetes.<br \/>\nKuninglik vihje sel juhul:<\/p>\n<blockquote><p>Kui mitu korda tuleb k\u00e4sk kirjutada: kord v\u00f5i mitu?\n<\/p><\/blockquote>\n<p>\nK\u00e4skude v\u00e4ljundite \"Sissejuhatus\" ja \"Kokkuv\u00f5te\" ning muutuja i deklareerimine ja initsialiseerimine ei sarnane teiste korduvate tegevustega. Need tehakse vaid \u00fcks kord, seega tuleb need kirjutada ts\u00fckli kehast v\u00e4lja.<\/p>\n<p>Koodis peavad j\u00e4\u00e4ma k\u00f5ik kolm lahendamise etappi, et neid hiljem raskustes viitamiseks kasutada. Esimese kahe variandi piisab, kui kommenteerida, et need ei segaks.<br \/>\n\u00d5pilase t\u00e4helepanu tuleks juhtida j\u00e4rgmistele faktidele:<br \/>\n \u2014 Ts\u00fckli tingimuses v\u00f5rreldakse tavaliselt loendurit ja piiri. Loendur v\u00f5ib ts\u00fckli kehas muutuda, piiri aga mitte. Selle reegli rikkumiseks tuleb esitada t\u00f5sised p\u00f5hjused.<br \/>\n \u2014 K\u00e4skude \"Sissejuhatus\" ja \"Kokkuv\u00f5te\" v\u00e4ljundid asuvad ts\u00fckli kehast v\u00e4ljaspool. Me peame need t\u00e4itma 1 kord. \"Sissejuhatus\" \u2014 enne tegevustele kordamise algust, \"Kokkuv\u00f5te\" \u2014 p\u00e4rast.<br \/>\nSelle teema kinnistamisel, j\u00e4rgmiste omandamisel ning raskustega tegelemisel on isegi tugevatele \u00f5pilastele kasulik esitada k\u00fcsimus: \"Aga kui tihti tuleb seda tegevust teha? \u00dcks kord v\u00f5i mitu?\".<\/p>\n<h4>Lisaoskuste arendamine<\/h4>\n<p>\nTs\u00fcklite uurimise k\u00e4igus harjutavad \u00fcli\u00f5pilased veel probleemide diagnoosimise ja lahendamise oskust. Diagnoosi tegemiseks peab tudeng esitama soovitud tulemuse ja v\u00f5rreldama seda tegeliku tulemusega. Nende vahekorra alusel s\u00f5ltuvad parandamise tegevused.<br \/>\nKuna \u00fcli\u00f5pilased ei suuda sel etapil veel piisavalt h\u00e4sti kujutada \"soovitud\" tulemust, v\u00f5ivad nad orienteeruda testandmetele. \u00dcldiselt ei m\u00f5ista keegi sel etapil veel, mis v\u00f5iks valesti minna ja kuidas sellega tegeleda. Seet\u00f5ttu annan \u00fclesande kirjutada \u00fcles t\u00fc\u00fcpilised probleemid ja m\u00f5ned v\u00f5imalikud lahendused. K\u00f5ige sobivama valimine on tudengi \u00fclesanne.<br \/>\nKirjutamine on vajalik, et k\u00fcsida: \"Kas tulemused vastasid ootustele?\", \"Milline olukord praegu kujunes?\", \"Kas rakendatud lahendus aitas?\".<\/p>\n<ol>\n<li>Tegevuste arv on oodatust 1 v\u00f5rra v\u00e4hem v\u00f5i rohkem. Lahendamisviisid:<br \/>\n \u2014 suurendada algse arvu arvesti 1 v\u00f5rra.<br \/>\n \u2014 asendada rangem v\u00f5rdlusoperaator (&lt; v\u00f5i &gt;) mitte rangema (&lt;= v\u00f5i &gt;=) vastu.<br \/>\n \u2014 muuta piirv\u00e4\u00e4rtuse v\u00e4\u00e4rtust 1 v\u00f5rra.<\/li>\n<li>Ts\u00fcklis toimuvad tegevused ilma peatamiseta, l\u00f5putult. Lahendamisviisid:<br \/>\n \u2014 lisada arvesti muutmise k\u00e4sk, kui see puudub.<br \/>\n \u2014 parandada arvesti muutmise k\u00e4sku nii, et selle v\u00e4\u00e4rtus muutuks piirv\u00e4\u00e4rtusele l\u00e4hemale.<br \/>\n \u2014 eemaldada piirv\u00e4\u00e4rtuse muutmise k\u00e4sk, kui see on ts\u00fckli kehas.<\/li>\n<li>Ts\u00fcklis olevate tegevuste arv on rohkem kui 1 v\u00f5rra v\u00e4hem v\u00f5i rohkem, kui oodata. Ts\u00fckli k\u00e4igus ei toimunud tegevust kordagi. Esiteks on vajalik v\u00e4lja selgitada muutujate tegelikud v\u00e4\u00e4rtused vahetult enne ts\u00fckli algust. Lahendamisviisid:<br \/>\n \u2014 muuta algv\u00e4\u00e4rtust piirv\u00e4\u00e4rtuses<br \/>\n \u2014 muuta algse arvu arvesti<\/li>\n<\/ol>\n<p>\nTavaliselt on probleem 3 seotud vale muutuja kasutamise v\u00f5i arvesti mitte nullimisega.<\/p>\n<p>P\u00e4rast seda seletust v\u00f5ivad tudengil siiski olla erinevad v\u00e4\u00e4rarusaamad ts\u00fcklite t\u00f6\u00f6 kohta.<br \/>\nK\u00f5ige levinumate hajutamiseks annan \u00fclesandeid:<\/p>\n<ol>\n<li>Milles piirv\u00e4\u00e4rtus, algse arvu arvesti v\u00f5i arvesti samm sisestatakse kasutaja poolt.<\/li>\n<li>Milles arvesti v\u00e4\u00e4rtust tuleb kasutada mingis aritmeetilises v\u00e4ljendis. Soovitavalt arvestiga allveesuvandi v\u00e4ljendis v\u00f5i nimetajas, et vahe oleks mittelineaarne.<\/li>\n<li>Millestki, kus loenduri v\u00e4\u00e4rtust ei kuvata ekraanil ts\u00fckli t\u00f6\u00f6tamise ajal. N\u00e4iteks sama teksti fragmentide soovitud arvu kuvamine v\u00f5i kujundi joonistamine kilpkonna graafika abil.<\/li>\n<li>Millestki, kus tuleb esmalt t\u00e4ita \u00fched korduvad tegevused ja seej\u00e4rel teised.<\/li>\n<li>Millestki, kus tuleb enne ja p\u00e4rast korduvaid tegevusi t\u00e4ita teisi tegevusi.<\/li>\n<\/ol>\n<p>\nIga \u00fclesande jaoks tuleb tuua testandmed ja oodatavad tulemused.<\/p>\n<p>Kuna on vaja m\u00f5ista, kui kiiresti saab edasi liikuda, tuleb anda lugeda nende \u00fclesannete tingimused ja k\u00fcsida: \"kuidas need erinevad n\u00e4itest?\", \"Mida tuleb n\u00e4ites muuta, et neid lahendada?\". Kui tudeng vastab sisuliselt, siis lasta tal lahendada v\u00e4hemalt \u00fcks koosoleku ajal ja \u00fclej\u00e4\u00e4nud kodus iseseisvalt. Kui lahendus on edukas, saab alustada ts\u00fcklite tingimuste selgitamist.<br \/>\nKui iseseisev lahendamine tekitab raskusi, tuleb k\u00f5ik koosolekul l\u00e4bi t\u00f6\u00f6tada. Selleks, et \u00fclesande lahendamine ei meenutaks \u00f6\u00f6kulli joonistamist, soovitan algul lahendada \u00fclesanne mitte universaalselt. See t\u00e4hendab, et lahendus peaks l\u00e4bima esimese testi ja mitte kasutama ts\u00fckli konstruktsiooni. Alles seej\u00e4rel rakendage teisendusi, et saavutada universaalsus.<\/p>\n<h4>Ts\u00fcklid ja harud<\/h4>\n<p>\nMinu arvates on kasulik anda teema \"harud ts\u00fcklite sees\" eraldi. Nii, et hiljem oleks n\u00e4ha erinevus korduva tingimuse kontrollimise ja \u00fchekordse kontrollimise vahel.<br \/>\nKinnistamise \u00fclesanded on numbrite v\u00e4ljastamine A-st B-ni, mis sisestatakse kasutaja poolt:<br \/>\n \u2014 alati kasvavas j\u00e4rjekorras.<br \/>\n \u2014 kasvavas v\u00f5i kahanevas j\u00e4rjekorras s\u00f5ltuvalt A ja B v\u00e4\u00e4rtustest.<\/p>\n<p>Teemasse \u201eharud ts\u00fcklite sees\u201d tuleks minna alles p\u00e4rast seda, kui \u00fcli\u00f5pilane on omandanud oskused: \u201emustri asendamine muutujaga\u201d ja \"korduvate tegevuste asendamine ts\u00fckliga\".<br \/>\nPeamine p\u00f5hjus harude rakendamiseks ts\u00fcklite sees on anomaaliad mustris. Keskosas rikutakse seda s\u00f5ltuvalt l\u00e4hteandmetest.<br \/>\nNendele tudengitele, kes suudavad otsida lahendust, kombineerides lihtsaid meetodeid, piisab \u00f6elda \"harud saab kirjutada ts\u00fcklite sees\" ja anda \u00fclesanne \"n\u00e4itena\" t\u00e4ielikult iseseisvaks lahendamiseks.<br \/>\nN\u00e4idis\u00fclesanne:<\/p>\n<blockquote><p>Kasutaja sisestab arvu X. V\u00e4ljasta veergudena numbrid vahemikus 0 kuni 9 ja pane plussm\u00e4rk &#8216;+&#8217; selle numbri juurde, mis on v\u00f5rdne X-iga.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Kui sisestati 0<\/b>0+<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">Kui sisestati 6<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6+<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">Kui sisestati 9<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9+<\/p>\n<p><b class=\"spoiler_title\">Kui sisestati 777<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p>Kui l\u00fchikesest seletusest ei piisa, et kirjutada ts\u00fckliga, tuleb saavutada selle sama \u00fclesande universaalne lahendus ilma ts\u00fcklita.<br \/>\nTuleb \u00fcks kahest variandist:<br \/>\n<b class=\"spoiler_title\">Soovitud<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(0 + \"+\");\n} else {\n    Console.WriteLine(0);\n}\nif (x==1) {\n    Console.WriteLine(1 + \"+\");\n} else {\n    Console.WriteLine(1);\n}\nif (x==2) {\n    Console.WriteLine(2 + \"+\");\n} else {\n    Console.WriteLine(2);\n}\nif (x==3) {\n    Console.WriteLine(3 + \"+\");\n} else {\n    Console.WriteLine(3);\n}\nif (x==4) {\n    Console.WriteLine(4 + \"+\");\n} else {\n    Console.WriteLine(4);\n}\nif (x==5) {\n    Console.WriteLine(5 + \"+\");\n} else {\n    Console.WriteLine(5);\n}\nif (x==6) {\n    Console.WriteLine(6 + \"+\");\n} else {\n    Console.WriteLine(6);\n}\nif (x==7) {\n    Console.WriteLine(7 + \"+\");\n} else {\n    Console.WriteLine(7);\n}\nif (x==8) {\n    Console.WriteLine(8 + \"+\");\n} else {\n    Console.WriteLine(8);\n}\nif (x==9) {\n    Console.WriteLine(9 + \"+\");\n} else {\n    Console.WriteLine(9);\n}\n<\/code><\/pre>\n<p><b class=\"spoiler_title\">V\u00f5imalik<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(\"0+n1n2n3n4n5n6n7n8n9\");\n}\nif (x==1) {\n    Console.WriteLine(\"0n1+n2n3n4n5n6n7n8n9\");\n}\nif (x==2) {\n    Console.WriteLine(\"0n1n2+n3n4n5n6n7n8n9\");\n}\nif (x==3) {\n    Console.WriteLine(\"0n1n2n3+n4n5n6n7n8n9\");\n}\nif (x==4) {\n    Console.WriteLine(\"0n1n2n3n4+n5n6n7n8n9\");\n}\nif (x==5) {\n    Console.WriteLine(\"0n1n2n3n4n5+n6n7n8n9\");\n}\nif (x==6) {\n    Console.WriteLine(\"0n1n2n3n4n5n6+n7n8n9\");\n}\nif (x==7) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7+n8n9\");\n}\nif (x==8) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7n8+n9\");\n}\nif (x==9) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7n8n9+\");\n}\n<\/code><\/pre>\n<p>Sarnast \u00fclesannet annan ma ette juba teema uurimise ajal, mis k\u00e4sitleb haru.<br \/>\nKui \u00fcli\u00f5pilasel on v\u00e4lja tulnud \"v\u00f5imalik\" variant, tuleb r\u00e4\u00e4kida, et \u00fche ja sama \u00fclesande lahendusi v\u00f5ib olla palju. Need erinevad aga n\u00f5uete muutustele vastupidavuses. K\u00fcsige: \"Kus koodis tuleb muuta, kui tuleb lisada veel \u00fcks number?\" \"V\u00f5imaliku\" variandi puhul tuleb lisada veel \u00fcks haru ja kirjutada 10 mujal kohas uus number. \"Soovitud\" variandi puhul piisab, et lisada ainult \u00fcks haru.<br \/>\nSeadke \u00fclesanne reprodutseerida \"soovitud\" variant, seej\u00e4rel leidke koodis seadusp\u00e4ra, tehke muutuja asendus ja kirjutage ts\u00fckkel.<br \/>\nKui teil on idee, kuidas seda \u00fclesannet lahendada ilma ts\u00fcklita m\u00f5nel muul viisil, kirjutage palun kommentaarides.<\/p>\n<h4>Ts\u00fcklid ts\u00fcklites<\/h4>\n<p>\nSelle teema puhul tuleks t\u00e4helepanu p\u00f6\u00f6rata sellele, et:<br \/>\n \u2014 sisemise ja v\u00e4limise ts\u00fckli loendurid peavad olema erinevad muutujad.<br \/>\n \u2014 sisemise ts\u00fckli loendur tuleb nullida mitu korda (st v\u00e4limise ts\u00fckli kehas).<br \/>\n Tekstrain v\u00e4ljundite puhul ei tohi esmalt kirjutada \u00fchte t\u00e4hte mitmes reas ja siis teist. K\u00f5ik esimeses reas olevad t\u00e4hed tuleb eelnevalt v\u00e4lja tuua, seej\u00e4rel k\u00f5ik teises reas olevad ja nii edasi.<\/p>\n<p>Ts\u00fcklite teema selgitamist on k\u00f5ige parem alustada loenduri nullimise t\u00e4htsuse selgitamisest.<br \/>\nN\u00e4idis\u00fclesanne:<\/p>\n<blockquote><p>Kasutaja sisestab kaks arvu: R ja T. V\u00e4ljasta kaks rida s\u00fcmboleid \"#\". Esimeses reas peaks olema R t\u00fckki s\u00fcmbolitega. Teises reas T t\u00fckki. Kui m\u00f5ni number on negatiivne, v\u00e4ljasta teade veast.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n###########<\/p>\n<p><b class=\"spoiler_title\">R=20, T=3<\/b>####################<br \/>\n###<\/p>\n<p><b class=\"spoiler_title\">R=-1, T=6<\/b>R v\u00e4\u00e4rtus peab olema mitte-negatiivne<\/p>\n<p><b class=\"spoiler_title\">R=6, T=-2<\/b>T v\u00e4\u00e4rtus peab olema mitte-negatiivne<\/p>\n<p>Ilmselt on sellel \u00fclesandel ka v\u00e4hemalt kaks lahendusvarianti.<br \/>\n<b class=\"spoiler_title\">Soovitud<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nint i = 0;\nwhile (i &lt; R)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\nConsole.WriteLine();\ni = 0;\nwhile (i &lt; T)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\n<\/code><\/pre>\n<p><b class=\"spoiler_title\">V\u00f5imalik nr 1<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nint i = 0;\nwhile (i &lt; R)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\nConsole.WriteLine();\nint j = 0;\nj = 0;\nwhile (j &lt; T)\n{\n    Console.Write(&quot;#&quot;);\n    j = j + 1;\n}\n<\/code><\/pre>\n<p>Eroone on see, et \"v\u00f5imalikus\" lahenduses teise rea v\u00e4ljundiks kasutati teist muutujat. Tuleb r\u00f5hutada, et m\u00f5lema ts\u00fckli jaoks tuleks kasutada sama muutujat. Sellise piiramise p\u00f5hjendamiseks v\u00f5ib tuua v\u00e4lja, et \u00fche loenduri lahendus kahes ts\u00fcklis on n\u00e4ide m\u00f5istest \"loenduri nullimine\". Selle termini m\u00f5istmine on vajalik j\u00e4rgnevate \u00fclesannete lahendamiseks. Kompromissina v\u00f5ib hoida kaht lahendust \u00fclesandele.<\/p>\n<p>T\u00fc\u00fcpiline probleem \u00fche loenduri kasutamisel kahe ts\u00fckli jaoks ilmneb j\u00e4rgmiselt:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Teise rea s\u00fcmbolite arv ei vasta v\u00e4\u00e4rtusele T. Kui selle probleemiga on abi vaja, siis tuleb \"nina sisse\" torgata ts\u00fckli t\u00fc\u00fcpiliste probleemide kokkuv\u00f5ttesse. See on s\u00fcmptom nr 3. Diagnoositakse, kui lisada loenduri v\u00e4\u00e4rtuse v\u00e4ljund otse enne teist ts\u00fcklit. Parandatakse nullimise teel. Kuid seda parem kohe ei r\u00e4\u00e4kida. \u00dcli\u00f5pilane peab proovima v\u00e4hemalt \u00fche h\u00fcpoteesi formuleerida.<\/p>\n<p>Eksisteerib muidugi ka selline lahendus. Kuid ma pole seda \u00fcli\u00f5pilastelt kunagi n\u00e4inud. Ts\u00fcklite \u00f5ppimise etapis selle kohta r\u00e4\u00e4kimine hajutab t\u00e4helepanu. Saame sellele hiljem tagasi tulla, kui uurime stringidega t\u00f6\u00f6tamise funktsioone.<br \/>\n<b class=\"spoiler_title\">V\u00f5imalik nr 2<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nConsole.WriteLine(new String('#', R));\nConsole.WriteLine(new String('#', T));\n<\/code><\/pre>\n<p>\nJ\u00e4rgmine kohustuslik \u00fclesanne:<\/p>\n<blockquote><p>Kuva ekraanile numbrid vahemikus 0 kuni 9. Iga number peab olema oma real. Ridade arvu (W) sisestate klaviatuuri kaudu.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">W=1<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">W=10<\/b><code>0000000000<br \/>\n1111111111<br \/>\n2222222222<br \/>\n3333333333<br \/>\n4444444444<br \/>\n5555555555<br \/>\n6666666666<br \/>\n7777777777<br \/>\n8888888888<br \/>\n9999999999<\/code><\/p>\n<p>Kui \u00fcli\u00f5pilane on \u00f5petanud muutuja asendamise tehnikat, suudab ta selle kiiresti lahendada. V\u00f5imalik probleem on j\u00e4lle muutuja nullimine. Kui teisendamine ei \u00f5nnestu, t\u00e4hendab see, et olete liiga rutakalt edasi liikunud ja peaksite lahendama lihtsamaid \u00fclesandeid.<\/p>\n<p>Ait\u00e4h t\u00e4helepanu eest. Pange meeldimised ja tellige kanal.<\/p>\n<p>P.S. Kui leiate tekstis tr\u00fckivigu v\u00f5i vigu, andke palun teada. Seda saate teha, t\u00e4histades tekstiosa ja vajutades Macis \u00ab\u2318 + Enter\u00bb v\u00f5i klassikalistel klaviatuuridel \u00abCtrl \/ Enter\u00bb, v\u00f5i s\u00f5numite kaudu. Kui need valikud ei ole saadaval, kirjutage vigadest kommentaarides. Ait\u00e4h!<\/p>\n<p class=\"for_users_only_msg\">Ainult registreeritud kasutajad saavad k\u00fcsitluses osaleda. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logige sisse<\/a><\/noindex>, palun.<\/p>\n<h2 class=\"default-block__polling-title\">K\u00fcsitlus lugejate jaoks, kellel pole karma<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,0%<\/strong>\u00d5petan professionaalselt, +12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">10,0%<\/strong>\u00d5petan professionaalselt, -11<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">70,0%<\/strong>Ei \u00f5peta, +17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Ei \u00f5peta, -10<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Muu0<\/p>\n<\/li>\n<\/ul>\n<p>    H\u00e4\u00e4letas 10 kasutajat. 5 kasutas diskreetset k\u00e4itumist.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/456500\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u044b, \u043f\u043e\u0437\u0430\u0431\u044b\u0442\u044b \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u044b. \u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40208","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-01T03:04:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-01T03:04:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas \u00f5petada raskusi \u00fcletama ja samal ajal sildu kirjutama | ProHoster","description":"Hoolimata sellest, et jutt k\u00e4ib \u00fchest p\u00f5hiteemast, on see artikkel kirjutatud kogenud spetsialistidele. Eesm\u00e4rk on n\u00e4idata, millised eksiarvamused on algajatel programmeerimises.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b | ProHoster","og:description":"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.","og:url":"https:\/\/prohoster.info\/et\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-01T03:04:35+00:00","article:modified_time":"2020-02-01T03:04:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40208","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:43:24","updated":"2022-09-29 01:18:32","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}