Kako učiti premagovati težave in hkrati pisati cikle

Kljub dejstvu, da bomo govorili o eni od osnovnih tem, je ta članek napisan za izkušene strokovnjake. Cilj je pokazati, kakšne napačne predstave imajo začetniki pri programiranju. Za praktične razvijalce so te težave že dolgo rešene, pozabljene ali sploh niso opazili. Članek vam lahko pride prav, če boste nenadoma morali nekomu pomagati pri tej temi. Članek vleče vzporednice z gradivom iz različnih knjig o programiranju avtorjev Schildt, Stroustrup, Okulov.

Tema o ciklih je bila izbrana zato, ker je pri osvajanju programiranja precej ljudi izključenih iz nje.

Ta tehnika je zasnovana za šibke učence. Močni ljudje se praviloma ne zataknejo na to temo in zanje ni treba izumljati posebnih tehnik. Sekundarni cilj članka je premakniti to tehniko iz razreda »deluje za vse učence, vendar samo enega učitelja« v razred »deluje za vse učence, vse učitelje«. Ne zahtevam absolutne izvirnosti. Če že uporabljate podobno metodologijo za poučevanje te teme, napišite, v čem se vaša različica razlikuje. Če se odločite za uporabo, nam povejte, kako je šlo. Če je podobna tehnika opisana v knjigi, napišite ime.


Na tej tehniki sem delal 4 leta in se individualno učil s študenti različnih stopenj usposabljanja. Skupno je okoli petdeset študentov in dva tisoč ur pouka. Sprva se je študentom vedno zataknilo pri tej temi in odšli. Za vsakega študenta je bila prilagojena metodologija in gradiva. V preteklem letu študenti niso več obtičali pri tej temi, zato sem se odločil deliti svoje ugotovitve.

Zakaj toliko črk? Cikli so tako osnovni!

Kot sem zapisal zgoraj, je lahko za praktične razvijalce in močne študente kompleksnost koncepta zank podcenjena. Na primer, lahko imate dolgo predavanje, vidite kimajoče glave in pametne oči. Ko pa poskušate rešiti kakršno koli težavo, se začnejo omamljenost in nerazložljive težave. Študenti so po predavanju verjetno imeli le delno razumevanje. Situacijo otežuje dejstvo, da učenci sami ne morejo povedati, kaj točno je njihova zabloda.
Nekega dne sem ugotovil, da učenci moje primere dojemajo kot hieroglife. To je kot nedeljivi deli besedila, v katerega morate dodati nekaj "čarobne" črke in bo delovalo.
Včasih sem opazil, da učenci mislijo, da je za rešitev določenega problema potrebno nekaj drugega dizajn, ki ga preprosto še nisem obravnaval. Čeprav je rešitev zahtevala le rahlo spremembo primera.

Tako sem prišel na idejo, da se ne bi smel osredotočiti na sintakso izrazov, ampak na idejo preoblikovanja ponavljajoče se kode z uporabo zank. Ko učenci obvladajo to idejo, je mogoče katero koli sintakso izboljšati z malo vaje.

Koga in zakaj učim?

Ker sprejemnih izpitov ni, lahko v razrede vključimo tako močne kot zelo šibke dijake. Več o mojih študentih si lahko preberete v članku Portret študentov večernega tečaja
Prizadeval sem si, da bi se programiranja lahko naučil vsak, ki se želi naučiti.
Moje ure potekajo individualno in tečajnik za vsako plača svoj denar. Zdi se, da bodo študenti optimizirali stroške in zahtevali minimum. Vendar pa ljudje ne hodijo na pouk iz oči v oči z učiteljem v živo, ne zaradi samega znanja, temveč zaradi zaupanja v to, kar so se naučili, zaradi občutka napredka in po odobritev strokovnjaka (učitelja). Če učenci ne bodo čutili napredka pri učenju, bodo odšli. Na splošno je razrede mogoče strukturirati tako, da učenci občutijo napredek pri povečanju števila znanih struktur. To pomeni, da se najprej podrobno učimo, nato se učimo, nato delamo, zdaj pa imamo pripravljen tisoč in en nočni tečaj, v katerem se dva meseca preučujejo samo cikli, na koncu pa študent, ki je napisal standardna knjižnica pod narekom. Za reševanje praktičnih problemov pa ni potrebno samo poznavanje gradiva, ampak tudi samostojnost pri njegovi uporabi in iskanju novih informacij. Zato menim, da je za tečaje iz oči v oči pravilno načelo poučevanje minimuma in spodbujanje samostojnega študija nians in povezanih tem. V temi zank menim, da je konstrukcija while najmanjša. Iz tega lahko razumete načelo. Če poznate načelo, lahko sami obvladate tako za kot tudi med delom.

