Kiel instrui kiel venki malfacilaĵojn, kaj samtempe skribi ciklojn

Malgraŭ tio, ke ni parolos pri unu el la bazaj temoj, ĉi tiu artikolo estas skribita por spertaj profesiuloj. La celo estas montri kiajn miskomprenojn havas komencantoj en programado. Por praktikantaj programistoj, ĉi tiuj problemoj estas delonge solvitaj, forgesitaj aŭ tute ne rimarkitaj. La artikolo povas esti utila se vi subite bezonas helpi iun pri ĉi tiu temo. La artikolo faras paralelojn kun materialo el diversaj libroj pri programado de Schildt, Stroustrup, Okulov.

La temo pri cikloj estis elektita ĉar sufiĉe multaj homoj estas ekskluditaj de ĝi kiam regas programadon.

Ĉi tiu tekniko estas desegnita por malfortaj studentoj. Ĝenerale, fortaj homoj ne blokiĝas pri ĉi tiu temo kaj ne necesas elpensi specialajn teknikojn por ili. La sekundara celo de la artikolo estas movi ĉi tiun teknikon de la klaso "verkoj por ĉiuj studentoj, sed nur unu instruisto" al la klaso "verkoj por ĉiuj studentoj, ĉiuj instruistoj". Mi ne pretendas absolutan originalecon. Se vi jam uzas similan metodaron por instrui ĉi tiun temon, bonvolu skribi kiel diferencas via versio. Se vi decidas uzi ĝin, diru al ni kiel ĝi iris. Se simila tekniko estas priskribita en libro, bonvolu skribi la nomon.


Mi laboris pri ĉi tiu tekniko dum 4 jaroj, studante individue kun studentoj de malsamaj niveloj de trejnado. Entute estas ĉirkaŭ kvindek studentoj kaj du mil horoj da klasoj. Komence, studentoj ĉiam blokiĝis pri ĉi tiu temo kaj foriris. Post ĉiu studento, la metodiko kaj materialoj estis alĝustigitaj. Dum la pasinta jaro, studentoj ne plu estis blokitaj pri ĉi tiu temo, do mi decidis konigi miajn trovojn.

Kial tiom da leteroj? Cikloj estas tiom elementaj!

Kiel mi skribis supre, por praktikantaj programistoj kaj por fortaj studentoj, la komplekseco de la koncepto de bukloj povas esti subtaksita. Ekzemple, vi povas doni longan prelegon, vidi kapjesantajn kapojn kaj inteligentajn okulojn. Sed kiam oni provas solvi ajnan problemon, komenciĝas stuporo kaj neklarigeblaj problemoj. Post la prelego, la studentoj verŝajne havis nur partan komprenon. La situacio estas pligravigita de la fakto, ke studentoj mem ne povas esprimi, kio ĝuste estas ilia iluzio.
Iun tagon mi konstatis, ke studentoj perceptas miajn ekzemplojn kiel hieroglifoj. Tio estas, kiel nedivideblaj tekstoj, en kiuj vi devas aldoni iun "magian" leteron kaj ĝi funkcios.
Foje mi rimarkis, ke studentoj pensas, ke por solvi specifan problemon oni bezonas io alia dezajno kiun mi simple ankoraŭ ne kovris. Kvankam la solvo postulis nur etan modifon de la ekzemplo.

Do mi elpensis la ideon, ke la fokuso ne estu sur la sintakso de esprimoj, sed sur la ideo refaktorigi ripetan kodon per bukloj. Post kiam studentoj regis ĉi tiun ideon, ajna sintakso povas esti plibonigita kun malmulte da praktiko.

Kiun kaj kial mi instruas?

Ĉar ne ekzistas alirekzamenoj, klasoj povas inkluzivi kaj fortajn kaj tre malfortajn studentojn. Vi povas legi pli pri miaj studentoj en la artikolo Portreto de vesperkursanoj
Mi strebis certigi, ke ĉiuj, kiuj volas lerni programadon, povu lerni ĝin.
Miaj klasoj okazas individue kaj la studento pagas sian propran monon por ĉiu. Ŝajnus, ke studentoj optimumigos kostojn kaj postulos la minimumon. Tamen homoj iras al vizaĝ-al-vizaĝaj klasoj kun vivanta instruisto ne pro la scio mem, sed pro la fido de tio, kion ili lernis, pro sento de progreso kaj por aprobo de la fakulo (instruisto). Se studentoj ne sentas progreson en sia lernado, ili foriros. Ĝenerale, klasoj povas esti strukturitaj tiel ke studentoj sentas progreson en pliigado de la nombro da konataj strukturoj. Tio estas, unue ni studas dum detale, poste ni studas por, poste faru dum, kaj nun ni havas mil kaj unu noktan kurson preta, en kiu nur cikloj estas studataj dum du monatoj, kaj fine — studento, kiu skribis; norma biblioteko sub diktado. Tamen, por solvi praktikajn problemojn, vi bezonas ne nur scion pri la materialo, sed ankaŭ sendependecon en ĝia aplikado kaj en serĉado de novaj informoj. Tial, por vizaĝ-al-vizaĝaj kursoj, mi opinias, ke la ĝusta principo estas instrui la minimumon kaj instigi memstaran studon de nuancoj kaj rilataj temoj. En la temo de bukloj, mi konsideras la while-konstruaĵon kiel la minimumon. Vi povas kompreni la principon de ĝi. Konante la principon, vi povas regi kaj por kaj fari-dum vi mem.

