Jak naučit překonávat obtíže a zároveň psát cykly

Navzdory tomu, že se budeme bavit o jednom ze základních témat, je tento článek psán pro zkušené profesionály. Cílem je ukázat, jaké mylné představy mají začátečníci v programování. Pro praktikující vývojáře jsou tyto problémy již dávno vyřešené, zapomenuté nebo si jich vůbec nevšimli. Článek se vám může hodit, pokud náhle potřebujete někomu s tímto tématem pomoci. Článek uvádí paralely s materiálem z různých knih o programování od Schildta, Stroustrupa, Okulova.

Téma o cyklech bylo vybráno proto, že je z něj při zvládnutí programování vyřazeno poměrně hodně lidí.

Tato technika je určena pro slabé studenty. Silní lidé se u tohoto tématu zpravidla nezaseknou a není třeba pro ně vymýšlet speciální techniky. Sekundárním cílem článku je přesunout tuto techniku ​​z třídy „pracuje pro všechny studenty, ale pouze jeden učitel“ do třídy „pracuje pro všechny studenty, všechny učitele“. Nenárokuji si absolutní originalitu. Pokud již podobnou metodiku k výuce tohoto tématu používáte, napište, v čem se vaše verze liší. Pokud se rozhodnete ji použít, řekněte nám, jak to dopadlo. Pokud je podobná technika popsána v knize, napište prosím název.


Této technice jsem se věnoval 4 roky, studoval jsem individuálně se studenty různých úrovní výcviku. Celkem jde o padesát studentů a dva tisíce hodin výuky. Nejprve se studenti vždy u tohoto tématu zasekli a odešli. Po každém žákovi byla upravena metodika a materiály. Za poslední rok už studenti na tomto tématu nezůstali, a tak jsem se rozhodl podělit se o své poznatky.

Proč tolik písmen? Cykly jsou tak elementární!

Jak jsem psal výše, pro praktikující vývojáře a pro silné studenty lze složitost konceptu smyček podcenit. Můžete například mít dlouhou přednášku, vidět přikyvující hlavy a inteligentní oči. Ale při pokusu o vyřešení jakéhokoli problému začíná strnulost a nevysvětlitelné problémy. Po přednášce měli studenti patrně jen částečné pochopení. Situaci zhoršuje skutečnost, že studenti sami nemohou vyjádřit, co přesně je jejich klam.
Jednoho dne jsem si uvědomil, že studenti vnímají mé příklady jako hieroglyfy. Tedy jako nedělitelné kusy textu, do kterých je potřeba přidat nějaké „kouzelné“ písmeno a ono to půjde.
Někdy jsem si všiml, že studenti si myslí, že k vyřešení konkrétního problému potřebujete něco jiného design, kterým jsem se ještě nezabýval. Řešení si sice vyžádalo jen drobnou úpravu příkladu.

Takže jsem přišel s myšlenkou, že by se nemělo soustředit na syntaxi výrazů, ale na myšlenku refaktorování opakujícího se kódu pomocí smyček. Jakmile si studenti tuto myšlenku osvojí, lze jakoukoli syntaxi vylepšit s trochou praxe.

Koho a proč učím?

Vzhledem k tomu, že neexistují žádné přijímací zkoušky, mohou třídy zahrnovat jak silné, tak velmi slabé studenty. Více o mých studentech si můžete přečíst v článku Portrét studentů večerního kurzu
Snažil jsem se zajistit, aby se to mohl naučit každý, kdo se chce naučit programovat.
Moje hodiny probíhají individuálně a student si platí své vlastní peníze za každou. Zdálo by se, že studenti budou optimalizovat náklady a požadovat minimum. Na prezenční hodiny s živým učitelem však lidé nechodí pro znalosti samotné, ale pro jistotu toho, co se naučili, pro pocit pokroku a pro schválení od odborníka (učitele). Pokud studenti nepocítí pokrok ve svém učení, odejdou. Obecně lze třídy strukturovat tak, aby studenti cítili pokrok ve zvyšování počtu známých struktur. To znamená, že nejprve se podrobně učíme, pak studujeme na, pak děláme a teď máme připravený tisíc a jeden noční kurz, ve kterém se dva měsíce studují jen cykly, a na konci – student, který napsal standardní knihovna pod diktátem. K řešení praktických problémů však potřebujete nejen znalost materiálu, ale také samostatnost při jeho aplikaci a vyhledávání nových informací. Proto si myslím, že u prezenčních kurzů je správnou zásadou učit minimum a podporovat samostatné studium nuancí a souvisejících témat. V tématu cyklů považuji za minimum konstrukci while. Z toho lze pochopit princip. Znáte-li tento princip, můžete zvládnout jak pro sebe, tak pro sebe.

