Ako naučiť prekonávať ťažkosti a zároveň písať cykly

Napriek tomu, že sa budeme baviť o jednej zo základných tém, tento článok je napísaný pre skúsených profesionálov. Cieľom je ukázať, aké mylné predstavy majú začiatočníci v programovaní. Pre praktizujúcich vývojárov sú tieto problémy už dávno vyriešené, zabudnuté alebo si ich vôbec nevšimli. Článok sa vám môže hodiť, ak zrazu potrebujete niekomu pomôcť s touto témou. Článok uvádza paralely s materiálmi z rôznych kníh o programovaní od Schildta, Stroustrupa, Okulova.

Téma o cykloch bola zvolená preto, lebo pri ovládaní programovania je z nej vyradených pomerne veľa ľudí.

Táto technika je určená pre slabších študentov. Silní ľudia sa spravidla na tejto téme nezaseknú a netreba im vymýšľať špeciálne techniky. Sekundárnym cieľom článku je posunúť túto techniku ​​z triedy „pracuje pre všetkých študentov, ale iba jedného učiteľa“ do triedy „pracuje pre všetkých študentov, všetkých učiteľov“. Nenárokujem si absolútnu originalitu. Ak už pri výučbe tejto témy používate podobnú metodiku, napíšte, v čom sa vaša verzia líši. Ak sa ho rozhodnete použiť, povedzte nám, ako to dopadlo. Ak je podobná technika opísaná v knihe, napíšte prosím názov.


Tejto technike som sa venoval 4 roky, študoval som individuálne so študentmi rôznych úrovní výcviku. Celkovo je to asi päťdesiat študentov a dvetisíc hodín vyučovania. Žiaci sa najprv vždy na tejto téme zasekli a odišli. Po každom žiakovi sa upravila metodika a materiály. Za posledný rok už študenti na tejto téme nezostali, a tak som sa rozhodol podeliť o svoje zistenia.

Prečo toľko písmen? Cykly sú také základné!

Ako som písal vyššie, pre cvičných vývojárov a pre silných študentov môže byť zložitosť konceptu slučiek podceňovaná. Môžete napríklad urobiť dlhú prednášku, vidieť prikyvujúce hlavy a inteligentné oči. Ale pri pokuse o vyriešenie akéhokoľvek problému začína stupor a nevysvetliteľné problémy. Po prednáške mali študenti zrejme len čiastočné pochopenie. Situáciu zhoršuje skutočnosť, že študenti sami nevedia vyjadriť, čo presne je ich klam.
Jedného dňa som si uvedomil, že študenti vnímajú moje príklady ako hieroglyfy. Teda ako nedeliteľné kúsky textu, do ktorých treba pridať nejaké „čarovné“ písmeno a bude to fungovať.
Niekedy som si všimol, že študenti si myslia, že na vyriešenie konkrétneho problému potrebujete niečo iné dizajn, ktorým som sa ešte nezaoberal. Riešenie si síce vyžadovalo len miernu úpravu príkladu.

Tak som prišiel s myšlienkou, že by sme sa nemali sústrediť na syntax výrazov, ale na myšlienku refaktorovania opakujúceho sa kódu pomocou slučiek. Keď si študenti osvoja túto myšlienku, akákoľvek syntax sa dá vylepšiť s malým cvičením.

Koho a prečo učím?

Keďže neexistujú žiadne prijímacie skúšky, triedy môžu zahŕňať silných aj veľmi slabých študentov. Viac o mojich študentoch si môžete prečítať v článku Portrét študentov večerného kurzu
Snažil som sa zabezpečiť, aby sa to mohol naučiť každý, kto sa chce naučiť programovať.
Moje hodiny prebiehajú individuálne a študent si platí svoje vlastné peniaze za každú. Zdalo by sa, že študenti budú optimalizovať náklady a požadovať minimum. Na prezenčné hodiny so živým učiteľom však ľudia nechodia pre vedomosti samotné, ale pre istotu toho, čo sa naučili, pre pocit napredovania a pre schválenie odborníkom (učiteľom). Ak žiaci nepociťujú pokrok v učení, odídu. Vo všeobecnosti môžu byť triedy štruktúrované tak, aby študenti cítili pokrok pri zvyšovaní počtu známych štruktúr. To znamená, že najprv sa podrobne učíme, potom sa učíme, potom robíme a teraz máme pripravených tisíc a jeden nočný kurz, v ktorom sa dva mesiace študujú len cykly a na konci študent, ktorý napísal štandardná knižnica pod diktátom. Na riešenie praktických problémov však potrebujete nielen znalosť materiálu, ale aj samostatnosť pri jeho aplikácii a vyhľadávaní nových informácií. Preto si myslím, že pri prezenčných kurzoch je správnym princípom učiť minimum a podporovať samostatné štúdium nuancií a súvisiacich tém. V téme cyklov považujem za minimum konštrukciu while. Z toho sa dá pochopiť princíp. Keď poznáte princíp, môžete si osvojiť oboje, ako aj pre seba.