Da bi šibki učenci obvladali gradivo, opis sintakse ni dovolj. Treba je dati več preprostih, a raznolikih nalog in podrobneje opisati primere. Navsezadnje je hitrost razvoja omejena z učenčevo sposobnostjo preoblikovanja izrazov in iskanja vzorcev. Za pametne učence bo večina nalog dolgočasnih. Ko se učite z njimi, vam ni treba vztrajati pri 100-odstotni rešitvi težav. Moje gradivo si lahko ogledate na moj github. Res je, da je skladišče bolj podobno čarovniškemu grimoriju - nihče razen mene ne bo razumel, kaj je kje, in če ne uspete preveriti, lahko znorite

Metodologija je usmerjena v prakso

Teorija je razložena na primeru reševanja problema. Pri tečaju osnov programiranja, kjer se poučujejo veje in zanke, preprosto ni mogoče celo uro uporabno predavati o eni temi. Za razlago koncepta je dovolj 15-20 minut. Glavne težave nastanejo pri izvajanju praktičnih nalog.
Učitelji začetniki se lahko na enem predavanju seznanijo z operaterji, vejami, zankami in nizi. Toda njihovi učenci se bodo soočili s problemom asimilacije teh informacij.
Navsezadnje morate ne le povedati gradiva, ampak tudi poskrbeti, da ga poslušalci razumejo.

Dejstvo obvladovanja teme je odvisno od tega, kako se študent spopada s samostojnim delom.
Če je učencu uspelo rešiti nalogo pri temi brez pomoči učitelja, potem je tema obvladana. Za zagotovitev samotestiranja je vsaka naloga opisana v tabeli s testnimi scenariji. Naloge imajo jasen vrstni red. Preskakovanje nalog ni priporočljivo. Če je trenutna naloga pretežka, je prehod na naslednjo neuporaben. Še bolj zapleteno je. Da lahko študent obvlada trenutno zapleteno nalogo, mu je na primeru prvega problema razloženih več tehnik. Pravzaprav se celotna vsebina teme spušča na tehnike premagovanja težav. Cikli so bolj stranski učinek.

Prva naloga je vedno zgled. Drugi se nekoliko razlikuje in se izvaja »samostojno« takoj za prvim pod nadzorom učitelja. Vse nadaljnje naloge so usmerjene v pozornost na različne malenkosti, ki lahko povzročijo napačne predstave.

Razlaga primera je dialog, v katerem mora učenec priklicati nazaj propagacijo in navzkrižno preverjanje, da se prepriča, ali je obvladal del snovi.

Bom banalen in rekel, da je prvi primer na temo zelo pomemben. Če imate gradivo za obsežno samostojno delo, lahko izpade prvega primera popravite. Če poleg primera ni nič drugega, študent najverjetneje ne bo obvladal teme.

Dokler ali za?

Eno od spornih vprašanj je izbira konstrukcije za primer: medtem ko ali za. Nekoč me je moj prijatelj razvijalec brez izkušenj s poučevanjem eno uro prepričeval, da je zanko for najlažje razumeti. Argumenti so se skrčili na to, da je "v njem vse jasno in postavljeno na svoje mesto." Vendar pa je glavni vzrok težav za prave začetnike ideja o samem ciklu in ne njegovo pisanje. Če oseba ne razume te ideje, bo imela težave s sintakso. Takoj ko je ideja realizirana, problemi oblikovanja kode izginejo sami od sebe.

