{"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 \u00fcle saama raskustest, ja samal ajal ka loopide kirjutamist","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Kuigi teema on p\u00f5hiline, on see artikkel suunatud kogenud spetsialistidele. Eesm\u00e4rk on n\u00e4idata, millised eksimused esinevad programmeerimise algajate seas. Praktiseerivatele arendajatele on need probleemid juba ammu lahendatud, unustatud v\u00f5i t\u00e4iesti m\u00e4rkamatuks j\u00e4\u00e4vad. Artikkel v\u00f5ib olla kasulik, kui teile tuleb kunagi kellelegi selle teema osas abi anda. Artiklis tehakse paralleele erinevate programmeerimisraamatute, autoriteks Shildt, Stroustrup ja Okulov, materjaliga.<\/p>\n<p>Ts\u00fcklite teema on valitud, sest see j\u00e4tab programmeerimise \u00f5ppimise k\u00e4igus paljusid inimesi v\u00e4lja.<\/p>\n<p>See meetod on suunatud n\u00f5rkadele tudengitele. P\u00f5hiliselt ei j\u00e4\u00e4 tugevamad selles teemas kinni ning neile ei vaja erilisi meetodeid v\u00e4lja m\u00f5elda. Teine eesm\u00e4rk on t\u00f5lkida see meetod klassist \"toimib k\u00f5igi tudengite jaoks, kuid ainult \u00fche \u00f5petaja juures\" klassi \"toimib k\u00f5igi tudengite ja k\u00f5igi \u00f5petajate jaoks\". Ma ei pretendeeri absoluutsele originaalsusele. Kui kasutate juba sarnast meetodit selle teema \u00f5petamiseks, andke palun teada, kuidas teie variant erineb. Kui otsustate seda rakendada, jagage palun tulemusi. Kui m\u00f5ni sarnane meetod on kajastatud m\u00f5nes raamatus, andke palun raamatu pealkiri.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOlen seda meetodit rakendanud nelja aasta jooksul, \u00f5petades individuaalselt eri tasemel tudengeid. Kokku umbes viisk\u00fcmmend tudengit ja kaks tuhat tundi tunde. Alguses j\u00e4id tudengid selle teema osas igaveseks kinni ja lahkusid. P\u00e4rast iga tudengit korrigeeriti meetodit ja materjale. Viimasel aastal ei j\u00e4\u00e4 tudengid enam selle teema k\u00fclge kinni, nii et otsustasin oma teadmisi jagada.<\/p>\n<h4>Miks nii palju kirjutada? Ts\u00fcklid on ju elementaarsed!<\/h4>\n<p>\nKuna ma olen juba varem maininud, et praktiseerivatele arendajatele ja tugevatele tudengitele v\u00f5ib ts\u00fcklite kontseptsiooni keerukus j\u00e4\u00e4da alahinnatuks. N\u00e4iteks on v\u00f5imalik korraldada pikka loengut, n\u00e4ha noogutavaid pead ja nutikaid silmi. Kuid kui proovida lahendada m\u00f5nda \u00fclesannet, algab tardumus ja seletamatud probleemid. P\u00e4rast loengut on tudengite arusaam ainult osaline. Olukorda halvendab see, et tudengid ei suuda ise s\u00f5nastada, kus t\u00e4pselt nende eksimus seisneb.<br \/>\nKord m\u00e4rkasin, et tudengid tajuvad minu n\u00e4iteid hierogl\u00fc\u00fcfidena. Ehk nagu jagamatuid tekstil\u00f5ike, kuhu tuleb lisada mingi \"maagiline\" t\u00e4ht ja siis t\u00f6\u00f6tab.<br \/>\nM\u00f5nikord m\u00e4rkasin, et tudengid arvavad, et konkreetse \u00fclesande lahendamiseks on vajalik <i>m\u00f5ni teine<\/i> konstruktsioon, millest ma lihtsalt veel ei ole r\u00e4\u00e4kinud. Kuigi lahendamiseks piisab vaid n\u00e4ite v\u00e4ikestest muudatustest.<\/p>\n<p>Seet\u00f5ttu j\u00f5udsin ideeni, et peamine t\u00e4helepanu tuleks suunata mitte v\u00e4ljendite s\u00fcntaksile, vaid korduva koodi refaktoreerimise ideele ts\u00fcklite abil. Niipea kui \u00f5pilased omandavad selle idee, t\u00f5mmatakse iga s\u00fcntaks nende v\u00e4ikeste harjutuste kaudu l\u00e4hemale.<\/p>\n<h4>Kellele ja miks ma \u00f5petan<\/h4>\n<p>\nKuna vastuv\u00f5tueksameid ei ole, v\u00f5ivad tundides olla nii tugevad kui ka v\u00e4ga n\u00f5rgad tudengid. Rohkem informatsiooni minu tudengite kohta on artiklis <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">\u00d6\u00f6kursside kuulajate portree<\/a><\/noindex><br \/>\nP\u00fc\u00fcdlesin selle poole, et programmeerimist valdaksid k\u00f5ik, kes seda soovivad.<br \/>\nMinu tunnid toimuvad individuaalselt ning tudeng maksab iga tunni eest. Tundub, et tudengid peaksid kulude optimeerimiseks n\u00f5udma minimaalset. Kuid inimesed k\u00e4ivad silmast silma loengutes elava \u00f5petaja juures mitte teadmiste p\u00e4rast, vaid selleks, et tunda kindlust, et nad on omandanud vajalikud oskused, kogeda edusamme ja saada heakskiitu eksperdilt (\u00f5petajalt). Kui tudengid ei tunne oma \u00f5ppimises edusamme, lahkuvad nad. \u00dcldiselt on v\u00f5imalik tunde \u00fcles ehitada nii, et tudengid tunneksid edusamme meie tuttavates konstruktides. Ehk k\u00f5igepealt uurime \u00fcksikasjalikult while ts\u00fcklit, siis uurime for ts\u00fcklit ja seej\u00e4rel do while ts\u00fcklit, ja n\u00fc\u00fcd on meil kursus tuhandeks ja \u00fcheks \u00f6iseks, kus kahe kuu jooksul \u00f5pitakse ainult ts\u00fckleid ning tulemuseks on tudeng, kes dikteerimisega kirjutas standardraamatukogu. Kuid praktiliste probleemide lahendamiseks on vajalik mitte ainult materjali tundma\u00f5ppimine, vaid ka iseseisvus selle rakendamisel ja uue teabe otsimisel. Seega pean silmas, et silmast silma kursuste puhul on \u00f5ige p\u00f5him\u00f5te - \u00f5petada minimaalset ning julgustada iseseisvat s\u00fcvenemist n\u00fcanssidesse ja samateemadesse. Ts\u00fcklite teemal olen minimaalseks pidanud while konstruktsiooni. Selle kaudu on v\u00f5imalik m\u00f5ista p\u00f5him\u00f5tet. Olles p\u00f5him\u00f5tte omandanud, suudab iga\u00fcks iseseisvalt valitseda nii for kui ka do-while.<\/p>\n<p>N\u00f5rkade \u00f5pilaste aine omandamine ei piirdu vaid s\u00fcntaksi kirjeldamisega. On oluline pakkuda rohkem lihtsaid, kuid mitmekesiseid \u00fclesandeid ning tuua n\u00e4iteid p\u00f5hjalikumalt. L\u00f5ppkokkuv\u00f5ttes piirab omandamise kiirus \u00f5pilase v\u00f5imet v\u00e4ljendeid \u00fcmber muuta ja mustreid leida. Nutikate \u00f5pilaste jaoks on enamik \u00fclesandeid igavad. Nendega t\u00f6\u00f6tades ei pea 100% \u00fclesannete lahendamist n\u00f5udma. Minu materjaliga saab tutvuda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">minu githubis<\/a><\/noindex>. T\u00f5si, see repot on pigem mustkunstniku grimuaari laadne \u2014 keegi peale minu ei m\u00f5ista, mis kus asub, ja kui kontroll l\u00e4bi kukub, v\u00f5ib hulluks minna.<\/p>\n<h4>Metoodika keskendub praktikale<\/h4>\n<p>\nTeooriat selgitatakse \u00fclesande lahenduse n\u00e4itel. Programmeerimise alaste tundide puhul, kus \u00f5pitakse harutusi ja ts\u00fckleid, ei ole v\u00f5imalik \u00fche teema kohta tervet tundi kasulikku loengut korraldada. 15-20 minutit piisab, et m\u00f5istet tutvustada. Peamised raskused tekivad praktiliste \u00fclesannete t\u00e4itmisel.<br \/>\nAlgajad \u00f5petajad v\u00f5ivad esitada operaatorid, harutused, ts\u00fcklid ja massiivid \u00fche loengu jooksul. Kuid \u00f5pilased seisavad nende teadmiste omandamise probleemide ette.<br \/>\nOluline on mitte ainult materjali tutvustada, vaid ka veenduda, et kuulajad on sellest aru saanud.<\/p>\n<p>Teema omandamise t\u00f5endamiseks vaadatakse, kuidas \u00f5pilane iseseisva t\u00f6\u00f6ga toime tuleb. <br \/>\nKui \u00f5pilasel \u00f5nnestub teema \u00fclesanne lahendada ilma \u00f5petaja abita, t\u00e4hendab see, et teema on omandatud. Iseseisva kontrolli tagamiseks on iga\u00fche \u00fclesande juures tabel teststsenaariumidega. \u00dclesannete j\u00e4rjekord on selge. \u00dclesandeid ei ole soovitatav vahele j\u00e4tta. Kui praegune \u00fclesanne on liiga keeruline, on kasutu minna j\u00e4rgmisele. See on veel keerulisem. Et \u00f5pilane saaks praeguse keerulise \u00fclesandega toime tulla, selgitatakse talle m\u00f5ningaid tehnikaid esimese \u00fclesande n\u00e4itel. Tegelikult, kogu teema sisu koondub kuni probleemide \u00fcletamise tehnikateni. Ts\u00fcklid on pigem k\u00f5rvaln\u00e4htus.<\/p>\n<p>Esimene \u00fclesanne on alati n\u00e4ide. Teine erineb vaid veidi ja t\u00e4idetakse \"ise\" kohe p\u00e4rast esimest \u00f5petaja j\u00e4relevalve all. K\u00f5ik j\u00e4rgnevad \u00fclesanded on suunatud erinevate detailide t\u00e4helepanu juhtimisele, mis v\u00f5ivad eksitusi tekitada.<\/p>\n<p>N\u00e4ite selgitamine on dialoog, kus \u00f5pilane peaks n\u00e4itama tagasivoolu ja ristvalideerimist, et veenduda materjali omandamises.<\/p>\n<p>Olgu ma banaalne ja v\u00e4idan, et esimene n\u00e4ide teema kohta on v\u00e4ga oluline. Kui on olemas piisavalt materjali ulatuslikuks iseseisvaks t\u00f6\u00f6ks, siis v\u00f5ib esimest n\u00e4idet puudutavad puudused parandada. Kui \u00f6elda, et midagi muud ei ole, siis t\u00f5en\u00e4oliselt ei omanda \u00f5pilane teemat.<\/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. \u00dckskord veenis \u00fcks tuttav praktik, kellel ei olnud \u00f5petamise kogemust, mind kogu tunni jooksul, et for ts\u00fckkel on k\u00f5ige lihtsam arusaadav. Tema argumendid piirdusid v\u00e4itega, et \"k\u00f5ik on selge ja kohad on paigas\". Kuid t\u00f5eliste algajate raskuste p\u00f5hjus peitub ts\u00fckli idees, mitte selle kirjutamises. Kui inimene ei m\u00f5ista seda ideed, siis tal on raskusi s\u00fcntaksiga. Kui idee on m\u00f5istetud, kaovad koodivormistamise probleemid iseenesest.<\/p>\n<p>Minu materjalides j\u00e4rgneb ts\u00fcklite teema harutuste teemale. if ja while v\u00e4line sarnasus v\u00f5imaldab teha otsese analoogia: \"kui tingimus pealkirjas on t\u00f5ene, siis t\u00e4idetakse keha\". Ts\u00fckli erip\u00e4ra seisneb selles, et keha t\u00e4idetakse mitu korda.<\/p>\n<p>Teine minu argument on, et while n\u00f5uab v\u00e4hem vormistamist kui for. V\u00e4hem vormistamist t\u00e4hendab v\u00e4hem rumalaid vigu puuduvate komade ja sulgudega. Algajatel ei ole veel piisavalt t\u00e4helepanelikkust ja p\u00f5hjalikkust, et automaatselt v\u00e4ltida s\u00fcntaktilisi vigu.<br \/>\nKolmas argument on see, et paljudes heades raamatutes selgitatakse while esimesena.<\/p>\n<p>Kui \u00f5pilasel \u00f5nnestub v\u00e4ljendeid kergesti \u00fcmber vormida, siis saab while k\u00f5rvale j\u00e4tta. \u00d5pilane valib hiljem, mis talle rohkem meeldib. Kui aga \u00fcmbervormimisega tekivad raskused, on parem t\u00e4helepanu mitte hajutada. Las \u00f5pilane lahendab alles k\u00f5ik while abil. Kui ts\u00fcklite teema on omandatud, saab lahendusi \u00fcmber kirjutada, et harjutada while'i for'iks muutmist.<br \/>\nTs\u00fcklid koos posttingimusega on \u00fcsna haruldased. Selle peale ma aega ei raiska. Kui \u00f5pilane on omandanud mustrite tuvastamise ja v\u00e4ljendite \u00fcmbervormimise ideed, siis suudab ta toime tulla ilma minu abita.<\/p>\n<p>Esimese n\u00e4ite tutvustamisel tugevatele \u00f5pilastele r\u00f5hutan, et esimese n\u00e4ite puhul on oluline fikseerida mitte ainult lahendus, vaid ka kogu tegevuste ahel, mis viis tulemuse saavuttamiseni. Laiskadele \u00f5pilastele v\u00f5ib j\u00e4\u00e4da mulje, et nad saavad ignoreerida kirjutamist ja j\u00e4tta endale vaid l\u00f5pp-algoritmi. Neid tuleb veenda, et kunagi v\u00f5ib neile ette tulla keeruline \u00fclesanne. Selle lahendamiseks tuleb j\u00e4rgida samme nagu selles n\u00e4ites. Just seep\u00e4rast on oluline fikseerida k\u00f5ik etapid. J\u00e4rgmistes \u00fclesannetes saab j\u00e4tta vaid l\u00f5pliku lahenduse versiooni.<\/p>\n<p>Automatiseerimise p\u00f5hidee on seda, et usaldame arvutile igap\u00e4evase t\u00f6\u00f6 tegemise inimese eest. \u00dcks p\u00f5hilisi meetodeid on ts\u00fcklite kirjutamine. Seda kasutatakse siis, kui programmis kirjutatakse j\u00e4rjest mitu sama korduvat tegevust.<\/p>\n<h4>Selge on parem kui ebaselge<\/h4>\n<p>\nEsimene \u00fclesanne ts\u00fcklite kohta v\u00f5ib tunduda hea ideena, kui ekraanile l\u00f5puks v\u00e4ljastatakse sama fraas mitu korda. N\u00e4iteks:<\/p>\n<blockquote><p>Hurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!<br \/>\nHurraa, see t\u00f6\u00f6tab!\n<\/p><\/blockquote>\n<p>\nSelline variant on halb, kuna v\u00e4ljundis ei ole n\u00e4htav loenduri v\u00e4\u00e4rtus. See on algajate jaoks probleem. Seda ei tohiks alahinnata. Alguses oli see \u00fclesanne esimene ja \u00fclesanne j\u00e4rjestikku suurenevate arvude v\u00e4ljastamiseks \u2013 teine. Vaja l\u00e4ks tutvustada t\u00e4iendavaid termineid nagu 'ts\u00fckkel N korda' ja 'ts\u00fckkel A-st B-ni', mis tegelikult t\u00e4hendavad sama. Et mitte luua liigseid m\u00f5isteid, otsustasin n\u00e4idata ainult n\u00e4idet numbrite j\u00e4rjestikuse v\u00e4ljastamise kohta. Harva suudavad inimesed ilma ettevalmistuseta hoida meeles loenduri ja modelleerida programmi k\u00e4itumist enda peas. M\u00f5ned \u00f5pilased puutuvad esmakordselt kokku 'meeles modelleerimisega' just ts\u00fcklite teemal.<br \/>\nP\u00e4rast teatavat praktikat annan \u00fclesande korduva teksti kirjutamiseks iseseisvaks lahendamiseks. Kui anda esmalt n\u00e4htav loendur ja seej\u00e4rel n\u00e4htamatu, siis \u00f5pilastel on v\u00e4hem probleeme. M\u00f5nikord piisab vihjest '\u00e4ra kirjuta loendurit ekraanile'.<\/p>\n<h4>Kuidas selgitatakse teistes?<\/h4>\n<p>\nEnamik internetis olevaid \u00f5pikuid esitab ts\u00fckli s\u00fcntaksi 'loengute' osana. N\u00e4iteks developer.mozilla.org veebilehel antakse koos while ts\u00fckliga teada ka mitmeid teisi konstruktsioone. Samal ajal antakse ainult konstruktsioonid \u0161abloonidena. Nende k\u00e4ivitamise tulemus on s\u00f5naliselt kirjeldatud, kuid illustreerimine puudub. Minu arvates selline teema esitlemine v\u00e4hendab j\u00e4rsult selliste materjalide kasulikkust. \u00d5pilane v\u00f5ib kopeerida koodi ning k\u00e4ivitada selle ise, kuid v\u00f5rdlusstandard on ikka vajalik. Kuidas m\u00f5ista, et n\u00e4ide on \u00f5igesti kopeeritud, kui tulemusega pole millestki v\u00f5rrelda?<br \/>\nKui antakse ainult \u0161abloon, ilma n\u00e4iteks, muutub \u00f5pilasel veelgi keerulisemaks. Kuidas m\u00f5ista, et koodifragmendid on \u0161abloonis \u00f5igesti paigutatud? V\u00f5ib proovida kirjutada kuidagi, ja seej\u00e4rel k\u00e4ivitada. Kuid kui ei ole v\u00f5rreldavat standardit, ei aita ka k\u00e4ivitamine. <i>kuidagi<\/i>, ja siis k\u00e4ivitada. Aga kui ei ole v\u00f5rdluspunkti, ei aita ka k\u00e4ivitamine.<\/p>\n<p>C++ kursis, millel on loeng, mille kolmandal lehek\u00fcljel on s\u00fcntaksilise ts\u00fckli struktuur teema \u201eoperaatorid\u201c all. Ts\u00fckli s\u00fcntaksit selgitades keskendutakse eriti terminile \u201eoperaator\u201c. Termin esitatakse faktikogumina nagu \u201es\u00fcmbol; see on operaator\u201c, \u201e{} on koosneva operaatori s\u00fcmbol\u201c, \u201ets\u00fckli keha peab olema operaator\u201c. Selline l\u00e4henemine ei meeldi mulle, kuna see peidab olulisi seoseid \u00fche termini taha. Algse kodeeringu anal\u00fc\u00fcs sellel tasemel on vajalik kompilaatorite arendajatele jazdvat ideed keele spetsifikatsioonist, kuid mitte \u00fcli\u00f5pilastele esmases l\u00e4henemises. Algajad programmeerijad ei oma harva piisavalt t\u00e4helepanelikkust, et terminite vastu nii hoolikalt suhelda. Harva suudab keegi uusi s\u00f5nu esimesel korral meeles pidada ja m\u00f5ista. Peaaegu keegi ei saa \u00f5igesti rakendada terminit, mille nad just \u00f5ppisid. Seet\u00f5ttu tekib \u00fcli\u00f5pilastel palju vigu, nagu \u201ekirjutasin while(a&lt;7);{, kuid programm ei t\u00f6\u00f6ta\u201c.<br \/>\nMinu arvates on parem alguses anda konstruktsiooni s\u00fcntaks kohe koos sulgudega. Variandi ilma sulgudeta selgitamine on sobiv ainult juhul, kui \u00f5pilasel tekib konkreetne k\u00fcsimus 'miks siin on ilma sulgudeta ja see t\u00f6\u00f6tab'.<\/p>\n<p>Okulovi raamatus \"Programmeerimise alused\" 2012. aastal algab tutvustus ts\u00fcklitega for \u0161abloonidega, seej\u00e4rel antakse soovitused selle kasutamiseks ja seej\u00e4rel j\u00e4rgneb kohe eksperimentaalne osa loengust. Ma saan aru, et raamat kirjutati selle v\u00e4hese arvu v\u00e4ga andekate \u00f5pilaste jaoks, kes harva tulevad minu tundidesse.<\/p>\n<p>Populaarsetes raamatutes on alati antud koodifragmendi tulemused. N\u00e4iteks Shildti \"Java 8. T\u00e4ielik juhend\" 2015. aasta v\u00e4ljaandest. Esiteks antakse \u0161abloon, seej\u00e4rel n\u00e4idatakse programmi n\u00e4idet ja kohe p\u00e4rast seda \u2013 t\u00e4itmise tulemus.<\/p>\n<blockquote><p>N\u00e4iteks vaatleme while-ts\u00fcklit, kus toimub tagasivaatamine alates 10 ja v\u00e4ljastatakse t\u00e4pselt 10 rida \"takte\":<br \/>\nP\u00e4rast k\u00e4ivitamist v\u00e4ljastab see programm k\u00fcmme \"takti\" j\u00e4rgmiselt: <\/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>\nSelle programmi kirjeldamise l\u00e4henemisviisi kasutatakse ka raamatus \"Javascript lastele\" ja w3schools.com JS kursusel. Veebilehe formaat v\u00f5imaldab isegi selle n\u00e4ite interaktiivseks muuta.<br \/>\n<code>takt 10<br \/>\ntakt 9<br \/>\ntakt 8<br \/>\ntakt 7<br \/>\ntakt 6<br \/>\ntakt 5<br \/>\ntakt 4<br \/>\ntakt 3<br \/>\ntakt 2<br \/>\ntakt 1<\/code><\/p><\/blockquote>\n<p>\nStroustrupi raamatus \"C++ p\u00f5him\u00f5tted ja praktika\" (2016) l\u00e4ks autor veelgi kaugemale. Esiteks seletatakse, milline tulemus peaks olema, ja p\u00e4rast seda n\u00e4idatakse programmi teksti. Samuti v\u00f5etakse n\u00e4iteks mitte lihtsalt suvaline programm, vaid antakse ekskurs ajaloosse. See aitab t\u00e4helepanu juhtida: \"Vaata, see ei ole lihtsalt m\u00f5ttetu tekst. Sa n\u00e4ed midagi olulist.\"<\/p>\n<p>Iteratsiooni n\u00e4iteks vaatleme esimest programmi, mille kirjutas David Wheeler Cambridge'i \u00fclikooli arvutlaboratooriumis 6. mail 1949. See programm arvutab ja printib lihtsa ruutude nimekirja.<\/p>\n<blockquote><p>Igas reas on number, millele j\u00e4rgneb tabulatsioonim\u00e4rk ('t') ja selle numbri ruut. C++ keeles n\u00e4eb selle programmi versioon v\u00e4lja selline:<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 tabulaatoris\u00fcmbol (&#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>\nKuidas ma ise selgitades l\u00e4henen<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">t\u00f5lge<\/a><\/noindex>Stroustrupi l\u00e4henemine: tulemuse kirjeldamine, seej\u00e4rel probleemi lahendamine, ja l\u00f5puks iseseisev anal\u00fc\u00fcs \u00fcli\u00f5pilaste poolt \u2014 tundub k\u00f5ige l\u00e4bim\u00e4ngitum. Seet\u00f5ttu otsustasin v\u00f5tta selle aluseks, kuid r\u00e4\u00e4kida v\u00e4hem ajaloolisest n\u00e4itest \u2014 \u00fclesandest \"sisukorra\" v\u00e4ljundiks. See loob tuntava ankurduse, et hiljem saaks \u00f6elda: \"kasu \u00fclesande osas sisukorrast\" ja et \u00fcli\u00f5pilased m\u00e4letaksid just seda. Oma n\u00e4ites p\u00fc\u00fcdsin ette tulema ka kahele k\u00f5ige levinumale eksitusele. Hiljem r\u00e4\u00e4gin neist l\u00e4hemalt.<\/p>\n<h4>Selle \u00fclesande raames tutvume keerukate \u00fclesannete lahendamise tehnikatega. Algne lahendus peab olema primitiivne ja lihtne. Seej\u00e4rel v\u00f5ib m\u00f5elda, kuidas seda lahendust parandada.<\/h4>\n<p>\nMinu t\u00e4helepanekute kohaselt viib l\u00e4henemine \"mall-n\u00e4ide-tulemus\" eri kombinatsioonides ikka selleni, et \u00fcli\u00f5pilased n\u00e4evad ts\u00fcklit kui hierogl\u00fc\u00fcfi. See v\u00e4ljendus selles, et nad ei m\u00f5istnud, miks sinna kirjutada tingimus, kuidas valida i++ ja i-- vahel ning muud, esmapilgul ilmselged asjad. Nende eksituste v\u00e4ltimiseks peaks ts\u00fcklite jutustamise l\u00e4henemine r\u00f5hutama korduvate tegevuste m\u00f5tet ja seej\u00e4rel \u2014 nende vormistamist konstruktsiooni abil. Seet\u00f5ttu enne ts\u00fckli s\u00fcntaksi andmist tuleb probleem lahendada \"otseselt\". Primitiivne \u00fclesanne sisukorra kohta n\u00e4eb v\u00e4lja selline:<\/p>\n<blockquote><p>Console.WriteLine(\"Sissejuhatus\");\nConsole.WriteLine(\"Pealkiri 1\");\nConsole.WriteLine(\"Pealkiri 2\");\nConsole.WriteLine(\"Pealkiri 3\");\nConsole.WriteLine(\"Pealkiri 4\");\nConsole.WriteLine(\"Pealkiri 5\");\nConsole.WriteLine(\"Pealkiri 6\");\nConsole.WriteLine(\"Pealkiri 7\");\nConsole.WriteLine(\"J\u00e4reldus\");<br \/>\n<code>Sissejuhatus<br \/>\nPeat\u00fckk 1<br \/>\nPeat\u00fckk 2<br \/>\nPeat\u00fckk 3<br \/>\nPeat\u00fckk 4<br \/>\nPeat\u00fckk 5<br \/>\nPeat\u00fckk 6<br \/>\nPeat\u00fckk 7<br \/>\nKokkuv\u00f5te<\/code><\/p><\/blockquote>\n<p>\nMinu t\u00e4helepanekute kohaselt toob l\u00e4henemine \u201emall-n\u00e4ide-tulemus\u201c erinevates kombinatsioonides endiselt kaasa selle, et \u00fcli\u00f5pilased tajuvad ts\u00fcklit kui hierogl\u00fc\u00fcfi. See v\u00e4ljendus selles, et nad ei saanud aru, miks sinna peab kirjutama tingimuse, kuidas valida i++ ja i&#8212; ning muid, v\u00e4idetavalt ilmselgeid asju. Nende eksimuste v\u00e4ltimiseks peaks l\u00e4henemine ts\u00fcklite selgitamisele r\u00f5hutama korduva tegevuse t\u00e4hendust ja alles seej\u00e4rel nende vormistamise kaudu konstruktsiooni. Seet\u00f5ttu enne ts\u00fckli s\u00fcntaksi esitamist tuleb lahendada \u201eotsene\u201c \u00fclesanne. Primitivne lahendus sisu kohta on j\u00e4rgmine:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(&quot;Sissejuhatus&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 1&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 2&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 3&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 4&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 5&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 6&quot;);\nConsole.WriteLine(&quot;Peat\u00fckk 7&quot;);\nConsole.WriteLine(&quot;J\u00e4reldus&quot;);\n<\/code><\/pre>\n<p>\nMillised tegevused korduvad j\u00e4rjestikku muutumatult?<br \/>\nSelles fragmendis ei ole neid. Siiski on k\u00e4skudest, mis v\u00e4ljastavad s\u00f5na \"Pealkiri\" koos numbriga, v\u00e4ga sarnased.<br \/>\nSeet\u00f5ttu on j\u00e4rgmine etapp fragmentide erinevuse leidmine. Ainult selles \u00fclesandes on k\u00f5ik ilmselge, hiljem korduvad mitte \u00fcksikud k\u00e4sud, vaid koodiblokid, mis koosnevad 5 v\u00f5i enamast reast. Otsida tuleb mitte ainult k\u00e4skude loendist, vaid ka harukonstruktsioonidest v\u00f5i ts\u00fcklist.<br \/>\nN\u00e4ites on k\u00e4skude vaheline erinevus s\u00f5na \"Pealkiri\" j\u00e4rel oleva numbri osas.<br \/>\nKui erinevus on leitud, tuleb m\u00f5ista muutumise seadusp\u00e4rasust. Kas erinev fragment on number? Kas see suureneb v\u00f5i v\u00e4heneb pidevalt? Kuidas muutub numbri v\u00e4\u00e4rtus kahe k\u00e4sku vahel, mis asuvad k\u00f5rvuti?<br \/>\nN\u00e4ites suureneb nummer tagas\u00f5nade \"Pealkiri\" j\u00e4rel sammuga 1. Erinevus on leitud, seadusp\u00e4rasus on tuvastatud. N\u00fc\u00fcd saab erineva fragmendi asendada muutuja.<br \/>\nSellise muutuja kuulutamine peab toimuma enne esimest korduvat fragmenti. Sellist muutuja nimetatakse tavaliselt I v\u00f5i j, v\u00f5i kuidagi laiemalt. Selle algne v\u00e4\u00e4rtus peab olema v\u00f5rdne esimese mis tahes kuvatava v\u00e4\u00e4rtusega. N\u00e4ites on esimene v\u00e4\u00e4rtus 1.<br \/>\nMilline algv\u00e4\u00e4rtus tuleb v\u00f5tta numbriseeria \"100, 101, 102, 103, 104, 105\" kuvamiseks?<br \/>\nSelles seerias on esimene number 100. <br \/>\nIga v\u00e4ljastamisk\u00e4sku j\u00e4rel tuleb seda muutuja v\u00e4\u00e4rtust suurendada 1 v\u00f5rra. See \u00fckstapuha on muutumise samm.<br \/>\nSelles reas on esimene number 100.<br \/>\nIga v\u00e4ljundk\u00e4sku peab selle muutuja v\u00e4\u00e4rtust t\u00f5stma 1 v\u00f5rra. See \u00fchik on muutumise samm.<br \/>\nMilline samm on numbrises \"100, 102, 104, 106\"?<br \/>\nSelles j\u00e4rjestuses on samm 2.<br \/>\nP\u00e4rast erineva osa asendamist muutujaga n\u00e4eb kood v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(&quot;Sissejuhatus&quot;);\nint i;\ni = 0;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;Peat\u00fckk &quot; + i);\ni = i + 1;\nConsole.WriteLine(&quot;J\u00e4reldus&quot;);\n<\/code><\/pre>\n<p>\nRakendades meetodit \u201em\u00f5ista seadusp\u00e4ra muutujana\u201c, saadakse koodis mitu j\u00e4rjestikku sama tegevust. N\u00fc\u00fcd saab korduvaid tegevusi asendada ts\u00fckliga.<\/p>\n<p>Probleemi lahendamise j\u00e4rjekord, kus tuleb kasutada ts\u00fckleid, koosneb j\u00e4rgmistest etappidest:<\/p>\n<ol>\n<li>Lahenda \u201eotseselt\u201d paljude eraldi k\u00e4skudega<\/li>\n<li>Leia seadusp\u00e4ra<\/li>\n<li>V\u00e4ljenda seadusp\u00e4ra muutujana<\/li>\n<li>Formuleeri ts\u00fcklina<\/li>\n<\/ol>\n<p>Edasi tutvustatakse uusi termineid, et \u00f5pilane ei satuks olukorda \u201ek\u00f5ike m\u00f5istan, aga ei oska \u00f6elda\u201c:<br \/>\n \u2014 loendaja \u2014 alati muutuja, mis on vajalik ts\u00fcklis samme j\u00e4lgimiseks. Tavaline t\u00e4isarv, mida v\u00f5rreldakse piiranguga.<br \/>\n \u2014 loendaja samm \u2014 loendaja muutumise seadusp\u00e4ra kirjeldamine.<br \/>\n \u2014 piirang \u2014 number v\u00f5i muutuja, millega v\u00f5rreldakse loendajat, et algoritm oleks piiratud. Loendaja v\u00e4\u00e4rtus muutub nii, et see l\u00e4heneks piirangule.<br \/>\n \u2014 ts\u00fckli keha \u2014 k\u00e4su kogum, mis kordub. Kui \u00f6eldakse \u201ek\u00e4sk on kirjutatud ts\u00fckli sisse\u201d, m\u00f5eldakse just ts\u00fckli keha.<br \/>\n \u2014 ts\u00fckli iteratsioon \u2014 ts\u00fckli keha korduv teostamine.<br \/>\n \u2014 ts\u00fckli tingimus \u2014 loogiline v\u00e4ljend, millest s\u00f5ltub, kas tehakse veel \u00fcks iteratsioon. (Siin v\u00f5ib esineda segadust haru konstruktsioonidega)<br \/>\nTuleb olla valmis, et esialgu kasutavad \u00f5pilased termineid valesti. See kehtib nii tugevate kui ka n\u00f5rkade puhul. \u00dchise keele loomine on terviklik kunst. Praegu kirjutan l\u00fchidalt: tuleb seada \u00fclesanne \u201eerista koodifragmendi &lt;termin&gt;\u201d ja ise kasutada neid termineid vestluses \u00f5igesti.<br \/>\nP\u00e4rast ts\u00fckliga \u00fcmberkirjutamist j\u00e4\u00e4b fragment:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(&quot;Sissejuhatus&quot;);\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Peat\u00fckk &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;J\u00e4reldus&quot;);<\/code><\/pre>\n<h4>Peamine vale arusaam<\/h4>\n<p>\n\u00dcks levinud vale arusaam \u00f5pilaste seas on see, et nad sisestavad ts\u00fckli konstruktsiooni tegevusi, mida on vaja teha ainult \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;J\u00e4reldus&quot;);\n}\n<\/code><\/pre>\n<p>\n\u00d5pilased satuvad pidevalt sellise probleemi ette, nii alguses kui ka keerukamate \u00fclesannete juures.<br \/>\nSel juhul on peamine vihje:<\/p>\n<blockquote><p>Kui palju kordi tuleb k\u00e4su kirjutamist korrata: \u00fcks kord v\u00f5i palju?\n<\/p><\/blockquote>\n<p>\nK\u00e4skude v\u00e4ljund s\u00f5nade \u201eSissejuhatus\u201d ja \u201eKokkuv\u00f5te\u201d, samuti muutuja i deklareerimine ja initsialiseerimine ei sarnane teiste korduvate tegevustega. Need teostatakse ainult \u00fche korra, seega tuleb need kirjutada ts\u00fckli kehast v\u00e4ljapoole.<\/p>\n<p>Koodis peavad j\u00e4\u00e4ma k\u00f5ik kolm lahendusetappi, et hiljem saaks neil rasketes olukordades viidata. Esimese kahe variandi piisab kommenteerimisest, et nad ei segaks.<br \/>\n\u00d5pilaste t\u00e4helepanu tuleks juhtida j\u00e4rgmistele faktidele:<br \/>\n \u2014 Ts\u00fckli tingimustes v\u00f5rreldakse tavaliselt loendajat ja piirangut. Loendaja v\u00f5ib ts\u00fckli kehas muutuda, piirang aga ei tohi. Selle reegli rikkumiseks peavad olema t\u00f5sised p\u00f5hjused.<br \/>\n \u2014 K\u00e4skude v\u00e4ljund s\u00f5nade \u201eSissejuhatus\u201d ja \u201eKokkuv\u00f5te\u201d on ts\u00fckli kehas v\u00e4ljas. Me peame need tegema 1 kord. \u201eSissejuhatus\u201d \u2014 enne tegevuste kordamist, \u201eKokkuv\u00f5te\u201d \u2014 p\u00e4rast.<br \/>\nSelle teema kinnistamise, j\u00e4rgmiste valdamise ja raskuste lahendamise k\u00e4igus on isegi tugevatele \u00f5pilastele kasulik esitada k\u00fcsimus: \u201eJa seda tegevust kui palju korda tuleb teha? \u00dcks v\u00f5i palju?\u201d.<\/p>\n<h4>T\u00e4iendavate oskuste arendamine<\/h4>\n<p>\nTs\u00fcklite \u00f5ppimise k\u00e4igus treenivad \u00f5pilased ka diagnostika ja probleemide lahendamise oskusi. Diagnoosimiseks peab \u00f5pilane kujutama ette soovitud tulemust ja v\u00f5rreldama seda tegeliku tulemusega. Neid erimeelsusi arvesse v\u00f5ttes s\u00f5ltuvad muutused parandamisest.<br \/>\nKuna \u00f5pilased ei kujuta selle etapi juures h\u00e4sti ette \u201esoovitud\u201d tulemust, siis v\u00f5ivad nad orienteeruda testandmetele. T\u00fc\u00fcpiliselt ei m\u00f5isteta sel hetkel veel, mis v\u00f5ib valesti minna ja kuidas sellega toime tulla. Seet\u00f5ttu annan ma m\u00e4rkmete tegemiseks kirjelduse t\u00fc\u00fcpilistest probleemidest ja m\u00f5ned lahendusviisid. K\u00f5ige sobivama valimine on \u00f5pilase enda \u00fclesanne.<br \/>\nSalvestus on vajalik, et k\u00fcsida: \u201eKas saime seda, mida ootasime?\u201c, \u201eMilline neist olukordadest n\u00fc\u00fcd kujunes?\u201c, \u201eKas rakendatud lahendus aitas?\u201c.<\/p>\n<ol>\n<li>Tegevuste arv on 1 v\u00e4hem v\u00f5i rohkem, kui oodatud. Lahendusv\u00f5imalused:<br \/>\n \u2014 suurenda algse arvesti v\u00e4\u00e4rtust 1 v\u00f5rra.<br \/>\n \u2014 asenda rangem v\u00f5rdlusoperator (&lt; v\u00f5i &gt;) l\u00f5dvemaga (&lt;= v\u00f5i &gt;=).<br \/>\n \u2014 muuda piirv\u00e4\u00e4rtust 1 v\u00f5rra.<\/li>\n<li>Ts\u00fcklis teostatavad tegevused toimuvad pidevalt, l\u00f5putult. Lahendusv\u00f5imalused:<br \/>\n \u2014 lisa arvesti muutev k\u00e4sk, kui see on puuduv.<br \/>\n \u2014 paranda arvesti muutev k\u00e4sk nii, et selle v\u00e4\u00e4rtus liikuks piirv\u00e4\u00e4rtusele l\u00e4hemale.<br \/>\n \u2014 eemalda arvesti muutev k\u00e4sk, kui see on ts\u00fckli kehas.<\/li>\n<li>Ts\u00fcklis teostatavate tegevuste arv on rohkem kui 1 v\u00e4hem v\u00f5i rohkem, kui oodatud. Ts\u00fcklis ei teostatud \u00fchtegi tegevust. Esiteks tuleks selgitada v\u00e4lja tegelikud muutuja v\u00e4\u00e4rtused ts\u00fckli alguses. Lahendusv\u00f5imalused:<br \/>\n \u2014 muuda piirv\u00e4\u00e4rtuse algne v\u00e4\u00e4rtus<br \/>\n \u2014 muuda arvesti algne v\u00e4\u00e4rtus<\/li>\n<\/ol>\n<p>\nTavaliselt on probleem 3 seotud vale muutuja kasutamise v\u00f5i arvesti nullimise puudumisega.<\/p>\n<p>P\u00e4rast seda selgitust v\u00f5ivad \u00fcli\u00f5pilasel endiselt olla erinevad ekslikud arusaamad ts\u00fcklite toimimisest.<br \/>\nLevitamaks k\u00f5ige levinumaid eksiarvamusi, esitan \u00fclesanded:<\/p>\n<ol>\n<li>Kus piirv\u00e4\u00e4rtus, arvesti algne v\u00e4\u00e4rtus v\u00f5i arvesti samm sisestatakse kasutaja poolt.<\/li>\n<li>Kus arvesti v\u00e4\u00e4rtust tuleb kasutada mingis aritmeetilises avaldises. Soovitav on, et arvesti oleks seotud juurdumise v\u00f5i nimetajaga, et erinevus oleks mitte-lineaarne.<\/li>\n<li>Kus arvesti v\u00e4\u00e4rtust ei kuvata ekraanil ts\u00fckli t\u00f6\u00f6 ajal. N\u00e4iteks vajaliku arvu sama tekstijuppide v\u00e4ljund v\u00f5i joonistada kujund turtlegraafikaga.<\/li>\n<li>Kus tuleb esmalt teostada \u00fched korduvad tegevused ja seej\u00e4rel teised.<\/li>\n<li>Kus tuleb teostada teisi tegevusi enne ja p\u00e4rast korduvaid.<\/li>\n<\/ol>\n<p>\nIga \u00fclesande puhul tuleb esitada testandmed ja oodatud tulemus.<\/p>\n<p>Kuna aru saada, kui kiiresti liikuda, tuleb anda aega \u00fclesannete tingimuste lugemiseks ja k\u00fcsida: \u201eKuidas need erinevad n\u00e4itest?\u201c, \u201eMida tuleks n\u00e4ites muuta, et neid lahendada?\u201c. Kui \u00fcli\u00f5pilane vastab m\u00f5testatult, siis v\u00f5ib lasta tal lahendada v\u00e4hemalt \u00fche tunni jooksul, \u00fclej\u00e4\u00e4nud aga iseseisvalt kodus. Kui lahendus osutub edukaks, siis v\u00f5ib alustada selgitust ts\u00fcklite sees olevate tingimuste kohta.<br \/>\nKui iseseisva lahendusega on probleeme, tuleb k\u00f5ik l\u00e4bi t\u00f6\u00f6tada tunnis. Et \u00fclesande lahendamine ei meenutaks \u00f6\u00f6kulli joonistamist, soovitan esmalt lahendada \u00fclesanne mitte\u00fcldiselt. See t\u00e4hendab, et lahendus peab l\u00e4bima esimese testi ja mitte kasutama ts\u00fckli konstruktsiooni. Ainult siis rakendada teisendusi, et saavutada lahenduse universaalsus.<\/p>\n<h4>Ts\u00fcklid ja harud<\/h4>\n<p>\nMinu arvates on kasulik anda teema \u201ets\u00fcklid harudest\u201c eraldi. Nii on hiljem n\u00e4ha erinevus korduva tingimuse kontrollimise ja \u00fchekordse kontrollimise vahel.<br \/>\nHarjutused kinnitamiseks, mis k\u00e4sitlevad numbrite v\u00e4ljundit A-st B-sse, 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 \u00fcle minna alles p\u00e4rast seda, kui \u00fcli\u00f5pilane on omandanud oskused: \u201emustri asendamine muutuja vastu\u201d ja \u201ekorduvate tegevuste asendamine ts\u00fckliga\u201d.<br \/>\nPeamine p\u00f5hjus harude rakendamiseks ts\u00fcklites on ebanormaalsused mustrites. Keskel on see rikkunud s\u00f5ltuvalt sisendandmetest.<br \/>\nNendele \u00fcli\u00f5pilastele, kes suudavad lahendust otsida, kombineerides lihtsaid tehnikasid, piisab, kui \u00f6elda \u201eharusid saab kirjutada ts\u00fcklite sisse\u201d ja anda \u00fclesanne \u201en\u00e4itena\u201d t\u00e4ielikult iseseisva lahendusena.<br \/>\nN\u00e4idis\u00fclesanne:<\/p>\n<blockquote><p>Kasutaja sisestab numbri X. V\u00e4ljasta \u00fche rea numbrid 0 kuni 9 ja pane plusss\u00fcmbol &#8216;+&#8217; nende numbrite juurde, mis on v\u00f5rdsed X-iga.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Kui sisestatud oli 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 sisestatud oli 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 sisestatud oli 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 sisestatud oli 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\u00fchike selgitus ei piisa, et kirjutada ts\u00fckliga, siis tuleb saavutada universaalne lahendus selle sama \u00fclesande jaoks ilma ts\u00fcklita.<br \/>\nSaab \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 + &quot;+&quot;);\n} else {\n    Console.WriteLine(0);\n}\nif (x==1) {\n    Console.WriteLine(1 + &quot;+&quot;);\n} else {\n    Console.WriteLine(1);\n}\nif (x==2) {\n    Console.WriteLine(2 + &quot;+&quot;);\n} else {\n    Console.WriteLine(2);\n}\nif (x==3) {\n    Console.WriteLine(3 + &quot;+&quot;);\n} else {\n    Console.WriteLine(3);\n}\nif (x==4) {\n    Console.WriteLine(4 + &quot;+&quot;);\n} else {\n    Console.WriteLine(4);\n}\nif (x==5) {\n    Console.WriteLine(5 + &quot;+&quot;);\n} else {\n    Console.WriteLine(5);\n}\nif (x==6) {\n    Console.WriteLine(6 + &quot;+&quot;);\n} else {\n    Console.WriteLine(6);\n}\nif (x==7) {\n    Console.WriteLine(7 + &quot;+&quot;);\n} else {\n    Console.WriteLine(7);\n}\nif (x==8) {\n    Console.WriteLine(8 + &quot;+&quot;);\n} else {\n    Console.WriteLine(8);\n}\nif (x==9) {\n    Console.WriteLine(9 + &quot;+&quot;);\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(&quot;0+n1n2n3n4n5n6n7n8n9&quot;);\n}\nif (x==1) {\n    Console.WriteLine(&quot;0n1+n2n3n4n5n6n7n8n9&quot;);\n}\nif (x==2) {\n    Console.WriteLine(&quot;0n1n2+n3n4n5n6n7n8n9&quot;);\n}\nif (x==3) {\n    Console.WriteLine(&quot;0n1n2n3+n4n5n6n7n8n9&quot;);\n}\nif (x==4) {\n    Console.WriteLine(&quot;0n1n2n3n4+n5n6n7n8n9&quot;);\n}\nif (x==5) {\n    Console.WriteLine(&quot;0n1n2n3n4n5+n6n7n8n9&quot;);\n}\nif (x==6) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6+n7n8n9&quot;);\n}\nif (x==7) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7+n8n9&quot;);\n}\nif (x==8) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7n8+n9&quot;);\n}\nif (x==9) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7n8n9+&quot;);\n}\n<\/code><\/pre>\n<p>Sarnast \u00fclesannet annan ma ette juba teema \u00f5ppimise ajal, mis k\u00e4sitleb haru.<br \/>\nKui \u00fcli\u00f5pilasel on \u201ev\u00f5imalik\u201c variant, tuleks r\u00e4\u00e4kida, et sama \u00fclesande jaoks v\u00f5ib olla mitmeid lahendusi. Need erinevad aga n\u00f5udmiste muutustele vastupidavuse poolest. K\u00fcsige: \u201eKui palju kohti koodis tuleb muuta, kui tuleb lisada veel \u00fcks number?\u201c \u201eV\u00f5imalikus\u201c variandis tuleb lisada veel \u00fcks haru ja kirjutada 10 teises kohas uus number. \u201eSoovitavas\u201c piisab ainult \u00fche haru lisamisest.<br \/>\nSeadke eesm\u00e4rk luua \u201esoovitav\u201c variant, seej\u00e4rel leida koodis mustreid, asendada muutuja ja kirjutada ts\u00fckkel.<br \/>\nKui teil on idee, kuidas selle \u00fclesande lahendamiseks ts\u00fcklit mitte kasutada, kirjutage palun kommentaaridesse.<\/p>\n<h4>Ts\u00fcklid ts\u00fcklites<\/h4>\n<p>\nSelles teemas tuleks t\u00e4helepanu p\u00f6\u00f6rata sellele, et:<br \/>\n \u2014 sise- ja v\u00e4lists\u00fckli loendurid peaksid olema erinevad muutujad.<br \/>\n \u2014 sise-ts\u00fckli loendur tuleb palju kordi nullida (st v\u00e4lis-ts\u00fckli kehas).<br \/>\n Teksti v\u00e4ljastamise \u00fclesannetes ei saa k\u00f5igepealt kirjutada \u00fchte t\u00e4hte mitmesse ritta, seej\u00e4rel teist. Esiteks tuleb v\u00e4lja anda k\u00f5ik esimese rea t\u00e4hed, seej\u00e4rel k\u00f5ik teise rea t\u00e4hed ja nii edasi.<\/p>\n<p>Ts\u00fcklite siseskeemide selgitamine on parim alustada loenduri nullimise olulisuse selgitamisega.<br \/>\nN\u00e4idis\u00fclesanne:<\/p>\n<blockquote><p>Kasutaja sisestab kaks numbrit: R ja T. V\u00e4ljasta kaks rida s\u00fcmboleid &quot;#&quot;. Esimeses reas peaks olema R t\u00fckki s\u00fcmbolit. Teises reas T t\u00fckki. Kui m\u00f5ni number on negatiivne, v\u00e4ljasta veateade.<\/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>On ilmne, et sellel \u00fclesandel on v\u00e4hemalt kaks erinevat lahendust.<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>Erinevus seisneb selles, et \u201ev\u00f5imalikus\u201c lahenduses teise rea v\u00e4ljastamiseks kasutati teist muutujat. Tuleks r\u00f5hutada, et sama muutuja kasutamine kahe ts\u00fckli jaoks. Sellist piirangut saab p\u00f5hjendada sellega, et \u00fche loenduri lahendus kahes ts\u00fcklis oleks n\u00e4ide \u201eloenduri nullimisest\u201c. Selle termini m\u00f5istmine on t\u00e4htis j\u00e4rgmiste \u00fclesannete lahendamisel. Kompromissina v\u00f5ib s\u00e4ilitada m\u00f5lemad \u00fclesande lahendused.<\/p>\n<p>T\u00fc\u00fcpiline probleem \u00fche loenduri kasutamisel kahe ts\u00fckli jaoks avaldub nii:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Teise rea s\u00fcmbolite arv ei vasta T v\u00e4\u00e4rtusele. Kui selle probleemiga on abi vaja, peab \u201enina ninna\u201c suunama ts\u00fckli t\u00fc\u00fcpiliste probleemide m\u00e4rkmed. See on s\u00fcmptom nr 3. Seda diagnoositakse, kui lisada loenduri v\u00e4\u00e4rtuse v\u00e4ljund otse enne teist ts\u00fcklit. Probleem lahendatakse nullimisega. Kuid sellest ei tasu kohe r\u00e4\u00e4kida. \u00dcli\u00f5pilane peaks p\u00fc\u00fcdma formuleerida v\u00e4hemalt \u00fche h\u00fcpoteesi.<\/p>\n<p>Muidugi on olemas ka selline lahenduse variant. Kuid ma ei ole seda \u00fcli\u00f5pilastelt kunagi n\u00e4inud. Ts\u00fcklite \u00f5ppimise etapil selle r\u00e4\u00e4kimine hajutab t\u00e4helepanu. Saame sellele tagasi p\u00f6\u00f6rduda hiljem, kui uurime stringide t\u00f6\u00f6funktsioone.<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>V\u00e4ljasta ekraanile numbrid 0 kuni 9. Iga number peab olema oma reas. Reas olevate numbrite arv (W) sisestatakse klaviatuurilt.<\/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 omandanud muutuja asendamise tehnika, siis suudab ta sellega \u00fcsna kiiresti hakkama saada. V\u00f5imalik probleem v\u00f5ib taas olla muutuja nullimine. Kui muundamisega ei \u00f5nnestu hakkama saada, t\u00e4hendab see, et olete liiga kiirem ja peaksite lahendama lihtsamaid \u00fclesandeid.<\/p>\n<p>Ait\u00e4h t\u00e4helepanu eest. PangeLike, tellige kanal.<\/p>\n<p>P.S. Kui leiate tekstis tr\u00fckivigu v\u00f5i vigu, palun andke mulle teada. Seda saab teha, kui valite osa tekstist ja vajutate Macis \u00ab\u2318 + Enter\u00bb ja klassikalistel klaviatuuridel \u00abCtrl \/ Enter\u00bb, v\u00f5i saates isiklikke s\u00f5numeid. Kui need valikud pole 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\">Lugemise k\u00fcsitlus ilma karmita<\/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\u00e4letanud 10 kasutajat. \u00dckski kasutaja ei hoidunud.<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.0.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.0.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":"Kuigi r\u00e4\u00e4gime \u00fchest p\u00f5hilisest teemast, on see artikkel m\u00f5eldud kogenud spetsialistidele. Eesm\u00e4rk on n\u00e4idata, millised eksiarvamused v\u00f5ivad algajatel programmeerimises esineda.","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}]}}