Na zvládnutie látky slabými študentmi nestačí opísať syntax. Je potrebné dať viac jednoduchých, ale pestrých úloh a podrobnejšie popísať príklady. V konečnom dôsledku je rýchlosť vývoja obmedzená schopnosťou študenta transformovať výrazy a hľadať vzory. Pre šikovných študentov bude väčšina úloh nudná. Pri štúdiu s nimi nemusíte trvať na vyriešení 100% problémov. Môj materiál si môžete pozrieť na môj github. Je pravda, že úložisko je skôr ako grimoár čarodejníka - nikto okrem mňa nepochopí, čo kde je, a ak neprejde kontrolou, môžete sa zblázniť

Metodika je orientovaná na prax

Teória je vysvetlená na príklade riešenia problému. Na hodine základov programovania, kde sa vyučujú vetvy a slučky, jednoducho nie je možné dávať užitočnú prednášku na jednu tému celú hodinu. Na vysvetlenie konceptu stačí 15-20 minút. Hlavné ťažkosti vznikajú pri vykonávaní praktických úloh.
Začínajúci učitelia môžu v rámci jednej prednášky rozohnať operátory, vetvy, slučky a polia. Ich študenti však budú čeliť problému asimilácie týchto informácií.
Koniec koncov, musíte materiál nielen povedať, ale aj zabezpečiť, aby mu poslucháči rozumeli.

Skutočnosť zvládnutia témy je daná tým, ako si študent poradí so samostatnou prácou.
Ak sa študentovi podarilo vyriešiť problém na tému bez pomoci učiteľa, potom je téma zvládnutá. Na zabezpečenie samotestovania je každá úloha popísaná v tabuľke s testovacími scenármi. Úlohy majú jasné poradie. Preskakovanie úloh sa neodporúča. Ak je aktuálna úloha príliš ťažká, potom je prechod na ďalšiu zbytočný. Je to ešte komplikovanejšie. Aby študent zvládol aktuálnu komplexnú úlohu, je mu na príklade prvého problému vysvetlených niekoľko techník. V skutočnosti sa celý obsah témy týka techník na prekonávanie ťažkostí. Cykly sú skôr vedľajším účinkom.

Prvá úloha je vždy príklad. Druhý sa mierne líši a vykonáva sa „samostatne“ bezprostredne po prvom pod dohľadom učiteľa. Všetky nasledujúce úlohy sú zamerané na to, aby ste venovali pozornosť rôznym maličkostiam, ktoré môžu spôsobiť mylné predstavy.

Vysvetlenie príkladu je dialóg, v ktorom študent potrebuje zavolať späť šírenie a krížové overenie, aby sa uistil, že zvládol časť materiálu.

Budem banálny a poviem, že prvý príklad na túto tému je veľmi dôležitý. Ak máte materiál na rozsiahlu samostatnú prácu, vynechanie prvého príkladu je možné opraviť. Ak okrem príkladu neexistuje nič iné, študent s najväčšou pravdepodobnosťou tému nezvládne.

Zatiaľ alebo na?

Jednou z kontroverzných otázok je výber konštrukcie napríklad: kým alebo na. Raz ma jeden praktický priateľ vývojár bez skúseností s výučbou hodinu presviedčal, že cyklus for je najjednoduchší na pochopenie. Argumenty sa scvrkli na „všetko v ňom je jasné a usporiadané na svojom mieste“. Hlavnou príčinou ťažkostí pre skutočných začiatočníkov je však myšlienka samotného cyklu a nie jeho písanie. Ak človek nerozumie tejto myšlienke, bude mať ťažkosti so syntaxou. Len čo sa nápad zrealizuje, problémy návrhu kódu samy od seba zmiznú.