Por atingi majstradon de la materialo de malfortaj studentoj, priskribi la sintakson ne sufiĉas. Necesas doni pli simplajn sed diversajn taskojn kaj priskribi ekzemplojn pli detale. Finfine, la rapideco de evoluo estas limigita per la kapablo de la studento transformi esprimojn kaj serĉi ŝablonojn. Por inteligentaj studentoj, la plej multaj taskoj estos enuigaj. Studante kun ili, vi ne devas insisti pri solvi 100% de la problemoj. Mia materialo rigardeblas ĉe mia github. Vere, la deponejo pli similas al la grimoro de sorĉisto - neniu krom mi komprenos kio estas kie, kaj se vi malsukcesas la kontrolon, vi povas freneziĝi.

La metodaro estas praktik-orientita

La teorio estas klarigita uzante la ekzemplon de solvado de problemo. En bazklaso de programado, kie branĉoj kaj bukloj estas instruitaj, simple ne eblas doni utilan prelegon pri unu temo dum tuta horo. 15-20 minutoj sufiĉas por klarigi la koncepton. La ĉefaj malfacilaĵoj aperas dum praktikaj taskoj.
Komencantaj instruistoj povas bruligi funkciigistojn, branĉojn, buklojn kaj tabelojn en unu prelego. Sed iliaj studentoj alfrontos la problemon asimili ĉi tiun informon.
Necesas ne nur rakonti la materialon, sed ankaŭ certigi, ke la aŭskultantoj komprenas ĝin.

La fakto regi temon estas determinita de kiel la studento traktas sendependan laboron.
Se studento sukcesis solvi problemon pri temo sen la helpo de instruisto, tiam la temo estas regata. Por certigi memtestadon, ĉiu tasko estas priskribita en tabelo kun testscenaroj. La taskoj havas klaran ordon. Preterpasi taskojn ne rekomendas. Se la nuna tasko estas tro malfacila, tiam pluiri al la sekva estas senutila. Ĝi estas eĉ pli komplika. Por ke la studento povu regi la nunan kompleksan taskon, pluraj teknikoj estas klarigitaj al li uzante la ekzemplon de la unua problemo. Fakte, la tuta enhavo de la temo venas al teknikoj por venki malfacilaĵojn. Cikloj estas pli kromefiko.

La unua tasko ĉiam estas ekzemplo. La dua iomete malsamas kaj estas farita "sendepende" tuj post la unua sub la superrigardo de instruisto. Ĉiuj postaj taskoj celas atenti diversajn malgrandajn aferojn, kiuj povas kaŭzi miskomprenojn.

La klarigo de la ekzemplo estas dialogo en kiu la studento bezonas revoki disvastigon kaj krucvalidadon por certigi ke li majstris parton de la materialo.

Mi estos banala kaj diros, ke la unua ekzemplo pri la temo estas tre grava. Se vi havas la materialon por ampleksa sendependa laboro, la preterlasoj de la unua ekzemplo povas esti korektitaj. Se estas nenio alia krom la ekzemplo, tiam la studento plej verŝajne ne regos la temon.

Dum aŭ por?

Unu el la polemikaj aferoj estas la elekto de konstruado por la ekzemplo: dum aŭ por. Iam, praktikanta programisto amiko mia sen instrua sperto pasigis horon konvinkante min, ke la buklo por estas la plej facile komprenebla. La argumentoj resumiĝis al "ĉio en ĝi estas klara kaj aranĝita en sia loko." Tamen, la ĉefa kaŭzo de malfacilaĵoj por veraj komencantoj estas la ideo de la ciklo mem, kaj ne ĝia skribo. Se homo ne komprenas ĉi tiun ideon, tiam li havos malfacilaĵojn kun la sintakso. Tuj kiam la ideo realiĝas, la problemoj de koddezajno malaperas memstare.