V mojih materialih tema zank sledi temi razvejanja. Zunanja podobnost if in while nam omogoča, da potegnemo neposredno analogijo: "ko je pogoj v glavi resničen, se telo izvede." Edina posebnost cikla je, da se telo izvaja večkrat.

Moj drugi argument je, da while zahteva manj oblikovanja kot for. Manj oblikovanja pomeni manj neumnih napak z manjkajočimi vejicami in oklepaji. Začetniki še niso razvili dovolj pozornosti in natančnosti, da bi se samodejno izognili sintaksnim napakam.
Tretji argument je v mnogih dobrih knjigah razložen kot prvi argument.

Če zna učenec zlahka preoblikovati izraze, potem lahko mimogrede govorite o for. Učenec bo nato izbral tisto, kar mu je najbolj všeč. Če preobrazbe povzročajo težave, potem je bolje, da ne odvrnete pozornosti. Naj učenec najprej reši vse z uporabo medtem. Ko obvladate temo zank, lahko ponovno napišete rešitve in vadite pretvorbo while v for.
Postpogojne zanke so precej redka zver. Sploh ne porabim časa za to. Če učenec obvlada ideje o prepoznavanju vzorcev in preoblikovanju izrazov, lahko to ugotovi brez moje pomoči.

Pri predstavitvi prvega primera močnim učencem opozarjam na dejstvo, da je v prvem primeru pomembno zabeležiti ne samo rešitev, temveč tudi celotno verigo dejanj, ki so pripeljala do rezultata. Leni učenci lahko pisanje zanemarijo in kopirajo samo končni algoritem. Prepričati jih je treba, da jih nekega dne čaka težka naloga. Če ga želite rešiti, boste morali slediti korakom kot v tem primeru. Zato je pomembno zabeležiti vse faze. Pri naslednjih težavah bo mogoče pustiti samo končno različico rešitve.

Glavna ideja avtomatizacije je, da računalniku zaupamo rutinsko delo namesto osebe. Ena od osnovnih tehnik je pisanje zank. Uporablja se, ko je v programu zaporedoma zapisanih več enakih ponavljajočih se dejanj.

Eksplicitno je bolje kot implicitno

Morda se zdi dobra ideja, da isto besedno zvezo prikažete večkrat v prvem opravilu zanke. Na primer:

Hura, deluje!
Hura, deluje!
Hura, deluje!
Hura, deluje!
Hura, deluje!
Hura, deluje!
Hura, deluje!
Hura, deluje!

Ta možnost je slaba, ker vrednost števca ni vidna v izhodu. To je težava za začetnike. Ne podcenjuj je. Sprva je bila ta naloga prva, naloga izpeljave niza števil v naraščajočem vrstnem redu pa druga. Treba je bilo uvesti dodatna pojma "cikli N-krat" in "cikel od A do B", ki sta v bistvu ista stvar. Da ne bi ustvarjal nepotrebnih entitet, sem se odločil prikazati samo primer z izpisom niza številk. Malo ljudi se brez priprave uspe naučiti držati števec v glavi in ​​modelirati obnašanje programa v svoji glavi. Nekateri učenci se z miselnim modeliranjem prvič srečajo na temo ciklov.
Po nekaj vaje dam nalogo ponovitve istega besedila v samostojno reševanje. Če daš najprej vidni števec in nato nevidnega, bodo imeli učenci manj težav. Včasih zadostuje namig »ne pišite števca na ekran«.

Kako si to razlagajo drugi?

V večini izobraževalnih gradiv na internetu je sintaksa cikla podana kot del »predavanja«. Na primer, na developer.mozilla.org (trenutno) je skupaj z zanko while opisanih več drugih konstruktov. V tem primeru so podane le same zasnove v obliki predlog. Rezultat njihovega lansiranja je opisan z besedami, ni pa ilustracije. Po mojem mnenju takšna predstavitev teme pomnoži uporabnost tovrstnih materialov na nič. Študent lahko sam prepiše kodo in jo požene, vendar še vedno potrebuje standard za primerjavo. Kako lahko razumete, da je bil primer pravilno prepisan, če rezultata ni s čim primerjati?
Ko je podana samo predloga, brez primera, postane za učenca še težje. Kako razumeti, da so fragmenti kode pravilno postavljeni v predlogo? Lahko poskusiš pisati nekako, nato pa tecite. Če pa ni standarda za primerjavo rezultata, tudi zagon ne bo pomagal.