V mojich materiáloch téma slučiek nadväzuje na tému vetvenia. Vonkajšia podobnosť if a while nám umožňuje nakresliť priamu analógiu: „keď je podmienka v hlavičke pravdivá, telo sa vykoná.“ Jedinou zvláštnosťou cyklu je, že telo sa vykonáva mnohokrát.

Môj druhý argument je, že while vyžaduje menej formátovania ako pre. Menej formátovania znamená menej hlúpych chýb s chýbajúcimi čiarkami a zátvorkami. Začiatočníci si ešte nevyvinuli dostatočnú pozornosť a pedantnosť, aby sa automaticky vyhli syntaktickým chybám.
Tretí argument je vysvetlený v mnohých dobrých knihách ako prvý argument.

Ak študent dokáže ľahko transformovať výrazy, môžete o tom hovoriť mimochodom. Študent si potom vyberie, čo sa mu najviac páči. Ak transformácie spôsobujú ťažkosti, potom je lepšie nerozptyľovať vašu pozornosť. Nechajte študenta najskôr všetko vyriešiť pomocou while. Keď si osvojíte tému slučiek, môžete prepísať riešenia na precvičenie prevodu while na for.
Postcondition slučky sú dosť vzácne zviera. Vôbec tomu nevenujem čas. Ak si študent osvojil myšlienky identifikácie vzorov a transformácie výrazov, dokáže na to prísť aj bez mojej pomoci.

Pri predvádzaní prvého príkladu silným žiakom upozorňujem na skutočnosť, že pri prvom príklade je dôležité zaznamenať nielen riešenie, ale aj celý reťazec akcií, ktoré viedli k výsledku. Leniví študenti môžu zanedbávať písanie a kopírovať iba konečný algoritmus. Treba ich presvedčiť, že jedného dňa ich čaká náročná úloha. Ak to chcete vyriešiť, budete musieť postupovať podľa krokov v tomto príklade. Preto je dôležité zaznamenávať všetky fázy. V nasledujúcich problémoch bude možné ponechať len finálnu verziu riešenia.

Hlavnou myšlienkou automatizácie je, že počítaču zveríme rutinnú prácu za človeka. Jednou zo základných techník je písanie slučiek. Používa sa, keď je v programe napísaných niekoľko rovnakých opakujúcich sa akcií za sebou.

Explicitné je lepšie ako implicitné

Mohlo by sa zdať ako dobrý nápad zobraziť rovnakú frázu viackrát v prvej úlohe opakovania. Naprí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!

Táto možnosť je zlá, pretože hodnota počítadla nie je viditeľná vo výstupe. Toto je problém pre začiatočníkov. Nepodceňujte ju. Najprv bola táto úloha prvou a úlohou odvodiť sériu čísel vo vzostupnom poradí bola druhá. Bolo potrebné zaviesť ďalšie pojmy „cyklus N-krát“ a „cyklus z A do B“, ktoré sú v podstate to isté. Aby nevznikali zbytočné entity, rozhodol som sa ukázať len príklad s výstupom radu čísel. Málokomu sa podarí naučiť držať v hlave počítadlo a modelovať správanie programu v hlave bez prípravy. Niektorí študenti sa prvýkrát stretávajú s mentálnym modelovaním na tému cyklov.
Po precvičení dávam za úlohu zopakovať ten istý text na samostatné vyriešenie. Ak dáte najskôr viditeľné počítadlo a potom neviditeľné, študenti budú mať menej problémov. Niekedy stačí rada „nepíšte počítadlo na obrazovku“.

Ako si to vysvetľujú iní?

Vo väčšine vzdelávacích materiálov na internete je syntax cyklu uvedená ako súčasť „prednášky“. Napríklad na stránke developer.mozilla.org (v súčasnosti) je spolu s cyklom while popísaných niekoľko ďalších konštruktov. V tomto prípade sú len samotné návrhy uvedené vo forme šablón. Výsledok ich spustenia je opísaný slovami, ale chýba ilustrácia. Takáto prezentácia témy podľa mňa znásobuje užitočnosť takýchto materiálov nulou. Študent si môže prepísať kód a spustiť ho sám, ale stále potrebuje štandard na porovnanie. Ako môžete pochopiť, že príklad bol prepísaný správne, ak nie je s čím porovnávať výsledok?
Keď je uvedená iba šablóna bez príkladu, je to pre študenta ešte ťažšie. Ako pochopiť, že fragmenty kódu sú v šablóne umiestnené správne? Môžete skúsiť napísať nejakoa potom spustite. Ale ak neexistuje štandard na porovnanie výsledku, nepomôže ani spustenie.