En miaj materialoj, la temo de bukloj sekvas la temon de branĉado. La ekstera simileco de se kaj dum permesas al ni desegni rektan analogon: "kiam la kondiĉo en la kaplinio estas vera, tiam la korpo estas ekzekutita." La sola propreco de la ciklo estas, ke la korpo estas ekzekutita multfoje.

Mia dua argumento estas, ke dum postulas malpli da formatado ol por. Malpli da formatado signifas malpli da stultaj eraroj kun mankantaj komoj kaj krampoj. Komencantoj ankoraŭ ne disvolvis sufiĉe da atentemo kaj zorgemo por aŭtomate eviti sintaksajn erarojn.
La tria argumento estas klarigita en multaj bonaj libroj kiel la unua argumento.

Se la studento povas facile transformi esprimojn, tiam vi povas paroli pri por preterpase. La studento tiam elektos tion, kion li plej ŝatas. Se transformoj kaŭzas malfacilaĵojn, tiam estas pli bone ne distri vian atenton. Lasu la studenton unue solvi ĉion uzante dum. Post kiam vi regas la temon de bukloj, vi povas reverki la solvojn por praktiki konvertadon dum al por.
Postkondiĉaj bukloj estas sufiĉe malofta besto. Mi tute ne pasigas tempon pri ĝi. Se studento regis la ideojn pri identigo de ŝablonoj kaj transformo de esprimoj, li povas eltrovi ĝin sen mia helpo.

Kiam mi montras la unuan ekzemplon al fortaj studentoj, mi atentigas pri tio, ke en la unua ekzemplo gravas registri ne nur la solvon, sed ankaŭ la tutan ĉenon de agoj, kiuj kondukis al la rezulto. Maldiligentaj studentoj povas neglekti la skribon kaj kopii nur la finan algoritmon. Ili devas esti konvinkitaj, ke iam malfacila tasko venos al ili. Por solvi ĝin, vi devos sekvi la paŝojn kiel en ĉi tiu ekzemplo. Tial gravas registri ĉiujn stadiojn. En la sekvaj problemoj eblos lasi nur la finan version de la solvo.

La ĉefa ideo de aŭtomatigo estas, ke ni konfidas komputilon fari rutinan laboron por homo. Unu el la bazaj teknikoj estas skribi buklojn. Ĝi estas uzata kiam pluraj identaj ripetaj agoj estas skribitaj en programo en vico.

Eksplicite estas pli bona ol implicita

Eble ŝajnas bona ideo montri la saman frazon plurfoje en la unua bukla tasko. Ekzemple:

Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!
Hura, ĝi funkcias!

Ĉi tiu opcio estas malbona ĉar la nombrila valoro ne estas videbla en la eligo. Ĉi tio estas problemo por komencantoj. Ne subtaksu ŝin. Komence, ĉi tiu tasko estis la unua, kaj la tasko derivi serion de nombroj en kreskanta ordo estis la dua. Necesis enkonduki pliajn terminojn "ciklo N fojojn" kaj "ciklo de A al B", kiuj esence estas la sama afero. Por ne krei nenecesajn entojn, mi decidis montri nur ekzemplon kun eligo de serio da nombroj. Malmultaj homoj sukcesas lerni kiel teni nombrilon en sia kapo kaj modeligi la konduton de programo en sia kapo sen preparo. Kelkaj studentoj unue renkontas mensan modeladon en la temo de cikloj.
Post iom da ekzercado, mi donas la taskon ripeti la saman tekston solvi sendepende. Se vi unue donas videblan nombrilon kaj poste nevideblan, studentoj havos malpli da problemoj. Kelkfoje sufiĉas la sugesto "ne skribu la nombrilon sur la ekrano".

Kiel aliaj klarigas ĝin?

En la plej multaj edukaj materialoj en la Interreto, la sintakso de la ciklo estas donita kiel parto de "prelego". Ekzemple, ĉe developer.mozilla.org (nuntempe), pluraj aliaj konstruaĵoj estas priskribitaj kune kun la buklo while. En ĉi tiu kazo, nur la dezajnoj mem estas donitaj en formo de ŝablonoj. La rezulto de ilia lanĉo estas priskribita per vortoj, sed ne estas ilustraĵo. Laŭ mi tia prezento de la temo multobligas la utilecon de tiaj materialoj per nulo. La studento povas reverki la kodon kaj ruli ĝin mem, sed li ankoraŭ bezonas normon por komparo. Kiel vi povas kompreni, ke ekzemplo estis reskribita ĝuste, se estas nenio kun kio kompari la rezulton?
Kiam oni donas nur ŝablonon, sen ekzemplo, ĝi fariĝas eĉ pli malfacila por la studento. Kiel kompreni, ke la kodaj fragmentoj estas ĝuste metitaj en la ŝablonon? Vi povas provi skribi iel, kaj poste kuru. Sed se ne ekzistas normo por kompari la rezulton, tiam lanĉo ankaŭ ne helpos.

