{"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\/ro\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","title":{"rendered":"Cum s\u0103 \u00eenv\u0103\u021b\u0103m s\u0103 dep\u0103\u0219im dificult\u0103\u021bile \u0219i \u00een acela\u0219i timp s\u0103 scriem bucle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cu toate c\u0103 vom discuta despre unul dintre subiectele de baz\u0103, acest articol este destinat profesioni\u0219tilor experimenta\u021bi. Scopul este de a ar\u0103ta ce \u00eencurc\u0103turi exist\u0103 printre \u00eencep\u0103torii \u00een programare. Pentru dezvoltatorii practican\u021bi, aceste probleme au fost rezolvate de mult, uitate sau chiar nesobservate. Articolul poate fi util dac\u0103 va trebui s\u0103 ajuta\u021bi pe cineva cu acest subiect. Se fac paralele cu materialul din diverse c\u0103r\u021bi de programare scrise de Shields, Stroustrup, Okulov.<\/p>\n<p>Tema despre bucle a fost aleas\u0103 deoarece aceasta filtreaz\u0103 destul de multe persoane \u00een procesul de \u00eenv\u0103\u021bare a program\u0103rii.<\/p>\n<p>Aceast\u0103 metod\u0103 este destinat\u0103 studen\u021bilor mai slabi. De obicei, cei puternici nu se fixeaz\u0103 pe acest subiect \u0219i nu este necesar s\u0103 invent\u0103m metode speciale pentru ei. Un alt obiectiv al articolului este de a transforma aceast\u0103 metod\u0103 din clasa \u201efunc\u021bioneaz\u0103 pentru to\u021bi studen\u021bii, dar doar pentru un singur profesor\u201d \u00een clasa \u201efunc\u021bioneaz\u0103 pentru to\u021bi studen\u021bii, to\u021bi profesorii\u201d. Nu pretind la originalitate absolut\u0103. Dac\u0103 deja aplica\u021bi o metod\u0103 similar\u0103 pentru a preda acest subiect, v\u0103 rog s\u0103-mi spune\u021bi \u00een ce difer\u0103 versiunea dumneavoastr\u0103. Dac\u0103 decide\u021bi s\u0103 aplica\u021bi, povesti\u021bi-mi despre rezultate, cum a decurs totul. Dac\u0103 o metod\u0103 similar\u0103 este descris\u0103 \u00eentr-o carte, v\u0103 rog s\u0103-mi spune\u021bi titlul.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAm lucrat la aceast\u0103 metod\u0103 timp de 4 ani, lucr\u00e2nd individual cu studen\u021bi de diferite niveluri de preg\u0103tire. \u00cen total, aproximativ cincizeci de studen\u021bi \u0219i dou\u0103 mii de ore de cursuri. La \u00eenceput, studen\u021bii se blocau pe acest subiect \u0219i plecau. Dup\u0103 fiecare student, metoda \u0219i materialele au fost corectate. \u00cen ultimul an, studen\u021bii nu mai r\u0103m\u00e2n bloca\u021bi pe acest subiect, a\u0219a c\u0103 am decis s\u0103 \u00eemp\u0103rt\u0103\u0219esc rezultatele.<\/p>\n<h4>De ce at\u00e2t de multe cuvinte? Bucla este elementar\u0103!<\/h4>\n<p>\nA\u0219a cum am men\u021bionat mai sus, pentru dezvoltatorii practican\u021bi \u0219i pentru studen\u021bii puternici, complexitatea conceptului de bucle poate fi subestimat\u0103. De exemplu, se poate sus\u021bine o lec\u021bie lung\u0103, observa capete care dau din cap \u0219i priviri inteligente. Dar, \u00een momentul \u00een care \u00eencearc\u0103 s\u0103 rezolve o problem\u0103, apare o blocaj \u0219i probleme inexplicabile. Dup\u0103 lec\u021bie, studen\u021bii au la sigur doar o \u00een\u021belegere par\u021bial\u0103. Situa\u021bia este agravat\u0103 de faptul c\u0103 studen\u021bii nu pot exprima singuri \u00een ce const\u0103 confuzia lor.<br \/>\nOdat\u0103 am realizat c\u0103 studen\u021bii percep exemplele mele ca pe ni\u0219te hieroglife. Adic\u0103, ca pe ni\u0219te buc\u0103\u021bi indivizibile de text, \u00een care trebuie s\u0103 completezi o liter\u0103 \u201emagic\u0103\u201d \u0219i va func\u021biona.<br \/>\nUneori observam c\u0103 studen\u021bii cred c\u0103 pentru a rezolva o problem\u0103 specific\u0103 este nevoie de <i>o alt\u0103<\/i> structur\u0103, pe care eu \u00eenc\u0103 nu am prezentat-o. De\u0219i pentru a rezolva era suficient s\u0103 modific pu\u021bin exemplul.<\/p>\n<p>De aceea am ajuns la ideea c\u0103 trebuie s\u0103 ne concentr\u0103m nu pe sintaxa expresiilor, ci pe conceptul de refactorizare a codului repetitiv prin intermediul buclelor. Odat\u0103 ce elevii st\u0103p\u00e2nesc aceast\u0103 idee, orice sintax\u0103 va fi \u00eenv\u0103\u021bat\u0103 prin exerci\u021bii mici.<\/p>\n<h4>Cui \u0219i de ce predau<\/h4>\n<p>\nDeoarece nu exist\u0103 examene de admitere, la cursuri pot fi at\u00e2t studen\u021bi buni, c\u00e2t \u0219i foarte slabi. Mai multe detalii despre studen\u021bii mei pot fi g\u0103site \u00een articolul <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">Portretul audien\u021bei cursurilor de sear\u0103<\/a><\/noindex><br \/>\nAm urm\u0103rit ca programarea s\u0103 fie \u00eenv\u0103\u021bat\u0103 de to\u021bi cei care \u00ee\u0219i doresc acest lucru.<br \/>\nCursurile mele sunt individuale, iar studentul pl\u0103te\u0219te pentru fiecare sesiune. Pare c\u0103 studen\u021bii ar trebui s\u0103 optimizeze costurile \u0219i s\u0103 cear\u0103 minimul. Cu toate acestea, oamenii vin la cursuri fa\u021b\u0103 \u00een fa\u021b\u0103 cu un profesor nu doar pentru cuno\u0219tin\u021be, ci pentru siguran\u021ba c\u0103 au reu\u0219it s\u0103 asimileze, pentru sentimentul de progres \u0219i pentru aprobarea expertului (profesorului). Dac\u0103 studen\u021bii nu simt progresul \u00een \u00eenv\u0103\u021bare, ei vor pleca. \u00cen general, se pot structura cursurile astfel \u00eenc\u00e2t studen\u021bii s\u0103 simt\u0103 progresul \u00een cre\u0219terea num\u0103rului de construc\u021bii cunoscute. Adic\u0103, mai \u00eent\u00e2i studiem detaliat while, apoi descoperim for, apoi do while, \u0219i astfel avem un curs pentru o mie \u0219i una de nop\u021bi, \u00een care timp de dou\u0103 luni studiem doar bucle, iar la final \u2014 un student care a scris, la dictare, biblioteca standard. Totu\u0219i, pentru a rezolva probleme practice, este nevoie nu doar de cuno\u0219tin\u021be, ci \u0219i de autonomie \u00een aplicarea acestora \u0219i \u00een c\u0103utarea de informa\u021bii noi. De aceea, pentru cursurile fa\u021b\u0103 \u00een fa\u021b\u0103, consider corect principiul \u2014 a \u00eenv\u0103\u021ba minimul \u0219i a \u00eencuraja studiul independent al detaliilor \u0219i al subiectelor \u00eenrudite. \u00cen ceea ce prive\u0219te buclele, eu consider c\u0103 minimul este structura while. Cu aceasta se poate \u00een\u021belege principiul. Cunosc\u00e2nd principiul, se pot st\u0103p\u00e2ni \u0219i for, \u0219i do-while \u00een mod independent.<\/p>\n<p>Pentru a asigura \u00eenv\u0103\u021barea materialului de c\u0103tre studen\u021bii mai pu\u021bin preg\u0103ti\u021bi, nu este suficient s\u0103 descrii sintaxa. Este necesar s\u0103 oferi mai multe sarcini simple, dar diverse, \u0219i s\u0103 explici exemplele mai detaliat. \u00cen cele din urm\u0103, viteza de \u00eenv\u0103\u021bare este limitat\u0103 de capacitatea studentului de a transforma expresiile \u0219i de a c\u0103uta modele. Pentru studen\u021bii mai iste\u021bi, majoritatea sarcinilor vor fi plictisitoare. Atunci c\u00e2nd lucrezi cu ei, nu este nevoie s\u0103 insi\u0219ti asupra solu\u021bion\u0103rii 100% din sarcini. Materialul meu poate fi vizualizat pe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">github-ul meu<\/a><\/noindex>. Totu\u0219i, depozitul arat\u0103 mai mult ca un grimuar al unui vr\u0103jitor \u2014 nimeni, \u00een afar\u0103 de mine, nu va \u00een\u021belege unde se afl\u0103 fiecare lucru, iar dac\u0103 se va considera c\u0103 este un e\u0219ec, s-ar putea s\u0103 \u00ee\u021bi pierzi min\u021bile<\/p>\n<h4>Metodologia este orientat\u0103 spre practic\u0103<\/h4>\n<p>\nTeoria este explicat\u0103 prin intermediul solu\u021bion\u0103rii unei probleme. La cursurile fundamentale de programare, unde se studiaz\u0103 ramifica\u021biile \u0219i buclele, pur \u0219i simplu nu este posibil s\u0103 organizezi o lec\u021bie util\u0103 pe un singur subiect timp de o or\u0103 \u00eentreag\u0103. 15-20 de minute sunt suficiente pentru a explica conceptul. Principalele dificult\u0103\u021bi apar \u00een timpul realiz\u0103rii sarcinilor practice.<br \/>\nProfesorii \u00eencep\u0103tori pot arunca operatori, ramifica\u021bii, bucle \u0219i matrice \u00eentr-o singur\u0103 lec\u021bie. Cu toate acestea, studen\u021bii se vor confrunta cu problema asimil\u0103rii acestei informa\u021bii.<br \/>\nTrebuie s\u0103 nu doar s\u0103 poveste\u0219ti materialul, ci \u0219i s\u0103 te asiguri c\u0103 ascult\u0103torii l-au \u00een\u021beles.<\/p>\n<p>Faptul c\u0103 un student a asimilat subiectul este determinat de modul \u00een care se descurc\u0103 cu munca independent\u0103. <br \/>\nDac\u0103 studentului i-a reu\u0219it s\u0103 rezolve problema pe subiect f\u0103r\u0103 ajutorul profesorului, \u00eenseamn\u0103 c\u0103 subiectul a fost asimilat. Pentru a asigura autoevaluarea, fiecare problem\u0103 este \u00eenso\u021bit\u0103 de o tabel\u0103 cu scenarii de testare. Problemele au un ordonare clar\u0103. Este nerecomandat s\u0103 sari peste probleme. Dac\u0103 problema curent\u0103 este prea dificil\u0103, este inutil s\u0103 treci la urm\u0103toarea. Aceasta este chiar mai dificil\u0103. Pentru ca studentul s\u0103 poat\u0103 dep\u0103\u0219i problema curent\u0103 complex\u0103, \u00eei sunt explicate c\u00e2teva tehnici pe exemplul primei probleme. De fapt, tot con\u021binutul subiectului se reduce la tehnici de dep\u0103\u0219ire a dificult\u0103\u021bilor. Bucles sunt, mai degrab\u0103, un efect secundar.<\/p>\n<p>Prima problem\u0103 este \u00eentotdeauna un exemplu. A doua difer\u0103 u\u0219or \u0219i se execut\u0103 \u201eindependent\u201d imediat dup\u0103 prima sub supravegherea profesorului. Toate problemele urm\u0103toare sunt menite s\u0103 atrag\u0103 aten\u021bia asupra diferitelor detalii care pot genera confuzii.<\/p>\n<p>Explica\u021bia exemplului este un dialog \u00een care studentul trebuie s\u0103 activeze back propagation \u0219i cross-validation pentru a se asigura c\u0103 a \u00een\u021beles o por\u021biune de material.<\/p>\n<p>Voi fi banal \u0219i voi afirma c\u0103 primul exemplu pe tema este foarte important. Dac\u0103 exist\u0103 material pentru o munc\u0103 autonom\u0103 extins\u0103, lipsa primului exemplu poate fi compensat\u0103. Dac\u0103 nu mai exist\u0103 nimic \u00een afar\u0103 de exemplu, atunci studentul cel mai probabil nu va \u00eenv\u0103\u021ba tema.<\/p>\n<h4>While sau for?<\/h4>\n<p>\nUna dintre \u00eentreb\u0103rile controversate este alegerea construc\u021biei pentru exemplu: while sau for. Odat\u0103, un cunoscut programator practicant f\u0103r\u0103 experien\u021b\u0103 \u00een predare m-a convins timp de o or\u0103 c\u0103 ciclul for este cel mai simplu de \u00een\u021beles. Argumentele au fost c\u0103 \u00ab\u00een el totul este clar \u0219i bine structurat\u00bb. \u00cens\u0103 cauza real\u0103 a dificult\u0103\u021bilor \u00eent\u00e2mpinate de \u00eencep\u0103tori este ideea ciclului, nu scrierea acestuia. Dac\u0103 o persoan\u0103 nu \u00een\u021belege aceast\u0103 idee, va avea dificult\u0103\u021bi cu sintaxa. Odat\u0103 ce ideea este \u00een\u021beleas\u0103, problemele de formatare a codului dispar de la sine.<\/p>\n<p>\u00cen materialele mele, tema ciclilor urmeaz\u0103 teme despre ramific\u0103ri. Asem\u0103narea extern\u0103 \u00eentre if \u0219i while permite realizarea unei analogii directe: \u00abc\u00e2nd condi\u021bia din antet este adev\u0103rat\u0103, se execut\u0103 corpul\u00bb. Particularitatea ciclului const\u0103 \u00een faptul c\u0103 corpul se execut\u0103 de mai multe ori.<\/p>\n<p>Al doilea argument al meu este c\u0103 while necesit\u0103 mai pu\u021bin cod dec\u00e2t for. Cu c\u00e2t este mai pu\u021bin cod, cu at\u00e2t sunt mai pu\u021bine erori stupide cu virgule \u0219i paranteze omise. \u00cencep\u0103torii nu au \u00eenc\u0103 suficiente abilit\u0103\u021bi de aten\u021bie \u0219i meticulozitate pentru a evita automat erorile de sintax\u0103.<br \/>\nAl treilea argument este c\u0103 \u00een multe c\u0103r\u021bi bune while este explicat primul.<\/p>\n<p>Dac\u0103 studentul reu\u0219e\u0219te s\u0103 transforme u\u0219or expresiile, atunci se poate vorbi despre for \u00een treac\u0103t. Studentul \u00ee\u0219i va alege singur ce \u00eei place mai mult. Dac\u0103 \u00eens\u0103 transform\u0103rile creeaz\u0103 dificult\u0103\u021bi, este mai bine s\u0103 nu distrag\u0103 aten\u021bia. S\u0103 rezolve mai \u00eent\u00e2i totul cu while. C\u00e2nd tema ciclurilor este st\u0103p\u00e2nit\u0103, se pot rescrie solu\u021biile pentru a exersa transformarea de la while la for.<br \/>\nCiclurile cu post-condi\u021bie sunt destul de rare. Nu-mi pierd timpul cu ele deloc. Dac\u0103 studentul a st\u0103p\u00e2nit ideile de identificare a regularit\u0103\u021bilor \u0219i transformarea expresiilor, atunci se va descurca f\u0103r\u0103 ajutorul meu.<\/p>\n<p>At the demonstration of the first example to strong students, I emphasize that in the first example it is important to capture not only the solution but also the entire sequence of actions that led to the result. Lazy students may neglect the writing and only transfer the final algorithm to themselves. They need to be convinced that one day they will come across a complex task. To solve it, they will need to follow steps just like in this example. That is why it is important to document all stages. In subsequent tasks, only the final solution can be left.<\/p>\n<p>The main idea of automation is that we delegate routine work to computers. One of the basic techniques is writing loops. This is used when the program repeatedly performs several identical actions in succession.<\/p>\n<h4>Explicit is better than implicit<\/h4>\n<p>\nIt might seem like a good idea in the first task on loops to print the same phrase several times. For example:<\/p>\n<blockquote><p>Hooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!<br \/>\nHooray, it works!\n<\/p><\/blockquote>\n<p>\nThis option is poor because the value of the counter is not visible in the output. This is a problem for beginners. One should not underestimate it. Initially, this task was the first, while the task of printing a series of numbers in ascending order was the second. It was necessary to introduce additional terms like 'loop N times' and 'loop from A to B', which are essentially the same. To avoid creating unnecessary entities, I decided to show only the example with printing a series of numbers. Few manage to learn how to keep the counter in mind and model the program's behavior in their heads without preparation. Some students encounter the modeling 'in their mind' for the first time precisely on the topic of loops.<br \/>\nAfter some practice, I assign the task of repeating identical text for independent solving. If a visible counter is provided first, and then an invisible one, students encounter fewer problems. Sometimes it's enough to hint, 'don't print the counter on the screen.'<\/p>\n<h4>How is it explained by others?<\/h4>\n<p>\n\u00cen majoritatea materialelor didactice disponibile online, sintaxa ciclului este prezentat\u0103 \u00een cadrul unei \u00ablec\u021bii\u00bb. De exemplu, pe developer.mozilla.org (la momentul actual), \u00eempreun\u0103 cu ciclul while sunt descrise \u0219i alte c\u00e2teva construc\u021bii. \u00cen acest caz, sunt prezentate doar construc\u021biile \u00een form\u0103 de \u0219abloane. Rezultatul execu\u021biei acestora este descris \u00een cuvinte, iar ilustrarea lipse\u0219te. Din punctul meu de vedere, o astfel de prezentare a subiectului reduce la zero utilitatea acestor materiale. Elevul poate rescrie codul \u0219i s\u0103-l execute singur, dar tot trebuie s\u0103 existe un etalon pentru compara\u021bie. Cum s\u0103 \u00een\u021belegi dac\u0103 exemplul a fost rescris corect dac\u0103 nu ai cu ce s\u0103 compari rezultatul?<br \/>\nC\u00e2nd este oferit doar un \u0219ablon, f\u0103r\u0103 un exemplu, studentului \u00eei este \u0219i mai greu. Cum s\u0103 \u00een\u021beleag\u0103 c\u0103 fragmentele de cod sunt aranjate corect \u00een \u0219ablon? Poate \u00eencerca s\u0103 scrie <i>\u00eentr-un fel<\/i>, apoi s\u0103-l execute. Dar dac\u0103 nu exist\u0103 un etalon pentru a compara rezultatul, nici executarea nu va ajuta.<\/p>\n<p>\u00cen cadrul cursului de C++ pe Intuit, sintaxa buclei este ascuns\u0103 pe pagina a treia a lec\u021biei 4 cu tema \u201eoperatorii\u201d. La explicarea sintaxei buclelor se pune un accent deosebit pe termenul \u201eoperator\u201d. Acest termen este prezentat sub form\u0103 de un set de fapte precum \u201esimbol; acesta este un operator\u201d, \u201e{} este un operator compus\u201d, \u201ecorpul buclei trebuie s\u0103 fie un operator\u201d. Nu-mi place aceast\u0103 abordare deoarece ascunde interconexiuni importante sub un singur termen. Analiza codului surs\u0103 al programului la acest nivel este necesar\u0103 dezvoltatorilor de compilatoare pentru a implementa specifica\u021bia limbajului, dar nu \u0219i studen\u021bilor la o prim\u0103 abordare. \u00cencep\u0103torii \u00een programare rareori au suficient\u0103 aten\u021bie pentru a se ocupa at\u00e2t de serios de termeni. Rar cineva re\u021bine \u0219i \u00een\u021belege cuvinte noi din prima. Practic nimeni nu poate aplica corect un termen pe care l-a aflat de cur\u00e2nd. A\u0219a c\u0103 studen\u021bii se confrunt\u0103 cu o mul\u021bime de erori precum \u201eam scris while(a&lt;7);{, dar programul nu func\u021bioneaz\u0103.\u201d<br \/>\nDin punctul meu de vedere, la \u00eenceput ar fi mai bine s\u0103 se ofere sintaxa construc\u021biei imediat cu paranteze. Varianta f\u0103r\u0103 paranteze ar trebui explicat\u0103 doar dac\u0103 elevul pune o \u00eentrebare concret\u0103 \u00abde ce aici f\u0103r\u0103 paranteze \u0219i func\u021bioneaz\u0103\u00bb.<\/p>\n<p>\u00cen cartea lui Okulov \u201eFundamentele program\u0103rii\u201d din 2012, introducerea la cicluri \u00eencepe cu modelul for, urmat de recomand\u0103ri privind utilizarea acestuia, iar apoi urmeaz\u0103 imediat o sec\u021biune experimental\u0103 a lec\u021biei. \u00cen\u021beleg c\u0103 aceast\u0103 carte a fost scris\u0103 pentru acel mic procent de elevi foarte capabili, care rareori vin la orele mele.<\/p>\n<p>\u00cen c\u0103r\u021bile populare este \u00eentotdeauna prezentat rezultatul fragmentelor de cod. De exemplu, \u00een cartea lui Schildt \u201eJava 8. Ghid complet\u201d din 2015. Mai \u00eent\u00e2i se ofer\u0103 modelul, apoi un exemplu de program \u0219i imediat dup\u0103, rezultatul execu\u021biei.<\/p>\n<blockquote><p>Ca exemplu, s\u0103 consider\u0103m ciclul while, \u00een care se face un num\u0103r\u0103tor descresc\u0103tor,<br \/>\n\u00eencep\u00e2nd de la 10, \u0219i se afi\u0219eaz\u0103 exact 10 linii de \u201etact\u201d: <\/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>\nDup\u0103 ce este lansat, acest program afi\u0219eaz\u0103 zece \u201etacte\u201d \u00een urm\u0103torul mod:<br \/>\n<code>tact 10<br \/>\ntact 9<br \/>\ntact 8<br \/>\ntact 7<br \/>\ntact 6<br \/>\ntact 5<br \/>\ntact 4<br \/>\ntact 3<br \/>\ntact 2<br \/>\ntact 1<\/code><\/p><\/blockquote>\n<p>\nAbordarea cu descrierea modelului, exemplul de program \u0219i rezultatul execu\u021biei acestuia este folosit\u0103 \u0219i \u00een cartea \u201eJavascript pentru copii\u201d \u0219i \u00een cursul js de pe w3schools.com. Formatul paginii web permite chiar realizarea acestui exemplu interactiv.<\/p>\n<p>\u00cen cartea lui Stroustrup \u201ePrincipii \u0219i practic\u0103 folosind C++\u201d din 2016, autorul a mers \u0219i mai departe. \u00cen primul r\u00e2nd, se explic\u0103 ce rezultat ar trebui s\u0103 ob\u021bin\u0103, iar abia apoi se arat\u0103 textul programului. De asemenea, ca exemplu, nu se ia o program\u0103 oarecare, ci se face o excursie \u00een istorie. Acest lucru ajut\u0103 s\u0103-i atrag\u0103 aten\u021bia asupra ei: \u201eUite, acesta nu este doar un text inutil. Vezi ceva semnificativ\u201d.<\/p>\n<blockquote><p>Ca exemplu de itera\u021bie, s\u0103 lu\u0103m prima program\u0103 realizat\u0103 pe o ma\u0219in\u0103 cu program stocat (EDSAC). Aceasta a fost scris\u0103 de David Wheeler \u00een laboratorul de calculatoare al Universit\u0103\u021bii din Cambridge, Anglia, pe 6 mai 1949. Aceast\u0103 program\u0103 calculeaz\u0103 \u0219i tip\u0103re\u0219te o simpl\u0103 list\u0103 de p\u0103trate.<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 \/>\nAici, \u00een fiecare linie se afl\u0103 un num\u0103r, urmat de un tabulator (&#8216;t&#8217;) \u0219i p\u0103tratul acestui num\u0103r. Versiunea acestui program \u00een limbajul C++ arat\u0103 astfel:<\/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>\nEste curios c\u0103 modelul sintactic din aceast\u0103 carte nu este descris. Stroustrup \u00een manualul instructorului (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">traducere<\/a><\/noindex>) subliniaz\u0103 c\u0103 respect\u0103 inteligen\u021ba studen\u021bilor s\u0103i. Poate c\u0103 abilitatea de a identifica un model \u00een mai multe exemple este considerat\u0103 o manifestare a acelei inteligen\u021be.<\/p>\n<h4>A\u0219a cum explic eu \u00eensumi<\/h4>\n<p>\nAbordarea lui Stroustrup: descrierea rezultatului, apoi solu\u021bia problemei \u0219i, \u00een final, analiza independent\u0103 a studentului \u2014 pare a fi cea mai bine g\u00e2ndit\u0103. De aceea, am decis s\u0103 iau ca baz\u0103 exact aceast\u0103 abordare, dar voi povesti folosind un exemplu mai pu\u021bin istoric \u2014 problema gener\u0103rii \u201ecuprinsului\u201d. Aceasta formeaz\u0103 un punct de referin\u021b\u0103 recognoscibil, astfel \u00eenc\u00e2t, mai t\u00e2rziu, s\u0103 putem spune \u201eaminte\u0219te-\u021bi problema cu cuprinsul\u201d \u0219i studen\u021bii s\u0103 \u00ee\u0219i aminteasc\u0103 exact de ea. \u00cen exemplul meu, am \u00eencercat s\u0103 prevenim \u00eenc\u0103 dou\u0103 dintre cele mai frecvente concep\u021bii gre\u0219ite. \u00cemi voi scrie despre ele \u00een detaliu.<\/p>\n<blockquote><p>\u00cen aceast\u0103 problem\u0103, ne familiariz\u0103m cu tehnicile de rezolvare a problemelor complexe. Solu\u021bia ini\u021bial\u0103 trebuie s\u0103 fie primitiv\u0103 \u0219i simpl\u0103. Apoi, putem s\u0103 ne g\u00e2ndim cum s\u0103 \u00eembun\u0103t\u0103\u021bim aceast\u0103 solu\u021bie.<br \/>\n<code>Introducere<br \/>\nCapitolul 1<br \/>\nCapitolul 2<br \/>\nCapitolul 3<br \/>\nCapitolul 4<br \/>\nCapitolul 5<br \/>\nCapitolul 6<br \/>\nCapitolul 7<br \/>\nConcluzie<\/code><\/p><\/blockquote>\n<p>\nDin observa\u021biile mele, abordarea \u201e\u0219ablon-exemplu-rezultat\u201d \u00een combina\u021bii diferite tot conduce la faptul c\u0103 studen\u021bii percep bucla ca pe un hieroglif. Aceasta s-a manifestat prin faptul c\u0103 ei nu \u00een\u021belegeau de ce ar fi necesar s\u0103 scrie o condi\u021bie, cum s\u0103 aleag\u0103 \u00eentre i++ \u0219i i-- \u0219i alte lucruri care par at\u00e2t de evidente. Pentru a evita aceste confuzii, abordarea \u00een prezentarea buclelor trebuie s\u0103 sublinieze semnifica\u021bia repet\u0103rii unor ac\u021biuni identice \u0219i abia apoi \u2014 modul de formare a acestora prin utilizarea construc\u021biei. Prin urmare, \u00eenainte de a oferi sintaxa buclei, trebuie s\u0103 rezolv\u0103m problema \u201edirect\u201d. O solu\u021bie primitiv\u0103 pentru problema cu cuprinsul arat\u0103 astfel:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introducere\");\nConsole.WriteLine(\"Capitolul 1\");\nConsole.WriteLine(\"Capitolul 2\");\nConsole.WriteLine(\"Capitolul 3\");\nConsole.WriteLine(\"Capitolul 4\");\nConsole.WriteLine(\"Capitolul 5\");\nConsole.WriteLine(\"Capitolul 6\");\nConsole.WriteLine(\"Capitolul 7\");\nConsole.WriteLine(\"Concluzie\");\n<\/code><\/pre>\n<p>\nCum poate fi \u00eembun\u0103t\u0103\u021bit?<br \/>\n\u00cenlocuirea ac\u021biunilor repetitive cu un ciclu.<br \/>\nCe ac\u021biuni se repet\u0103 aici f\u0103r\u0103 modific\u0103ri?<br \/>\n\u00cen acest fragment, nu exist\u0103 astfel de ac\u021biuni. Totu\u0219i, comenzile de a afi\u0219a cuv\u00e2ntul \u201eCapitol\u201d cu num\u0103rul sunt foarte asem\u0103n\u0103toare \u00eentre ele.<br \/>\nDe aceea, urm\u0103torul pas este c\u0103utarea diferen\u021bei \u00eentre fragmente. Doar \u00een aceast\u0103 problem\u0103 este totul evident, apoi se vor repeta nu comenzi unice, ci blocuri de cod de 5 linii sau mai mult. Va trebui s\u0103 c\u0103ut\u0103m nu doar \u00een lista de comenzi, ci \u0219i \u00een construc\u021bii de ramifica\u021bie sau ciclu.<br \/>\n\u00cen exemplu, diferen\u021ba \u00eentre comenzi const\u0103 \u00een num\u0103rul de dup\u0103 cuv\u00e2ntul \u201eCapitol\u201d.<br \/>\nOdat\u0103 ce diferen\u021ba este g\u0103sit\u0103, trebuie s\u0103 \u00een\u021belegem pattern-ul schimb\u0103rii. Fragmentele distincte sunt numere? Acestea cresc sau scad constant? Cum variaz\u0103 valoarea num\u0103rului \u00eentre cele dou\u0103 comenzi adiacente?<br \/>\n\u00cen exemplu, num\u0103rul dup\u0103 cuv\u00e2ntul \u201eCapitol\u201d cre\u0219te cu c\u00e2te 1. Diferen\u021ba a fost g\u0103sit\u0103, iar regularitatea identificat\u0103. Acum putem \u00eenlocui fragmentul difern\u021biat cu o variabil\u0103.<br \/>\nTrebuie s\u0103 declar\u0103m o astfel de variabil\u0103 \u00eenainte de primul dintre fragmentele repetitive. Aceast\u0103 variabil\u0103 este de obicei numit\u0103 I sau j sau \u00eentr-un mod mai detaliat. Valoarea ini\u021bial\u0103 a acesteia trebuie s\u0103 fie egal\u0103 cu prima valoare afi\u0219at\u0103 pe ecran. \u00cen exemplu, prima valoare este 1. <br \/>\nCe valoare ini\u021bial\u0103 ar trebui s\u0103 lu\u0103m pentru a afi\u0219a seria de numere \u201e100, 101, 102, 103, 104, 105\u201d?<br \/>\n\u00cen aceast\u0103 serie, primul num\u0103r este 100.<br \/>\nDup\u0103 fiecare comand\u0103 de afi\u0219are, trebuie s\u0103 cre\u0219tem valoarea acestei variabile cu 1. Aceast\u0103 unitate este pasul de schimbare.<br \/>\nCare va fi pasul \u00een seria de numere \u201e100, 102, 104, 106\u201d?<br \/>\n\u00cen aceast\u0103 serie, pasul este 2.<br \/>\nDup\u0103 \u00eenlocuirea fragmentului diferit cu o variabil\u0103, codul va ar\u0103ta astfel:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introducere\");\nint i;\ni = 0;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolul \" + i);\ni = i + 1;\nConsole.WriteLine(\"Concluzie\");\n<\/code><\/pre>\n<p>\nDup\u0103 aplicarea tehnicii \u201eexprima\u021bi regularitatea cu o variabil\u0103\u201d, codul con\u021bine c\u00e2teva grupuri de ac\u021biuni identice care se desf\u0103\u0219oar\u0103 \u00een succesiune. Acum ac\u021biunile repetitive pot fi \u00eenlocuite cu un ciclu.<\/p>\n<p>Secven\u021ba de solu\u021bionare a problemei, unde trebuie s\u0103 folosim cicluri, const\u0103 \u00een etape:<\/p>\n<ol>\n<li>Solu\u021biona\u021bi \u201edirect\u201d cu un num\u0103r de comenzi separate<\/li>\n<li>G\u0103si\u021bi regularitatea<\/li>\n<li>Exprima\u021bi regularitatea cu o variabil\u0103<\/li>\n<li>Forma\u021bi-o sub form\u0103 de ciclu<\/li>\n<\/ol>\n<p>Apoi sunt introduse noi termeni, pentru ca studentul s\u0103 nu se afle \u00een situa\u021bia \u201e\u00een\u021beleg tot, dar nu pot s\u0103 spun\u201d:<br \/>\n \u2014 contor \u2014 \u00eentotdeauna variabil\u0103 care este necesar\u0103 pentru a urm\u0103ri num\u0103rul de pa\u0219i ai ciclului. De obicei, un num\u0103r \u00eentreg care este comparat cu o limit\u0103.<br \/>\n \u2014 pasul contorului \u2014 descrierea regularit\u0103\u021bii de schimbare a contorului.<br \/>\n \u2014 limit\u0103 \u2014 un num\u0103r sau o variabil\u0103 cu care este comparat contorul, astfel \u00eenc\u00e2t algoritmul s\u0103 fie finit. Valoarea contorului se schimb\u0103 astfel \u00eenc\u00e2t s\u0103 se apropie de limit\u0103.<br \/>\n \u2014 corpul ciclului \u2014 un set de comenzi care vor fi repetate. C\u00e2nd se spune \u201ecomand\u0103 scris\u0103 \u00een interiorul ciclului\u201d, se refer\u0103 exact la corp.<br \/>\n \u2014 itera\u021bia ciclului \u2014 executarea o dat\u0103 a corpului ciclului.<br \/>\n \u2014 condi\u021bia de ciclu \u2014 o expresie logic\u0103 de care depinde dac\u0103 se va executa o alt\u0103 itera\u021bie. (Aici poate ap\u0103rea confuzie cu structurile de ramificare)<br \/>\nTrebuie s\u0103 fim preg\u0103ti\u021bi c\u0103, la \u00eenceput, studen\u021bii vor utiliza termeni \u00een mod misconceptual. Aceasta se aplic\u0103 at\u00e2t celor puternici, c\u00e2t \u0219i celor slabi. Stabilirea unui limbaj comun este o adev\u0103rat\u0103 art\u0103. Acum voi scrie pe scurt: trebuie s\u0103 formul\u0103m sarcina \u201esubliniaz\u0103 fragmentul de cod cu \u201d \u0219i s\u0103 folosim corect ace\u0219ti termeni \u00een discu\u021bie.<br \/>\nDup\u0103 transformarea cu un ciclu, ob\u021binem fragmentul:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introducere\");\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Capitolul &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;Concluzie&quot;);<\/code><\/pre>\n<h4>Principala confuzie<\/h4>\n<p>\nO confuzie popular\u0103 printre studen\u021bi este c\u0103 ei includ \u00een structura ciclului astfel de ac\u021biuni care trebuie executate o singur\u0103 dat\u0103. De exemplu, a\u0219a:<\/p>\n<pre><code class=\"cs\">;\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Introducere&quot;)\n    Console.WriteLine(&quot;Capitolul &quot; + i);\n    i = i + 1;\n    Console.WriteLine(&quot;Concluzie&quot;);\n}\n<\/code><\/pre>\n<p>\nElevii se confrunt\u0103 constant cu aceast\u0103 problem\u0103, at\u00e2t la \u00eenceput, c\u00e2t \u0219i \u00een sarcini mai complexe.<br \/>\nSugestia principal\u0103 \u00een acest caz:<\/p>\n<blockquote><p>De c\u00e2te ori trebuie s\u0103 repet\u0103m scrierea comenzii: o dat\u0103 sau de mai multe ori?\n<\/p><\/blockquote>\n<p>\nComenzile de ie\u0219ire a cuvintelor \u201eIntroducere\u201d \u0219i \u201eConcluzie\u201d, precum \u0219i declara\u021bia \u0219i ini\u021bializarea variabilei i nu sunt similare cu alte ac\u021biuni repetitive. Acestea se execut\u0103 o singur\u0103 dat\u0103, deci trebuie scrise \u00een afara corpului ciclului.<\/p>\n<p>\u00cen cod trebuie s\u0103 r\u0103m\u00e2n\u0103 toate cele trei etape ale solu\u021biei, astfel \u00eenc\u00e2t ulterior s\u0103 ne putem referi la ele \u00een caz de dificult\u0103\u021bi. Primele dou\u0103 variante pot fi doar comentate pentru a nu deranja.<br \/>\nAten\u021bia studentului trebuie s\u0103 fie \u00eendreptat\u0103 spre urm\u0103toarele fapte:<br \/>\n \u2014 \u00cen condi\u021bia ciclului, de obicei, se compar\u0103 un contor \u0219i o limit\u0103. Contorul poate varia \u00een corpul ciclului, dar limita nu. Pentru a \u00eenc\u0103lca aceast\u0103 regul\u0103, este necesar s\u0103 avem motive temeinice.<br \/>\n \u2014 Comenzile de ie\u0219ire a cuvintelor \u201eIntroducere\u201d \u0219i \u201eConcluzie\u201d se afl\u0103 \u00een afara corpului ciclului. Trebuie s\u0103 le execut\u0103m o singur\u0103 dat\u0103. \u201eIntroducere\u201d \u2014 \u00eenainte de a repeta ac\u021biunile, \u201eConcluzie\u201d \u2014 dup\u0103.<br \/>\n\u00cen procesul de consolidare a acestei teme, st\u0103p\u00e2nirea urm\u0103toarelor, precum \u0219i clarificarea dificult\u0103\u021bilor, chiar \u0219i studen\u021bilor puternici le este util s\u0103 pun\u0103 \u00eentrebarea: \u201eIar aceast\u0103 ac\u021biune trebuie s\u0103 fie executat\u0103 de c\u00e2te ori? O dat\u0103 sau de mai multe ori?\u201d.<\/p>\n<h4>Dezvoltarea abilit\u0103\u021bilor suplimentare<\/h4>\n<p>\n\u00cen timpul studiului ciclurilor, studen\u021bii \u00ee\u0219i dezvolt\u0103 abilitatea de diagnosticare \u0219i rezolvare a problemelor. Pentru a efectua diagnosticul, studentul trebuie s\u0103-\u0219i imagineze rezultatul dorit \u0219i s\u0103-l compare cu rezultatul efectiv. Ac\u021biunile pentru corectare depind de diferen\u021ba dintre acestea.<br \/>\nDat fiind c\u0103 studen\u021bii \u00een aceast\u0103 etap\u0103 nu au o claritate suficient\u0103 asupra rezultatelor \u201edorin\u021be\u201d, ei \u00ee\u0219i pot orienta c\u0103tre datele de test. De obicei, nimeni la acest stadiu nu \u00een\u021belege ce poate merge prost \u0219i cum s\u0103 fac\u0103 fa\u021b\u0103. Prin urmare, le ofer o descriere a problemelor tipice \u0219i c\u00e2teva modalit\u0103\u021bi de rezolvare, iar alegerea celei mai potrivite revine studentului.<br \/>\nNota\u021bia este necesar\u0103 pentru a \u00eentreba \u201ea ie\u0219it ceea ce se a\u0219tepta?\u201d, \u201eCare dintre aceste situa\u021bii s-a \u00eent\u00e2mplat acum?\u201d, \u201eA ajutat solu\u021bia aplicat\u0103?\u201d.<\/p>\n<ol>\n<li>Num\u0103rul de ac\u021biuni este cu 1 mai mic sau mai mare dec\u00e2t se a\u0219tepta. Modalit\u0103\u021bile de rezolvare sunt:<br \/>\n \u2014 cre\u0219te valoarea ini\u021bial\u0103 a contorului cu 1.<br \/>\n \u2014 \u00eenlocuie\u0219te operatorul strict de comparare (&lt; sau &gt;) cu unul ne-dur (&lt;= sau &gt;=).<br \/>\n \u2014 schimb\u0103 valoarea limitat\u0103 cu 1.<\/li>\n<li>Ac\u021biunile din ciclu se execut\u0103 f\u0103r\u0103 oprire, infinit. Modalit\u0103\u021bile de rezolvare sunt:<br \/>\n \u2014 adaug\u0103 comanda de modificare a contorului, dac\u0103 lipseste.<br \/>\n \u2014 corecteaz\u0103 comanda de modificare a contorului astfel \u00eenc\u00e2t valoarea s\u0103 se apropie de limit\u0103.<br \/>\n \u2014 elimin\u0103 comanda de modificare a limitei, dac\u0103 se afl\u0103 \u00een corpul ciclului.<\/li>\n<li>Num\u0103rul de ac\u021biuni din ciclu este cu 1 mai mic sau mai mare dec\u00e2t se a\u0219tepta. Ac\u021biunea din ciclu nu s-a executat deloc. Este necesar s\u0103 afl\u0103m valorile efective ale variabilelor chiar \u00eenainte de \u00eenceperea ciclului. Modalit\u0103\u021bile de rezolvare sunt:<br \/>\n \u2014 modific\u0103 valoarea ini\u021bial\u0103 a limitei<br \/>\n \u2014 modific\u0103 valoarea ini\u021bial\u0103 a contorului<\/li>\n<\/ol>\n<p>\nDe obicei, problema 3 este legat\u0103 de utilizarea unei variabile gre\u0219ite sau de ne-resetarea contorului.<\/p>\n<p>Dup\u0103 aceast\u0103 explica\u021bie, studentul poate \u00eenc\u0103 avea diverse concep\u021bii gre\u0219ite despre func\u021bionarea ciclurilor.<br \/>\nPentru a dizolva cele mai comune, le ofer sarcini:<\/p>\n<ol>\n<li>\u00cen care limita, valoarea ini\u021bial\u0103 a contorului sau pasul contorului sunt introduse de utilizator.<\/li>\n<li>\u00cen care valoarea contorului trebuie utilizat\u0103 \u00eentr-o expresie aritmetic\u0103. Este de preferat ca aceasta s\u0103 fie \u00eentr-o expresie subr\u0103d\u0103cin\u0103 sau \u00een numitor, astfel \u00eenc\u00e2t diferen\u021ba s\u0103 fie neliniar\u0103.<\/li>\n<li>\u00cen care valoarea contorului nu este afi\u0219at\u0103 pe ecran \u00een timpul execu\u021biei buclei. De exemplu, afi\u0219area unui num\u0103r necesar de fragmente de text identice sau desenarea unei figuri folosind grafic\u0103 de tip broasc\u0103 \u021bestoas\u0103.<\/li>\n<li>\u00cen care trebuie s\u0103 efectuezi mai \u00eent\u00e2i unele ac\u021biuni repetitive \u0219i apoi altele.<\/li>\n<li>\u00cen care trebuie s\u0103 efectuezi alte ac\u021biuni \u00eenainte \u0219i dup\u0103 cele repetitive.<\/li>\n<\/ol>\n<p>\nPentru fiecare sarcin\u0103 trebuie oferite date de testare \u0219i rezultatul a\u0219teptat.<\/p>\n<p>Pentru a \u00een\u021belege c\u00e2t de repede se poate lucra, trebuie s\u0103 le oferi elevilor s\u0103 citeasc\u0103 condi\u021biile acestor sarcini \u0219i s\u0103 \u00eentrebi: \u201ece le diferen\u021biaz\u0103 de exemplu?\u201d, \u201ece trebuie s\u0103 schimbi \u00een exemplu pentru a le rezolva?\u201d. Dac\u0103 elevul r\u0103spunde ra\u021bional, atunci s\u0103 rezolve m\u0103car una \u00een clas\u0103, iar restul acas\u0103. Dac\u0103 solu\u021bia este reu\u0219it\u0103, atunci putem \u00eencepe explica\u021bia despre condi\u021biile din interiorul buclelor.<br \/>\nDac\u0103 exist\u0103 dificult\u0103\u021bi \u00een rezolvarea pe cont propriu, atunci trebuie s\u0103 se exerseze totul \u00een clas\u0103. Pentru a nu face rezolvarea unei sarcini similar\u0103 cu desenatul unei bufni\u021be, recomand s\u0103 rezolvi mai \u00eent\u00e2i sarcina nu \u00een mod universal. Adic\u0103, a\u0219a \u00eenc\u00e2t solu\u021bia s\u0103 treac\u0103 primul test \u0219i s\u0103 nu foloseasc\u0103 construc\u021bia buclei. Apoi se pot aplica transform\u0103ri pentru a ob\u021bine universalitatea solu\u021biei.<\/p>\n<h4>Buclele \u0219i ramific\u0103rile<\/h4>\n<p>\nDin perspectiva mea, este util s\u0103 oferim tema \u201ebuclele \u00een interiorul ramific\u0103rilor\u201d separat. A\u0219a, \u00eenc\u00e2t s\u0103 fie ulterior vizibil\u0103 diferen\u021ba \u00eentre verificarea repetat\u0103 a condi\u021biei \u0219i verificarea unic\u0103.<br \/>\nSarcinile de consolidare vor fi despre afi\u0219area numerelor de la A la B, care sunt introduse de utilizator:<br \/>\n \u2014 mereu \u00een ordine cresc\u0103toare.<br \/>\n \u2014 \u00een ordine cresc\u0103toare sau descresc\u0103toare \u00een func\u021bie de valorile A \u0219i B.<\/p>\n<p>Tema \u201eramific\u0103rii \u00een interiorul buclelor\u201d trebuie abordat\u0103 doar dup\u0103 ce studentul a st\u0103p\u00e2nit tehnicile: \u201e\u00eenlocuirea regularit\u0103\u021bii cu o variabil\u0103\u201d \u0219i \u201e\u00eenlocuirea ac\u021biunilor repetate cu o bucl\u0103\u201d.<br \/>\nPrincipala cauz\u0103 a aplic\u0103rii ramific\u0103rilor \u00een interiorul buclelor sunt anomaliile \u00een regularitate. \u00cen mijloc aceasta este perturbat\u0103 \u00een func\u021bie de datele ini\u021biale.<br \/>\nPentru acei elevi care sunt capabili s\u0103 caute solu\u021bii prin combinarea unor tehnici simple, este suficient s\u0103 spunem \u201eramific\u0103rile pot fi scrise \u00een interiorul buclelor\u201d \u0219i s\u0103 oferim sarcina \u201epentru exemplu\u201d complet pentru auto-rezolvare.<br \/>\nSarcina pentru exemplu:<\/p>\n<blockquote><p>Utilizatorul introduce un num\u0103r X. Afi\u0219a\u021bi \u00een coloan\u0103 numerele de la 0 la 9 \u0219i pune\u021bi semnul \u201e+\u201d l\u00e2ng\u0103 num\u0103rul care este egal cu X.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Dac\u0103 a fost introdus 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\">Dac\u0103 s-a introdus 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\">Dac\u0103 s-a introdus 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\">Dac\u0103 s-a introdus 777<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p>Dac\u0103 explica\u021bia scurt\u0103 nu este suficient\u0103 pentru a scrie cu un ciclu, atunci trebuie s\u0103 g\u0103si\u021bi o solu\u021bie universal\u0103 a acelea\u0219i probleme f\u0103r\u0103 ciclu.<br \/>\nSe va ob\u021bine una dintre cele dou\u0103 variante:<br \/>\n<b class=\"spoiler_title\">Dezirabil<\/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\">Posibil<\/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>O problem\u0103 similar\u0103 o dau dinainte, \u00een timpul studiului subiectului despre ramifica\u021bii.<br \/>\nDac\u0103 studentul a ob\u021binut o variant\u0103 \u201eposibil\u0103\u201d, atunci trebuie s\u0103 se explice c\u0103 solu\u021biile pentru aceea\u0219i problem\u0103 pot fi multiple. Totu\u0219i, ele difer\u0103 prin stabilitatea fa\u021b\u0103 de modific\u0103rile cerin\u021belor. Pune\u021bi \u00eentrebarea: \u201eC\u00e2te locuri din cod trebuie corectate dac\u0103 trebuie s\u0103 ad\u0103uga\u021bi un alt num\u0103r?\u201d \u00cen varianta \u201eposibil\u0103\u201d va trebui s\u0103 ad\u0103uga\u021bi o alt\u0103 ramifica\u021bie \u0219i s\u0103 scrie\u021bi \u00een alte 10 locuri noul num\u0103r. \u00cen variant\u0103 \u201edezirabil\u0103\u201d este suficient s\u0103 ad\u0103uga\u021bi doar o singur\u0103 ramifica\u021bie.<br \/>\nFormula\u021bi sarcina de a reproduce varianta \u201edezirabil\u0103\u201d, apoi g\u0103si\u021bi \u00een cod o regul\u0103, realiza\u021bi \u00eenlocuirea variabilei \u0219i scrie\u021bi un ciclu.<br \/>\nDac\u0103 ave\u021bi o idee despre cum s\u0103 rezolva\u021bi aceast\u0103 problem\u0103 f\u0103r\u0103 ciclu \u00een alt mod, v\u0103 rog s\u0103 scrie\u021bi \u00een comentarii.<\/p>\n<h4>Cicluri \u00een interiorul ciclurilor<\/h4>\n<p>\n\u00cen acest subiect trebuie s\u0103 acorda\u021bi aten\u021bie la:<br \/>\n \u2014 contoarele pentru ciclul interior \u0219i cel exterior trebuie s\u0103 fie variabile diferite.<br \/>\n \u2014 contorul pentru ciclul interior trebuie resetat de multe ori (adic\u0103 \u00een corpul ciclului exterior).<br \/>\n \u00cen sarcinile de ie\u0219ire a textului, nu po\u021bi scrie mai \u00eent\u00e2i o liter\u0103 pe mai multe r\u00e2nduri \u0219i apoi pe a doua. Trebuie mai \u00eent\u00e2i s\u0103 ie\u0219i toate literele primului r\u00e2nd, apoi toate literele celui de-al doilea \u0219i a\u0219a mai departe.<\/p>\n<p>Explicarea subiectului despre cicluri \u00een interiorul ciclumilor este cel mai bine s\u0103 \u00eenceap\u0103 cu explicarea importan\u021bei reset\u0103rii contorului.<br \/>\nSarcina pentru exemplu:<\/p>\n<blockquote><p>Utilizatorul introduce dou\u0103 numere: R \u0219i T. Afi\u0219a\u021bi dou\u0103 randuri de caractere \"#\". \u00cen primul r\u00e2nd trebuie s\u0103 fie R caractere. \u00cen al doilea r\u00e2nd trebuie s\u0103 fie T caractere. Dac\u0103 un num\u0103r este negativ, afi\u0219a\u021bi un mesaj de eroare.<\/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>Valoarea lui R trebuie s\u0103 fie non-negativ\u0103<\/p>\n<p><b class=\"spoiler_title\">R=6, T=-2<\/b>Valoarea lui T trebuie s\u0103 fie non-negativ\u0103<\/p>\n<p>Este evident c\u0103 aceast\u0103 problem\u0103 are cel pu\u021bin dou\u0103 solu\u021bii posibile.<br \/>\n<b class=\"spoiler_title\">Dezirabil<\/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\">Solu\u021bie posibil\u0103 \u21161<\/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>Diferen\u021ba este c\u0103 \u00een solu\u021bia \u00abposibil\u0103\u00bb pentru ie\u0219irea celui de-al doilea r\u00e2nd a fost utilizat\u0103 a doua variabil\u0103. Este necesar s\u0103 se insiste asupra utiliz\u0103rii acelea\u0219i variabile pentru ambele cicluri. Poate fi argumentat c\u0103 solu\u021bia cu un singur contor pentru dou\u0103 cicluri va ilustra termenul \u00abresetarea contorului\u00bb. \u00cen\u021belegerea acestui termen este necesar\u0103 pentru trecerea la urm\u0103toarele probleme. Ca un compromis, ambele solu\u021bii ale problemei pot fi p\u0103strate.<\/p>\n<p>O problem\u0103 tipic\u0103 cu utilizarea unei singure variabile contor pentru dou\u0103 cicluri se manifest\u0103 astfel:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Num\u0103rul de caractere din al doilea r\u00e2nd nu se potrive\u0219te cu valoarea T. Dac\u0103 ai nevoie de ajutor cu aceast\u0103 problem\u0103, trebuie s\u0103 \u00ab\u00eei ar\u0103\u021bi\u00bb noti\u021bele despre problemele tipice cu ciclurile. Acesta este simptom \u21163. Este diagnosticabil dac\u0103 adaugi ie\u0219irea valorii contorului chiar \u00eenainte de al doilea ciclu. Se corecteaz\u0103 prin resetare. Dar este mai bine s\u0103 nu poveste\u0219ti asta imediat. Studentul ar trebui s\u0103 \u00eencerce s\u0103 formuleze cel pu\u021bin o ipotez\u0103.<\/p>\n<p>Exist\u0103, desigur, \u0219i aceast\u0103 variant\u0103 de solu\u021bie. Dar nu am v\u0103zut-o la studen\u021bi. \u00cen etapa de \u00eenv\u0103\u021bare a ciclurilor, a vorbi despre ea va distrage aten\u021bia. O putem relua mai t\u00e2rziu, \u00een cadrul studiului func\u021biilor de lucru cu \u0219iruri.<br \/>\n<b class=\"spoiler_title\">Solu\u021bie posibil\u0103 \u21162<\/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>\nUrm\u0103toarea sarcin\u0103 obligatorie:<\/p>\n<blockquote><p>Afi\u0219a\u021bi pe ecran cifrele de la 0 la 9. Fiecare cifr\u0103 trebuie s\u0103 fie pe o linie separat\u0103. Num\u0103rul de cifre pe linie (W) este introdus de la tastatur\u0103.<\/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>Dac\u0103 studentul a \u00eenv\u0103\u021bat s\u0103 \u00eenlocuiasc\u0103 variabila, va reu\u0219i destul de repede. Problema posibil\u0103 va fi din nou resetezarea variabilei. Dac\u0103 nu reu\u0219e\u0219te s\u0103 fac\u0103 conversia, \u00eenseamn\u0103 c\u0103 ai gr\u0103bit lucrurile \u0219i ar trebui s\u0103 rezolvi probleme mai simple.<\/p>\n<p>Mul\u021bumesc pentru aten\u021bie. Da\u021bi like, abona\u021bi-v\u0103 la canal.<\/p>\n<p>P.S. Dac\u0103 a\u021bi g\u0103sit gre\u0219eli sau tipuri \u00een text, v\u0103 rog s\u0103-mi spune\u021bi. Pute\u021bi face acest lucru select\u00e2nd o parte din text \u0219i ap\u0103s\u00e2nd pe Mac \u201e\u2318 + Enter\u201d, iar pe tastaturile clasice \u201eCtrl \/ Enter\u201d, sau prin mesaje private. Dac\u0103 aceste variante nu sunt disponibile, scrie\u021bi despre gre\u0219eli \u00een comentarii. Mul\u021bumesc!<\/p>\n<p class=\"for_users_only_msg\">Numai utilizatorii \u00eenregistra\u021bi pot participa la sondaj. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Conecta\u021bi-v\u0103<\/a><\/noindex>, v\u0103 rug\u0103m.<\/p>\n<h2 class=\"default-block__polling-title\">Sondaj pentru cititori f\u0103r\u0103 karma<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,0%<\/strong>Predau profesional, +12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">10,0%<\/strong>Predau profesional, -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>Nu predau, +17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Nu predau, -10<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Altceva0<\/p>\n<\/li>\n<\/ul>\n<p>    10 utilizatori au votat. 5 utilizatori s-au ab\u021binut.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Cum s\u0103 \u00eenve\u021bi s\u0103 dep\u0103\u0219e\u0219ti dificult\u0103\u021bile \u0219i, \u00een acela\u0219i timp, s\u0103 scrii cicluri | ProHoster","description":"De\u0219i vorbim despre unul dintre subiectele de baz\u0103, acest articol este scris pentru speciali\u0219ti experimenta\u021bi. Scopul este de a ar\u0103ta ce confuzii au \u00eencep\u0103torii \u00een programare.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}