V kurze C++ na Intuitive je syntax cyklu pochovaná na tretej strane prednášky 4 na tému „operátori“. Pri vysvetľovaní syntaxe slučiek sa osobitný dôraz kladie na pojem „operátor“. Termín je prezentovaný ako súbor faktov ako „symbol; toto je príkaz", "{} je zložený príkaz", "telo cyklu musí byť príkaz". Tento prístup sa mi nepáči, pretože sa zdá, že skrýva dôležité vzťahy za jeden výraz. Analýza zdrojového kódu programu do termínov na tejto úrovni je potrebná pre vývojárov kompilátorov na implementáciu špecifikácie jazyka, ale nie pre študentov ako prvé priblíženie. Začiatočníci v programovaní sú len zriedka natoľko precízni, aby venovali takú veľkú pozornosť pojmom. Je to vzácny človek, ktorý si na prvýkrát pamätá a rozumie novým slovám. Takmer nikto nevie správne použiť termín, ktorý sa práve naučil. Študenti preto dostanú veľa chýb, ako napríklad „Napísal som pri(a<7);{, ale program nefunguje.“
Podľa mňa je na začiatok lepšie dať syntax konštrukcie hneď so zátvorkami. Možnosť bez zátvoriek by mala byť vysvetlená iba vtedy, ak má študent konkrétnu otázku: „prečo tam nie sú zátvorky a funguje to“.

V Okulovovej knihe z roku 2012 „Základy programovania“ sa úvod do slučiek začína vzorom for, potom poskytuje odporúčania na jeho použitie a potom okamžite prechádza do experimentálnej časti lekcie. Chápem, že kniha bola napísaná pre tú menšinu veľmi schopných študentov, ktorí na moje hodiny chodia len zriedka.

V populárnych knihách je vždy napísaný výsledok fragmentov kódu. Napríklad Shildtovo vydanie „Java 8. The Complete Guide“ z roku 2015. Najprv je uvedená šablóna, potom príklad programu a hneď po ňom - ​​výsledok vykonania.

Ako príklad si predstavte cyklus while, ktorý robí opak
odpočítavanie začína od 10 a zobrazuje sa presne 10 riadkov „opatrení“:

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

Po spustení tento program vydá desať „cyklov“ nasledovne:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Postup opisu šablóny, vzorového programu a výsledku programu je použitý aj v knihe „Javascript for Kids“ a v kurze js na w3schools.com. Formát webovej stránky dokonca umožňuje, aby bol tento príklad interaktívny.

Stroustrupova kniha Principles and Practice Using C++ z roku 2016 zašla ešte ďalej. Prvým krokom je vysvetliť, aký výsledok by sa mal dosiahnuť, a potom sa zobrazí text programu. Navyše si ako príklad nevezmú len náhodný program, ale exkurziu do histórie. Pomáha to upozorniť na to: „Pozri, toto nie je len nejaký zbytočný text. Vidíš niečo zmysluplné."

Ako príklad iterácie zvážte prvý program spustený na stroji s uloženým programom (EDSAC). Napísal ho David Wheeler v počítačovom laboratóriu Cambridgeskej univerzity v Anglicku 6. mája 1949. Tento program vypočíta a vytlačí jednoduchý zoznam štvorcov.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Tu každý riadok obsahuje číslo, za ktorým nasleduje znak tabulátora ('t') a druhá mocnina tohto čísla. C++ verzia tohto programu vyzerá takto:

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

Je zaujímavé, že v tejto knihe nie je popísaný vzor syntaxe. Stroustrup v príručke pre inštruktora (preklad) zdôrazňuje, že rešpektuje inteligenciu svojich študentov. Možno, že schopnosť identifikovať vzor na niekoľkých príkladoch sa považuje za prejav takejto inteligencie.

Ako si vysvetľujem

Stroustrupov prístup: opísanie výsledku, potom vyriešenie problému a potom nezávislá analýza študenta sa javí ako najpremyslenejšia. Preto som sa rozhodol vziať to ako základ, ale povedať to na menej historickom príklade - úlohou odvodiť „obsah“. Tvorí rozpoznateľnú kotvu, aby ste potom mohli povedať „zapamätaj si úlohu o obsahu“ a študenti si to zapamätajú presne. V mojom príklade som sa snažil zabrániť ďalším dvom najbežnejším mylným predstavám. Ďalej o nich napíšem podrobnejšie.