En la C++-kurso pri Intuicio, la buklosintakso estas enterigita en la tria paĝo de Prelego 4 pri la temo "funkciigistoj". Kiam oni klarigas la sintakson de bukloj, speciala emfazo estas metita sur la esprimon "funkciigisto". La termino estas prezentita kiel aro de faktoj kiel "simbolo; ĉi tio estas deklaro", "{} estas kunmetita deklaro", "la korpo de la buklo devas esti deklaro". Mi ne ŝatas ĉi tiun aliron ĉar ĝi ŝajnas kaŝi gravajn rilatojn malantaŭ unu termino. Analizi la fontkodon de programo en terminojn je ĉi tiu nivelo estas bezonata de kompililprogramistoj por efektivigi la lingvospecifon, sed ne de studentoj kiel unua aproksimado. Novuloj al programado malofte estas sufiĉe zorgemaj por atenti tiom da terminoj. Estas malofta homo, kiu unuafoje memoras kaj komprenas novajn vortojn. Preskaŭ neniu povas ĝuste apliki terminon, kiun ili ĵus lernis. Tial studentoj ricevas multajn erarojn kiel "Mi skribis dum(a<7);{, sed la programo ne funkcias."
Miaopinie, komence estas pli bone doni la sintakson de la konstruo tuj per krampoj. La opcio sen krampoj devus esti klarigita nur se la studento havas specifan demandon: "kial ne ekzistas krampoj kaj ĝi funkcias."

En la libro "Fundamentoj de Programado" de Okulov (2012), enkonduko al bukloj komenciĝas per la ŝablono por, tiam donas rekomendojn por ĝia uzo, kaj tuj poste iras al la eksperimenta sekcio de la leciono. Mi komprenas, ke la libro estis verkita por tiu malplimulto de tre kapablaj studentoj, kiuj malofte venas al miaj klasoj.

En popularaj libroj, la rezulto de kodfragmentoj ĉiam estas skribita. Ekzemple, la eldono de 8 "Java 2015. The Complete Guide" de Shildt. Unue, ŝablono estas donita, poste ekzempla programo kaj tuj post ĝi - la rezulto de ekzekuto.

Ekzemple, konsideru while-buklon, kiu faras la inverson
retronombrado ekde 10, kaj ekzakte 10 linioj de "mezuriloj" montriĝas:

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

Unufoje rulita, ĉi tiu programo eligas dek "ciklojn" jene:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

La aliro priskribado de ŝablono, ekzempla programo kaj la rezulto de ĉi tiu programo ankaŭ estas uzata en la libro "Javaskripto por Infanoj" kaj en la js-kurso ĉe w3schools.com. La retpaĝa formato eĉ permesas ĉi tiun ekzemplon esti interaga.

La 2016 libro de Stroustrup Principles and Practice Using C++ iris eĉ pli. La unua paŝo estas klarigi, kian rezulton oni devas akiri, kaj post tio la teksto de la programo montriĝas. Cetere ili prenas ne nur hazardan programon kiel ekzemplon, sed donas ekskurson en historion. Tio helpas atentigi pri ĝi: “Vidu, ĉi tio ne estas nur ia senutila teksto. Vi vidas ion signifan."

Kiel ekzemplo de ripeto, konsideru la unuan programon efektivigitan sur stokita programmaŝino (EDSAC). Ĝi estis skribita fare de David Wheeler ĉe la Komputila Laboratorio de Cambridge University, Anglio la 6-an de majo 1949. Ĉi tiu programo kalkulas kaj presas simplan liston de kvadratoj.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Ĉi tie, ĉiu linio enhavas nombron sekvitan de tabula signo ('t') kaj la kvadrato de tiu nombro. La C++-versio de ĉi tiu programo aspektas jene:

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

Interese, la sintaksa ŝablono ne estas priskribita en ĉi tiu libro. Stroustrup en la manlibro de la instruisto (traduko) emfazas ke ĝi respektas la inteligentecon de siaj studentoj. Eble la kapablo identigi ŝablonon en pluraj ekzemploj estas konsiderata kiel manifestiĝo de tia inteligenteco.

Kiel mi klarigas min

