{"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\/da\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","title":{"rendered":"Hvordan man l\u00e6rer at overvinde vanskeligheder og samtidig skrive loops","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Selvom emnet er et af de grundl\u00e6ggende, er denne artikel skrevet til erfarne fagfolk. M\u00e5let er at vise hvilke misforst\u00e5elser nybegyndere i programmering kan have. For praktiserende udviklere er disse problemer l\u00e6nge blevet l\u00f8st, glemt eller overhovedet ikke bem\u00e6rket. Artiklen kan v\u00e6re nyttig, hvis du pludselig skal hj\u00e6lpe nogen med dette emne. Der tr\u00e6kkes paralleller til materialet fra forskellige b\u00f8ger om programmering af Schilt, Stroustrup og Okulov.<\/p>\n<p>Emnet om l\u00f8kker er valgt, fordi mange falder fra, n\u00e5r de l\u00e6rer programmering.<\/p>\n<p>Denne metode er beregnet til svage studerende. St\u00e6rke studerende h\u00e6nger som regel ikke fast i dette emne, og der er ikke behov for at udvikle s\u00e6rlige metoder til dem. En sekund\u00e6r m\u00e5l for artiklen er at overs\u00e6tte denne metode fra klassen 'virker for alle studerende, men kun hos \u00e9n underviser' til klassen 'virker for alle studerende, alle undervisere'. Jeg p\u00e5st\u00e5r ikke at v\u00e6re absolut original. Hvis du allerede bruger en lignende metode til at undervise i dette emne, s\u00e5 skriv venligst, hvordan din version adskiller sig. Hvis du v\u00e6lger at anvende den, s\u00e5 del venligst dine erfaringer efterf\u00f8lgende. Hvis en lignende metode er beskrevet i en bog, s\u00e5 giv venligst navnet.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJeg har arbejdet med denne metode i 4 \u00e5r, hvor jeg har undervist studerende p\u00e5 forskellige niveauer individuelt. I alt omkring halvtreds studerende og to tusinde timer med undervisning. I starten sad studerende fast p\u00e5 dette emne og forlod det. Efter hver studerende blev metoden og materialerne justeret. I det sidste \u00e5r h\u00e6nger studerende ikke l\u00e6ngere fast p\u00e5 dette emne, s\u00e5 jeg besluttede at dele mine erfaringer.<\/p>\n<h4>Hvorfor s\u00e5 mange ord? L\u00f8kker er jo element\u00e6re!<\/h4>\n<p>\nSom jeg n\u00e6vnte f\u00f8r, kan kompleksiteten af l\u00f8kkekoncepter undervurderes af praktiserende udviklere og st\u00e6rke studerende. For eksempel kan man holde en lang forel\u00e6sning, se nikkende hoveder og kloge \u00f8jne. Men n\u00e5r man fors\u00f8ger at l\u00f8se en opgave, opst\u00e5r der pludselig st\u00f8d og uforklarlige problemer. Efter forel\u00e6sningen har studerende sandsynligvis kun en delvis forst\u00e5else. Situationen forv\u00e6rres af, at studerende ikke selv kan udtrykke, hvori deres misforst\u00e5else best\u00e5r.<br \/>\nEngang inds\u00e5 jeg, at studerende opfatter mine eksempler som hieroglyffer. Alts\u00e5 som udelelige tekststykker, hvor man skal tilf\u00f8je et eller andet \"magisk\" bogstav, s\u00e5 det virker.<br \/>\nNogle gange lagde jeg m\u00e6rke til, at studerende t\u00e6nker, at der til at l\u00f8se en konkret opgave er brug for <i>et eller andet andet<\/i> konstruktion, som jeg bare ikke har fortalt endnu. Selvom man kun beh\u00f8vede at modificere eksemplet lidt.<\/p>\n<p>Derfor kom jeg til ideen om, at fokus ikke skal v\u00e6re p\u00e5 syntaksen af udtryk, men p\u00e5 id\u00e9en om refaktorering af gentaget kode med hj\u00e6lp af l\u00f8kker. S\u00e5 snart eleverne mestrer denne id\u00e9, kan de ethvert syntaks l\u00e6re gennem sm\u00e5 \u00f8velser.<\/p>\n<h4>Hvem og hvorfor jeg underviser<\/h4>\n<p>\nDa der ikke er nogle optagelsespr\u00f8ver, kan der p\u00e5 lektionerne v\u00e6re b\u00e5de st\u00e6rke og meget svage studerende. Man kan l\u00e6se mere detaljeret om mine studerende i artiklen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">Portr\u00e6t af deltagerne i aftenkurserne<\/a><\/noindex><br \/>\nJeg str\u00e6bte efter, at programmering skulle v\u00e6re tilg\u00e6ngelig for alle, der \u00f8nsker det.<br \/>\nMine lektioner foreg\u00e5r individuelt, og eleven betaler for hvert m\u00f8de. Det kunne tyde p\u00e5, at studerende vil optimere omkostningerne og kr\u00e6ve det minimale. Alligevel kommer folk til fysiske lektioner med en levende underviser, ikke kun for selve viden, men for trygheden ved, at de har forst\u00e5et det, for f\u00f8lelsen af fremgang og for godkendelse fra eksperten (underviseren). Hvis studerende ikke f\u00f8ler, at de g\u00f8r fremskridt i deres l\u00e6ring, vil de forlade undervisningen. Generelt kan man organisere lektionerne, s\u00e5 studerende f\u00f8ler fremgang ved at \u00f8ge antallet af kendte konstruktioner. S\u00e5 f\u00f8rst studerer vi grundigt while, derefter for, s\u00e5 do while og s\u00e5 har vi et kursus, der minder om tusinde og \u00e9n nat, hvor der i to m\u00e5neder kun studeres l\u00f8kker, hvilket resulterer i en studerende, der p\u00e5 diktat har skrevet standardbiblioteket. Men for at l\u00f8se praktiske opgaver kr\u00e6ver det ikke kun viden om materialet, men ogs\u00e5 selvst\u00e6ndighed i anvendelsen af det og i jagten p\u00e5 ny information. Derfor anser jeg for fysiske kurser, at det er en god princip at l\u00e6re minimum og tilskynde selvstudium af detaljer og besl\u00e6gtede emner. I emnet om l\u00f8kker anser jeg, at minimum er konstruktionen while. P\u00e5 den kan man forst\u00e5 princippet. Ved at kende princippet kan man ogs\u00e5 selv l\u00e6re for og do-while.<\/p>\n<p>For weak students to master the material, it's not enough to describe the syntax. It is necessary to provide more simple yet diverse tasks and to elaborate on examples in greater detail. Ultimately, the speed of learning is limited by the student's ability to transform expressions and to find patterns. For more perceptive students, many tasks will feel boring. When working with them, it's okay not to insist on solving 100% of the problems. You can view my material on <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">my GitHub<\/a><\/noindex>. Although the repository resembles a sorcerer's grimoire \u2014 no one except me understands what is where, and if you fail the verification, you might just go insane.<\/p>\n<h4>The methodology is practice-oriented.<\/h4>\n<p>\nTheory is explained through problem-solving examples. In programming basics classes, where branching and loops are studied, it simply won't work to hold a useful lecture on one topic for an entire hour. 15-20 minutes are enough to explain the concept. The main difficulties arise during the practical tasks.<br \/>\nBeginner instructors might dump operators, branching, loops, and arrays in one lecture. However, students will struggle to grasp this information.<br \/>\nIt's not just about conveying the material; one must also ensure that the listeners understand it.<\/p>\n<p>The degree of mastery of the topic is determined by how the student performs in independent work. <br \/>\nIf a student manages to solve a problem on the topic without the teacher's help, then they have mastered the topic. To ensure independent verification, each task is described with a table of test scenarios. Tasks have a clear order. Skipping tasks is not recommended. If the current task is too difficult, moving on to the next one is pointless. It will be even harder. To help the student tackle the current challenging task, several techniques are explained using the first task as an example. Essentially, the entire content of the topic comes down to techniques for overcoming difficulties. Loops are more of a side effect.<\/p>\n<p>The first task is always an example. The second is slightly different and is completed 'independently' right after the first under the teacher's supervision. All subsequent tasks are aimed at drawing attention to various nuances that may cause misconceptions.<\/p>\n<p>Forklaringen af eksemplet er en dialog, hvor studerende skal anvende back propagation og krydsvalidering for at sikre, at de forst\u00e5r materialet.<\/p>\n<p>Jeg vil v\u00e6re banal og sige, at det f\u00f8rste eksempel p\u00e5 emnet er meget vigtigt. Hvis der er tilstr\u00e6kkeligt materiale til selvst\u00e6ndigt arbejde, kan manglen p\u00e5 det f\u00f8rste eksempel rettes. Hvis der ikke er andet end eksemplet, vil studerende sandsynligvis ikke mestre emnet.<\/p>\n<h4>While eller for?<\/h4>\n<p>\nEt af de omstridte sp\u00f8rgsm\u00e5l er valget af konstrukt for eksemplet: while eller for. En gang overbeviste en ven, der er praktiserende udvikler uden undervisningserfaring, mig i en time om, at for-l\u00f8kken er den nemmeste at forst\u00e5. Argumenterne gik p\u00e5, at \"alt er klart, og det er lagt p\u00e5 plads\". Men den grundl\u00e6ggende \u00e5rsag til de faktiske nybegynders vanskeligheder ligger i selve ideen om l\u00f8kken, ikke i selve skrivningen. Hvis en person ikke forst\u00e5r denne id\u00e9, vil de have problemer med syntaksen. N\u00e5r id\u00e9en er forst\u00e5et, forsvinder problemerne med kodens format automatisk.<\/p>\n<p>I mine materialer f\u00f8lger emnet om l\u00f8kker efter emnet om forgrening. Den ydre lighed mellem if og while g\u00f8r det muligt at lave en direkte analogi: \"N\u00e5r betingelsen i overskriften er sand, udf\u00f8res kroppen.\" Forskellen ved l\u00f8kken er blot, at kroppen udf\u00f8res mange gange.<\/p>\n<p>Mit andet argument er, at while kr\u00e6ver mindre format end for. Mindre format betyder f\u00e6rre dumme fejl med glemte kommaer og parenteser. Nybegyndere har ikke udviklet tilstr\u00e6kkelig opm\u00e6rksomhed og detaljeorientering til automatisk at undg\u00e5 syntaktiske fejl.<br \/>\nDet tredje argument er, at while forklares f\u00f8rst i mange gode b\u00f8ger.<\/p>\n<p>Hvis studerende nemt kan omdanne udtryk, kan man kort n\u00e6vne for. Studerende v\u00e6lger selv, hvad de foretr\u00e6kker. Hvis omdannelsen derimod volder problemer, er det bedst ikke at sprede opm\u00e6rksomheden. Lad den studerende f\u00f8rst l\u00f8se det hele med while. N\u00e5r emnet om l\u00f8kker er mestret, kan l\u00f8sningerne omskrives for at \u00f8ve omdannelsen fra while til for.<br \/>\nL\u00f8kker med postbetingelse er en ret sj\u00e6lden st\u00f8rrelse. Jeg bruger slet ikke tid p\u00e5 dem. Hvis den studerende har mestret id\u00e9erne om at opdage m\u00f8nstre og omdanne udtryk, vil de kunne klare sig uden min hj\u00e6lp.<\/p>\n<p>N\u00e5r jeg pr\u00e6senterer det f\u00f8rste eksempel for st\u00e6rke studerende, p\u00e5peger jeg, at det i f\u00f8rste eksempel er vigtigt at dokumentere ikke kun l\u00f8sningen, men ogs\u00e5 hele r\u00e6kken af handlinger, der f\u00f8rte til resultatet. Dovne studerende kan fors\u00f8mme dokumentationen og kun overf\u00f8re den endelige algoritme. De skal overbevises om, at de ogs\u00e5 en dag vil st\u00e5 overfor en vanskelig opgave. For at l\u00f8se den, er det n\u00f8dvendigt at f\u00f8lge trinene, som i dette eksempel. Derfor er det vigtigt at dokumentere alle faser. I de f\u00f8lgende opgaver kan man n\u00f8jes med at pr\u00e6sentere den endelige l\u00f8sning.<\/p>\n<p>Hovedideen bag automatisering er, at vi beder computeren om at udf\u00f8re rutinearbejde for mennesket. En af de grundl\u00e6ggende teknikker er at skrive l\u00f8kker. Det bruges, n\u00e5r programmet skal udf\u00f8re flere ensartede, gentagne handlinger.<\/p>\n<h4>Det \u00e5benlyse er bedre end det skjulte<\/h4>\n<p>\nDet kan virke som en god id\u00e9 i den f\u00f8rste opgave om l\u00f8kker at udskrive en ensartet s\u00e6tning flere gange. For eksempel:<\/p>\n<blockquote><p>Hurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!<br \/>\nHurra, det virker!\n<\/p><\/blockquote>\n<p>\nDenne tilgang er d\u00e5rlig, fordi man ikke kan se t\u00e6llerens v\u00e6rdi i outputtet. Dette er et problem for begyndere. Man skal ikke undervurdere det. Oprindeligt var denne opgave den f\u00f8rste, og opgaven om at udskrive en sekvens af tal i stigende r\u00e6kkef\u00f8lge var den anden. Det blev n\u00f8dvendigt at introducere yderligere termer som \"l\u00f8kke N gange\" og \"l\u00f8kke fra A til B\", som i princippet er det samme. For ikke at skabe un\u00f8dvendige enheder, besluttede jeg at vise kun eksemplet med udskrivning af en sekvens af tal. F\u00e5 personer lykkes med at l\u00e6re at holde en t\u00e6ller i hovedet og modellere programmets adf\u00e6rd der, uden forberedelse. Nogle studerende m\u00f8der for f\u00f8rste gang konceptet med at modellere \"i sindet\" netop i emnet om l\u00f8kker.<br \/>\nEfter lidt praksis giver jeg opgaven om at gentage den samme tekst til selvst\u00e6ndig l\u00f8sning. Hvis man f\u00f8rst giver en synlig t\u00e6ller og derefter en usynlig, vil de studerende have f\u00e6rre problemer. Nogle gange er det nok med en henvisning til \"skriv ikke t\u00e6lleren p\u00e5 sk\u00e6rmen\".<\/p>\n<h4>Hvordan forklares det hos andre?<\/h4>\n<p>\nI de fleste undervisningsmaterialer p\u00e5 internettet gives syntaksen for l\u00f8kker som en del af en \"forel\u00e6sning\". For eksempel p\u00e5 developer.mozilla.org (i \u00f8jeblikket) beskrives flere konstruktioner sammen med while-l\u00f8kken. Her gives der udelukkende selve konstruktionerne som skabeloner. Resultatet af deres k\u00f8rsel beskrives med ord, og illustrationer mangler. Efter min mening reducerer en s\u00e5dan pr\u00e6sentation emnets nyttev\u00e6rdi til nul. Eleverne kan gen skrive koden og k\u00f8re den selv, men der er stadig behov for en reference til sammenligning. Hvordan skal man forst\u00e5, at eksemplet er kopieret korrekt, hvis der ikke er noget at sammenligne resultatet med?<br \/>\nN\u00e5r der kun gives en skabelon uden eksempel, bliver det endnu sv\u00e6rere for studenten. Hvordan skal man forst\u00e5, at kodefragmenterne er placeret korrekt i skabelonen? Man kan pr\u00f8ve at skrive <i>p\u00e5 en eller anden m\u00e5de<\/i>, og s\u00e5 k\u00f8re den. Men hvis der ikke er en standard til sammenligning af resultatet, hj\u00e6lper det heller ikke at k\u00f8re den.<\/p>\n<p>I C++ kurset p\u00e5 Intuit ligger syntaksen for l\u00f8kken skjult p\u00e5 den tredje side af forel\u00e6sning 4 om emnet \"operatorer\". N\u00e5r syntaksen for l\u00f8kker forklares, l\u00e6gges der s\u00e6rlig v\u00e6gt p\u00e5 termen \"operator\". Termen pr\u00e6senteres som en samling af fakta s\u00e5som \"symbolet; det er en operator\", \"{} er en sammensat operator\", \"l\u00f8kkens krop skal v\u00e6re en operator\". Jeg kan ikke lide denne tilgang, da den p\u00e5 en m\u00e5de skjuler vigtige sammenh\u00e6nge bag \u00e9n term. At analysere kildeteksten i programmet p\u00e5 dette niveau er n\u00f8dvendigt for compiler-udviklere for at implementere sprogstandarder, men slet ikke for nybegyndere som f\u00f8rste skridt. Nybegyndere inden for programmering har sj\u00e6ldent den n\u00f8dvendige omhyggelighed til at v\u00e6re s\u00e5 fokuserede p\u00e5 termer. Sj\u00e6ldne personer husker og forst\u00e5r nye ord f\u00f8rste gang. Praktisk talt ingen kan korrekt anvende en term, de lige har l\u00e6rt. Derfor opst\u00e5r der mange fejl blandt studerende s\u00e5som \"jeg skrev while(a&lt;7);{, men programmet virker ikke&quot;.<br \/>\nJeg mener, at det i starten er bedre at give syntaksen for konstruktionen med det samme med parenteser. Varianten uden parenteser b\u00f8r kun forklares, hvis eleven har et konkret sp\u00f8rgsm\u00e5l som \"hvorfor er der ingen parenteser her, og det fungerer\".<\/p>\n<p>I bogen af Okulov \"Grundl\u00e6ggende programmering\" fra 2012 begynder introduktionen til l\u00f8kker med skabelonen for, hvorefter der gives anbefalinger til brug, og derefter f\u00f8lger straks et eksperimentelt afsnit. Jeg forst\u00e5r, at bogen blev skrevet til det lille mindretal af meget dygtige elever, som sj\u00e6ldent kommer til mine lektioner.<\/p>\n<p>I popul\u00e6re b\u00f8ger skrives resultatet af kodefragmenter altid. For eksempel i Schildts \"Java 8. Den komplette guide\" fra 2015 gives f\u00f8rst skabelonen, derefter et eksempel p\u00e5 et program og straks derefter - resultatet af udf\u00f8relsen.<\/p>\n<blockquote><p>Som eksempel ser vi p\u00e5 en while-l\u00f8kke, hvor der udf\u00f8res en nedt\u00e6lling, der begynder fra 10, og der udskrives pr\u00e6cist 10 linjer \"takt\":<br \/>\nEfter start viser dette program ti \"takt\" p\u00e5 f\u00f8lgende m\u00e5de: <\/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>\nDen tilgang, der beskriver skabelonen, eksemplet p\u00e5 programmet og resultatet af arbejdet med dette program, anvendes ogs\u00e5 i bogen \"Javascript for b\u00f8rn\" og i js-kurset p\u00e5 w3schools.com. Formatet p\u00e5 web-siden g\u00f8r det endda muligt at g\u00f8re dette eksempel interaktivt.<br \/>\n<code>takt 10<br \/>\ntakt 9<br \/>\ntakt 8<br \/>\ntakt 7<br \/>\ntakt 6<br \/>\ntakt 5<br \/>\ntakt 4<br \/>\ntakt 3<br \/>\ntakt 2<br \/>\ntakt 1<\/code><\/p><\/blockquote>\n<p>\nI bogen af Stroustrup \"Principper og praksis med C++\" fra 2016 g\u00e5r forfatteren endnu l\u00e6ngere. F\u00f8rst forklares hvad resultatet skal v\u00e6re, og derefter vises teksten af programmet. Desuden tages der ikke bare et tilf\u00e6ldigt program som eksempel, men der gives et kig tilbage i historien. Det hj\u00e6lper med at henlede opm\u00e6rksomheden p\u00e5 det: \"Se, det er ikke bare en v\u00e6rdil\u00f8s tekst. Du ser noget betydningsfuldt.\"<\/p>\n<p>Som eksempel p\u00e5 iteration ser vi p\u00e5 det f\u00f8rste program, der blev udf\u00f8rt p\u00e5 en maskine med stored program (EDSAC). Det blev skrevet af David Wheeler i Cambridge Universitets Computer Laboratory den 6. maj 1949. Dette program beregner og udskriver en simpel liste over kvadrater.<\/p>\n<blockquote><p>Her indeholder hver linje et tal efterfulgt af et tabulator tegn (\u2018t\u2019) og kvadratet af dette tal. Versionen af dette program i C++ ser s\u00e5ledes ud:<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 \/>\nHer i hver linje findes der et tal efterfulgt af et tabulatortegn (&#8216;t&#8217;) og kvadratet af dette tal. Versionen af dette program p\u00e5 C++ ser s\u00e5dan ud:<\/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>\n) v\u00e6gt p\u00e5, at han respekterer sine elevers intellekt. M\u00e5ske anses evnen til at identificere skabelonen i flere eksempler for at v\u00e6re et tegn p\u00e5 s\u00e5dan intelligens.<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">overs\u00e6ttelse<\/a><\/noindex>Som jeg selv forklarer<\/p>\n<h4>Hvordan jeg forklarer<\/h4>\n<p>\nStroustrup's approach: describe the outcome, then solve the task, and finally have the student analyze it independently \u2014 seems the most thoughtful. Therefore, I decided to base my discussion on this, but to illustrate it with a less historical example \u2014 the task of outputting a \u2018table of contents\u2019. It creates a recognizable anchor so that later I can say \u2018remember the task about the table of contents\u2019 and students will recall it specifically. In my example, I aimed to preempt two of the most common misconceptions. I will elaborate on them further.<\/p>\n<blockquote><p>In this task, we familiarize ourselves with techniques for solving complex problems. The initial solution should be primitive and simple. Only then can we think about how to improve this solution.<br \/>\n<code>Introduktion<br \/>\nKapitel 1<br \/>\nKapitel 2<br \/>\nKapitel 3<br \/>\nKapitel 4<br \/>\nKapitel 5<br \/>\nKapitel 6<br \/>\nKapitel 7<br \/>\nKonklusion<\/code><\/p><\/blockquote>\n<p>\nEfter mine observationer f\u00f8rer tilgangen \"skabelon-eksempel-resultat\" i forskellige kombinationer stadig til, at studerende opfatter l\u00f8kken som et hieroglyf. Dette blev tydeligt, da de ikke forstod, hvorfor de skulle skrive en betingelse, hvordan de skulle v\u00e6lge mellem i++ og i\u2014 og andre tilsyneladende \u00e5benlyse ting. For at undg\u00e5 disse misforst\u00e5elser, skal tilgangen til at tale om l\u00f8kker understrege meningen med at gentage de samme handlinger og derefter \u2014 udformningen af dem ved hj\u00e6lp af konstruktioner. Derfor, f\u00f8r syntaksen for l\u00f8kken pr\u00e6senteres, skal opgaven<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introduktion\");\nConsole.WriteLine(\"Kapitel 1\");\nConsole.WriteLine(\"Kapitel 2\");\nConsole.WriteLine(\"Kapitel 3\");\nConsole.WriteLine(\"Kapitel 4\");\nConsole.WriteLine(\"Kapitel 5\");\nConsole.WriteLine(\"Kapitel 6\");\nConsole.WriteLine(\"Kapitel 7\");\nConsole.WriteLine(\"Konklusion\");\n<\/code><\/pre>\n<p>\nHow can it be improved?<br \/>\nReplace the repetitive actions with a loop.<br \/>\nWhat actions are repeated here consecutively without changes?<br \/>\nThere are none in this fragment. However, the commands to output the word \u2018Kapitel\u2019 with the number are very similar to each other.<br \/>\nTherefore, the next step is to find the difference between the fragments. It is only obvious in this task; later, not individual commands will repeat, but blocks of code of 5 lines or more. Searching will require looking not just in the list of commands, but in branching or loop constructs.<br \/>\nIn the example, the difference between the commands is in the number following the word \u2018Kapitel\u2019.<br \/>\nOnce the difference is found, it is necessary to understand the pattern of change. Is the distinguishing fragment a number? Does it constantly increase or decrease? How does the value of the number change between the two commands adjacent to each other?<br \/>\nI eksemplet stiger tallet efter ordet \"Kapitel\" med skridtet 1. Forskellen er fundet, der er identificeret et m\u00f8nster. Nu kan den varierende del erstattes med en variabel.<br \/>\nS\u00e5dan en variabel skal deklareres f\u00f8r den f\u00f8rste af de gentagne dele. En s\u00e5dan variabel kaldes normalt i eller j, eller et mere udf\u00f8rligt navn. Dens startv\u00e6rdi skal v\u00e6re lig med den f\u00f8rste v\u00e6rdi, der vises p\u00e5 sk\u00e6rmen. I eksemplet er den f\u00f8rste v\u00e6rdi 1. <br \/>\nHvilken startv\u00e6rdi skal tages for at vise r\u00e6kken af tal \"100, 101, 102, 103, 104, 105\"?<br \/>\nI denne r\u00e6kke er det f\u00f8rste tal 100.<br \/>\nEfter hver output-kommando skal v\u00e6rdien af denne variabel \u00f8ges med 1. Denne 1 er \u00e6ndringsskridtet.<br \/>\nHvilket skridt vil der v\u00e6re i r\u00e6kken af tal \"100, 102, 104, 106\"?<br \/>\nI denne r\u00e6kke er skridtet 2.<br \/>\nEfter at have erstattet den varierende del med en variabel, vil koden se s\u00e5dan ud:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introduktion\");\nint i;\ni = 0;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Kapitel \" + i);\ni = i + 1;\nConsole.WriteLine(\"Konklusion\");\n<\/code><\/pre>\n<p>\nEfter anvendelsen af metoden \"udtryk m\u00f8nstret som en variabel\" resulterer koden i flere grupper af ensartede handlinger, der f\u00f8lger hinanden. Nu kan de gentagne handlinger erstattes med en l\u00f8kke.<\/p>\n<p>Sekvensen til l\u00f8sning af opgaven, hvor cykler skal bruges, best\u00e5r af f\u00f8lgende trin:<\/p>\n<ol>\n<li>L\u00f8s \"direkte\" med mange separate kommandoer<\/li>\n<li>Find m\u00f8nsteret<\/li>\n<li>Udtryk m\u00f8nsteret som en variabel<\/li>\n<li>Pr\u00e6senter det i form af en l\u00f8kke<\/li>\n<\/ol>\n<p>Dern\u00e6st introduceres nye termer, s\u00e5 studerende ikke st\u00e5r i situationen \"jeg forst\u00e5r alt, men kan ikke sige det\":<br \/>\n \u2014 t\u00e6ller \u2014 altid en variabel, der er n\u00f8dvendig for at holde styr p\u00e5 antallet af skridt i l\u00f8kken. Normalt et helt tal, der sammenlignes med en gr\u00e6nse.<br \/>\n \u2014 skridtet for t\u00e6lleren \u2014 beskrivelse af m\u00f8nstret for \u00e6ndring af t\u00e6lleren.<br \/>\n \u2014 gr\u00e6nsen \u2014 tal eller variabel, som t\u00e6lleren sammenlignes med, s\u00e5 algoritmen er endelig. T\u00e6llerens v\u00e6rdi \u00e6ndres for at n\u00e6rme sig gr\u00e6nsen.<br \/>\n \u2014 kroppen af l\u00f8kken \u2014 s\u00e6t af kommandoer, der vil blive gentaget. N\u00e5r der siges \"kommando skrevet inden for l\u00f8kken\", refereres der netop til kroppen.<br \/>\n \u2014 iteration af l\u00f8kken \u2014 \u00e9n enkelt udf\u00f8relse af l\u00f8kkens krop.<br \/>\n \u2014 betingelse for loop \u2014 det logiske udtryk, der bestemmer, om en ny iteration skal udf\u00f8res. (Her kan der v\u00e6re forvirring med forgreningskonstruktioner)<br \/>\nMan skal v\u00e6re forberedt p\u00e5, at studerende i begyndelsen vil anvende termerne forkert. Dette g\u00e6lder b\u00e5de st\u00e6rke og svage. At etablere et f\u00e6lles sprog er en kunst. Jeg vil skrive kort: man skal stille opgaven \"udv\u00e6lg kodefragmentet med \" og selv bruge termerne korrekt i samtalen.<br \/>\nEfter transformationen med loopet f\u00e5r vi fragmentet:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(&quot;Introduktion&quot;);\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Kapitel &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;Konklusion&quot;);<\/code><\/pre>\n<h4>Hovedmisforst\u00e5elsen<\/h4>\n<p>\nEn popul\u00e6r misforst\u00e5else blandt studerende er, at de inden for loopkonstruktionen placerer s\u00e5danne handlinger, der kun skal udf\u00f8res \u00e9n gang. For eksempel s\u00e5dan her:<\/p>\n<pre><code class=\"cs\">;\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Introduktion&quot;)\n    Console.WriteLine(&quot;Kapitel &quot; + i);\n    i = i + 1;\n    Console.WriteLine(&quot;Konklusion&quot;);\n}\n<\/code><\/pre>\n<p>\nEleverne st\u00f8der konstant p\u00e5 dette problem, b\u00e5de i begyndelsen og i mere komplekse opgaver.<br \/>\nDen grundl\u00e6ggende ledetr\u00e5d i dette tilf\u00e6lde:<\/p>\n<blockquote><p>Hvor mange gange skal man gentage kommandoen: \u00e9n gang eller mange?\n<\/p><\/blockquote>\n<p>\nKommandoerne for at udskrive ordene \"Introduktion\" og \"Konklusion\", samt erkl\u00e6ringen og initialiseringen af variablen i, adskiller sig fra de andre gentagne handlinger. De udf\u00f8res kun \u00e9n gang, derfor skal de skrives uden for loopets krop.<\/p>\n<p>Koden skal inkludere alle tre faser af l\u00f8sningen, s\u00e5 man senere kan henvise til dem i tilf\u00e6lde af vanskeligheder. De f\u00f8rste to versioner kan sagtens kommenteres ud, s\u00e5 de ikke forstyrrer.<br \/>\nStuderendes opm\u00e6rksomhed skal rettes mod f\u00f8lgende fakta:<br \/>\n \u2014 I loopets betingelse sammenlignes t\u00e6lleren og gr\u00e6nsen. T\u00e6lleren kan \u00e6ndres i loopets krop, men gr\u00e6nsen kan ikke. For at bryde denne regel skal der angives gode grunde.<br \/>\n \u2014 Kommandoerne til at udskrive ordene \"Introduktion\" og \"Konklusion\" er placeret uden for loopets krop. Vi skal kun udf\u00f8re dem \u00e9n gang. \"Introduktion\" \u2014 f\u00f8r gentagelse af handlingerne, \"Konklusion\" \u2014 efter.<br \/>\nI processen med at bef\u00e6ste dette emne, l\u00e6re de n\u00e6ste, samt i forbindelse med vanskeligheder, er det nyttigt selv for st\u00e6rke studerende at stille sp\u00f8rgsm\u00e5let: \"Og dette handling, hvor mange gange skal det udf\u00f8res? \u00c9n eller mange?\".<\/p>\n<h4>Udvikling af supplerende f\u00e6rdigheder<\/h4>\n<p>\nI studerende udvikler endnu deres f\u00e6rdighed til at diagnosticere og l\u00f8se problemer i forbindelse med l\u00e6ring af loop. For at udf\u00f8re en diagnose skal studenten forestille sig det \u00f8nskede resultat og sammenligne det med det faktiske resultat. Handlingerne for at rette fejl afh\u00e6nger af forskellen mellem dem.<br \/>\nDa studerende p\u00e5 dette stadium stadig har en begr\u00e6nset forst\u00e5else af, hvad et \"\u00f8nsket\" resultat er, kan de orientere sig efter testdata. Generelt forst\u00e5r ingen p\u00e5 dette stadium, hvad der kan g\u00e5 galt, og hvordan man h\u00e5ndterer det. Derfor giver jeg en skriftlig beskrivelse af typiske problemer og flere m\u00e5der at l\u00f8se dem p\u00e5. Valget af den mest passende l\u00f8sning er studentens opgave.<br \/>\nNotater er n\u00f8dvendige for at kunne stille sp\u00f8rgsm\u00e5l som \"Fik vi det resultat, vi forventede?\", \"Hvilken af disse situationer fandt sted nu?\", \"Hjalp den brugte l\u00f8sning?\".<\/p>\n<ol>\n<li>Antallet af handlinger er 1 mindre eller mere end forventet. L\u00f8sningsmetoder:<br \/>\n \u2014 \u00f8ge den indledende v\u00e6rdi af t\u00e6lleren med 1.<br \/>\n \u2014 erstatte den strenge sammenligningsoperator (&lt; eller &gt;) med den ikke-strenge (&lt;= eller &gt;=).<br \/>\n \u2014 \u00e6ndre gr\u00e6nsev\u00e6rdien med 1.<\/li>\n<li>Handlinger i l\u00f8kken udf\u00f8res uden stop, uendeligt. L\u00f8sningsmetoder:<br \/>\n \u2014 tilf\u00f8je en \u00e6ndringskommando for t\u00e6lleren, hvis den mangler.<br \/>\n \u2014 rette \u00e6ndringskommandoen for t\u00e6lleren, s\u00e5 dens v\u00e6rdi n\u00e6rmer sig gr\u00e6nsen.<br \/>\n \u2014 fjerne \u00e6ndringskommandoen for gr\u00e6nsen, hvis den er i l\u00f8kkens krop.<\/li>\n<li>Antallet af handlinger i l\u00f8kken er mere end 1 mindre eller mere end forventet. Handlingerne i l\u00f8kken blev ikke udf\u00f8rt en eneste gang. F\u00f8rst skal de faktiske v\u00e6rdier for variablerne findes lige f\u00f8r starten af l\u00f8kken. L\u00f8sningsmetoder:<br \/>\n \u2014 \u00e6ndre den indledende gr\u00e6nsev\u00e6rdi.<br \/>\n \u2014 \u00e6ndre den indledende v\u00e6rdi af t\u00e6lleren.<\/li>\n<\/ol>\n<p>\nNormalt er problem 3 relateret til brugen af den forkerte variabel eller at t\u00e6lleren ikke nulstilles.<\/p>\n<p>Efter denne forklaring kan studenten stadig have forskellige misforst\u00e5elser ang\u00e5ende l\u00f8b.<br \/>\nFor at afklare de mest almindelige misforst\u00e5elser giver jeg opgaver:<\/p>\n<ol>\n<li>Hvor gr\u00e6nsen, den indledende v\u00e6rdi af t\u00e6lleren eller skridtet for t\u00e6lleren indtastes af brugeren.<\/li>\n<li>Hvor v\u00e6rdien af t\u00e6lleren skal bruges i et aritmetisk udtryk. Det er \u00f8nskeligt, at t\u00e6lleren er i n\u00e6vneren eller i den underliggende del af udtrykket, s\u00e5 forskellen bliver ikke-line\u00e6r.<\/li>\n<li>Hvor v\u00e6rdien af t\u00e6lleren ikke vises p\u00e5 sk\u00e6rmen under udf\u00f8relsen af l\u00f8kken. For eksempel at vise et n\u00f8dvendigt antal ens fragmenter af tekst eller tegne en figur med turtles grafikker.<\/li>\n<li>Hvor man f\u00f8rst skal udf\u00f8re \u00e9n type gentagne handlinger og derefter en anden.<\/li>\n<li>Hvor der skal udf\u00f8res andre handlinger f\u00f8r og efter de gentagne.<\/li>\n<\/ol>\n<p>\nFor hver opgave skal der angives testdata og forventet resultat.<\/p>\n<p>For at forst\u00e5, hvor hurtigt man kan bev\u00e6ge sig, skal man give dem mulighed for at l\u00e6se betingelserne for disse opgaver og sp\u00f8rge: \"hvordan adskiller de sig fra eksemplet?\", \"hvad skal der \u00e6ndres i eksemplet for at l\u00f8se dem?\". Hvis eleven svarer meningsfuldt, kan de l\u00f8se mindst \u00e9n opgave i timen, mens de andre g\u00f8r det hjemme. Hvis l\u00f8sningen er succesfuld, kan man starte forklaringen om betingelserne inden for l\u00f8kker.<br \/>\nHvis der er vanskeligheder med selvst\u00e6ndig l\u00f8sning, skal alt \u00f8ves i timen. For at l\u00f8sningen ikke skal minde om at tegne en ugle, anbefaler jeg f\u00f8rst at l\u00f8se opgaven ikke universelt. Det vil sige, at l\u00f8sningen skal best\u00e5 den f\u00f8rste test og ikke bruge l\u00f8kkekonstruktionen. Derefter kan man anvende transformationer for at opn\u00e5 universel l\u00f8sning.<\/p>\n<h4>L\u00f8kker og betingninger<\/h4>\n<p>\nEfter min mening er det nyttigt at give emnet \"l\u00f8kker inden for betingninger\" separat. S\u00e5 man bagefter kan se forskellen mellem gentagen betingelseskontrol og engang kontrollen.<br \/>\nOpgaver til \u00f8velse vil v\u00e6re om at udskrive tal fra A til B, som indtastes af brugeren:<br \/>\n \u2014 altid stigende.<br \/>\n \u2014 stigende eller faldende afh\u00e6ngigt af v\u00e6rdierne for A og B.<\/p>\n<p>Overgangen til emnet \u00abforgrening inden i l\u00f8kker\u00bb skal kun finde sted, n\u00e5r eleven har mestret metoderne: \u00aberstatning af regelm\u00e6ssigheder med variabler\u00bb og &quot;erstatning af gentagne handlinger med l\u00f8kker&quot;.<br \/>\nHoved\u00e5rsagen til at anvende betingelser inden for l\u00f8kker er uregelm\u00e6ssigheder i m\u00f8nsteret. I midten bliver det forstyrret afh\u00e6ngigt af inputdataene.<br \/>\nTil de studerende, som er i stand til at finde l\u00f8sninger ved at kombinere enkle teknikker, er det tilstr\u00e6kkeligt at sige \"betingelser kan skrives inde i l\u00f8kker\" og give en opgave \"for eksempel\" helt til selvst\u00e6ndig l\u00f8sning.<br \/>\nEksempelopgave:<\/p>\n<blockquote><p>Brugeren indtaster tallet X. Udskriv tallene fra 0 til 9 i en kolonne og s\u00e6t et tegn &#8216;+&#8217; ved det tal, der er lig med X.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Hvis der blev indtastet 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\">Hvis der blev indtastet 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\">Hvis der blev indtastet 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\">Hvis der blev indtastet 777<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p>Hvis der mangler en kort forklaring for at skrive med en l\u00f8kke, s\u00e5 skal der opn\u00e5s en universel l\u00f8sning p\u00e5 den samme opgave uden l\u00f8kke.<br \/>\nDer vil komme en af to muligheder:<br \/>\n<b class=\"spoiler_title\">\u00d8nsket<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(0 + &quot;+&quot;);\n} else {\n    Console.WriteLine(0);\n}\nif (x==1) {\n    Console.WriteLine(1 + &quot;+&quot;);\n} else {\n    Console.WriteLine(1);\n}\nif (x==2) {\n    Console.WriteLine(2 + &quot;+&quot;);\n} else {\n    Console.WriteLine(2);\n}\nif (x==3) {\n    Console.WriteLine(3 + &quot;+&quot;);\n} else {\n    Console.WriteLine(3);\n}\nif (x==4) {\n    Console.WriteLine(4 + &quot;+&quot;);\n} else {\n    Console.WriteLine(4);\n}\nif (x==5) {\n    Console.WriteLine(5 + &quot;+&quot;);\n} else {\n    Console.WriteLine(5);\n}\nif (x==6) {\n    Console.WriteLine(6 + &quot;+&quot;);\n} else {\n    Console.WriteLine(6);\n}\nif (x==7) {\n    Console.WriteLine(7 + &quot;+&quot;);\n} else {\n    Console.WriteLine(7);\n}\nif (x==8) {\n    Console.WriteLine(8 + &quot;+&quot;);\n} else {\n    Console.WriteLine(8);\n}\nif (x==9) {\n    Console.WriteLine(9 + &quot;+&quot;);\n} else {\n    Console.WriteLine(9);\n}\n<\/code><\/pre>\n<p><b class=\"spoiler_title\">Mulig<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(&quot;0+n1n2n3n4n5n6n7n8n9&quot;);\n}\nif (x==1) {\n    Console.WriteLine(&quot;0n1+n2n3n4n5n6n7n8n9&quot;);\n}\nif (x==2) {\n    Console.WriteLine(&quot;0n1n2+n3n4n5n6n7n8n9&quot;);\n}\nif (x==3) {\n    Console.WriteLine(&quot;0n1n2n3+n4n5n6n7n8n9&quot;);\n}\nif (x==4) {\n    Console.WriteLine(&quot;0n1n2n3n4+n5n6n7n8n9&quot;);\n}\nif (x==5) {\n    Console.WriteLine(&quot;0n1n2n3n4n5+n6n7n8n9&quot;);\n}\nif (x==6) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6+n7n8n9&quot;);\n}\nif (x==7) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7+n8n9&quot;);\n}\nif (x==8) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7n8+n9&quot;);\n}\nif (x==9) {\n    Console.WriteLine(&quot;0n1n2n3n4n5n6n7n8n9+&quot;);\n}\n<\/code><\/pre>\n<p>Jeg giver en lignende opgave p\u00e5 forh\u00e5nd, mens vi l\u00e6rer emnet om forgrening.<br \/>\nHvis en studerende har opn\u00e5et en \"mulig\" mulighed, skal der fort\u00e6lles, at der kan v\u00e6re mange l\u00f8sninger p\u00e5 den samme opgave. Men de varierer i robusthed over for \u00e6ndringer i krav. Stil sp\u00f8rgsm\u00e5let: \"Hvor mange steder i koden skal rettes, hvis der skal tilf\u00f8jes et andet tal?\" I den \"mulige\" mulighed skal der tilf\u00f8jes endnu en forgrening og at skrive det nye tal i 10 andre steder. I den \"\u00f8nskede\" er det blot n\u00f8dvendigt at tilf\u00f8je \u00e9n forgrening.<br \/>\nS\u00e6t en opgave til at reproducere den \"\u00f8nskede\" mulighed, og find derefter m\u00f8nsteret i koden, udf\u00f8r udskiftning af variablen og skriv en l\u00f8kke.<br \/>\nHvis du har en id\u00e9 til, hvordan denne opgave kan l\u00f8ses uden en l\u00f8kke p\u00e5 en anden m\u00e5de, s\u00e5 skriv gerne i kommentarer.<\/p>\n<h4>L\u00f8kker inden i l\u00f8kker<\/h4>\n<p>\nI dette emne skal der v\u00e6re fokus p\u00e5, at:<br \/>\n \u2014 t\u00e6llere for den indre og den ydre l\u00f8kke skal v\u00e6re forskellige variabler.<br \/>\n \u2014 t\u00e6lleren for den indre l\u00f8kke skal nulstilles mange gange (det vil sige i kroppen af den ydre l\u00f8kke).<br \/>\n I opgaver med udskrivning af tekst kan man ikke f\u00f8rst skrive et bogstav i flere linjer og derefter et andet. Man skal f\u00f8rst udskrive alle bogstaver fra den f\u00f8rste linje, derefter alle bogstaver fra den anden osv.<\/p>\n<p>Forklaringen p\u00e5 emnet om l\u00f8kker inden for l\u00f8kker b\u00f8r bedst begynde med at forklare vigtigheden af at nulstille t\u00e6lleren.<br \/>\nEksempelopgave:<\/p>\n<blockquote><p>Brugeren indtaster to tal: R og T. Udskriv to strenge af tegn &quot;#&quot;. Den f\u00f8rste r\u00e6kke skal have R tegn. Den anden r\u00e6kke skal have T tegn. Hvis et af tallene er negativt, skal en fejlmeddelelse vises.<\/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>V\u00e6rdien af R skal v\u00e6re ikke-negativ<\/p>\n<p><b class=\"spoiler_title\">R=6, T=-2<\/b>V\u00e6rdien af T skal v\u00e6re ikke-negativ<\/p>\n<p>Det er tydeligt, at denne opgave ogs\u00e5 har mindst to l\u00f8sninger.<br \/>\n<b class=\"spoiler_title\">\u00d8nsket<\/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\">Mulighed 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>Forskellen er, at i den \"mulige\" l\u00f8sning blev der brugt en anden variabel til at udskrive den anden linje. Man skal insistere p\u00e5 at bruge den samme variabel til begge l\u00f8kker. Dette begr\u00e6nsningsargument kan forklares ved, at en l\u00f8sning med \u00e9n t\u00e6ller til to l\u00f8kker vil illustrere termen \"nulstilling af t\u00e6lleren\". Forst\u00e5elsen af denne term er n\u00f8dvendig ved l\u00f8sningen af de f\u00f8lgende opgaver. Som et kompromis kan man gemme begge l\u00f8sninger p\u00e5 opgaven.<\/p>\n<p>Et typisk problem ved brugen af \u00e9n t\u00e6ller til to l\u00f8kker viser sig s\u00e5dan her:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Antallet af tegn i den anden linje stemmer ikke overens med v\u00e6rdien T. Hvis der er brug for hj\u00e6lp til dette problem, skal man \"pege p\u00e5\" noterne om typiske l\u00f8kkeproblemer. Dette er symptom nr. 3. Det diagnosticeres ved at tilf\u00f8je udskrift af t\u00e6lleren lige f\u00f8r den anden l\u00f8kke. Det rettes ved nulstilling. Men det er bedre ikke at fort\u00e6lle for meget om det med det samme. Den studerende skal fors\u00f8ge at formulere mindst en hypotese.<\/p>\n<p>Der er selvf\u00f8lgelig ogs\u00e5 denne l\u00f8sning. Men jeg har aldrig set den hos studerende. I l\u00f8bet af l\u00e6ringen om l\u00f8kker vil en fort\u00e6lling om det forvirre opm\u00e6rksomheden. Man kan vende tilbage til det senere, n\u00e5r man studerer funktioner til arbejdet med strenge.<br \/>\n<b class=\"spoiler_title\">Mulighed 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>\nDen n\u00e6ste obligatoriske opgave:<\/p>\n<blockquote><p>Vis tallene fra 0 til 9 p\u00e5 sk\u00e6rmen. Hvert tal skal st\u00e5 p\u00e5 sin egen linje. Antallet af tal pr. linje (W) indtastes via tastaturet.<\/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>Hvis eleven har mestret metoden med at erstatte variablen, vil de klare det ret hurtigt. Et muligt problem vil igen v\u00e6re nulstillingen af variablen. Hvis du har sv\u00e6rt ved konverteringen, s\u00e5 har du muligvis hastet og skal arbejde med lettere opgaver f\u00f8rst.<\/p>\n<p>Tak for opm\u00e6rksomheden. Giv likes og abonner p\u00e5 kanalen.<\/p>\n<p>P.S. Hvis du finder tastefejl eller fejl i teksten, bedes du give mig besked. Du kan g\u00f8re dette ved at markere en del af teksten og trykke p\u00e5 Mac \u00ab\u2318 + Enter\u00bb, og p\u00e5 klassiske tastaturer \u00abCtrl \/ Enter\u00bb, eller via personlige beskeder. Hvis de muligheder ikke er tilg\u00e6ngelige, s\u00e5 skriv om fejlene i kommentarerne. Tak!<\/p>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Afstemning for l\u00e6sere uden karma<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,0%<\/strong>Underviser professionelt, +12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">10,0%<\/strong>Underviser professionelt, -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>Underviser ikke, +17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Underviser ikke, -10<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Andet0<\/p>\n<\/li>\n<\/ul>\n<p>    10 brugere har stemt. 5 brugere har undladt at stemme.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Hvordan l\u00e6re at overvinde udfordringer og samtidig skrive loops | ProHoster","description":"Selvom det drejer sig om et af de grundl\u00e6ggende emner, er denne artikel skrevet til erfarne fagfolk. M\u00e5let er at vise, hvilke misforst\u00e5elser nybegyndere kan have inden for programmering.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}