V tejto úlohe sa zoznámime s technikami riešenia zložitých problémov. Počiatočné rozhodnutie musí byť primitívne a jednoduché. No a potom sa môžete zamyslieť nad tým, ako toto riešenie vylepšiť.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Podľa mojich pozorovaní prístup „šablóna-príklad-výsledok“ v rôznych kombináciách stále vedie k tomu, že študenti vnímajú cyklus ako hieroglyf. Prejavilo sa to v tom, že nechápali, prečo je tam podmienka písať, ako si vybrať medzi i++ a i—a ďalšie zdanlivo samozrejmé veci. Aby sa predišlo týmto mylným predstavám, prístup k rozprávaniu o cykloch by mal zdôrazniť význam opakovania rovnakých akcií a až potom ich formalizovať pomocou štruktúry. Preto pred zadaním syntaxe slučky musíte problém vyriešiť priamo. Primitívne riešenie problému s obsahom vyzerá 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("Заключение");

Ako sa to dá zlepšiť?
Nahraďte monotónne akcie cyklom.
Aké akcie sa opakujú za sebou bez zmien?
V tomto fragmente nie sú žiadne. Príkazy na zobrazenie slova „Kapitola“ s číslom sú si však veľmi podobné.
Preto ďalšou fázou je nájsť rozdiel medzi fragmentmi. Iba v tejto úlohe je všetko zrejmé, potom sa nebudú opakovať jednotlivé príkazy, ale bloky kódu s 5 alebo viac riadkami. Budete musieť hľadať nielen v zozname príkazov, ale aj v konštrukciách vetvenia alebo slučky.
V príklade je rozdiel medzi príkazmi v čísle za slovom „Kapitola“.
Akonáhle nájdete rozdiel, musíte pochopiť vzorec zmeny. Iný fragment je číslo? Neustále sa zvyšuje alebo znižuje? Ako sa mení hodnota čísla medzi dvoma tímami vedľa seba?
V príklade sa číslo za slovom „Kapitola“ zvyšuje v krokoch po 1. Rozdiel je nájdený, vzor je odhalený. Teraz môžete nahradiť odlišný fragment premennou.
Takúto premennú musíte deklarovať pred prvým z opakujúcich sa fragmentov. Takáto premenná sa zvyčajne nazýva I alebo j alebo nejako podrobnejšie. Jeho počiatočná hodnota sa musí rovnať prvej hodnote zobrazenej na obrazovke. V príklade je prvá hodnota 1.
Aká počiatočná hodnota by sa mala použiť na zobrazenie série čísel „100, 101, 102, 103, 104, 105“?
Prvé číslo v tejto sérii je 100.
Po každom výstupnom príkaze musíte zvýšiť hodnotu tejto premennej o 1. Táto jednotka je krokom zmeny.
Aký krok bude v rade čísel „100, 102, 104, 106“?
Krok 2 v tomto riadku.
Po nahradení odlišného fragmentu premennou bude kód vyzerať 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 „vyjadrite vzor premennej“ v kóde získate niekoľko skupín identických akcií, ktoré idú za sebou. Teraz je možné opakované akcie nahradiť cyklom.

Postupnosť riešenia problému, kde je potrebné použiť slučky, pozostáva z nasledujúcich krokov:

  1. Vyriešte „čelom“ s mnohými samostatnými príkazmi
  2. Nájdite vzor
  3. Vyjadrite vzor premennej
  4. Dizajn ako cyklus

