{"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\/pl\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","title":{"rendered":"Jak nauczy\u0107 pokonywa\u0107 trudno\u015bci, a przy okazji pisa\u0107 p\u0119tle","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mimo \u017ce temat wydaje si\u0119 podstawowy, ten artyku\u0142 jest napisany z my\u015bl\u0105 o do\u015bwiadczonych specjalistach. Jego celem jest pokazanie typowych b\u0142\u0119d\u00f3w, kt\u00f3re pope\u0142niaj\u0105 nowicjusze w programowaniu. Dla praktykuj\u0105cych programist\u00f3w te problemy s\u0105 ju\u017c dawno rozwi\u0105zane, zapomniane lub wr\u0119cz niezauwa\u017cane. Artyku\u0142 mo\u017ce by\u0107 pomocny, je\u015bli nagle b\u0119dziesz musia\u0142 pom\u00f3c komu\u015b w tej kwestii. W artykule por\u00f3wnano materia\u0142y z r\u00f3\u017cnych ksi\u0105\u017cek na temat programowania autorstwa Shields, Stroustrupa, Okulowa.<\/p>\n<p>Temat cykli zosta\u0142 wybrany, poniewa\u017c na nim odpada wielu ludzi podczas nauki programowania.<\/p>\n<p>Ta metoda jest skierowana na s\u0142abszych student\u00f3w. Z regu\u0142y silni nie utkn\u0105 na tym etapie i nie ma potrzeby wymy\u015blania specjalnych metod dla nich. Drugorz\u0119dnym celem artyku\u0142u jest przet\u0142umaczenie tej metody z klasy \"dzia\u0142a na wszystkich studentach, ale tylko u jednego nauczyciela\" do klasy \"dzia\u0142a u wszystkich student\u00f3w, wszystkich nauczycieli\". Nie roszcz\u0119 pretensji do absolutnej oryginalno\u015bci. Je\u015bli ju\u017c stosujesz podobn\u0105 metod\u0119 w nauczaniu tego tematu, prosz\u0119, napisz, czym tw\u00f3j wariant si\u0119 r\u00f3\u017cni. Je\u015bli zdecydujesz si\u0119 na zastosowanie jej, daj zna\u0107 po zako\u0144czeniu, jak wszystko posz\u0142o. Je\u015bli podobna metoda jest opisana w jakiej\u015b ksi\u0105\u017cce, napisz prosz\u0119 tytu\u0142.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nPracowa\u0142em nad t\u0105 metod\u0105 przez 4 lata, prowadz\u0105c indywidualne zaj\u0119cia ze studentami o r\u00f3\u017cnym poziomie przygotowania. \u0141\u0105cznie oko\u0142o pi\u0119\u0107dziesi\u0119ciu student\u00f3w i dwa tysi\u0105ce godzin zaj\u0119\u0107. Na pocz\u0105tku na tym etapie studenci nieustannie utkn\u0119li i znikali. Po ka\u017cdym studencie metoda i materia\u0142y by\u0142y korygowane. Ostatni rok studenci ju\u017c nie utkn\u0119li na tym etapie, wi\u0119c postanowi\u0142em podzieli\u0107 si\u0119 swoimi materia\u0142ami.<\/p>\n<h4>Czemu tyle s\u0142\u00f3w? Cykle to przecie\u017c elementarna sprawa!<\/h4>\n<p>\nJak ju\u017c pisa\u0142em wcze\u015bniej, dla praktykuj\u0105cych programist\u00f3w i silnych student\u00f3w trudno\u015b\u0107 koncepcji cykli mo\u017ce by\u0107 niedoceniana. Na przyk\u0142ad mo\u017cna przeprowadzi\u0107 d\u0142ug\u0105 wyk\u0142ad, zobaczy\u0107 kiwaj\u0105ce g\u0142owy i m\u0105dre oczy. Ale podczas rozwi\u0105zywania jakiego\u015b zadania pojawia si\u0119 zawirowanie i niewyt\u0142umaczalne problemy. Po wyk\u0142adzie studenci z pewno\u015bci\u0105 maj\u0105 tylko cz\u0119\u015bciowe zrozumienie. Sytuacj\u0119 pogarsza to, \u017ce studenci nie potrafi\u0105 sami sformu\u0142owa\u0107, w czym dok\u0142adnie tkwi ich b\u0142\u0105d.<br \/>\nPewnego razu u\u015bwiadomi\u0142em sobie, \u017ce studenci postrzegaj\u0105 moje przyk\u0142ady jak hieroglify. To znaczy, jak niepodzielne fragmenty tekstu, w kt\u00f3re nale\u017cy wpisa\u0107 jak\u0105\u015b \u201emagiczn\u0105\u201d liter\u0119, by to zadzia\u0142a\u0142o.<br \/>\nCzasami zauwa\u017ca\u0142em, \u017ce studenci my\u015bl\u0105, \u017ce do rozwi\u0105zania konkretnego zadania potrzebna jest <i>jakakolwiek inna<\/i> konstrukcja, o kt\u00f3rej po prostu jeszcze nie wspomnia\u0142em. Chocia\u017c do rozwi\u0105zania wystarczy\u0142o jedynie nieco zmodyfikowa\u0107 przyk\u0142ad.<\/p>\n<p>Dlatego doszed\u0142em do wniosku, \u017ce nale\u017cy skupi\u0107 si\u0119 nie na sk\u0142adni wyra\u017ce\u0144, ale na idei refaktoryzacji powtarzaj\u0105cego si\u0119 kodu za pomoc\u0105 p\u0119tli. Gdy tylko uczniowie opanuj\u0105 t\u0119 ide\u0119, ka\u017cdy sk\u0142adnia b\u0119dzie przyswajana poprzez ma\u0142e \u0107wiczenia.<\/p>\n<h4>Kogo i po co ucz\u0119<\/h4>\n<p>\nPoniewa\u017c nie ma egzamin\u00f3w wst\u0119pnych, na zaj\u0119ciach mog\u0105 by\u0107 zar\u00f3wno silni, jak i bardzo s\u0142abi studenci. Wi\u0119cej o moich studentach mo\u017cna przeczyta\u0107 w artykule <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">Portret s\u0142uchaczy wieczornych kurs\u00f3w<\/a><\/noindex><br \/>\nD\u0105\u017cy\u0142em do tego, aby programowanie opanowali wszyscy, kt\u00f3rzy tego pragn\u0105.<br \/>\nMoje zaj\u0119cia odbywaj\u0105 si\u0119 indywidualnie, a student p\u0142aci w\u0142asne pieni\u0105dze za ka\u017cde. Wydawa\u0142oby si\u0119, \u017ce studenci b\u0119d\u0105 optymalizowa\u0107 koszty i domaga\u0107 si\u0119 minimum. Jednak ludzie przychodz\u0105 na zaj\u0119cia stacjonarne z \u017cywym nauczycielem nie tylko po wiedz\u0119, ale tak\u017ce po pewno\u015b\u0107, \u017ce zd\u0105\u017cyli przyswoi\u0107 materia\u0142, poczucie post\u0119pu oraz akceptacj\u0119 ze strony eksperta (nauczyciela). Je\u015bli studenci nie b\u0119d\u0105 czuli post\u0119pu w swoim nauczaniu, odejd\u0105. Og\u00f3lnie zaj\u0119cia mo\u017cna tak budowa\u0107, aby studenci odczuwali post\u0119p w zwi\u0119kszaj\u0105cej si\u0119 liczbie znanych konstrukcji. To znaczy, najpierw dok\u0142adnie badamy while, potem uczymy si\u0119 for, potem do while i oto mamy kurs na tysi\u0105c i jedn\u0105 noc, w kt\u00f3rym przez dwa miesi\u0105ce uczymy si\u0119 tylko p\u0119tli, a na ko\u0144cu \u2014 student, kt\u00f3ry od dyktanda napisa\u0142 standardow\u0105 bibliotek\u0119. Jednak do rozwi\u0105zywania praktycznych zada\u0144 potrzebna jest nie tylko znajomo\u015b\u0107 materia\u0142u, ale tak\u017ce samodzielno\u015b\u0107 w jego zastosowaniu i w poszukiwaniu nowych informacji. Dlatego w przypadku kurs\u00f3w stacjonarnych uwa\u017cam za s\u0142uszne podej\u015bcie \u2014 nauczy\u0107 minimum i zach\u0119ca\u0107 do samodzielnego studiowania niuans\u00f3w i pokrewnych temat\u00f3w. W temacie p\u0119tli minimum stanowi konstrukcja while. Na jej podstawie mo\u017cna zrozumie\u0107 zasad\u0119. Znaj\u0105c zasad\u0119, mo\u017cna samodzielnie opanowa\u0107 for i do-while.<\/p>\n<p>Aby osi\u0105gn\u0105\u0107 przyswojenie materia\u0142u przez s\u0142abszych uczni\u00f3w, opisanie sk\u0142adni nie wystarczy. Nale\u017cy zadawa\u0107 wi\u0119cej prostych, ale r\u00f3\u017cnorodnych zada\u0144 i dok\u0142adniej opisywa\u0107 przyk\u0142ady. Ostatecznie pr\u0119dko\u015b\u0107 przyswajania ogranicza zdolno\u015b\u0107 ucznia do przekszta\u0142cania wyra\u017ce\u0144 i wyszukiwania wzorc\u00f3w. Dla inteligentnych uczni\u00f3w wi\u0119kszo\u015b\u0107 zada\u0144 b\u0119dzie nudna. Podczas zaj\u0119\u0107 z nimi, nie trzeba upiera\u0107 si\u0119 przy rozwi\u0105zaniu 100% zada\u0144. M\u00f3j materia\u0142 mo\u017cna zobaczy\u0107 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">moim GitHubie<\/a><\/noindex>. Jednak repozytorium bardziej przypomina grimuar czarodzieja \u2014 nikt, poza mn\u0105, nie zrozumie, co gdzie si\u0119 znajduje, a je\u015bli si\u0119 zawali kontrola, mo\u017cna zwariowa\u0107.<\/p>\n<h4>Metodyka koncentruje si\u0119 na praktyce.<\/h4>\n<p>\nTeoria jest wyja\u015bniana na przyk\u0142adzie rozwi\u0105zywania zada\u0144. Na zaj\u0119ciach wprowadzaj\u0105cych do programowania, gdzie uczone s\u0105 instrukcje warunkowe i p\u0119tle, po prostu nie da si\u0119 zorganizowa\u0107 u\u017cytecznej wyk\u0142adu na jeden temat przez ca\u0142\u0105 godzin\u0119. 15-20 minut wystarcza, aby wyja\u015bni\u0107 koncepcj\u0119. G\u0142\u00f3wne trudno\u015bci pojawiaj\u0105 si\u0119 podczas wykonywania zada\u0144 praktycznych.<br \/>\nZaczynaj\u0105cy nauczyciele mog\u0105 wyk\u0142ada\u0107 operatory, instrukcje warunkowe, p\u0119tle i tablice na jednej lekcji. Tylko uczniowie napotkaj\u0105 problem z przyswajaniem tych informacji.<br \/>\nTrzeba nie tylko opowiedzie\u0107 materia\u0142, ale tak\u017ce upewni\u0107 si\u0119, \u017ce s\u0142uchacze go zrozumieli.<\/p>\n<p>Fakt przyswojenia tematu okre\u015bla si\u0119 po tym, jak ucze\u0144 radzi sobie z prac\u0105 samodzieln\u0105. <br \/>\nJe\u015bli uczniowi uda\u0142o si\u0119 rozwi\u0105za\u0107 zadanie na temat bez pomocy nauczyciela, to znaczy, \u017ce temat zosta\u0142 przyswojony. Aby zapewni\u0107 samodzieln\u0105 kontrol\u0119, do ka\u017cdego zadania do\u0142\u0105czona jest tabela z testowymi scenariuszami. Zadania maj\u0105 wyra\u017anie okre\u015blon\u0105 kolejno\u015b\u0107. Nie zaleca si\u0119 pomijania zada\u0144. Je\u015bli obecne zadanie jest zbyt trudne, sens przechodzenia do nast\u0119pnego jest znikomy. Ono jest jeszcze trudniejsze. Aby ucze\u0144 m\u00f3g\u0142 poradzi\u0107 sobie z bie\u017c\u0105cym trudnym zadaniem, t\u0142umaczone mu s\u0105 r\u00f3\u017cne techniki na przyk\u0142adzie pierwszego zadania. W\u0142a\u015bciwie ca\u0142a tre\u015b\u0107 tematu sprowadza si\u0119 do technik pokonywania trudno\u015bci. P\u0119tle to raczej efekty uboczne.<\/p>\n<p>Pierwsze zadanie zawsze jest przyk\u0142adem. Drugie r\u00f3\u017cni si\u0119 niewiele i jest wykonywane \"samodzielnie\" natychmiast po pierwszym pod czujnym okiem nauczyciela. Wszystkie kolejne zadania maj\u0105 na celu zwr\u00f3cenie uwagi na r\u00f3\u017cne szczeg\u00f3\u0142y, kt\u00f3re mog\u0105 prowadzi\u0107 do nieporozumie\u0144.<\/p>\n<p>Wyja\u015bnienie przyk\u0142adu to dialog, w kt\u00f3rym student musi wykona\u0107 propagacj\u0119 wsteczn\u0105 oraz walidacj\u0119 krzy\u017cow\u0105, aby upewni\u0107 si\u0119, \u017ce opanowa\u0142 cz\u0119\u015b\u0107 materia\u0142u.<\/p>\n<p>B\u0119d\u0119 bana\u0142em i stwierdz\u0119, \u017ce pierwszy przyk\u0142ad na temat - jest bardzo wa\u017cny. Posiadaj\u0105c materia\u0142 do szerokiej pracy samodzielnej, mo\u017cna naprawi\u0107 pomini\u0119cia pierwszego przyk\u0142adu. Je\u015bli poza przyk\u0142adem nie ma nic wi\u0119cej, to student prawdopodobnie nie opanuje tematu.<\/p>\n<h4>While czy for?<\/h4>\n<p>\nJednym z kontrowersyjnych pyta\u0144 jest wyb\u00f3r konstrukcji do przyk\u0142adu: while czy for. Pewnego razu m\u00f3j znajomy praktykuj\u0105cy programista bez do\u015bwiadczenia w nauczaniu przez godzin\u0119 przekonywa\u0142 mnie, \u017ce p\u0119tla for jest najprostsza do zrozumienia. Argumenty sprowadza\u0142y si\u0119 do \"wszystko jest zrozumia\u0142e i uporz\u0105dkowane\". Jednak prawdziwym \u017ar\u00f3d\u0142em trudno\u015bci dla pocz\u0105tkuj\u0105cych jest sama idea p\u0119tli, a nie jej zapis. Je\u017celi kto\u015b nie zrozumie tej idei, b\u0119dzie mia\u0142 trudno\u015bci ze sk\u0142adni\u0105. Gdy tylko idea zostanie zrozumiana, problemy z formatowaniem kodu znikaj\u0105 same.<\/p>\n<p>W moich materia\u0142ach temat p\u0119tli nast\u0119puje po temacie warunk\u00f3w. Zewn\u0119trzne podobie\u0144stwo if i while pozwala na bezpo\u015bredni\u0105 analogi\u0119: \"gdy warunek w nag\u0142\u00f3wku jest prawdziwy, wykonuje si\u0119 cia\u0142o\". Specyfika p\u0119tli polega jedynie na tym, \u017ce cia\u0142o jest wykonywane wiele razy.<\/p>\n<p>M\u00f3j drugi argument jest taki, \u017ce while wymaga mniej formatowania ni\u017c for. Mniej formatowania - mniej g\u0142upich b\u0142\u0119d\u00f3w z pomini\u0119tymi przecinkami i nawiasami. U pocz\u0105tkuj\u0105cych uwaga i dok\u0142adno\u015b\u0107 nie s\u0105 jeszcze na tyle rozwini\u0119te, \u017ceby automatycznie unika\u0107 b\u0142\u0119d\u00f3w sk\u0142adniowych.<br \/>\nTrzeci argument - w wielu dobrych ksi\u0105\u017ckach while wyja\u015bnia si\u0119 jako pierwszy.<\/p>\n<p>Je\u017celi studentowi udaje si\u0119 \u0142atwo przekszta\u0142ca\u0107 wyra\u017cenia, mo\u017cna wspomnie\u0107 o for mimochodem. Student p\u00f3\u017aniej sam wybierze, co mu bardziej odpowiada. Je\u015bli jednak przekszta\u0142cenia sprawiaj\u0105 trudno\u015bci, lepiej nie rozprasza\u0107 uwagi. Niech najpierw student rozwi\u0105zuje wszystko przy u\u017cyciu while. Kiedy temat p\u0119tli zostanie opanowany, mo\u017cna przepisa\u0107 rozwi\u0105zania, aby \u0107wiczy\u0107 przekszta\u0142canie while na for.<br \/>\nP\u0119tle z warunkiem ko\u0144cowym to do\u015b\u0107 rzadki zjawisko. Na ten temat w og\u00f3le nie po\u015bwi\u0119cam czasu. Je\u015bli student opanowa\u0142 idee wykrywania wzorc\u00f3w i przekszta\u0142cania wyra\u017ce\u0144, poradzi sobie bez mojej pomocy.<\/p>\n<p>Podczas prezentacji pierwszego przyk\u0142adu silnym studentom zwracam uwag\u0119 na to, \u017ce w pierwszym przyk\u0142adzie wa\u017cne jest, aby utrwali\u0107 nie tylko rozwi\u0105zanie, ale tak\u017ce ca\u0142\u0105 sekwencj\u0119 dzia\u0142a\u0144, kt\u00f3re doprowadzi\u0142y do wyniku. Lenistwo student\u00f3w mo\u017ce prowadzi\u0107 do tego, \u017ce zaniedbaj\u0105 spisanie krok\u00f3w i przeka\u017c\u0105 sobie jedynie ko\u0144cowy algorytm. Nale\u017cy ich przekona\u0107, \u017ce kiedy\u015b napotkaj\u0105 trudne zadanie. Aby je rozwi\u0105za\u0107, trzeba b\u0119dzie post\u0119powa\u0107 krok po kroku, jak w tym przyk\u0142adzie. Dlatego tak wa\u017cne jest, aby uwieczni\u0107 wszystkie etapy. W nast\u0119pnych zadaniach mo\u017cna b\u0119dzie zostawi\u0107 tylko ostateczn\u0105 wersj\u0119 rozwi\u0105zania.<\/p>\n<p>G\u0142\u00f3wna idea automatyzacji polega na tym, \u017ce zlecaj\u0105c komputerowi wykonywanie rutynowej pracy za cz\u0142owieka. Jednym z podstawowych sposob\u00f3w jest pisanie p\u0119tli. Zastosowuje si\u0119 je, gdy w programie realizuje si\u0119 kilka tych samych powtarzaj\u0105cych si\u0119 dzia\u0142a\u0144 pod rz\u0105d.<\/p>\n<h4>Jawne jest lepsze ni\u017c domy\u015blne<\/h4>\n<p>\nMo\u017ce si\u0119 wydawa\u0107 dobr\u0105 my\u015bl\u0105 w pierwszym zadaniu dotycz\u0105cym p\u0119tli wy\u015bwietlenie na ekranie jakiego\u015b powtarzaj\u0105cego si\u0119 zdania kilka razy. Na przyk\u0142ad:<\/p>\n<blockquote><p>Hurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!<br \/>\nHurra, dzia\u0142a!\n<\/p><\/blockquote>\n<p>\nTaka opcja jest z\u0142a, poniewa\u017c w wyniku nie wida\u0107 warto\u015bci licznika. To problem dla pocz\u0105tkuj\u0105cych. Nie nale\u017cy go lekcewa\u017cy\u0107. Na pocz\u0105tku to zadanie by\u0142o pierwsze, a zadanie dotycz\u0105ce wy\u015bwietlania ci\u0105gu liczb w porz\u0105dku rosn\u0105cym \u2014 drugie. Trzeba by\u0142o wprowadza\u0107 dodatkowe terminy \u201ep\u0119tla N razy\u201d i \u201ep\u0119tla od A do B\u201d, kt\u00f3re w istocie s\u0105 tym samym. Aby nie mno\u017cy\u0107 zb\u0119dnych byt\u00f3w, postanowi\u0142em pokaza\u0107 tylko przyk\u0142ad z wy\u015bwietlaniem ci\u0105gu liczb. Niewielu udaje si\u0119 bez przygotowania nauczy\u0107 si\u0119 utrzyma\u0107 w g\u0142owie licznik i modelowa\u0107 zachowanie programu w my\u015bli. Niekt\u00f3rzy studenci po raz pierwszy stykaj\u0105 si\u0119 z modelowaniem \u201ew my\u015blach\u201d na temat p\u0119tli.<br \/>\nPo pewnej praktyce zadanie polegaj\u0105ce na powtarzaniu tego samego tekstu zadaj\u0119 do samodzielnego rozwi\u0105zania. Je\u015bli najpierw podam widoczny licznik, a potem niewidoczny, studenci maj\u0105 mniej problem\u00f3w. Czasami wystarczy podpowied\u017a \u201enie pisz licznika na ekranie\u201d.<\/p>\n<h4>Jak to jest wyja\u015bniane u innych?<\/h4>\n<p>\nW wi\u0119kszo\u015bci materia\u0142\u00f3w dydaktycznych w Internecie sk\u0142adnia p\u0119tli przedstawiana jest w ramach \u201ewyk\u0142adu\u201d. Na przyk\u0142ad na developer.mozilla.org (obecnie) razem z p\u0119tl\u0105 while opisanych jest jeszcze kilka konstrukcji. Przy tym podawane s\u0105 wy\u0142\u0105cznie same konstrukcje w postaci szablon\u00f3w. Wynik ich uruchomienia opisywany jest s\u0142owami, a ilustracja jest nieobecna. Moim zdaniem, taki spos\u00f3b prezentacji tematu ca\u0142kowicie ogranicza u\u017cyteczno\u015b\u0107 takich materia\u0142\u00f3w. Ucze\u0144 mo\u017ce przepisa\u0107 kod i uruchomi\u0107 go sam, ale etalon do por\u00f3wnania i tak jest potrzebny. Jak zrozumie\u0107, \u017ce przyk\u0142ad zosta\u0142 poprawnie przepisany, je\u015bli nie ma czego por\u00f3wna\u0107 z wynikiem?<br \/>\nKiedy podany jest tylko szablon, bez przyk\u0142adu, studentowi staje si\u0119 jeszcze trudniej. Jak zrozumie\u0107, \u017ce fragmenty kodu s\u0105 umieszczone w szablonie poprawnie? Mo\u017cna spr\u00f3bowa\u0107 napisa\u0107 <i>jako\u015b<\/i>, a potem uruchomi\u0107. Ale je\u015bli nie ma etalonu do por\u00f3wnania wyniku, to uruchomienie r\u00f3wnie\u017c nie pomo\u017ce.<\/p>\n<p>W kursie z C++ na intuicie sk\u0142adnia p\u0119tli jest zawarta na trzeciej stronie wyk\u0142adu 4 na temat \u201eoperatory\u201d. Podczas wyja\u015bniania sk\u0142adni p\u0119tli szczeg\u00f3ln\u0105 uwag\u0119 zwraca si\u0119 na termin \u201eoperator\u201d. Termin ten przedstawiany jest w formie zbioru fakt\u00f3w, takich jak \u201esymbol; to operator\u201d, \u201e{} to operator z\u0142o\u017cony\u201d, \u201ecia\u0142o p\u0119tli musi by\u0107 operatorem\u201d. Taki spos\u00f3b my\u015blenia nie podoba mi si\u0119, poniewa\u017c w jaki\u015b spos\u00f3b ukrywa wa\u017cne powi\u0105zania pod jednym terminem. Analiza kodu \u017ar\u00f3d\u0142owego programu na poziomie takich termin\u00f3w jest potrzebna programistom kompilator\u00f3w do realizacji specyfikacji j\u0119zyka, ale nie studentom na wst\u0119pnym etapie. Nowicjusze w programowaniu rzadko maj\u0105 wystarczaj\u0105c\u0105 skrupulatno\u015b\u0107, aby tak dok\u0142adnie podchodzi\u0107 do termin\u00f3w. Rzadko kto zapami\u0119tuje i rozumie nowe s\u0142owa za pierwszym razem. Praktycznie nikt nie potrafi poprawnie zastosowa\u0107 terminu, kt\u00f3ry dopiero co pozna\u0142. Dlatego studenci pope\u0142niaj\u0105 mn\u00f3stwo b\u0142\u0119d\u00f3w, takich jak \u201enapisa\u0142em while(a &lt; 7);{, a program nie dzia\u0142a\u201d.<br \/>\nMoim zdaniem, na pocz\u0105tku lepiej jest poda\u0107 sk\u0142adni\u0119 konstrukcji od razu ze wszystkimi nawiasami. Opcj\u0119 bez nawias\u00f3w nale\u017cy wyja\u015bnia\u0107 tylko w przypadku, gdy ucze\u0144 zada konkretne pytanie \u201edlaczego tu bez nawias\u00f3w i dzia\u0142a?\u201d.<\/p>\n<p>W ksi\u0105\u017cce Okulowa \u201ePodstawy programowania\u201d z 2012 roku wprowadzenie do p\u0119tli zaczyna si\u0119 od szablonu for, nast\u0119pnie podane s\u0105 zalecenia dotycz\u0105ce jego u\u017cycia, a potem od razu przechodzi si\u0119 do eksperymentalnej cz\u0119\u015bci zaj\u0119\u0107. Rozumiem, \u017ce ksi\u0105\u017cka zosta\u0142a napisana dla tego mniejszo\u015bci bardzo utalentowanych uczni\u00f3w, kt\u00f3rzy rzadko przychodz\u0105 na moje zaj\u0119cia.<\/p>\n<p>W popularnych ksi\u0105\u017ckach zawsze podawany jest wynik fragment\u00f3w kodu. Na przyk\u0142ad w ksi\u0105\u017cce Schildta \u201eJava 8. Pe\u0142ne przewodnictwo\u201d z 2015 roku. Najpierw podany jest szablon, potem przyk\u0142ad programu, a zaraz po nim \u2014 wynik wykonania.<\/p>\n<blockquote><p>Jako przyk\u0142ad rozwa\u017cmy p\u0119tl\u0119 while, w kt\u00f3rej wykonywany jest odwr\u00f3cony<br \/>\nodczyt, zaczynaj\u0105c od 10, i wy\u015bwietlane jest dok\u0142adnie 10 linii \u201etakty\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>\nPo uruchomieniu ten program wy\u015bwietla dziesi\u0119\u0107 \u201etakty\u201d w nast\u0119puj\u0105cy spos\u00f3b:<br \/>\n<code>tak 10<br \/>\ntak 9<br \/>\ntak 8<br \/>\ntak 7<br \/>\ntak 6<br \/>\ntak 5<br \/>\ntak 4<br \/>\ntak 3<br \/>\ntak 2<br \/>\ntak 1<\/code><\/p><\/blockquote>\n<p>\nPodej\u015bcie z opisem szablonu, przyk\u0142adu programu i wyniku dzia\u0142ania tego programu jest r\u00f3wnie\u017c u\u017cywane w ksi\u0105\u017cce \u201eJavascript dla dzieci\u201d i w kursie js na w3schools.com. Format strony internetowej nawet umo\u017cliwia zrobienie tego przyk\u0142adu interaktywnym.<\/p>\n<p>W ksi\u0105\u017cce Stroustrupa \u201eZasady i praktyka przy u\u017cyciu C++\u201d z 2016 roku autor poszed\u0142 jeszcze dalej. Najpierw wyja\u015bnia, jaki wynik powinien powsta\u0107, a dopiero potem pokazuje tekst programu. Co wi\u0119cej, jako przyk\u0142ad nie bior\u0105 po prostu losowego programu, lecz oferuj\u0105 rzut oka w histori\u0119. To pomaga zwr\u00f3ci\u0107 uwag\u0119 na to \u201eSp\u00f3jrz, to nie jest tylko jaki\u015b bezu\u017cyteczny tekst. Widzisz co\u015b znacz\u0105cego\u201d.<\/p>\n<blockquote><p>Jako przyk\u0142ad iteracji rozwa\u017cmy pierwszy program wykonany na maszynie z pami\u0119ci\u0105 programu (EDSAC). Zosta\u0142 on napisany przez Davida Wheelera w laboratorium komputerowym Uniwersytetu w Cambridge w Anglii 6 maja 1949 roku. Ten program oblicza i drukuje prost\u0105 list\u0119 kwadrat\u00f3w.<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 \/>\nTutaj w ka\u017cdej linii znajduje si\u0119 liczba, po kt\u00f3rej nast\u0119puje znak tabulacji (&#8216;t&#8217;) oraz kwadrat tej liczby. Wersja tego programu w j\u0119zyku C++ wygl\u0105da tak:<\/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>\nCiekawe, \u017ce szablon sk\u0142adni w tej ksi\u0105\u017cce nie jest opisywany. Stroustrup w przewodniku dla nauczycieli (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">t\u0142umaczenie<\/a><\/noindex>) k\u0142adzie nacisk na to, \u017ce szanuje inteligencj\u0119 swoich student\u00f3w. By\u0107 mo\u017ce umiej\u0119tno\u015b\u0107 dostrzegania wzoru w kilku przyk\u0142adach jest uznawana za przejaw takiej inteligencji.<\/p>\n<h4>Jak ja sam t\u0142umacz\u0119<\/h4>\n<p>\nPodej\u015bcie Stroustrupa: opis wyniku, nast\u0119pnie rozwi\u0105zanie problemu, a potem samodzielna analiza przez studenta \u2014 wydaje si\u0119 najbardziej przemy\u015blane. Dlatego postanowi\u0142em wzi\u0105\u0107 za podstaw\u0119 w\u0142a\u015bnie to, ale opowiedzie\u0107 na mniej historycznym przyk\u0142adzie \u2014 zadaniu dotycz\u0105cym wy\u015bwietlenia \u00abspisu tre\u015bci\u00bb. Tworzy to rozpoznawalny punkt zaczepienia, dzi\u0119ki kt\u00f3remu mo\u017cna p\u00f3\u017aniej powiedzie\u0107 \u201eprzypomnij sobie zadanie o spisie tre\u015bci\u201d i aby studenci dok\u0142adnie to zapami\u0119tywali. W swoim przyk\u0142adzie stara\u0142em si\u0119 r\u00f3wnie\u017c ostrzec przed dwoma z najcz\u0119stszych b\u0142\u0119d\u00f3w. P\u00f3\u017aniej opisz\u0119 je dok\u0142adniej.<\/p>\n<blockquote><p>W tym zadaniu poznajemy techniki rozwi\u0105zywania skomplikowanych problem\u00f3w. Pocz\u0105tkowe rozwi\u0105zanie powinno by\u0107 proste i prymitywne. A potem mo\u017cemy pomy\u015ble\u0107, jak to rozwi\u0105zanie ulepszy\u0107.<br \/>\n<code>Wprowadzenie<br \/>\nRozdzia\u0142 1<br \/>\nRozdzia\u0142 2<br \/>\nRozdzia\u0142 3<br \/>\nRozdzia\u0142 4<br \/>\nRozdzia\u0142 5<br \/>\nRozdzia\u0142 6<br \/>\nRozdzia\u0142 7<br \/>\nPodsumowanie<\/code><\/p><\/blockquote>\n<p>\nZ moich obserwacji wynika, \u017ce podej\u015bcie \u201eszablon-przyk\u0142ad-wynik\u201d w r\u00f3\u017cnych kombinacjach i tak prowadzi do tego, \u017ce studenci postrzegaj\u0105 p\u0119tl\u0119 jako hieroglif. Przejawia\u0142o si\u0119 to tym, \u017ce nie rozumieli, po co tam pisa\u0107 warunek, jak wybiera\u0107 mi\u0119dzy i++ a i-- oraz inne, wydaj\u0105ce si\u0119 oczywiste rzeczy. Aby unikn\u0105\u0107 tych nieporozumie\u0144, podej\u015bcie do omawiania p\u0119tli powinno podkre\u015bla\u0107 sens powtarzania identycznych dzia\u0142a\u0144, a dopiero potem \u2013 ich form\u0119 za pomoc\u0105 konstrukcji. Dlatego zanim podam sk\u0142adni\u0119 p\u0119tli, trzeba rozwi\u0105za\u0107 problem \u201eprosto\u201d. Prymitywne rozwi\u0105zanie problemu og\u0142oszenia wygl\u0105da tak:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Wprowadzenie\");\nConsole.WriteLine(\"Rozdzia\u0142 1\");\nConsole.WriteLine(\"Rozdzia\u0142 2\");\nConsole.WriteLine(\"Rozdzia\u0142 3\");\nConsole.WriteLine(\"Rozdzia\u0142 4\");\nConsole.WriteLine(\"Rozdzia\u0142 5\");\nConsole.WriteLine(\"Rozdzia\u0142 6\");\nConsole.WriteLine(\"Rozdzia\u0142 7\");\nConsole.WriteLine(\"Podsumowanie\");\n<\/code><\/pre>\n<p>\nJak mo\u017cna to poprawi\u0107?<br \/>\nZast\u0105pi\u0107 jednorodne dzia\u0142ania p\u0119tl\u0105.<br \/>\nJakie dzia\u0142ania tutaj powtarzaj\u0105 si\u0119 kolejno bez zmian?<br \/>\nW tym fragmencie takich nie ma. Z kolei polecenia do wy\u015bwietlania s\u0142owa \u201eRozdzia\u0142\u201d z numerem s\u0105 bardzo podobne do siebie.<br \/>\nDlatego nast\u0119pnym krokiem jest poszukiwanie r\u00f3\u017cnic mi\u0119dzy fragmentami. Tylko w tym zadaniu wszystko jest oczywiste, potem b\u0119d\u0105 si\u0119 powtarza\u0107 nie pojedyncze polecenia, ale bloki kodu licz\u0105ce 5 linii i wi\u0119cej. Nale\u017cy szuka\u0107 nie tylko w li\u015bcie polece\u0144, ale r\u00f3wnie\u017c w konstrukcjach warunkowych albo p\u0119tli.<br \/>\nW przyk\u0142adzie r\u00f3\u017cnica mi\u0119dzy poleceniami tkwi w liczbie po s\u0142owie \u201eRozdzia\u0142\u201d.<br \/>\nGdy tylko r\u00f3\u017cnica zostanie znaleziona, nale\u017cy zrozumie\u0107 prawid\u0142owo\u015b\u0107 zmiany. R\u00f3\u017cni\u0105cy si\u0119 fragment to liczba? Czy ona si\u0119 stale zwi\u0119ksza, czy zmniejsza? Jak zmienia si\u0119 warto\u015b\u0107 liczby mi\u0119dzy dwoma s\u0105siednimi poleceniami?<br \/>\nW przyk\u0142adzie liczba po s\u0142owie \u201eRozdzia\u0142\u201d wzrasta o 1. R\u00f3\u017cnica zosta\u0142a znaleziona, a wz\u00f3r odkryty. Teraz mo\u017cemy zast\u0105pi\u0107 r\u00f3\u017cni\u0105cy si\u0119 fragment zmienn\u0105.<br \/>\nTak\u0105 zmienn\u0105 nale\u017cy zadeklarowa\u0107 przed pierwszym z powtarzaj\u0105cych si\u0119 fragment\u00f3w. Zazwyczaj nazywa si\u0119 j\u0105 I lub j, albo w spos\u00f3b bardziej rozwini\u0119ty. Jej pocz\u0105tkowa warto\u015b\u0107 powinna by\u0107 r\u00f3wna pierwszej warto\u015bci wy\u015bwietlanej na ekranie. W przyk\u0142adzie pierwsza warto\u015b\u0107 to 1. <br \/>\nJak\u0105 pocz\u0105tkow\u0105 warto\u015b\u0107 nale\u017cy wybra\u0107 do wy\u015bwietlenia ci\u0105gu liczb \u201e100, 101, 102, 103, 104, 105\u201d?<br \/>\nW tym ci\u0105gu pierwsza liczba to 100.<br \/>\nPo ka\u017cdej komendzie wyj\u015bcia nale\u017cy zwi\u0119kszy\u0107 warto\u015b\u0107 tej zmiennej o 1. Ta jedna to krok zmiany.<br \/>\nJaki krok b\u0119dzie w ci\u0105gu liczb \u201e100, 102, 104, 106\u201d?<br \/>\nW tym ci\u0105gu krok wynosi 2.<br \/>\nPo zast\u0105pieniu r\u00f3\u017cni\u0105cego si\u0119 fragmentu zmienn\u0105, kod b\u0119dzie wygl\u0105da\u0142 tak:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Wprowadzenie\");\nint i;\ni = 0;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Rozdzia\u0142 \" + i);\ni = i + 1;\nConsole.WriteLine(\"Podsumowanie\");\n<\/code><\/pre>\n<p>\nPo zastosowaniu metody \u201ewyrazi\u0107 wz\u00f3r w zmiennej\u201d w kodzie powstaje kilka grup takich samych dzia\u0142a\u0144, kt\u00f3re s\u0105 wykonywane sekwencyjnie. Teraz powtarzaj\u0105ce si\u0119 dzia\u0142ania mo\u017cna zast\u0105pi\u0107 p\u0119tl\u0105.<\/p>\n<p>Sekwencja rozwi\u0105zywania zadania, w kt\u00f3rym nale\u017cy u\u017cy\u0107 p\u0119tli, sk\u0142ada si\u0119 z etap\u00f3w:<\/p>\n<ol>\n<li>Rozwi\u0105za\u0107 \u201ena sztywno\u201d za pomoc\u0105 wielu pojedynczych komend<\/li>\n<li>Znale\u017a\u0107 wz\u00f3r<\/li>\n<li>Wyrazi\u0107 wz\u00f3r w zmiennej<\/li>\n<li>Oformowa\u0107 w postaci p\u0119tli<\/li>\n<\/ol>\n<p>Nast\u0119pnie wprowadza si\u0119 nowe terminy, aby student nie znalaz\u0142 si\u0119 w sytuacji \u201ewszystko rozumiem, ale nie mog\u0119 powiedzie\u0107\u201d:<br \/>\n \u2014 licznik \u2014 zawsze zmienna, kt\u00f3ra jest potrzebna do \u015bledzenia liczby krok\u00f3w p\u0119tli. Zwykle jest to liczba ca\u0142kowita, kt\u00f3ra jest por\u00f3wnywana z ograniczeniem.<br \/>\n \u2014 krok licznika \u2014 opis wzoru zmiany licznika.<br \/>\n \u2014 ograniczenie \u2014 liczba lub zmienna, z kt\u00f3r\u0105 por\u00f3wnywany jest licznik, aby algorytm by\u0142 sko\u0144czony. Warto\u015b\u0107 licznika zmienia si\u0119 w taki spos\u00f3b, aby zbli\u017ca\u0107 si\u0119 do ograniczenia.<br \/>\n \u2014 cia\u0142o p\u0119tli \u2014 zestaw komend, kt\u00f3re b\u0119d\u0105 powtarzane. Kiedy m\u00f3wi si\u0119 \u201ekomenda napisana wewn\u0105trz p\u0119tli\u201d, ma si\u0119 na my\u015bli w\u0142a\u015bnie cia\u0142o.<br \/>\n \u2014 iteracja p\u0119tli \u2014 jednokrotne wykonanie cia\u0142a p\u0119tli.<br \/>\n \u2014 warunek p\u0119tli \u2014 wyra\u017cenie logiczne, od kt\u00f3rego zale\u017cy, czy b\u0119dzie wykonywana kolejna iteracja. (Mo\u017ce to wprowadzi\u0107 w b\u0142\u0105d w kontek\u015bcie struktur warunkowych)<br \/>\nTrzeba by\u0107 przygotowanym na to, \u017ce na pocz\u0105tku studenci b\u0119d\u0105 u\u017cywa\u0107 termin\u00f3w niezgodnie z ich przeznaczeniem. Dotyczy to zar\u00f3wno silnych, jak i s\u0142abych student\u00f3w. Nawi\u0105zanie wsp\u00f3lnego j\u0119zyka to ca\u0142kowita sztuka. Teraz kr\u00f3tk\u0105 wiadomo\u015b\u0107: nale\u017cy postawi\u0107 zadanie \u201ewyodr\u0119bnij fragment kodu z &lt;terminem&gt;\u201d i samemu poprawnie u\u017cywa\u0107 tych termin\u00f3w w rozmowie.<br \/>\nPo przekszta\u0142ceniu z p\u0119tl\u0105 otrzymujemy fragment:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Wprowadzenie\");\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Rozdzia\u0142 &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;Podsumowanie&quot;);<\/code><\/pre>\n<h4>G\u0142\u00f3wne nieporozumienie<\/h4>\n<p>\nJednym z popularnych przekona\u0144 student\u00f3w jest to, \u017ce umieszczaj\u0105 w konstrukcji p\u0119tli takie dzia\u0142ania, kt\u00f3re nale\u017cy wykona\u0107 tylko raz. Na przyk\u0142ad tak:<\/p>\n<pre><code class=\"cs\">;\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Wprowadzenie&quot;)\n    Console.WriteLine(&quot;Rozdzia\u0142 &quot; + i);\n    i = i + 1;\n    Console.WriteLine(&quot;Podsumowanie&quot;);\n}\n<\/code><\/pre>\n<p>\nUczniowie natrafiaj\u0105 na ten problem zar\u00f3wno na pocz\u0105tku, jak i w bardziej z\u0142o\u017conych zadaniach.<br \/>\nKr\u00f3lowa wskaz\u00f3wka w tym przypadku:<\/p>\n<blockquote><p>Ile razy nale\u017cy powt\u00f3rzy\u0107 pisanie komendy: raz czy wiele?\n<\/p><\/blockquote>\n<p>\nKomendy wyj\u015bcia s\u0142\u00f3w \u201eWprowadzenie\u201d i \u201eZako\u0144czenie\u201d, a tak\u017ce deklaracja i inicjalizacja zmiennej i nie s\u0105 podobne do innych powtarzalnych dzia\u0142a\u0144. Wykonywane s\u0105 tylko raz, wi\u0119c nale\u017cy je napisa\u0107 poza cia\u0142em p\u0119tli.<\/p>\n<p>W kodzie powinny pozosta\u0107 wszystkie trzy etapy rozwi\u0105zania, aby mo\u017cna by\u0142o p\u00f3\u017aniej si\u0119 do nich odwo\u0142a\u0107 w razie trudno\u015bci. Pierwsze dwa warianty wystarczy skomentowa\u0107, aby nie przeszkadza\u0142y.<br \/>\nNale\u017cy zwr\u00f3ci\u0107 uwag\u0119 studenta na nast\u0119puj\u0105ce fakty:<br \/>\n \u2014 W warunku p\u0119tli zwykle por\u00f3wnuje si\u0119 licznik i ograniczenie. Licznik mo\u017ce si\u0119 zmienia\u0107 w ciele p\u0119tli, a ograniczenie \u2014 nie. Aby z\u0142ama\u0107 t\u0119 zasad\u0119, nale\u017cy mie\u0107 przekonuj\u0105ce powody.<br \/>\n \u2014 Komendy do wyj\u015bcia s\u0142\u00f3w \u201eWprowadzenie\u201d i \u201eZako\u0144czenie\u201d s\u0105 poza cia\u0142em p\u0119tli. Musimy je wykona\u0107 1 raz. \u201eWprowadzenie\u201d \u2014 przed powt\u00f3rzeniem dzia\u0142a\u0144, \u201eZako\u0144czenie\u201d \u2014 po.<br \/>\nW procesie utrwalania tego tematu, opanowywania nast\u0119pnych, a tak\u017ce radzenia sobie z trudno\u015bciami, nawet silnym studentom przydatne jest zadawanie pytania: \u201eA ile razy nale\u017cy wykona\u0107 t\u0119 czynno\u015b\u0107? Raz czy wiele?\u201d.<\/p>\n<h4>Rozw\u00f3j dodatkowych umiej\u0119tno\u015bci<\/h4>\n<p>\nW trakcie nauki o cyklach studenci praktykuj\u0105 umiej\u0119tno\u015bci diagnostyczne i rozwi\u0105zywania problem\u00f3w. Aby przeprowadzi\u0107 diagnostyk\u0119, student musi wyobrazi\u0107 sobie po\u017c\u0105dany rezultat i por\u00f3wna\u0107 go z rezultatem rzeczywistym. Dzia\u0142ania naprawcze zale\u017c\u0105 od r\u00f3\u017cnicy mi\u0119dzy nimi.<br \/>\nPoniewa\u017c na tym etapie studenci nie maj\u0105 jeszcze wyra\u017anego wyobra\u017cenia o \u00abpo\u017c\u0105danym\u00bb rezultacie, mog\u0105 opiera\u0107 si\u0119 na danych testowych. Zazwyczaj nikt na tym etapie nie rozumie jeszcze, co mo\u017ce p\u00f3j\u015b\u0107 nie tak i jak z tym walczy\u0107. Dlatego podaj\u0119 do zapisania w zeszycie opisy typowych problem\u00f3w i kilka sposob\u00f3w ich rozwi\u0105zania. Wyb\u00f3r najodpowiedniejszego z nich to zadanie samego studenta.<br \/>\nNotatki s\u0105 potrzebne, aby pyta\u0107: \u00abczy uda\u0142o si\u0119 to, co oczekiwano?\u00bb, \u00abkt\u00f3ra z tych sytuacji mia\u0142a miejsce?\u00bb, \u00abczy zastosowane rozwi\u0105zanie pomog\u0142o?\u00bb.<\/p>\n<ol>\n<li>Liczba dzia\u0142a\u0144 jest o 1 mniejsza lub wi\u0119ksza ni\u017c oczekiwano. Sposoby rozwi\u0105zania:<br \/>\n \u2014 zwi\u0119kszy\u0107 pocz\u0105tkow\u0105 warto\u015b\u0107 licznika o 1.<br \/>\n \u2014 zmieni\u0107 \u015bcis\u0142y operator por\u00f3wnania () na niescis\u0142y (=).<br \/>\n \u2014 zmieni\u0107 warto\u015b\u0107 ograniczenia o 1.<\/li>\n<li>Dzia\u0142ania w p\u0119tli s\u0105 wykonywane bez zatrzymania, niesko\u0144czono\u015b\u0107. Sposoby rozwi\u0105zania:<br \/>\n \u2014 doda\u0107 komend\u0119 zmieniaj\u0105c\u0105 licznik, je\u015bli jej brakuje.<br \/>\n \u2014 poprawi\u0107 komend\u0119 zmieniaj\u0105c\u0105 licznik tak, aby jego warto\u015b\u0107 zbli\u017ca\u0142a si\u0119 do ograniczenia.<br \/>\n \u2014 usun\u0105\u0107 komend\u0119 zmieniaj\u0105c\u0105 ograniczenie, je\u015bli znajduje si\u0119 w ciele p\u0119tli.<\/li>\n<li>Liczba dzia\u0142a\u0144 w p\u0119tli jest o wi\u0119cej ni\u017c 1 mniejsza lub wi\u0119ksza ni\u017c oczekiwano. Dzia\u0142anie w p\u0119tli nie zosta\u0142o wykonane ani razu. Najpierw nale\u017cy ustali\u0107 rzeczywiste warto\u015bci zmiennych bezpo\u015brednio przed rozpocz\u0119ciem p\u0119tli. Sposoby rozwi\u0105zania:<br \/>\n \u2014 zmieni\u0107 pocz\u0105tkow\u0105 warto\u015b\u0107 ograniczenia<br \/>\n \u2014 zmieni\u0107 pocz\u0105tkow\u0105 warto\u015b\u0107 licznika<\/li>\n<\/ol>\n<p>\nZazwyczaj problem 3 wyst\u0119puje, gdy u\u017cywana jest niew\u0142a\u015bciwa zmienna lub licznik nie jest zerowany.<\/p>\n<p>Po tym wyja\u015bnieniu, student mo\u017ce wci\u0105\u017c mie\u0107 r\u00f3\u017cne z\u0142udzenia dotycz\u0105ce dzia\u0142ania cykli.<br \/>\nAby rozwia\u0107 najcz\u0119stsze, podaj\u0119 zadania:<\/p>\n<ol>\n<li>W kt\u00f3rej ograniczenie, pocz\u0105tkowa warto\u015b\u0107 licznika lub krok licznika wprowadza u\u017cytkownik.<\/li>\n<li>W kt\u00f3rej warto\u015b\u0107 licznika nale\u017cy wykorzysta\u0107 w jakim\u015b wyra\u017ceniu arytmetycznym. Najlepiej, aby licznik znajdowa\u0142 si\u0119 w wyra\u017ceniu podpieraj\u0105cym lub w mianowniku, aby r\u00f3\u017cnica by\u0142a nieliniowa.<\/li>\n<li>W kt\u00f3rym warto\u015b\u0107 licznika nie jest wy\u015bwietlana na ekranie podczas dzia\u0142ania p\u0119tli. Na przyk\u0142ad wy\u015bwietlenie potrzebnej liczby identycznych fragment\u00f3w tekstu lub narysowanie figury grafik\u0105 \u017c\u00f3\u0142wiow\u0105.<\/li>\n<li>W kt\u00f3rym najpierw nale\u017cy wykona\u0107 jedne powtarzaj\u0105ce si\u0119 dzia\u0142ania, a potem inne.<\/li>\n<li>W kt\u00f3rym nale\u017cy wykona\u0107 inne dzia\u0142ania przed i po powtarzaj\u0105cych si\u0119.<\/li>\n<\/ol>\n<p>\nDla ka\u017cdego zadania nale\u017cy przygotowa\u0107 dane testowe oraz oczekiwany wynik.<\/p>\n<p>Aby zrozumie\u0107, jak szybko mo\u017cna si\u0119 porusza\u0107, nale\u017cy da\u0107 przeczyta\u0107 warunki tych zada\u0144 i zapyta\u0107: \u201eczym r\u00f3\u017cni\u0105 si\u0119 od przyk\u0142adu?\u201d, \u201eCo nale\u017cy zmieni\u0107 w przyk\u0142adzie, aby je rozwi\u0105za\u0107?\u201d. Je\u015bli student odpowiada sensownie, niech rozwi\u0105\u017ce przynajmniej jedno podczas zaj\u0119\u0107, a pozosta\u0142e \u2014 w domu samodzielnie. Je\u015bli rozwi\u0105zanie b\u0119dzie udane, mo\u017cna rozpocz\u0105\u0107 wyja\u015bnienie dotycz\u0105ce warunk\u00f3w wewn\u0105trz p\u0119tli.<br \/>\nJe\u015bli pojawiaj\u0105 si\u0119 trudno\u015bci z samodzielnym rozwi\u0105zaniem, nale\u017cy wszystko przepracowa\u0107 na zaj\u0119ciach. Aby rozwi\u0105zanie zadania nie przypomina\u0142o rysowania sowy, zalecam najpierw rozwi\u0105zanie zadania w spos\u00f3b nieog\u00f3lny. To znaczy tak, aby rozwi\u0105zanie przechodzi\u0142o pierwszy test i nie u\u017cywa\u0142o konstrukcji p\u0119tli. A potem zastosowa\u0107 przekszta\u0142cenia, aby uzyska\u0107 og\u00f3lno\u015b\u0107 rozwi\u0105zania.<\/p>\n<h4>P\u0119tle i rozga\u0142\u0119zienia<\/h4>\n<p>\nMoim zdaniem, warto oddzielnie poruszy\u0107 temat \u201ep\u0119tle wewn\u0105trz rozga\u0142\u0119zie\u0144\u201d. Tak, aby p\u00f3\u017aniej by\u0142o wida\u0107 r\u00f3\u017cnic\u0119 mi\u0119dzy wielokrotnym sprawdzaniem warunku a jednokrotnym.<br \/>\nZadania do utrwalenia b\u0119d\u0105 dotyczy\u0142y wy\u015bwietlania liczb od A do B, kt\u00f3re wprowadza u\u017cytkownik:<br \/>\n \u2014 zawsze w porz\u0105dku rosn\u0105cym.<br \/>\n \u2014 w porz\u0105dku rosn\u0105cym lub malej\u0105cym w zale\u017cno\u015bci od warto\u015bci A i B.<\/p>\n<p>Do tematu \u201ebranching within loops\u201d nale\u017cy przej\u015b\u0107 dopiero po opanowaniu technik: \u201ezamiana wzoru na zmienn\u0105\u201d oraz \u201ezamiana powtarzaj\u0105cych si\u0119 dzia\u0142a\u0144 na p\u0119tl\u0119\u201d.<br \/>\nG\u0142\u00f3wny pow\u00f3d stosowania rozga\u0142\u0119zie\u0144 wewn\u0105trz p\u0119tli \u2014 anomalie w wzorze. W \u015brodku jest zak\u0142\u00f3cana w zale\u017cno\u015bci od danych wej\u015bciowych.<br \/>\nUczniom, kt\u00f3rzy potrafi\u0105 szuka\u0107 rozwi\u0105zania poprzez \u0142\u0105czenie prostych technik, wystarczy powiedzie\u0107: \u201erozga\u0142\u0119zienia mo\u017cna pisa\u0107 wewn\u0105trz p\u0119tli\u201d i da\u0107 zadanie \u201ena przyk\u0142ad\u201d ca\u0142kowicie do samodzielnego rozwi\u0105zania.<br \/>\nZadanie na przyk\u0142ad:<\/p>\n<blockquote><p>U\u017cytkownik wprowadza liczb\u0119 X. Wy\u015bwietl w kolumnie liczby od 0 do 9 i umie\u015b\u0107 znak \u2018+\u2019 obok tej liczby, kt\u00f3ra jest r\u00f3wna X.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Je\u015bli wprowadzono 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\">Je\u015bli wprowadzono 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\">Je\u015bli wprowadzono 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\">Je\u015bli wprowadzono 777<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p>Je\u015bli brakuje kr\u00f3tkiego wyja\u015bnienia, aby napisa\u0107 z u\u017cyciem p\u0119tli, nale\u017cy d\u0105\u017cy\u0107 do uniwersalnego rozwi\u0105zania tego samego zadania bez p\u0119tli.<br \/>\nB\u0119dzie to jedna z dw\u00f3ch opcji:<br \/>\n<b class=\"spoiler_title\">Po\u017c\u0105dany<\/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\">Mo\u017cliwe<\/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>Podobne zadanie daj\u0119 z wyprzedzeniem, podczas studiowania tematu dotycz\u0105cego rozga\u0142\u0119zie\u0144.<br \/>\nJe\u015bli student uzyska opcj\u0119 \u201emo\u017cliw\u0105\u201d, nale\u017cy powiedzie\u0107, \u017ce tego samego zadania mo\u017ce by\u0107 wiele rozwi\u0105za\u0144. Jednak r\u00f3\u017cni\u0105 si\u0119 one odporno\u015bci\u0105 na zmiany wymaga\u0144. Zadaj pytanie: \u201eIle miejsc w kodzie trzeba b\u0119dzie poprawi\u0107, je\u015bli trzeba b\u0119dzie doda\u0107 jeszcze jedn\u0105 liczb\u0119?\u201d W \u201emo\u017cliwej\u201d opcji b\u0119dzie trzeba doda\u0107 jeszcze jedn\u0105 ga\u0142\u0105\u017a i dopisa\u0107 zupe\u0142nie nowe liczby w 10 innych miejscach. W \u201epo\u017c\u0105danej\u201d wystarczy doda\u0107 tylko jedn\u0105 ga\u0142\u0105\u017a.<br \/>\nPostaw zadanie odtworzenia \u201epo\u017c\u0105danego\u201d wariantu, nast\u0119pnie znajd\u017a w kodzie regularno\u015b\u0107, wykonaj zamian\u0119 zmiennej i napisz p\u0119tl\u0119.<br \/>\nJe\u015bli masz pomys\u0142, jak rozwi\u0105za\u0107 to zadanie bez p\u0119tli w inny spos\u00f3b, prosz\u0119 napisz to w komentarzach.<\/p>\n<h4>P\u0119tle wewn\u0105trz p\u0119tli<\/h4>\n<p>\nW tym temacie trzeba zwr\u00f3ci\u0107 uwag\u0119 na to, \u017ce:<br \/>\n \u2014 liczniki dla zewn\u0119trznej i wewn\u0119trznej p\u0119tli musz\u0105 by\u0107 r\u00f3\u017cnymi zmiennymi.<br \/>\n \u2014 licznik dla wewn\u0119trznej p\u0119tli nale\u017cy zerowa\u0107 wiele razy (tj. w ciele p\u0119tli zewn\u0119trznej).<br \/>\n W zadaniach zwi\u0105zanych z wy\u015bwietlaniem tekstu nie mo\u017cna najpierw wypisa\u0107 jednej litery w kilku wierszach, a potem drugiej. Nale\u017cy najpierw wypisa\u0107 wszystkie litery pierwszego wiersza, potem wszystkie litery drugiego i tak dalej.<\/p>\n<p>Wyja\u015bnienie tematu dotycz\u0105cego p\u0119tli wewn\u0119trznych najlepiej rozpocz\u0105\u0107 od om\u00f3wienia znaczenia zerowania licznika.<br \/>\nZadanie na przyk\u0142ad:<\/p>\n<blockquote><p>U\u017cytkownik wprowadza dwie liczby: R i T. Wy\u015bwietl dwie linie znak\u00f3w \"#\". W pierwszej linii powinno by\u0107 R sztuk znak\u00f3w. W drugiej linii T sztuk. Je\u015bli kt\u00f3rakolwiek liczba b\u0119dzie ujemna, wy\u015bwietl komunikat o b\u0142\u0119dzie.<\/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>Warto\u015b\u0107 R musi by\u0107 nieujemna.<\/p>\n<p><b class=\"spoiler_title\">R=6, T=-2<\/b>Warto\u015b\u0107 T musi by\u0107 nieujemna.<\/p>\n<p>Oczywi\u015bcie, \u017ce to zadanie ma co najmniej dwa mo\u017cliwe rozwi\u0105zania.<br \/>\n<b class=\"spoiler_title\">Po\u017c\u0105dany<\/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\">Mo\u017cliwo\u015b\u0107 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>R\u00f3\u017cnica polega na tym, \u017ce w 'mo\u017cliwo\u015bci' do wypisania drugiej linii u\u017cyto drugiej zmiennej. Nale\u017cy nalega\u0107 na zastosowanie tej samej zmiennej dla obu p\u0119tli. Mo\u017cna to uzasadni\u0107 tym, \u017ce rozwi\u0105zanie z jednym licznikiem dla dw\u00f3ch p\u0119tli b\u0119dzie ilustracj\u0105 terminu 'zerowanie licznika'. Zrozumienie tego terminu jest kluczowe przy rozwi\u0105zywaniu kolejnych zada\u0144. Jako kompromis mo\u017cna zachowa\u0107 oba rozwi\u0105zania tego zadania.<\/p>\n<p>Typowy problem z zastosowaniem jednej zmiennej-licznika dla dw\u00f3ch p\u0119tli objawia si\u0119 w ten spos\u00f3b:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Liczba znak\u00f3w w drugiej linii nie odpowiada warto\u015bci T. Je\u015bli potrzebna jest pomoc w zwi\u0105zku z tym problemem, nale\u017cy 'wskaza\u0107 palcem' na notatki dotycz\u0105ce typowych problem\u00f3w z p\u0119tli. To symptom nr 3. Diagnozuje si\u0119 to, je\u015bli doda si\u0119 wypisanie warto\u015bci licznika bezpo\u015brednio przed drug\u0105 p\u0119tl\u0105. Naprawia si\u0119 przez zerowanie. Ale lepiej od razu tego nie m\u00f3wi\u0107. Student powinien spr\u00f3bowa\u0107 sformu\u0142owa\u0107 przynajmniej jedn\u0105 hipotez\u0119.<\/p>\n<p>Istnieje oczywi\u015bcie inna wariant rozwi\u0105zania. Ale nie widzia\u0142em go u student\u00f3w ani razu. Na etapie nauki p\u0119tli, opowiadanie o nim rozprasza\u0142oby uwag\u0119. Mo\u017cna do niego wr\u00f3ci\u0107 p\u00f3\u017aniej, podczas nauki funkcji do pracy z ci\u0105gami.<br \/>\n<b class=\"spoiler_title\">Mo\u017cliwo\u015b\u0107 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>\nNast\u0119pne obowi\u0105zkowe zadanie:<\/p>\n<blockquote><p>Wy\u015bwietl na ekranie cyfry od 0 do 9. Ka\u017cda cyfra powinna by\u0107 w osobnej linii. Liczba cyfr w linii (W) jest wprowadzana z klawiatury.<\/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>Je\u015bli student opanowa\u0142 metod\u0119 z zamian\u0105 zmiennej, poradzi sobie do\u015b\u0107 szybko. Mo\u017cliwy problem zn\u00f3w b\u0119dzie zwi\u0105zany z zerowaniem zmiennej. Je\u015bli nie radzi sobie z konwersj\u0105, oznacza to, \u017ce si\u0119 spieszy\u0142e\u015b i trzeba rozwi\u0105za\u0107 \u0142atwiejsze zadania.<\/p>\n<p>Dzi\u0119kuj\u0119 za uwag\u0119. Lajkujcie, subskrybujcie kana\u0142.<\/p>\n<p>P.S. Je\u015bli znalaz\u0142e\u015b liter\u00f3wki lub b\u0142\u0119dy w tek\u015bcie, prosz\u0119 daj mi zna\u0107. Mo\u017cesz to zrobi\u0107, zaznaczaj\u0105c cz\u0119\u015b\u0107 tekstu i naciskaj\u0105c na Macu \u201e\u2318 + Enter\u201d, a na klasycznych klawiaturach \u201eCtrl \/ Enter\u201d, lub poprzez wiadomo\u015bci prywatne. Je\u015bli te opcje s\u0105 niedost\u0119pne, napisz o b\u0142\u0119dach w komentarzach. Dzi\u0119kuj\u0119!<\/p>\n<p class=\"for_users_only_msg\">Tylko zarejestrowani u\u017cytkownicy mog\u0105 bra\u0107 udzia\u0142 w ankiecie. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Zaloguj si\u0119<\/a><\/noindex>, prosz\u0119.<\/p>\n<h2 class=\"default-block__polling-title\">Ankieta dla czytelnik\u00f3w bez karmy<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,0%<\/strong>Ucz\u0119 zawodowo, +12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">10,0%<\/strong>Ucz\u0119 zawodowo, -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>Nie ucz\u0119, +17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Nie ucz\u0119, -10<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Inne0<\/p>\n<\/li>\n<\/ul>\n<p>    Zag\u0142osowa\u0142o 10 u\u017cytkownik\u00f3w. Wstrzyma\u0142o si\u0119 5 u\u017cytkownik\u00f3w.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/456500\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u044b, \u043f\u043e\u0437\u0430\u0431\u044b\u0442\u044b \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u044b. \u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40208","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Jak nauczy\u0107 pokonywa\u0107 trudno\u015bci, a przy okazji pisa\u0107 p\u0119tle | ProHoster","description":"Mimo \u017ce mowa b\u0119dzie o jednym z podstawowych temat\u00f3w, ten artyku\u0142 jest napisany dla do\u015bwiadczonych specjalist\u00f3w. Celem jest pokazanie, jakie b\u0142\u0119dne wyobra\u017cenia maj\u0105 nowicjusze w programowaniu.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}