V tečaju C++ na Intuitive je sintaksa zanke zakopana na tretji strani predavanja 4 na temo "operatorji". Pri razlagi sintakse zank je poseben poudarek na izrazu »operator«. Izraz je predstavljen kot skupek dejstev, kot so »simbol; to je stavek«, »{} je sestavljen stavek«, »telo zanke mora biti stavek«. Ta pristop mi ni všeč, ker se zdi, da za enim izrazom skriva pomembna razmerja. Razčlenitev izvorne kode programa v izraze na tej ravni potrebujejo razvijalci prevajalnika za implementacijo jezikovne specifikacije, ne pa študenti kot prvi približek. Novinci v programiranju so le redko dovolj natančni, da bi bili tako pozorni na izraze. Redka oseba si zapomni in razume nove besede prvič. Skoraj nihče ne more pravilno uporabiti izraza, ki se ga je pravkar naučil. Zato učenci dobijo veliko napak, kot je "Napisal sem medtem(a<7);{, vendar program ne deluje."
Po mojem mnenju je na začetku bolje dati sintakso konstrukcije takoj z oklepaji. Možnost brez oklepajev je treba razložiti le, če ima študent specifično vprašanje: "zakaj ni oklepajev in deluje."

V knjigi Okulova iz leta 2012 »Osnove programiranja« se uvod v zanke začne z vzorcem for, nato poda priporočila za njegovo uporabo in takoj preide na eksperimentalni del lekcije. Razumem, da je bila knjiga napisana za tisto manjšino zelo sposobnih študentov, ki redko pridejo k mojim predavanjem.

V priljubljenih knjigah je vedno zapisan rezultat fragmentov kode. Na primer, izdaja Shildta »Java 8. The Complete Guide« iz leta 2015. Najprej je podana predloga, nato primer programa in takoj za njim - rezultat izvedbe.

Kot primer razmislite o zanki while, ki deluje obratno
odštevanje se začne od 10, in prikazanih je natanko 10 vrstic "mer":

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

Po zagonu ta program ustvari deset "ciklov", kot sledi:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Pristop opisovanja predloge, primera programa in rezultata programa je uporabljen tudi v knjigi “Javascript za otroke” in v tečaju js na w3schools.com. Oblika spletne strani celo omogoča, da je ta primer interaktiven.

Stroustrupova knjiga iz leta 2016 Principles and Practice Using C++ je šla še dlje. Prvi korak je pojasniti, kakšen rezultat naj bi dobili, nato pa se prikaže besedilo programa. Poleg tega za primer ne vzamejo le naključnega programa, ampak dajejo izlet v zgodovino. To pomaga pritegniti pozornost nanj: »Poglejte, to ni samo neuporabno besedilo. Vidiš nekaj pomembnega."

Kot primer iteracije razmislite o prvem programu, ki se izvaja na stroju s shranjenimi programi (EDSAC). Napisal ga je David Wheeler v računalniškem laboratoriju Univerze v Cambridgeu v Angliji 6. maja 1949. Ta program izračuna in natisne preprost seznam kvadratov.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Tukaj vsaka vrstica vsebuje številko, ki ji sledi tabulator ('t') in kvadrat te številke. Različica C++ tega programa izgleda takole:

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

Zanimivo je, da sintaksni vzorec v tej knjigi ni opisan. Stroustrup v priročniku za inštruktorja (prevod) poudarja, da spoštuje inteligenco svojih študentov. Morda se sposobnost prepoznavanja vzorca v več primerih šteje za manifestacijo takšne inteligence.

Kot razlagam sam