Ďalej sa zavádzajú nové pojmy, aby sa študent neocitol v situácii „všetkému rozumiem, ale nemôžem to povedať“:
— počítadlo je vždy premenná, ktorá je potrebná na sledovanie počtu krokov v slučke. Typicky celé číslo, ktoré sa porovnáva s obmedzením.
— krok počítadla — opis vzoru zmien počítadla.
- obmedzenie - číslo alebo premenná, s ktorou sa počítadlo porovnáva, aby bol algoritmus konečný. Hodnota počítadla sa zmení tak, aby sa priblížila k limitu.
— loop body — súbor príkazov, ktoré sa budú opakovať. Keď hovoria „príkaz je napísaný v slučke“, majú na mysli telo.
— opakovanie cyklu — jednorazové vykonanie tela cyklu.
— loop condition — logický výraz, ktorý určuje, či bude vykonaná ďalšia iterácia. (Tu môže dôjsť k zámene s rozvetvenými štruktúrami)
Musíte sa pripraviť na to, že študenti budú najskôr používať termíny na iné účely. To platí pre silných aj slabých. Vytvoriť spoločný jazyk je umenie. Teraz napíšem stručne: musíte si nastaviť úlohu „zvýrazniť fragment kódu pomocou <term>“ a správne používať tieto výrazy v konverzácii.
Po transformácii pomocou slučky sa získa fragment:

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

Hlavná mylná predstava

Jednou populárnou mylnou predstavou medzi študentmi je, že umiestňujú akcie do slučky, ktorú je potrebné vykonať iba raz. Napríklad takto:

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

Študenti sa s týmto problémom stretávajú neustále, ako na začiatku, tak aj pri zložitejších problémoch.
Kľúčový tip v tomto prípade:

Koľkokrát by ste mali príkaz zopakovať: raz alebo viackrát?

Príkazy na tlač slov „Úvod“ a „Záver“ a deklaráciu a inicializáciu premennej i nie sú ako iné opakujúce sa akcie. Vykonajú sa iba raz, čo znamená, že musia byť zapísané mimo tela slučky.

Všetky tri stupne riešenia by mali zostať v kóde, aby ste sa na ne mohli neskôr v prípade ťažkostí odvolať. Prvé dve možnosti stačí okomentovať, aby neprekážali.
Študent by mal byť upozornený na tieto skutočnosti:
— V stave slučky sa zvyčajne porovnáva počítadlo a limit. Počítadlo sa môže meniť v tele slučky, ale limit nie. Aby ste toto pravidlo porušili, musíte formulovať presvedčivé dôvody.
— Príkazy na zobrazenie slov „Úvod“ a „Záver“ sa nachádzajú mimo tela slučky. Musíme ich vykonať 1 krát. „Úvod“ - pred opakovaním akcií, „Záver“ - po.
V procese upevňovania tejto témy, zvládania ďalších, ako aj zvládania ťažkostí je užitočné aj pre silných študentov položiť si otázku: „Koľkokrát je potrebné túto akciu vykonať? Jeden alebo veľa?

Rozvoj dodatočných zručností

V procese štúdia cyklov si študenti rozvíjajú aj zručnosť diagnostiky a riešenia problémov. Na vykonanie diagnostiky musí študent prezentovať požadovaný výsledok a porovnať ho so skutočným výsledkom. Nápravné opatrenia závisia od rozdielu medzi nimi.
Keďže študenti v tejto fáze stále majú malú predstavu o „požadovanom“ výsledku, môžu sa zamerať na testovacie údaje. Spravidla nikto v tejto fáze ešte nechápe, čo sa môže pokaziť a ako sa s tým vysporiadať. Preto si do zošita píšem popis typických problémov a niekoľko spôsobov ich riešenia. Výber toho najvhodnejšieho je úlohou samotného študenta.
Je potrebný záznam s otázkou „stalo sa to, čo sa očakávalo?“, „Ktorá z týchto situácií sa stala teraz?“, „Pomohlo použité riešenie?“

  1. Počet akcií je o 1 nižší alebo vyšší, než sa očakávalo. Riešenia:
    — zvýšiť počiatočnú hodnotu počítadla o 1.
    — nahraďte striktný operátor porovnávania (< alebo >) neprísnym operátorom (<= alebo >=).
    — zmeňte limitnú hodnotu na 1.
  2. Akcie v slučke sa vykonávajú bez zastavenia, neobmedzene. Riešenia:
    — pridajte príkaz na zmenu počítadla, ak chýba.
    — opravte príkaz na zmenu počítadla tak, aby sa jeho hodnota priblížila k limitu.
    — odstráňte príkaz na zmenu obmedzenia, ak je v tele cyklu.
  3. Počet akcií v slučke je o viac ako 1 menší alebo väčší, ako sa očakávalo. Akcia v slučke nebola vykonaná ani raz. Najprv musíte zistiť skutočné hodnoty premenných tesne pred spustením cyklu. Riešenia:
    — zmeniť počiatočnú hodnotu obmedzenia
    — zmeniť počiatočnú hodnotu počítadla