Pro zvládnutí látky slabými studenty nestačí popis syntaxe. Je třeba zadat více jednoduchých, ale rozmanitých úkolů a podrobněji popsat příklady. V konečném důsledku je rychlost vývoje omezena schopností studenta transformovat výrazy a hledat vzory. Pro chytré studenty bude většina úkolů nudná. Při studiu s nimi nemusíte trvat na vyřešení 100% problémů. Můj materiál je k nahlédnutí na můj github. Pravda, úložiště připomíná spíše grimoár černokněžníka – nikdo kromě mě nepochopí, co kde je, a pokud neprojdete kontrolou, můžete se zbláznit

Metodika je orientována na praxi

Teorie je vysvětlena na příkladu řešení problému. V hodině základů programování, kde se vyučují větve a smyčky, prostě není možné dávat užitečnou přednášku na jedno téma celou hodinu. K vysvětlení konceptu stačí 15-20 minut. Hlavní potíže vznikají při provádění praktických úkolů.
Začínající učitelé mohou na jedné přednášce odradit operátory, větve, smyčky a pole. Ale jejich studenti budou čelit problému asimilace těchto informací.
Koneckonců, musíte látku nejen vyprávět, ale také se ujistit, že jí posluchači rozumí.

Skutečnost zvládnutí tématu je dána tím, jak se student vypořádá se samostatnou prací.
Pokud se studentovi podařilo vyřešit problém na téma bez pomoci učitele, pak je téma zvládnuto. Aby bylo zajištěno samotestování, je každý úkol popsán v tabulce se scénáři testování. Úkoly mají jasné pořadí. Přeskakování úkolů se nedoporučuje. Pokud je aktuální úkol příliš obtížný, pak je přechod k dalšímu zbytečný. Je to ještě složitější. Aby student zvládl aktuální složitý úkol, je mu na příkladu prvního problému vysvětleno několik technik. Ve skutečnosti celý obsah tématu spočívá v technikách překonávání obtíží. Cykly jsou spíše vedlejším efektem.

První úkol je vždy příklad. Druhý se mírně liší a provádí se „samostatně“ bezprostředně po prvním pod dohledem učitele. Všechny následující úkoly jsou zaměřeny na to, aby věnovaly pozornost různým maličkostem, které mohou způsobit mylné představy.

Vysvětlením příkladu je dialog, ve kterém student potřebuje zavolat zpětné šíření a křížové ověření, aby se ujistil, že zvládl část materiálu.

Budu banální a řeknu, že první příklad na toto téma je velmi důležitý. Pokud máte materiál pro rozsáhlou samostatnou práci, vynechání prvního příkladu lze opravit. Pokud tam kromě příkladu není nic jiného, ​​pak student s největší pravděpodobností téma nezvládne.

Zatím nebo na?

Jednou z kontroverzních otázek je výběr konstrukce pro příklad: zatímco nebo pro. Jednou mě jeden zkušený vývojář bez zkušeností s výukou hodinu přesvědčoval, že smyčka for je nejsnáze pochopitelná. Argumenty se scvrkávaly na „všechno v něm je jasné a na svém místě“. Hlavní příčinou obtíží pro skutečné začátečníky je však myšlenka samotného cyklu, nikoli jeho psaní. Pokud člověk této myšlence nerozumí, bude mít potíže se syntaxí. Jakmile je nápad realizován, problémy návrhu kódu samy zmizí.

V mých materiálech téma smyček navazuje na téma větvení. Vnější podobnost if a while nám umožňuje nakreslit přímou analogii: „když je podmínka v hlavičce pravdivá, tělo se vykoná.“ Jedinou zvláštností cyklu je, že tělo se provádí mnohokrát.

Můj druhý argument je, že while vyžaduje méně formátování než pro. Méně formátování znamená méně hloupých chyb s chybějícími čárkami a závorkami. Začátečníci si ještě nevyvinuli dostatečnou pozornost a pečlivost, aby se automaticky vyvarovali syntaktických chyb.
Třetí argument je vysvětlen v mnoha dobrých knihách jako argument první.