Najbolj premišljen se zdi Stroustrupov pristop: opis rezultata, nato reševanje problema in nato samostojna analiza študenta. Zato sem se odločil, da ga vzamem za osnovo, vendar ga povem z manj zgodovinskim primerom - nalogo izpeljave "kazala". Oblikuje prepoznavno sidro, da lahko potem rečete »zapomni si nalogo o kazalu« in da si učenci zapomnijo točno to. V svojem primeru sem skušal preprečiti še dve najpogostejši napačni predstavi. V nadaljevanju bom o njih pisal podrobneje.

V tej nalogi se seznanimo s tehnikami reševanja kompleksnih problemov. Začetna odločitev mora biti primitivna in preprosta. No, potem lahko razmislite, kako izboljšati to rešitev.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Po mojih opažanjih pristop »predloga-primer-rezultat« v različnih kombinacijah še vedno vodi do tega, da učenci cikel dojemajo kot hieroglif. To se je kazalo v tem, da niso razumeli, zakaj obstaja pogoj za pisanje tja, kako izbrati med i++ in i— in druge na videz očitne stvari. Da bi se izognili tem napačnim predstavam, bi moral pristop k govorjenju o ciklih poudarjati pomen ponavljanja identičnih dejanj in jih šele nato formalizirati s strukturo. Zato morate pred podajanjem sintakse zanke neposredno rešiti težavo. Primitivna rešitev problema kazala je videti takole:

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

Kako ga je mogoče izboljšati?
Zamenjajte monotona dejanja s ciklom.
Katera dejanja se ponavljajo zapored brez sprememb?
V tem fragmentu jih ni. Vendar so si ukazi za prikaz besede »Chapter« s številko zelo podobni.
Zato je naslednja stopnja iskanje razlike med fragmenti. Samo v tej nalogi je vse očitno, potem se ne bodo ponovili posamezni ukazi, temveč bloki kode s 5 vrsticami ali več. Ne boste morali iskati le na seznamu ukazov, temveč v konstrukcijah razvejanja ali zanke.
V primeru je razlika med ukazi v številki za besedo “Chapter”.
Ko ugotovite razliko, morate razumeti vzorec spremembe. Različni fragment je številka? Se nenehno povečuje ali zmanjšuje? Kako se spremeni vrednost števila med dvema ekipama ena ob drugi?
V primeru se število za besedo »poglavje« povečuje v korakih po 1. Razlika je najdena, vzorec je razkrit. Zdaj lahko zamenjate različni fragment s spremenljivko.
Tako spremenljivko morate deklarirati pred prvim od ponavljajočih se fragmentov. Takšna spremenljivka se običajno imenuje I ali j ali kaj bolj podrobnega. Njegova začetna vrednost mora biti enaka prvi vrednosti, prikazani na zaslonu. V primeru je prva vrednost 1.
Katero začetno vrednost je treba vzeti za prikaz niza številk "100, 101, 102, 103, 104, 105"?
Prva številka v tem nizu je 100.
Po vsakem izhodnem ukazu morate povečati vrednost te spremenljivke za 1. Ta enota je korak spremembe.
Kateri korak bo v nizu številk "100, 102, 104, 106"?
2. korak v tej vrstici.
Po zamenjavi različnega fragmenta s spremenljivko bo koda videti takole:

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 uporabi tehnike »izrazi vzorec spremenljivke« v kodi dobite več skupin enakih dejanj, ki gredo v vrsto. Zdaj lahko ponavljajoča se dejanja nadomestimo z zanko.

Zaporedje reševanja problema, kjer morate uporabiti zanke, je sestavljeno iz naslednjih korakov:

  1. Rešite »neposredno« s številnimi ločenimi ukazi
  2. Poiščite vzorec
  3. Izrazite vzorec spremenljivke
  4. Oblikovanje kot cikel