Problém 3 zvyčajne zahŕňa použitie nesprávnej premennej alebo nevynulovanie počítadla na nulu.

Po tomto vysvetlení môže mať študent stále rôzne mylné predstavy o fungovaní slučiek.
Aby som rozptýlil tie najbežnejšie, dávam vám nasledujúce úlohy:

  1. V ktorom užívateľ zadáva limit, počiatočnú hodnotu počítadla alebo krok počítadla.
  2. V ktorom sa hodnota počítadla musí použiť v nejakom aritmetickom výraze. Je vhodné použiť počítadlo v radikálovom výraze alebo v menovateli, aby bol rozdiel nelineárny.
  3. V ktorom sa hodnota počítadla nezobrazuje na obrazovke, keď je slučka spustená. Napríklad zobrazenie požadovaného počtu identických textových fragmentov alebo kreslenie figúry s grafikou korytnačky.
  4. V ktorom musíte najskôr vykonať niekoľko opakujúcich sa akcií a potom ďalšie.
  5. V ktorom musíte vykonať ďalšie akcie pred a po opakovaní

Pre každú úlohu musíte poskytnúť testovacie údaje a očakávaný výsledok.

Aby ste pochopili, ako rýchlo sa môžete pohybovať, musíte si prečítať podmienky týchto problémov a opýtať sa: „ako sa líšia od príkladu?“, „Čo je potrebné v príklade zmeniť, aby sa vyriešili?“ Ak žiak odpovie zmysluplne, tak nech aspoň jeden vyrieši na hodine, zvyšok doma sám. Ak je riešenie úspešné, potom môžeme začať vysvetľovať podmienky vo vnútri slučiek.
Ak máte problémy s riešením problémov sami, musíte na hodine prejsť všetkým. Aby riešenie problému nepripomínalo kreslenie sovy, odporúčam najskôr problém vyriešiť neuniverzálnym spôsobom. Teda tak, aby riešenie prešlo prvým testom a nepoužívalo konštrukciu slučky. Potom použite transformácie, aby ste dosiahli univerzálnosť riešenia.

Slučky a konáre

Podľa mňa je užitočné dať tému „cykly v rámci pobočiek“ samostatne. Aby ste neskôr videli rozdiel medzi kontrolou podmienky viackrát a kontrolou raz.
Úlohy pre konsolidáciu budú o výstupe čísel z A do B, ktoré zadáva užívateľ:
- vždy vo vzostupnom poradí.
- vzostupne alebo zostupne v závislosti od hodnôt A a B.

Téma „rozvetvenie v rámci slučiek“ by sa malo posunúť ďalej, až keď študent zvládne techniky: „nahradenie vzoru premennou“ a „nahradenie opakujúcich sa akcií cyklom“.
Hlavným dôvodom použitia vetiev vo vnútri slučiek sú anomálie vo vzore. V strede sa zlomí v závislosti od počiatočných údajov.
Pre tých študentov, ktorí sú schopní hľadať riešenie kombináciou jednoduchých techník, stačí povedať „vetvovanie je možné zapísať do slučiek“ a dať problém „napríklad“ úplne vyriešiť samostatne.
Príklad úlohy:

Používateľ zadá číslo X. Zobrazte čísla od 0 do 9 v stĺpci a oproti číslu, ktoré sa rovná X, vložte znamienko „+“.

Ak bola zadaná 00+
1
2
3
4
5
6
7
8
9

Ak bola zadaná 60
1
2
3
4
5
6+
7
8
9

Ak bola zadaná 90
1
2
3
4
5
6
7
8
9+

Ak bola zadaná 7770
1
2
3
4
5
6
7
8
9

Ak na písanie so slučkou nestačí krátke vysvetlenie, potom musíte dosiahnuť univerzálne riešenie toho istého problému bez slučky.
Dostanete jednu z dvoch možností:
Požadovaný

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ú úlohu dávam vopred, pri štúdiu témy vetvenia.
Ak študent príde s „možnou“ možnosťou, musíte im povedať, že na rovnaký problém môže byť veľa riešení. Líšia sa však odolnosťou voči zmenám požiadaviek. Položte otázku: „Koľko miest v kóde by bolo potrebné opraviť, ak by som musel pridať ďalšie číslo? V „možnej“ verzii budete musieť pridať ďalšiu pobočku a pridať nové číslo na 10 ďalších miestach. V „požadovanom“ stačí pridať iba jednu vetvu.
Nastavte úlohu na reprodukciu „požadovanej“ možnosti, potom nájdite vzor v kóde, vykonajte nahradenie premennej a napíšte slučku.
Ak máte nápad, ako vyriešiť tento problém bez slučky iným spôsobom, napíšte do komentárov.