Pokud student dokáže snadno transformovat výrazy, můžete o tom mluvit mimochodem. Žák si pak vybere, co se mu nejvíce líbí. Pokud transformace způsobují potíže, pak je lepší nerozptylovat vaši pozornost. Nechte studenta nejprve vše vyřešit pomocí while. Jakmile zvládnete téma smyček, můžete řešení přepsat a procvičit si převod while na for.
Postcondition smyčky jsou docela vzácné zvíře. Vůbec tomu nevěnuji čas. Pokud si student osvojil myšlenky identifikace vzorů a transformace výrazů, dokáže na to přijít i bez mé pomoci.

Při předvádění prvního příkladu silným žákům upozorňuji na skutečnost, že u prvního příkladu je důležité zaznamenat nejen řešení, ale i celý řetězec akcí, které vedly k výsledku. Líní studenti mohou psaní zanedbat a zkopírovat pouze finální algoritmus. Je třeba je přesvědčit, že jednoho dne je čeká těžký úkol. Chcete-li to vyřešit, budete muset postupovat podle kroků jako v tomto příkladu. Proto je důležité zaznamenávat všechny fáze. V následujících problémech bude možné ponechat pouze finální verzi řešení.

Hlavní myšlenkou automatizace je, že svěříme počítači, aby za člověka dělal rutinní práci. Jednou ze základních technik je psaní smyček. Používá se, když je v programu zapsáno několik stejných opakujících se akcí za sebou.

Explicitní je lepší než implicitní

Může se zdát jako dobrý nápad zobrazit stejnou frázi vícekrát v první úloze opakování. Například:

Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!
Hurá, funguje to!

Tato možnost je špatná, protože hodnota čítače není ve výstupu viditelná. To je problém pro začátečníky. Nepodceňujte ji. Nejprve byl tento úkol první a úkol odvodit řadu čísel ve vzestupném pořadí byl druhý. Bylo nutné zavést další termíny „cyklus N krát“ a „cyklus z A do B“, které jsou v podstatě totéž. Aby nevznikaly zbytečné entity, rozhodl jsem se ukázat pouze příklad s výstupem řady čísel. Málokomu se podaří naučit se držet pult v hlavě a modelovat chování programu v hlavě bez přípravy. Někteří studenti se poprvé setkávají s mentálním modelováním na téma cyklů.
Po určité praxi dávám za úkol zopakovat stejný text k samostatnému řešení. Pokud dáte nejprve viditelné počítadlo a poté neviditelné, studenti budou mít méně problémů. Někdy stačí rada „nepište počítadlo na obrazovku“.

Jak to vysvětlují ostatní?

Ve většině vzdělávacích materiálů na internetu je syntaxe cyklu uvedena jako součást „přednášky“. Například na developer.mozilla.org (aktuálně) je spolu se smyčkou while popsáno několik dalších konstrukcí. V tomto případě jsou ve formě šablon uvedeny pouze samotné návrhy. Výsledek jejich spuštění je popsán slovy, ale chybí ilustrace. Podle mého názoru taková prezentace tématu násobí užitečnost takových materiálů nulou. Student si může kód přepsat a spustit sám, ale stále potřebuje standard pro srovnání. Jak můžete pochopit, že příklad byl přepsán správně, když výsledek není s čím porovnat?
Když je uvedena pouze šablona bez příkladu, je to pro studenta ještě obtížnější. Jak pochopit, že fragmenty kódu jsou v šabloně umístěny správně? Můžete zkusit napsat nějaka poté spustit. Pokud ale neexistuje norma pro porovnání výsledku, pak nepomůže ani spuštění.

V kurzu C++ na Intuitive je syntaxe smyčky pohřbena na třetí stránce přednášky 4 na téma „operátoři“. Při vysvětlování syntaxe smyček je zvláštní důraz kladen na pojem „operátor“. Termín je prezentován jako soubor faktů jako „symbol; toto je příkaz", "{} je složený příkaz", "tělo cyklu musí být příkaz". Tento přístup se mi nelíbí, protože se zdá, že skrývá důležité vztahy za jeden termín. Rozbor zdrojového kódu programu do termínů na této úrovni potřebují vývojáři kompilátoru k implementaci jazykové specifikace, ale ne studenti jako první aproximaci. Začátečníci v programování jsou zřídka tak pečliví, aby věnovali tak velkou pozornost termínům. Je to vzácný člověk, který si pamatuje nová slova a rozumí jim hned napoprvé. Téměř nikdo nedokáže správně použít termín, který se právě naučil. Studenti proto dostávají mnoho chyb jako „Napsal jsem zatímco(a<7);{, ale program nefunguje.“
Podle mě je na začátku lepší dát syntaxi konstrukce hned se závorkami. Možnost bez závorek by měla být vysvětlena pouze v případě, že má student konkrétní otázku: „proč nejsou závorky a funguje to“.