Nato so uvedeni novi izrazi, da se učenec ne znajde v situaciji »vse razumem, a ne morem povedati«:
— števec je vedno spremenljivka, ki je potrebna za sledenje številu korakov v zanki. Običajno celo število, ki se primerja z omejitvijo.
— korak števca — opis vzorca sprememb števca.
- omejitev - število ali spremenljivka, s katero primerjamo števec, da je algoritem dokončen. Vrednost števca se spremeni, da se približa meji.
— telo zanke — niz ukazov, ki se bodo ponavljali. Ko rečejo "ukaz je zapisan v zanki", mislijo na telo.
— ponovitev zanke — enkratna izvedba telesa zanke.
— pogoj zanke — logični izraz, ki določa, ali bo izvedena druga ponovitev. (Tu lahko pride do zmede z razvejanimi strukturami)
Pripravljeni morate biti na dejstvo, da bodo učenci sprva uporabljali izraze za druge namene. To velja tako za močne kot za šibke. Vzpostavljanje skupnega jezika je umetnost. Zdaj bom napisal na kratko: nastaviti morate nalogo »označi fragment kode z <term>« in sami pravilno uporabiti te izraze v pogovoru.
Po transformaciji z zanko dobimo fragment:

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

Glavna napačna predstava

Ena izmed priljubljenih napačnih predstav med študenti je, da dejanja postavljajo v zanko, ki jih je treba izvesti samo enkrat. Na primer takole:

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

Učenci se s to težavo srečujejo ves čas, tako na začetku kot pri zahtevnejših nalogah.
Ključni nasvet v tem primeru:

Kolikokrat morate ponoviti ukaz: enkrat ali večkrat?

Ukazi za izpis besed "Uvod" in "Zaključek" ter deklaracija in inicializacija spremenljivke i niso podobni drugim ponavljajočim se dejanjem. Izvedejo se samo enkrat, kar pomeni, da jih je treba zapisati zunaj telesa zanke.

Vse tri stopnje rešitve naj ostanejo v kodi, da se lahko pozneje v primeru težav obrnete nanje. Dovolj je, da komentirate prvi dve možnosti, da ne motita.
Študenta je treba opozoriti na naslednja dejstva:
— V stanju zanke se običajno primerjata števec in meja. Števec se lahko spremeni v telesu zanke, omejitev pa ne. Če želite kršiti to pravilo, morate oblikovati prepričljive razloge.
— Ukazi za prikaz besed »Uvod« in »Zaključek« se nahajajo zunaj telesa zanke. Izvesti jih moramo 1-krat. "Uvod" - pred ponovitvijo dejanj, "Zaključek" - po.
V procesu utrjevanja te teme, obvladovanja naslednjih, pa tudi ob soočanju s težavami je koristno, da si tudi močni učenci zastavijo vprašanje: »Kolikokrat je treba to dejanje izvesti? Enega ali več?

Razvoj dodatnih veščin

V procesu študijskih ciklov študenti razvijajo tudi veščino diagnosticiranja in reševanja problemov. Za izvedbo diagnostike mora študent predstaviti želeni rezultat in ga primerjati z dejanskim rezultatom. Korektivni ukrepi so odvisni od razlike med njimi.
Ker imajo učenci na tej stopnji še vedno malo pojma o "želenem" rezultatu, se lahko osredotočijo na testne podatke. Praviloma še nihče v tej fazi ne razume, kaj gre lahko narobe in kako se s tem spopasti. Zato v zvezek zapišem opis tipičnih težav in več načinov za njihovo rešitev. Izbira najprimernejšega je naloga študenta samega.
Zapis je potreben za vprašanje "ali se je zgodilo tisto, kar je bilo pričakovano?", "Katera od teh situacij se je zgodila zdaj?", "Ali je uporabljena rešitev pomagala?"

  1. Število dejanj je 1 manj ali več od pričakovanega. rešitve:
    — povečati začetno vrednost števca za 1.
    — zamenjajte strogi primerjalni operator (< ali >) z nestrogim (<= ali >=).
    — spremenite mejno vrednost na 1.
  2. Dejanja v zanki se izvajajo brez ustavljanja, neomejeno. rešitve:
    — dodajte ukaz za spremembo števca, če manjka.
    — popravite ukaz za spremembo števca, tako da se njegova vrednost približa meji.
    — odstranite ukaz za spremembo omejitve, če je v telesu zanke.
  3. Število dejanj v zanki je več kot 1 manjše ali večje od pričakovanega. Dejanje v zanki ni bilo izvedeno niti enkrat. Najprej morate ugotoviti dejanske vrednosti spremenljivk tik preden se zanka začne. rešitve:
    — spremenite začetno vrednost omejitve
    — spremenite začetno vrednost števca