La aliro de Stroustrup: priskribado de la rezulto, poste solvi la problemon, kaj poste sendependa analizo de la studento - ŝajnas la plej pripensema. Tial mi decidis preni ĝin kiel bazon, sed rakonti ĝin uzante malpli historian ekzemplon - la taskon derivi "enhavtabelon". Ĝi formas rekoneblan ankron por ke vi tiam povu diri "memori la taskon pri la enhavtabelo" kaj por ke studentoj memoru ĝuste tion. En mia ekzemplo, mi provis malhelpi du pliajn el la plej oftaj miskompreniĝoj. Poste mi skribos pri ili pli detale.

En ĉi tiu tasko ni estas prezentitaj al teknikoj por solvi kompleksajn problemojn. La komenca decido devas esti farita primitiva kaj simpla. Nu, tiam vi povas pensi pri kiel plibonigi ĉi tiun solvon.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Laŭ miaj observoj, la aliro "ŝablono-ekzemplo-rezulto" en diversaj kombinaĵoj ankoraŭ kondukas al tio, ke studentoj perceptas la ciklon kiel hieroglifo. Tio manifestiĝis en tio, ke ili ne komprenis, kial estas kondiĉo por skribi tie, kiel elekti inter i++ kaj i— kaj aliajn ŝajne evidentajn aferojn. Por eviti ĉi tiujn miskompreniĝojn, la aliro al paroli pri cikloj devus emfazi la signifon de ripeti identajn agojn kaj nur tiam formaligi ilin uzante strukturon. Tial, antaŭ ol doni la buklan sintakson, vi devas solvi la problemon rekte. Primitiva solvo al la problemo de enhavtabelo aspektas jene:

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("Заключение");

Kiel ĝi povas esti plibonigita?
Anstataŭigi monotonajn agojn per ciklo.
Kiuj agoj estas ripetitaj en vico sen ŝanĝoj?
Estas neniuj en ĉi tiu fragmento. Tamen, la ordonoj por montri la vorton "Ĉapitro" kun nombro estas tre similaj unu al la alia.
Tial, la sekva etapo estas trovi la diferencon inter la fragmentoj. Nur en ĉi tiu tasko ĉio estas evidenta, tiam ne unuopaj komandoj ripetiĝos, sed blokoj de kodo de 5 linioj aŭ pli. Vi devos serĉi ne nur en la listo de komandoj, sed en disbranĉaj aŭ buklokonstruaĵoj.
En la ekzemplo, la diferenco inter la komandoj estas en la nombro post la vorto "Ĉapitro".
Post kiam la diferenco estas trovita, vi devas kompreni la ŝablonon de ŝanĝo. La malsama fragmento estas la nombro? Ĉu ĝi konstante kreskas aŭ malkreskas? Kiel la valoro de nombro ŝanĝiĝas inter du teamoj unu apud la alia?
En la ekzemplo, la nombro post la vorto "Ĉapitro" pliiĝas en pliigoj de 1. La diferenco estas trovita, la ŝablono estas malkaŝita. Nun vi povas anstataŭigi la malsaman fragmenton per variablo.
Vi devas deklari tian variablon antaŭ la unua el la ripetaj fragmentoj. Tia variablo estas kutime nomata I aŭ j aŭ io pli detala. Ĝia komenca valoro devas esti egala al la unua valoro montrata sur la ekrano. En la ekzemplo, la unua valoro estas 1.
Kian komencan valoron oni devas preni por montri la serion de nombroj "100, 101, 102, 103, 104, 105"?
La unua nombro en ĉi tiu serio estas 100.
Post ĉiu eliga komando, vi devas pliigi la valoron de ĉi tiu variablo je 1. Ĉi tiu unuo estas la ŝanĝopaŝo.
Kio paŝo estos en la serio de nombroj "100, 102, 104, 106"?
Paŝo 2 en ĉi tiu vico.
Post anstataŭigi la malsaman fragmenton per variablo, la kodo aspektos jene:

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("Заключение");

Post aplikado de la tekniko "esprimi la ŝablonon de variablo" en la kodo, vi ricevas plurajn grupojn de identaj agoj, kiuj iras en vico. Nun ripetaj agoj povas esti anstataŭigitaj per ciklo.

La sekvenco de solvado de problemo, kie vi bezonas uzi buklojn, konsistas el la sekvaj paŝoj:

  1. Solvu "fronte" per multaj apartaj komandoj
  2. Trovu ŝablonon
  3. Esprimu la ŝablonon de variablo
  4. Dezajno kiel ciklo