V Okulovově knize „Základy programování“ z roku 2012 začíná úvod do smyček vzorem for, poté dává doporučení pro jeho použití a poté okamžitě přechází k experimentální části lekce. Chápu, že kniha byla napsána pro menšinu velmi schopných studentů, kteří na mé hodiny chodí jen zřídka.

V populárních knihách je vždy zapsán výsledek fragmentů kódu. Například Shildtovo vydání „Java 8. The Complete Guide“ z roku 2015. Nejprve je uvedena šablona, ​​poté ukázkový program a hned po něm - výsledek provedení.

Jako příklad zvažte smyčku while, která dělá opak
odpočítávání počínaje 10 a zobrazí se přesně 10 řádků „opatření“:

//Продемонстрировать применение оператора цикла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("такт " + n);
            n--;
        }
    }
}

Po spuštění tento program vydá deset „cyklů“ takto:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Postup popisu šablony, ukázkového programu a výsledku programu je také použit v knize „Javascript for Kids“ a v kurzu js na w3schools.com. Formát webové stránky dokonce umožňuje, aby byl tento příklad interaktivní.

Stroustrupova kniha Principles and Practice Using C++ z roku 2016 šla ještě dále. Prvním krokem je vysvětlit, jaký výsledek by měl být získán, a poté se zobrazí text programu. Navíc si berou za příklad nejen náhodný program, ale exkurzi do historie. To pomáhá přitáhnout pozornost: „Podívejte, tohle není jen nějaký zbytečný text. Vidíš něco smysluplného."

Jako příklad iterace zvažte první program spuštěný na stroji s uloženým programem (EDSAC). Napsal ji David Wheeler v počítačové laboratoři Cambridgeské univerzity v Anglii 6. května 1949. Tento program vypočítá a vytiskne jednoduchý seznam čtverců.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Zde každý řádek obsahuje číslo následované znakem tabulátoru ('t') a druhou mocninou tohoto čísla. C++ verze tohoto programu vypadá takto:

//Вычисляем и распечатываем таблицу квадратов чисел 0-99
int main()
{
    int i = 0; // Начинаем с нуля
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

Zajímavé je, že vzor syntaxe není v této knize popsán. Stroustrup v návodu pro instruktora (překlad) zdůrazňuje, že respektuje inteligenci svých studentů. Možná je schopnost identifikovat vzor v několika příkladech považována za projev takové inteligence.

Jak si vysvětluji

Nejpromyšlenější se jeví Stroustrupův přístup: popsat výsledek, poté vyřešit problém a poté nezávislou analýzu studentem. Proto jsem se rozhodl vzít to jako základ, ale řeknu to na méně historickém příkladu - úkol odvodit „obsah“. Tvoří rozeznatelnou kotvu, abyste pak mohli říci „zapamatuj si úkol o obsahu“ a studenti si to přesně zapamatovali. Ve svém příkladu jsem se pokusil zabránit dalším dvěma nejčastějším mylným představám. Dále o nich napíšu podrobněji.

V této úloze se seznámíme s technikami řešení složitých problémů. Počáteční rozhodnutí musí být primitivní a jednoduché. No a pak můžete přemýšlet o tom, jak toto řešení vylepšit.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Podle mých pozorování vede přístup „šablona-příklad-výsledek“ v různých kombinacích stále k tomu, že studenti vnímají cyklus jako hieroglyf. To se projevovalo tím, že nechápali, proč je tam podmínka psát, jak si vybrat mezi i++ a i — a další zdánlivě samozřejmé věci. Aby se předešlo těmto mylným představám, měl by přístup k hovořit o cyklech zdůrazňovat význam opakování stejných akcí a teprve poté je formalizovat pomocí struktury. Proto před zadáním syntaxe smyčky musíte problém vyřešit přímo. Primitivní řešení problému s obsahem vypadá takto:

Console.WriteLine("Введение");
Console.WriteLine("Глава 1");
Console.WriteLine("Глава 2");
Console.WriteLine("Глава 3");
Console.WriteLine("Глава 4");
Console.WriteLine("Глава 5");
Console.WriteLine("Глава 6");
Console.WriteLine("Глава 7");
Console.WriteLine("Заключение");

Jak to lze zlepšit?
Nahraďte monotónní akce cyklem.
Jaké akce se opakují za sebou beze změn?
V tomto fragmentu nejsou žádné. Příkazy pro zobrazení slova „Kapitola“ s číslem jsou si však velmi podobné.
Další fází je proto nalezení rozdílu mezi fragmenty. Pouze v tomto úkolu je vše zřejmé, pak se nebudou opakovat jednotlivé příkazy, ale bloky kódu o 5 nebo více řádcích. Budete muset hledat nejen v seznamu příkazů, ale i ve větvených nebo smyčkových konstrukcích.
V příkladu je rozdíl mezi příkazy v čísle za slovem „Kapitola“.
Jakmile najdete rozdíl, musíte pochopit vzorec změny. Jiný fragment je číslo? Neustále se zvyšuje nebo snižuje? Jak se změní hodnota čísla mezi dvěma týmy vedle sebe?
V příkladu se číslo za slovem „Kapitola“ zvyšuje v krocích po 1. Rozdíl je nalezen, vzor je odhalen. Nyní můžete nahradit odlišný fragment proměnnou.
Takovou proměnnou musíte deklarovat před prvním z opakujících se fragmentů. Taková proměnná se obvykle nazývá I nebo j nebo nějak podrobněji. Jeho počáteční hodnota se musí rovnat první hodnotě zobrazené na obrazovce. V příkladu je první hodnota 1.
Jakou počáteční hodnotu je třeba vzít pro zobrazení řady čísel „100, 101, 102, 103, 104, 105“?
První číslo v této sérii je 100.
Po každém výstupním příkazu musíte zvýšit hodnotu této proměnné o 1. Tato jednotka je krokem změny.
Jaký krok bude v řadě čísel „100, 102, 104, 106“?
Krok 2 v tomto řádku.
Po nahrazení odlišného fragmentu proměnnou bude kód vypadat takto:

Console.WriteLine("Введение");
int i;
i = 0;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Заключение");

Po použití techniky „vyjádření vzoru proměnné“ v kódu získáte několik skupin identických akcí, které jdou za sebou. Nyní lze opakující se akce nahradit cyklem.

Posloupnost řešení problému, kde potřebujete použít smyčky, se skládá z následujících kroků:

  1. Řešte „čelem“ mnoha samostatnými příkazy
  2. Najděte vzor
  3. Vyjádřete vzor proměnné
  4. Uspořádejte jako cyklus

Dále jsou zavedeny nové pojmy, aby se student neocitl v situaci „všemu rozumím, ale neumím to říct“:
— čítač je vždy proměnná, která je potřebná ke sledování počtu kroků ve smyčce. Obvykle celé číslo, které se porovnává s omezením.
— čítačový krok — popis vzoru změn čítače.
- omezení - číslo nebo proměnná, se kterou je počítadlo porovnáno, aby byl algoritmus konečný. Hodnota čítače se změní, aby se přiblížila limitu.
— loop body — sada příkazů, které se budou opakovat. Když říkají „příkaz je zapsán uvnitř smyčky“, myslí tím tělo.
— opakování smyčky — jednorázové provedení těla smyčky.
— podmínka smyčky — logický výraz, který určuje, zda bude provedena další iterace. (Tady může dojít k záměně s větvenými strukturami)
Musíte se připravit na to, že studenti budou zpočátku používat termíny pro jiné účely. To platí pro silné i slabé. Nastolit společný jazyk je umění. Nyní napíšu stručně: musíte si nastavit úkol „zvýraznit fragment kódu pomocí <term>“ a tyto výrazy sami správně používat v konverzaci.
Po transformaci smyčkou se získá fragment:

Console.WriteLine("Введение");
int i = 0;
while (i < 7) {
    Console.WriteLine("Глава " + i);
    i = i + 1;
}
Console.WriteLine("Заключение");

Hlavní mylná představa

Jednou z populárních mylných představ mezi studenty je, že umisťují akce do smyčky, kterou je třeba provést pouze jednou. Například takto:

;
int i = 0;
while (i < 7) {
    Console.WriteLine("Введение")
    Console.WriteLine("Глава " + i);
    i = i + 1;
    Console.WriteLine("Заключение");
}

Studenti na tento problém narážejí neustále, jak na začátku, tak i ve složitějších problémech.
Klíčová rada v tomto případě:

Kolikrát byste měli příkaz opakovat: jednou nebo mnohokrát?

Příkazy pro tisk slov "Úvod" a "Závěr" a deklaraci a inicializaci proměnné i nejsou jako jiné opakované akce. Provádějí se pouze jednou, což znamená, že je třeba je zapsat mimo tělo smyčky.

Všechny tři fáze řešení by měly zůstat v kódu, abyste se na ně mohli později v případě potíží odkázat. První dvě možnosti stačí okomentovat, aby nepřekážely.
Student by měl být upozorněn na následující skutečnosti:
— Ve stavu smyčky se čítač a limit obvykle porovnávají. Čítač se může měnit v těle smyčky, ale limit ne. Abyste toto pravidlo porušili, musíte formulovat pádné důvody.
— Příkazy pro zobrazení slov „Úvod“ a „Závěr“ jsou umístěny mimo tělo smyčky. Musíme je provést 1x. „Úvod“ - před opakováním akcí, „Závěr“ - po.
V procesu upevňování tohoto tématu, zvládání dalších i zvládání obtíží je pro i silné studenty užitečné položit si otázku: „Kolikrát je třeba tuto akci provést? Jeden nebo mnoho?

Rozvoj dalších dovedností

V procesu studia cyklů studenti také rozvíjejí dovednost diagnostiky a řešení problémů. Pro provedení diagnostiky musí student prezentovat požadovaný výsledek a porovnat jej se skutečným výsledkem. Nápravná opatření závisí na rozdílu mezi nimi.
Protože studenti v této fázi stále mají malou představu o „požadovaném“ výsledku, mohou se zaměřit na testovací data. Zpravidla nikdo v této fázi ještě nechápe, co se může pokazit a jak se s tím vypořádat. Proto si píšu do sešitu popis typických problémů a několik způsobů jejich řešení. Vybrat ten nejvhodnější je úkolem studenta samotného.
Záznam je potřeba k otázce „stalo se, co se očekávalo?“, „Která z těchto situací se stala nyní?“, „Pomohlo použité řešení?“

  1. Počet akcí je o 1 menší nebo více, než se očekávalo. Řešení:
    — zvýšit počáteční hodnotu počítadla o 1.
    — nahraďte striktní operátor porovnání (< nebo >) nepřísným operátorem (<= nebo >=).
    — změňte mezní hodnotu na 1.
  2. Akce ve smyčce se provádějí bez zastavení, neomezeně dlouho. Řešení:
    — přidejte příkaz ke změně čítače, pokud chybí.
    — opravte příkaz ke změně čítače tak, aby se jeho hodnota přiblížila limitu.
    — odstraňte příkaz změny omezení, pokud je v těle smyčky.
  3. Počet akcí ve smyčce je o více než 1 menší nebo větší, než se očekávalo. Akce ve smyčce nebyla provedena ani jednou. Nejprve musíte zjistit skutečné hodnoty proměnných těsně před začátkem cyklu. Řešení:
    — změnit počáteční hodnotu omezení
    — změnit počáteční hodnotu počítadla

Problém 3 obvykle zahrnuje použití nesprávné proměnné nebo nevynulování počítadla na nulu.

Po tomto vysvětlení může mít student stále různé mylné představy o tom, jak smyčky fungují.
Abych odstranil ty nejběžnější, zadávám vám následující úkoly:

  1. Ve kterém uživatel zadává limit, počáteční hodnotu čítače nebo krok čítače.
  2. Ve kterém musí být v nějakém aritmetickém výrazu použita hodnota čítače. Je vhodné použít čítač v radikálním výrazu nebo ve jmenovateli, aby rozdíl byl nelineární.
  3. Ve kterém se hodnota čítače nezobrazuje na obrazovce, když smyčka běží. Například zobrazení požadovaného počtu identických textových fragmentů nebo nakreslení postavy s grafikou želvy.
  4. Ve kterém musíte provést nejprve některé opakující se akce a poté další.
  5. Ve kterém musíte provést další akce před a po opakování

Pro každý úkol musíte poskytnout testovací data a očekávaný výsledek.

Abyste pochopili, jak rychle se můžete pohybovat, musíte si přečíst podmínky těchto problémů a zeptat se: „Jak se liší od příkladu?“, „Co je třeba v příkladu změnit, aby se vyřešily?“ Pokud žák odpoví smysluplně, pak ať alespoň jeden vyřeší v hodině, zbytek pak sám doma. Pokud je řešení úspěšné, pak můžeme začít vysvětlovat podmínky uvnitř smyček.
Pokud máte problémy s řešením problémů sami, musíte ve třídě vše zvládnout. Aby řešení problému nepřipomínalo kreslení sovy, doporučuji nejprve problém vyřešit neuniverzálním způsobem. Tedy tak, aby řešení prošlo prvním testem a nepoužívalo konstrukci smyčky. Pak použijte transformace, abyste dosáhli univerzálnosti řešení.

Smyčky a větve

Dle mého názoru je užitečné dát téma „cykly v rámci oborů“ samostatně. Abyste později viděli rozdíl mezi kontrolou podmínky vícekrát a jednou kontrolou.
Úkoly pro konsolidaci se budou týkat výstupu čísel z A do B, která zadává uživatel:
- vždy ve vzestupném pořadí.
- vzestupně nebo sestupně v závislosti na hodnotách A a B.

Téma „větvení v rámci smyček“ by se mělo posunout dále až poté, co si student osvojí techniky: „náhrada vzoru proměnnou“ a „náhrada opakujících se akcí cyklem“.
Hlavním důvodem pro použití větví uvnitř smyček jsou anomálie ve vzoru. Uprostřed se láme v závislosti na počátečních údajích.
Pro ty studenty, kteří jsou schopni hledat řešení kombinací jednoduchých technik, stačí říci „větvení lze zapsat do smyček“ a dát problém „například“ zcela samostatně vyřešit.
Příklad úkolu:

Uživatel zadá číslo X. Zobrazte ve sloupci čísla od 0 do 9 a naproti číslu, které se rovná X, vložte znaménko „+“.

Pokud byla zadána 00+
1
2
3
4
5
6
7
8
9

Pokud byla zadána 60
1
2
3
4
5
6+
7
8
9

Pokud byla zadána 90
1
2
3
4
5
6
7
8
9+

Pokud byla zadána 7770
1
2
3
4
5
6
7
8
9

Pokud k psaní se smyčkou nestačí krátké vysvětlení, pak je třeba dosáhnout univerzálního řešení stejného problému bez smyčky.
Získáte jednu ze dvou možností:
Žádoucí

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine(0 + "+");
} else {
    Console.WriteLine(0);
}
if (x==1) {
    Console.WriteLine(1 + "+");
} else {
    Console.WriteLine(1);
}
if (x==2) {
    Console.WriteLine(2 + "+");
} else {
    Console.WriteLine(2);
}
if (x==3) {
    Console.WriteLine(3 + "+");
} else {
    Console.WriteLine(3);
}
if (x==4) {
    Console.WriteLine(4 + "+");
} else {
    Console.WriteLine(4);
}
if (x==5) {
    Console.WriteLine(5 + "+");
} else {
    Console.WriteLine(5);
}
if (x==6) {
    Console.WriteLine(6 + "+");
} else {
    Console.WriteLine(6);
}
if (x==7) {
    Console.WriteLine(7 + "+");
} else {
    Console.WriteLine(7);
}
if (x==8) {
    Console.WriteLine(8 + "+");
} else {
    Console.WriteLine(8);
}
if (x==9) {
    Console.WriteLine(9 + "+");
} else {
    Console.WriteLine(9);
}