Težava 3 običajno vključuje uporabo napačne spremenljivke ali neponastavitev števca na nič.

Po tej razlagi ima lahko študent še vedno različne napačne predstave o delovanju zank.
Da bi odpravili najpogostejše, vam dam naslednje naloge:

  1. V katerega mejo, začetno vrednost števca ali korak števca vnese uporabnik.
  2. V katerem je treba vrednost števca uporabiti v nekem aritmetičnem izrazu. Priporočljivo je, da uporabite števec v radikalnem izrazu ali v imenovalcu, tako da je razlika nelinearna.
  3. V katerem vrednost števca ni prikazana na zaslonu, medtem ko zanka teče. Na primer, prikaz zahtevanega števila enakih fragmentov besedila ali risanje figure z grafiko želve.
  4. V katerem morate najprej izvesti nekaj ponavljajočih se dejanj, nato pa druga.
  5. V katerem morate izvesti druga dejanja pred in po ponovitvi

Za vsako nalogo morate navesti testne podatke in pričakovani rezultat.

Da bi razumeli, kako hitro se lahko premikate, morate prebrati izraze teh problemov in se vprašati: "kako se razlikujejo od primera?", "Kaj je treba v primeru spremeniti, da jih rešimo?" Če učenec odgovarja smiselno, potem naj vsaj enega reši pri pouku, ostalo pa doma sam. Če je rešitev uspešna, potem lahko začnemo razlagati pogoje znotraj zank.
Če imate težave pri samostojnem reševanju problemov, morate vse obdelati v razredu. Da reševanje problema ne bi spominjalo na risanje sove, priporočam, da problem najprej rešite na neuniverzalen način. To pomeni, da rešitev prestane prvi test in ne uporablja konstrukcije zanke. No, potem uporabite transformacije, da dosežete univerzalnost rešitve.

Zanke in veje

Po mojem mnenju je koristno dati temo "cikli znotraj panog" ločeno. Da boste pozneje videli razliko med večkratnim in enkratnim preverjanjem pogoja.
Naloge za utrjevanje bodo namenjene izpisovanju števil od A do B, ki jih vnese uporabnik:
- vedno v naraščajočem vrstnem redu.
- naraščajoče ali padajoče, odvisno od vrednosti A in B.

Tema "razvejanja znotraj zank" se mora premakniti šele, ko študent obvlada tehnike: "zamenjava vzorca s spremenljivko" in "zamenjava ponavljajočih se dejanj s ciklom."
Glavni razlog za uporabo vej znotraj zank so anomalije v vzorcu. Na sredini se zlomi glede na začetne podatke.
Za tiste študente, ki so sposobni iskati rešitev s kombiniranjem preprostih tehnik, je dovolj, da rečejo, da je "razvejanje mogoče zapisati znotraj zank" in dajo problem "na primer" v celoti rešiti samostojno.
Primer naloge:

Uporabnik vnese število X. Številke od 0 do 9 izpišemo v stolpec in nasproti števila, ki je enako X, postavimo znak '+'.

Če je bila vnesena 00+
1
2
3
4
5
6
7
8
9

Če je bila vnesena 60
1
2
3
4
5
6+
7
8
9

Če je bila vnesena 90
1
2
3
4
5
6
7
8
9+

Če je bila vnesena 7770
1
2
3
4
5
6
7
8
9

Če kratka razlaga ni dovolj za pisanje z zanko, potem morate doseči univerzalno rešitev istega problema brez zanke.
Dobili boste eno od dveh možnosti:
Zaželeno

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žno

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

Podobno nalogo dam vnaprej, medtem ko preučujem temo razvejanja.
Če študent pride na "možno" možnost, mu morate povedati, da lahko obstaja več rešitev za isti problem. Razlikujejo pa se po odpornosti na spremembe zahtev. Postavite vprašanje: "Koliko mest v kodi bi bilo treba popraviti, če bi moral dodati še eno številko?" V "možni" različici boste morali dodati še eno podružnico in dodati novo številko na 10 drugih mestih. V "želenem" je dovolj, da dodate samo eno vejo.
Nastavite nalogo za reprodukcijo »želene« možnosti, nato poiščite vzorec v kodi, izvedite zamenjavo spremenljivke in napišite zanko.
Če imate idejo, kako drugače rešiti ta problem brez zanke, napišite v komentarje.