Poste, novaj terminoj estas enkondukitaj, por ke la studento ne troviĝu en la situacio de "Mi komprenas ĉion, sed mi ne povas diri ĝin":
— nombrilo ĉiam estas variablo, kiu necesas por spuri la nombron da paŝoj en buklo. Tipe entjero kiu estas komparita kun la limo.
— counter step — priskribo de la ŝablono de nombrilaj ŝanĝoj.
- limigo - nombro aŭ variablo kun kiu la nombrilo estas komparata tiel ke la algoritmo estas fina. La nombrila valoro ŝanĝiĝas por alproksimiĝi al la limo.
— buklokorpo — aro de komandoj, kiuj estos ripetitaj. Kiam ili diras "la komando estas skribita ene de buklo", ili signifas la korpon.
— buklo ripeto — unufoja ekzekuto de la buklokorpo.
— buklokondiĉo — logika esprimo kiu determinas ĉu alia ripeto estos efektivigita. (Povas esti konfuzo kun disbranĉaj strukturoj ĉi tie)
Vi devas esti preta por la fakto, ke komence studentoj uzos terminojn por aliaj celoj. Ĉi tio validas kaj por la fortaj kaj la malfortaj. Establi komunan lingvon estas arto. Nun mi skribos mallonge: vi devas agordi la taskon "marku la kodfragmenton per <termino>" kaj uzi ĉi tiujn terminojn mem ĝuste en konversacio.
Post transformo kun buklo, la fragmento estas akirita:

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

La ĉefa miskompreno

Unu populara miskompreniĝo inter studentoj estas ke ili metas agojn en buklon kiu devas esti farita nur unufoje. Ekzemple tiel:

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

Studentoj renkontas ĉi tiun problemon la tutan tempon, kaj komence kaj en pli kompleksaj problemoj.
Ŝlosila konsilo en ĉi tiu kazo:

Kiom da fojoj vi ripetu la ordonon: unufoje aŭ multfoje?

La ordonoj por presi la vortojn "Enkonduko" kaj "Konkludo" kaj deklari kaj pravalorigi la variablon i ne estas kiel aliaj ripetaj agoj. Ili estas ekzekutitaj nur unufoje, kio signifas, ke ili devas esti skribitaj ekster la buklokorpo.

Ĉiuj tri etapoj de la solvo devas resti en la kodo por ke vi povu referenci al ili poste en kazo de malfacilaĵoj. Sufiĉas komenti la unuajn du eblojn por ke ili ne malhelpu.
La atento de la studento devas esti altirita al la sekvaj faktoj:
— En buklokondiĉo oni kutime komparas nombrilon kaj limon. La nombrilo povas ŝanĝiĝi en la korpo de la buklo, sed la limo ne povas. Por rompi ĉi tiun regulon, vi devas formuli konvinkajn kialojn.
— Komandoj por montri la vortojn "Enkonduko" kaj "Konkludo" situas ekster la korpo de la buklo. Ni devas plenumi ilin 1 fojon. "Enkonduko" - antaŭ ripeti la agojn, "Konkludo" - poste.
En la procezo de solidigo de ĉi tiu temo, majstrado de la sekvaj, same kiel traktado de malfacilaĵoj, estas utile por eĉ fortaj studentoj demandi la demandon: "Kiom da fojoj ĉi tiu ago devas esti farita? Unu aŭ multaj?

Disvolviĝo de pliaj kapabloj

En la procezo de studado de cikloj, studentoj ankaŭ disvolvas la kapablon diagnozi kaj solvi problemojn. Por fari diagnozon, la studento devas prezenti la deziratan rezulton kaj kompari ĝin kun la reala rezulto. Korektaj agoj dependas de la diferenco inter ili.
Ĉar studentoj en ĉi tiu etapo ankoraŭ havas malmulte da ideo pri la "dezirata" rezulto, ili povas koncentriĝi pri testaj datumoj. Kiel regulo, neniu en ĉi tiu etapo ankoraŭ komprenas, kio povas misfunkcii kaj kiel trakti ĝin. Tial mi skribas en kajero priskribon de tipaj problemoj kaj plurajn manierojn solvi ilin. Elekti la plej taŭgan estas la tasko de la studento mem.
Oni bezonas rekordon por demandi "ĉu tio, kio estis atendita, okazis?", "Kiu el ĉi tiuj situacioj okazis nun?", "Ĉu la aplikata solvo helpis?"

  1. La nombro da agoj estas 1 malpli aŭ pli ol atendite. Solvoj:
    — pliigu la komencan valoron de la nombrilo per 1.
    — anstataŭigu la striktan komparan operatoron (< aŭ >) per nestrikta (<= aŭ >=).
    — ŝanĝu la limvaloron al 1.
  2. Agoj en buklo estas farataj sen halto, senfine. Solvoj:
    — aldonu nombriloŝanĝan komandon se ĝi mankas.
    — ripari la nombriloŝanĝan komandon por ke ĝia valoro proksimiĝu al la limo.
    — forigu la komandon de limoŝanĝo se ĝi estas en la korpo de la buklo.
  3. La nombro da agoj en buklo estas pli ol 1 malpli aŭ pli ol atendite. La ago en la buklo ne estis efektivigita eĉ unufoje. Unue vi devas ekscii la realajn valorojn de la variabloj ĝuste antaŭ ol la buklo komenciĝas. Solvoj:
    — ŝanĝi la komencan valoron de la limo
    — ŝanĝi la komencan valoron de la nombrilo