Možný

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine("0+n1n2n3n4n5n6n7n8n9");
}
if (x==1) {
    Console.WriteLine("0n1+n2n3n4n5n6n7n8n9");
}
if (x==2) {
    Console.WriteLine("0n1n2+n3n4n5n6n7n8n9");
}
if (x==3) {
    Console.WriteLine("0n1n2n3+n4n5n6n7n8n9");
}
if (x==4) {
    Console.WriteLine("0n1n2n3n4+n5n6n7n8n9");
}
if (x==5) {
    Console.WriteLine("0n1n2n3n4n5+n6n7n8n9");
}
if (x==6) {
    Console.WriteLine("0n1n2n3n4n5n6+n7n8n9");
}
if (x==7) {
    Console.WriteLine("0n1n2n3n4n5n6n7+n8n9");
}
if (x==8) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8+n9");
}
if (x==9) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8n9+");
}

Podobný úkol dávám předem, při studiu tématu větvení.
Pokud student přijde s „možnou“ možností, musíte jim říci, že na stejný problém může být mnoho řešení. Liší se však odolností vůči změnám požadavků. Položte otázku: „Kolik míst v kódu by bylo potřeba opravit, kdybych musel přidat další číslo? V „možné“ verzi budete muset přidat další pobočku a přidat nové číslo na 10 dalších místech. V „požadovaném“ stačí přidat pouze jednu větev.
Nastavte úlohu tak, aby reprodukovala „požadovanou“ možnost, pak najděte vzor v kódu, proveďte nahrazení proměnné a napište smyčku.
Pokud máte nápad, jak tento problém vyřešit bez smyčky jiným způsobem, napište do komentářů.