Zanke znotraj zank

V tej temi morate biti pozorni na naslednje:
— števci za notranjo in zunanjo zanko morajo biti različni spremenljivki.
— števec za notranjo zanko je treba večkrat ponastaviti (to je v telesu zunanje zanke).
— pri nalogah za izpis besedila ne morete najprej napisati ene črke v več vrsticah in nato druge. Najprej morate natisniti vse črke prve vrstice, nato vse črke druge in tako naprej.

Najbolje je, da začnete razlagati temo zank znotraj zank z razlago pomena ponastavitve števca na nič.
Primer naloge:

Uporabnik vnese dve številki: R in T. Izpiše dve vrstici znakov "#". Prva vrstica naj vsebuje znake R. Druga vrstica vsebuje T kosov. Če je katero koli število negativno, se prikaže sporočilo o napaki.

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

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

R=-1, T=6Vrednost R mora biti nenegativna

R=6, T=-2Vrednost T mora biti nenegativna

Očitno ima tudi ta problem vsaj dve rešitvi.
Zaželeno

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žno #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;
}

Razlika je v tem, da je bila v "možni" rešitvi za izpis druge vrstice uporabljena druga spremenljivka. Vztrajajte pri uporabi iste spremenljivke za obe zanki. To omejitev je mogoče utemeljiti z dejstvom, da bo rešitev z enim števcem za dva cikla ilustracija izraza "ponastavitev števca". Razumevanje tega pojma je potrebno pri reševanju naslednjih problemov. Kot kompromis lahko shranite obe rešitvi problema.

Tipična težava z uporabo ene spremenljivke števca za dve zanki je videti takole:
R=5, T=11#####
######

Število znakov v drugi vrstici ne ustreza vrednosti T. Če potrebujete pomoč pri tej težavi, morate preučiti opombe o tipičnih težavah z zankami. To je simptom št. 3. Diagnosticira se, če dodate vrednost števca neposredno pred drugim ciklom. Popravljeno s ponastavitvijo. Vendar je bolje, da tega ne poveste takoj. Študent mora poskušati oblikovati vsaj eno hipotezo.

Obstaja pa seveda še ena rešitev. Med študenti pa tega še nisem videl. Na stopnji preučevanja ciklov bo zgodba o tem odvrnila pozornost. K temu se lahko vrnete pozneje, ko se učite o funkcijah nizov.
Možno #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));

Naslednja zahtevana naloga:

Prikažite številke od 0 do 9. Vsaka številka naj bo v svoji vrstici. Število števk v vrstici (W) se vnese s tipkovnico.

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

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

Če je študent obvladal tehniko zamenjave spremenljivke, se bo zelo hitro spopadel. Morebitna težava bo spet pri ponastavitvi spremenljivke. Če ne zmorete preobrazbe, pomeni, da se vam je mudilo in morate rešiti enostavnejše probleme.

Hvala za vašo pozornost. Všečkajte in se naročite na kanal.

PS Če najdete tipkarske ali napake v besedilu, me prosim obvestite. To lahko storite tako, da izberete del besedila in pritisnete “⌘ + Enter” na Macu in “Ctrl / Enter” na klasičnih tipkovnicah ali prek zasebnih sporočil. Če te možnosti niso na voljo, pišite o napakah v komentarjih. Hvala vam!

V anketi lahko sodelujejo samo registrirani uporabniki. Prijaviti se, prosim.

Anketa za bralce brez karme

  • 20,0%Poučujem strokovno, +12

  • 10,0%Poučujem strokovno, -11

  • 70,0%Ne poučujem, +17

  • 0,0%Ne poučujem, -10

  • 0,0%Drugo0

Glasovalo je 10 uporabnikov. 5 uporabnikov se je vzdržalo.

Vir: www.habr.com

Dodaj komentar