Problemo 3 kutime implikas uzi la malĝustan variablon aŭ ne restarigi la nombrilon al nulo.

Post ĉi tiu klarigo, la studento ankoraŭ povas havi diversajn miskomprenojn pri kiel funkcias bukloj.
Por forigi la plej oftajn, mi donas al vi la jenajn taskojn:

  1. En kiu la limo, komenca nombrilo valoro, aŭ nombrilo paŝo estas enirita de la uzanto.
  2. En kiu la nombrila valoro devas esti uzata en iu aritmetika esprimo. Estas konsilinde uzi nombrilon en la radikala esprimo aŭ en la denominatoro tiel ke la diferenco estu nelinia.
  3. En kiu la nombrila valoro ne estas montrata sur la ekrano dum la buklo funkcias. Ekzemple, montri la bezonatan nombron da identaj tekstfragmentoj aŭ desegni figuron kun testudaj grafikoj.
  4. En kiu vi devas fari unue kelkajn ripetajn agojn, kaj poste aliajn.
  5. En kiu vi devas fari aliajn agojn antaŭ kaj post ripeti

Por ĉiu tasko vi devas provizi testajn datumojn kaj la atendatan rezulton.

Por kompreni kiom rapide vi povas moviĝi, vi devas legi la kondiĉojn de ĉi tiuj problemoj kaj demandi: "kiel ili diferencas de la ekzemplo?", "Kion necesas ŝanĝi en la ekzemplo por solvi ilin?" Se la studento respondas signifoplene, tiam li solvu almenaŭ unu en la klaso, kaj la ceterajn hejme memstare. Se la solvo estas sukcesa, tiam ni povas komenci klarigi la kondiĉojn ene de la bukloj.
Se vi havas problemojn solvante problemojn memstare, vi devas prilabori ĉion en la klaso. Por eviti solvi la problemon rememorigi pri desegno de strigo, mi rekomendas unue solvi la problemon en neuniversala maniero. Tio estas, tiel ke la solvo trapasas la unuan teston kaj ne uzas la buklokonstruon. Nu, tiam apliki transformojn por atingi universalecon de la solvo.

Bukloj kaj branĉoj

Miaopinie, estas utile doni la temon "cikloj ene de branĉoj" aparte. Por ke poste vi povas vidi la diferencon inter kontroli kondiĉon plurfoje kaj kontroli ĝin unufoje.
La taskoj por firmiĝo estos pri eligo de nombroj de A ĝis B, kiujn la uzanto enmetas:
- ĉiam en kreskanta ordo.
- supreniranta aŭ malsupreniranta depende de la valoroj de A kaj B.

La temo de "branĉiĝo ene de bukloj" devus esti antaŭenigita nur post kiam la studento majstris la teknikojn: "anstataŭigi ŝablonon per variablo" kaj "anstataŭigi ripetajn agojn per ciklo".
La ĉefa kialo por uzi branĉojn ene de bukloj estas anomalioj en la ŝablono. Meze ĝi rompas depende de la komencaj datumoj.
Por tiuj studentoj, kiuj kapablas serĉi solvon per kombinado de simplaj teknikoj, sufiĉas diri "branĉado povas esti skribita ene de bukloj" kaj doni la problemon "ekzemple" tute por solvi sendepende.
Ekzempla tasko:

La uzanto enigas la nombron X. Montru la nombrojn de 0 ĝis 9 en kolumno kaj metu '+' signon kontraŭ la nombro kiu estas egala al X.

Se 0 estis enigita0+
1
2
3
4
5
6
7
8
9

Se 6 estis enigita0
1
2
3
4
5
6+
7
8
9

Se 9 estis enigita0
1
2
3
4
5
6
7
8
9+

Se 777 estis enigita0
1
2
3
4
5
6
7
8
9

Se mallonga klarigo ne sufiĉas por skribi kun buklo, tiam vi devas atingi universalan solvon de la sama problemo sen buklo.
Vi ricevos unu el du ebloj:
Dezirita

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

Eblas

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+");
}