Smyčky uvnitř Smyček

V tomto tématu je třeba věnovat pozornost následujícímu:
— čítače pro vnitřní a vnější smyčky musí být různé proměnné.
— čítač vnitřní smyčky musí být mnohokrát resetován (to znamená v těle vnější smyčky).
— v úlohách textového výstupu nemůžete nejprve napsat jedno písmeno na několik řádků a potom druhé. Nejprve musíte vytisknout všechna písmena prvního řádku, poté všechna písmena druhého a tak dále.

Nejlepší je začít vysvětlovat téma smyček uvnitř smyček vysvětlením důležitosti vynulování počítadla.
Příklad úkolu:

Uživatel zadá dvě čísla: R a T. Vytiskne dva řádky znaků "#". První řádek by měl obsahovat R znaků. Druhý řádek obsahuje T kusů. Pokud je jakékoli číslo záporné, zobrazí se chybová zpráva.

R = 5, T = 11#####
###########

R = 20, T = 3#####################
# # #

R = -1, T = 6Hodnota R musí být nezáporná

R = 6, T = -2Hodnota T musí být nezáporná

Je zřejmé, že tento problém má také nejméně dvě řešení.
Žádoucí

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
i = 0;
while (i < T)
{
    Console.Write("#");
    i = i + 1;
}