Slučky v slučkách

V tejto téme musíte venovať pozornosť nasledujúcemu:
— počítadlá pre vnútornú a vonkajšiu slučku musia byť rôzne premenné.
— počítadlo pre vnútornú slučku sa musí mnohokrát vynulovať (to znamená v tele vonkajšej slučky).
— v úlohách textového výstupu nemôžete najprv napísať jedno písmeno do niekoľkých riadkov a potom druhé. Najprv musíte vytlačiť všetky písmená prvého riadku, potom všetky písmená druhého atď.

Najlepšie je začať vysvetľovať tému slučiek v rámci slučiek vysvetlením dôležitosti vynulovania počítadla.
Príklad úlohy:

Používateľ zadá dve čísla: R a T. Vytlačí dva riadky so znakmi „#“. Prvý riadok by mal obsahovať R znakov. Druhý riadok obsahuje T kusov. Ak je akékoľvek číslo záporné, zobrazí sa chybové hlásenie.

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

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

R = -1, T = 6Hodnota R musí byť nezáporná

R = 6, T = -2Hodnota T musí byť nezáporná

Je zrejmé, že aj tento problém má minimálne dve riešenia.
Požadovaný

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;
}

Rozdiel je v tom, že v „možnom“ riešení bola na výstup druhého riadku použitá druhá premenná. Mali by ste trvať na použití rovnakej premennej pre obe slučky. Toto obmedzenie možno odôvodniť tým, že riešenie s jedným počítadlom na dva cykly bude ilustráciou pojmu „reset počítadla“. Pochopenie tohto pojmu je nevyhnutné pri riešení nasledujúcich problémov. Ako kompromis si môžete uložiť obe riešenia problému.

Typický problém s použitím jednej premennej počítadla pre dve slučky vyzerá takto:
R = 5, T = 11#####
######

Počet znakov v druhom riadku nezodpovedá hodnote T. Ak potrebujete pomôcť s týmto problémom, musíte sa pozrieť do poznámok o typických problémoch so slučkami. Toto je symptóm číslo 3. Diagnostikuje sa, ak pridáte výstup hodnoty počítadla bezprostredne pred druhým cyklom. Opravené resetovaním. Ale je lepšie to nepovedať hneď. Študent sa musí pokúsiť sformulovať aspoň jednu hypotézu.

Samozrejme, existuje aj iné riešenie. Ale medzi študentmi som to nikdy nevidel. V štádiu štúdia cyklov príbeh o tom odvedie pozornosť. Môžete sa k tomu vrátiť neskôr, keď sa dozviete o funkciách reťazcov.
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));

Ďalšia požadovaná úloha:

Zobrazte čísla od 0 do 9. Každé číslo by malo byť na samostatnom riadku. Počet číslic v riadku (W) sa zadáva 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

Ak si študent osvojil techniku ​​nahradenia premennej, tak si poradí celkom rýchlo. Možný problém bude opäť v resetovaní premennej. Ak nemôžete zvládnuť transformáciu, znamená to, že ste sa ponáhľali a potrebujete vyriešiť jednoduchšie problémy.

Ďakujem za tvoju pozornosť. Páči sa mi a odoberajte kanál.

PS Ak v texte nájdete preklepy alebo chyby, dajte mi prosím vedieť. Môžete to urobiť výberom časti textu a stlačením „⌘ + Enter“ na Macu a „Ctrl / Enter“ na klasickej klávesnici alebo prostredníctvom súkromných správ. Ak tieto možnosti nie sú k dispozícii, napíšte o chybách v komentároch. Ďakujem!

Do prieskumu sa môžu zapojiť iba registrovaní užívatelia. Prihlásiť saProsím.

Anketa pre čitateľov bez karmy

  • 20,0%Učím profesionálne, +12

  • 10,0%Učím profesionálne, -11

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

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

  • 0,0%Iné0

Hlasovalo 10 užívateľov. 5 užívateľov sa zdržalo hlasovania.

Zdroj: hab.com

Pridať komentár