Mi donas similan taskon anticipe, studante la temon pri disbranĉigo.
Se la studento venas kun "ebla" opcio, tiam vi devas diri al ili, ke povas esti multaj solvoj al la sama problemo. Tamen ili diferencas en sia rezisto al ŝanĝoj en postuloj. Demandu: "Kiom da lokoj en la kodo devus esti korektitaj se mi devus aldoni alian numeron?" En la "ebla" versio, vi devos aldoni unu plian branĉon kaj aldoni novan numeron en 10 aliaj lokoj. En la "dezirata" sufiĉas aldoni nur unu branĉon.
Agordu la taskon por reprodukti la "deziratan" opcion, tiam trovu ŝablonon en la kodo, faru varian anstataŭigon kaj skribu buklon.
Se vi havas ideon pri kiel solvi ĉi tiun problemon sen buklo alimaniere, bonvolu skribi en la komentoj.

Bukloj ene Bukloj

En ĉi tiu temo vi devas atenti la jenajn:
— nombriloj por la internaj kaj eksteraj bukloj devas esti malsamaj variabloj.
— la nombrilo por la interna buklo devas esti rekomencigita multfoje (tio estas, en la korpo de la ekstera buklo).
— en tekstaj eligotaskoj oni ne povas unue skribi unu literon en pluraj linioj, kaj poste la duan. Vi devas unue presi ĉiujn literojn de la unua linio, poste ĉiujn literojn de la dua, ktp.

Plej bone estas komenci klarigi la temon de cikloj ene de cikloj klarigante la gravecon restarigi la nombrilon al nulo.
Ekzempla tasko:

La uzanto enigas du nombrojn: R kaj T. Presu du liniojn de "#" signoj. La unua linio devus enhavi R-signojn. La dua linio enhavas T-pecojn. Se iu nombro estas negativa, montru erarmesaĝon.

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

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

R=-1, T=6La R-valoro devas esti nenegativa

R=6, T=-2T-valoro devas esti nenegativa

Evidente, ĉi tiu problemo ankaŭ havas almenaŭ du solvojn.
Dezirita

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

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

La diferenco estas ke en la "ebla" solvo, dua variablo estis uzita por eligi la duan linion. Vi devus insisti uzi la saman variablon por ambaŭ bukloj. Ĉi tiu limigo povas esti pravigita per la fakto, ke solvo kun unu nombrilo por du cikloj estos ilustraĵo de la esprimo "nombrilo rekomencigita". Kompreni ĉi tiun terminon necesas kiam vi solvas la sekvajn problemojn. Kiel kompromiso, vi povas konservi ambaŭ solvojn al la problemo.

Tipa problemo kun uzado de unu nombrila variablo por du bukloj aperas jene:
R=5, T=11#####
######

La nombro da signoj en la dua linio ne respondas al la valoro de T. Se vi bezonas helpon kun ĉi tiu problemo, tiam vi devas rigardi la notojn pri tipaj problemoj kun bukloj. Ĉi tio estas simptomo #3. Ĝi estas diagnozita se vi aldonas nombrilon eligo tuj antaŭ la dua ciklo. Korektita per restarigo. Sed estas pli bone ne diri ĉi tion tuj. La studento devas provi formuli almenaŭ unu hipotezon.

Estas, kompreneble, alia solvo. Sed mi neniam vidis ĝin inter studentoj. En la etapo de studado de cikloj, la rakonto pri ĝi distros la atenton. Vi povas reveni al ĝi poste kiam vi lernas pri kordaj funkcioj.
Ebla numero 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));

Sekva postulata tasko:

Montru la nombrojn de 0 ĝis 9. Ĉiu nombro devus esti sur sia propra linio. La nombro da ciferoj en linio (W) estas enigita de la klavaro.

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

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

Se studento regis la teknikon anstataŭigi variablon, tiam li elportos sufiĉe rapide. Ebla problemo denove estos en restarigo de la variablo. Se vi ne povas trakti la transformon, tio signifas, ke vi hastis kaj bezonas solvi pli simplajn problemojn.

Dankon pro via atento. Ŝatu kaj abonu la kanalon.

PS Se vi trovas erarojn aŭ erarojn en la teksto, bonvolu sciigi min. Ĉi tio povas esti farita elektante parton de la teksto kaj premante "⌘ + Enigu" en Mac, kaj "Ctrl / Enigu" ĉe klasikaj klavaroj aŭ per privataj mesaĝoj. Se ĉi tiuj opcioj ne disponeblas, skribu pri eraroj en la komentoj. Dankon!

Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.

Enketo por legantoj sen karmo

  • 20,0%Mi instruas profesie, +12

  • 10,0%Mi instruas profesie, -11

  • 70,0%Mi ne instruas, +17

  • 0,0%Mi ne instruas, -10

  • 0,0%Aliaj0

10 uzantoj voĉdonis. 5 uzantoj sindetenis.

fonto: www.habr.com

Aldoni komenton