Možné #1

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
int j = 0;
j = 0;
while (j < T)
{
    Console.Write("#");
    j = j + 1;
}

Rozdíl je v tom, že v "možném" řešení byla pro výstup druhého řádku použita druhá proměnná. Měli byste trvat na použití stejné proměnné pro obě smyčky. Toto omezení lze odůvodnit tím, že řešení s jedním čítačem na dva cykly bude ilustrací termínu „resetování čítače“. Pochopení tohoto pojmu je nutné při řešení následujících problémů. Jako kompromis můžete uložit obě řešení problému.

Typický problém s použitím jedné proměnné čítače pro dvě smyčky vypadá takto:
R = 5, T = 11#####
######

Počet znaků na druhém řádku neodpovídá hodnotě T. Pokud potřebujete pomoci s tímto problémem, musíte se podívat do poznámek o typických problémech se smyčkami. Toto je příznak č. 3. Diagnostikuje se, pokud přidáte výstup hodnoty čítače bezprostředně před druhým cyklem. Opraveno resetováním. Ale je lepší to neříkat hned. Student se musí pokusit formulovat alespoň jednu hypotézu.

Existuje samozřejmě i jiné řešení. Ale mezi studenty jsem to nikdy neviděl. Ve fázi studia cyklů příběh o tom odvede pozornost. Můžete se k tomu vrátit později, když se budete učit o funkcích řetězců.
Možné #2

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
Console.WriteLine(new String('#', R));
Console.WriteLine(new String('#', T));

Další požadovaný úkol:

Zobrazte čísla od 0 do 9. Každé číslo by mělo být na samostatném řádku. Počet číslic na řádku (W) se zadává z klávesnice.

W = 10
1
2
3
4
5
6
7
8
9

W = 100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

Pokud si student osvojil techniku ​​nahrazování proměnné, pak si poradí celkem rychle. Možný problém bude opět v resetu proměnné. Pokud transformaci nezvládnete, znamená to, že jste spěchali a potřebujete vyřešit jednodušší problémy.

Děkuji za pozornost. Lajkujte a odebírejte kanál.

PS Pokud v textu najdete překlepy nebo chyby, dejte mi prosím vědět. To lze provést výběrem části textu a stisknutím „⌘ + Enter“ na Macu a „Ctrl / Enter“ na klasické klávesnici nebo prostřednictvím soukromých zpráv. Pokud tyto možnosti nejsou k dispozici, napište o chybách do komentářů. Děkuji!

Průzkumu se mohou zúčastnit pouze registrovaní uživatelé. Přihlásit se, prosím.

Anketa pro čtenáře bez karmy

  • 20,0%Profesně učím, +12

  • 10,0%Profesně učím, -11

  • 70,0%Neučím, +17

  • 0,0%Neučím, -10

  • 0,0%Ostatní0

Hlasovalo 10 uživatelů. 5 uživatelů se zdrželo hlasování.

Zdroj: www.habr.com

Přidat komentář