Kuidas õpetada raskustest üle saamist ja samal ajal tsükleid kirjutama

Hoolimata asjaolust, et räägime ühest põhiteemast, on see artikkel kirjutatud kogenud spetsialistidele. Eesmärk on näidata, millised väärarusaamad on algajatel programmeerimises. Praktiseerivate arendajate jaoks on need probleemid ammu lahendatud, unustatud või üldse mitte märgatud. Artikkel võib olla kasulik, kui teil on ootamatult vaja kedagi selle teemaga aidata. Artiklis tuuakse paralleele erinevate Schildti, Stroustrupi, Okulovi programmeerimist käsitlevate raamatute materjalidega.

Tsükliteema valiti seetõttu, et programmeerimise meisterdamisel jäetakse sellest üsna paljud välja.

See tehnika on mõeldud nõrkadele õpilastele. Tugevad inimesed selle teemaga reeglina kinni ei jää ja nende jaoks pole vaja spetsiaalseid võtteid välja mõelda. Artikli teisene eesmärk on viia see tehnika klassist "Töötab kõigile õpilastele, kuid ainult ühele õpetajale" klassile "Töötab kõigile õpilastele, kõigile õpetajatele". Ma ei pretendeeri absoluutsele originaalsusele. Kui kasutate juba sarnast metoodikat selle teema õpetamiseks, kirjutage palun, kuidas teie versioon erineb. Kui otsustate seda kasutada, rääkige meile, kuidas see läks. Kui sarnast tehnikat on kirjeldatud mõnes raamatus, kirjutage palun nimi.


Töötasin selle tehnika kallal 4 aastat, õppides individuaalselt erinevate koolitustasemete õpilastega. Kokku on õpilasi viiskümmend ja tunde kaks tuhat. Algul jäid õpilased selle teemaga alati jänni ja lahkusid. Iga õpilase järel kohendati metoodikat ja materjale. Viimase aasta jooksul pole õpilased selle teemaga enam kinni jäänud, mistõttu otsustasin oma leide jagada.

Miks nii palju kirju? Tsüklid on nii elementaarsed!

Nagu eespool kirjutasin, võib praktiseerivate arendajate ja tugevate õpilaste jaoks silmuste kontseptsiooni keerukust alahinnata. Näiteks saab pidada pikka loengut, näha noogutavaid päid ja intelligentseid silmi. Kuid mis tahes probleemi lahendamisel algab uimasus ja seletamatud probleemid. Pärast loengut oli õpilastel ilmselt vaid osaline arusaam. Olukorda raskendab asjaolu, et õpilased ise ei oska öelda, mis nende pettekujutelm täpselt on.
Ühel päeval taipasin, et õpilased tajusid minu näiteid hieroglüüfidena. See tähendab, nagu jagamatud tekstitükid, kuhu peate lisama mõne "maagilise" tähe ja see töötab.
Mõnikord märkasin, et õpilased arvavad, et konkreetse probleemi lahendamiseks on vaja midagi muud kujundus, mida ma lihtsalt pole veel katnud. Kuigi lahendus nõudis vaid väikest näite muutmist.

Seega tulin välja ideele, et fookus ei peaks olema avaldiste süntaksil, vaid korduva koodi ümberkujundamise ideel silmuste abil. Kui õpilased on selle idee selgeks saanud, saab mis tahes süntaksit vähese harjutamisega parandada.

Keda ja miks ma õpetan?

Kuna sisseastumiseksameid pole, võivad klassidesse kuuluda nii tugevad kui ka väga nõrgad õpilased. Lisateavet minu õpilaste kohta saate lugeda artiklist Õhtukursuslaste portree
Püüdsin tagada, et kõik, kes tahavad programmeerimist õppida, saaksid seda õppida.
Minu tunnid toimuvad individuaalselt ja õpilane maksab igaühe eest oma raha. Näib, et õpilased optimeerivad kulusid ja nõuavad miinimumi. Inimesed lähevad aga silmast silma tundidesse elava õpetajaga mitte teadmiste enda, vaid õpitu kindlustunde, edasiminekutunde ja eksperdi (õpetaja) heakskiidu saamiseks. Kui õpilased õppimises edasiminekut ei tunne, lahkuvad nad. Üldiselt saab klasse üles ehitada nii, et õpilased tunneksid edusamme tuttavate struktuuride arvu suurendamisel. See tähendab, et kõigepealt uurime üksikasjalikult, siis õpime, siis teeme nii kaua ja nüüd on meil valmis tuhande ja ühe öö kursus, kus kaks kuud õpitakse ainult tsükleid ja lõpuks õpilane, kes kirjutas. standardne raamatukogu dikteerimise all. Praktiliste probleemide lahendamiseks on aga vaja mitte ainult materjali tundmist, vaid ka iseseisvust selle rakendamisel ja uue teabe otsimisel. Seetõttu pean silmast silma kursuste puhul õigeks põhimõtteks õpetada miinimumi ja julgustada iseseisvat nüansside ja seonduvate teemade õppimist. Silmuste teemas pean miinimumiks while konstruktsiooni. Sellest saate põhimõttest aru. Põhimõtet teades oskate nii enda jaoks kui ka ise teha.

Nõrkade õpilaste jaoks materjali valdamise saavutamiseks ei piisa süntaksi kirjeldamisest. Vaja on anda lihtsamaid, kuid mitmekülgsemaid ülesandeid ja kirjeldada üksikasjalikumalt näiteid. Lõppkokkuvõttes piirab arengu kiirust õpilase võime väljendeid teisendada ja mustreid otsida. Tarkade õpilaste jaoks on enamik ülesandeid igavad. Nendega õppides ei pea te nõudma probleemide 100% lahendamist. Minu materjaliga saab tutvuda aadressil minu github. Tõsi, hoidla on rohkem nagu warlocki grimoire – keegi peale minu ei saa aru, mis kus asub ja kui sa kontrolli läbi kukud, võid hulluks minna

Metoodika on praktikale orienteeritud

Teooriat selgitatakse ülesande lahendamise näitel. Programmeerimise põhitõdede tunnis, kus õpetatakse harusid ja silmuseid, ei ole lihtsalt võimalik terve tunni jooksul pidada kasulikku loengut ühel teemal. Mõiste selgitamiseks piisab 15-20 minutist. Peamised raskused tekivad praktiliste ülesannete täitmisel.
Algavad õpetajad saavad ühes loengus operaatoreid, harusid, silmuseid ja massiive kõristida. Kuid nende õpilastel on selle teabe assimileerimise probleem.
Materjali pole vaja ainult jutustada, vaid ka jälgida, et kuulajad sellest aru saaksid.

Teema valdamise fakti määrab see, kuidas õpilane iseseisva tööga toime tuleb.
Kui õpilasel õnnestus mingil teemal ülesanne lahendada ilma õpetaja abita, siis on teema omandatud. Enesetestimise tagamiseks kirjeldatakse iga ülesannet testistsenaariumitega tabelis. Ülesannetel on selge järjekord. Ülesannete vahelejätmine pole soovitatav. Kui praegune ülesanne on liiga raske, on järgmise juurde liikumine kasutu. See on veelgi keerulisem. Et õpilane saaks praeguse keerulise ülesandega hakkama, selgitatakse talle esimese ülesande näitel mitmeid tehnikaid. Tegelikult taandub kogu teema sisu raskuste ületamise tehnikatele. Tsüklid on pigem kõrvalmõju.

Esimene ülesanne on alati eeskujuks. Teine erineb veidi ja sooritatakse “iseseisvalt” kohe pärast esimest õpetaja juhendamisel. Kõik järgnevad ülesanded on suunatud sellele, et pöörata tähelepanu erinevatele pisiasjadele, mis võivad eksiarvamusi tekitada.

Näite selgituseks on dialoog, milles õpilane peab levitamise ja ristvalideerimise tagasi kutsuma, et veenduda, et ta on osa materjalist selgeks saanud.

Olen banaalne ja ütlen, et esimene näide selle teema kohta on väga oluline. Kui teil on materjali mahukaks iseseisvaks tööks, saab esimese näite puudusi parandada. Kui peale näite pole midagi muud, siis tõenäoliselt õpilane teemat ei valda.

Ajaks või ajaks?

Üks vastuolulisi küsimusi on näite konstruktsiooni valik: while või for. Kunagi veetis mu praktiseeriv arendajast sõber, kellel polnud õpetamiskogemust, tund aega, veendes mind, et for-silmust on kõige lihtsam mõista. Argumendid taandusid sellele, et "kõik selles on selge ja omal kohal". Tõeliste algajate raskuste algpõhjus on aga tsükli enda idee, mitte selle kirjutamine. Kui inimene sellest ideest aru ei saa, on tal süntaksiga raskusi. Niipea kui idee realiseerub, kaovad koodikujunduse probleemid iseenesest.

Minu materjalides järgib silmuste teema hargnemise teemat. Kui ja while väline sarnasus võimaldab meil tuua otsese analoogia: "kui päises olev tingimus on tõene, siis keha täidetakse." Tsükli ainus eripära on see, et keha hukatakse mitu korda.

Minu teine ​​argument on see, et kuigi vajab vähem vormindamist kui jaoks. Vähem vormindamist tähendab vähem rumalaid vigu puuduvate komade ja sulgudega. Algajad pole veel piisavalt tähelepanelikkust ja täpsust välja arendanud, et automaatselt vältida süntaksivigu.
Kolmandat argumenti selgitatakse paljudes heades raamatutes esimese argumendina.

Kui õpilane oskab väljendeid hõlpsasti teisendada, siis saate sellest rääkida möödaminnes. Seejärel valib õpilane selle, mis talle kõige rohkem meeldib. Kui muutused tekitavad raskusi, siis on parem mitte tähelepanu hajutada. Laske õpilasel esmalt kõik lahendada, kasutades while. Kui olete silmuste teema selgeks saanud, saate lahendused ümber kirjutada, et harjutada while teisendamist for jaoks.
Tingimuslikud silmused on üsna haruldane metsaline. Ma ei kuluta sellele üldse aega. Kui õpilane on omandanud mustrite tuvastamise ja väljendite teisendamise ideed, saab ta selle välja mõelda ilma minu abita.

Esimest näidet tugevatele õpilastele demonstreerides juhin tähelepanu asjaolule, et esimese näite puhul on oluline fikseerida mitte ainult lahendus, vaid ka kogu tegevuse ahel, mis tulemuseni viis. Laisad õpilased võivad kirjutamise unarusse jätta ja kopeerida ainult lõpliku algoritmi. Nad peavad olema veendunud, et ühel päeval tuleb nende teele raske ülesanne. Selle lahendamiseks peate järgima selles näites toodud samme. Seetõttu on oluline kõik etapid salvestada. Järgmistes probleemides on võimalik jätta ainult lahenduse lõplik versioon.

Automatiseerimise põhiidee seisneb selles, et me usaldame arvutile inimese eest rutiinsed tööd. Üks põhitehnikaid on silmuste kirjutamine. Seda kasutatakse siis, kui programmi kirjutatakse järjest mitu identset korduvat tegevust.

Eksplitsiitne on parem kui kaudne

Võib tunduda hea mõte kuvada sama fraasi mitu korda esimeses silmustoimingus. Näiteks:

Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!
Hurraa, see töötab!

See valik on halb, kuna loenduri väärtust pole väljundis näha. See on probleem algajatele. Ära alahinda teda. Algul oli see ülesanne esimene ja arvude jada tuletamise ülesanne tõusvas järjekorras oli teine. Vaja oli võtta kasutusele lisaterminid “tsükkel N korda” ja “tsükkel A-st B-sse”, mis on sisuliselt sama asi. Et mitte luua tarbetuid oleme, otsustasin näidata ainult näidet numbrite jada väljundiga. Vähestel inimestel õnnestub ilma ettevalmistuseta õppida, kuidas peas loendurit hoida ja peas programmi käitumist modelleerida. Mõned õpilased puutuvad esimest korda kokku vaimse modelleerimisega tsüklite teemal.
Pärast mõningast harjutamist annan ülesande sama teksti korrata iseseisvaks lahendamiseks. Kui annate kõigepealt nähtava loenduri ja seejärel nähtamatu, on õpilastel vähem probleeme. Mõnikord piisab vihjest "ära kirjuta loendurit ekraanile".

Kuidas teised seda seletavad?

Enamikus Internetis leiduvates õppematerjalides esitatakse tsükli süntaks “loengu” raames. Näiteks saidil developer.mozilla.org (praegu) kirjeldatakse koos while-tsükliga mitmeid teisi konstruktsioone. Sel juhul antakse mallidena ainult kujundused ise. Nende käivitamise tulemust kirjeldatakse sõnadega, kuid illustratsioon puudub. Minu arvates korrutab selline teema esitus selliste materjalide kasulikkuse nulliga. Õpilane saab koodi ümber kirjutada ja ise käivitada, kuid võrdluseks on tal siiski vaja standardit. Kuidas aru saada, et näide on õigesti ümber kirjutatud, kui tulemust pole millegagi võrrelda?
Kui antakse ainult mall, ilma näiteta, muutub see õpilase jaoks veelgi keerulisemaks. Kuidas aru saada, et koodilõigud on mallis õigesti paigutatud? Võite proovida kirjutada kuidagi, ja siis jooksma. Aga kui tulemuse võrdlemiseks pole standardit, siis ei aita ka käivitamine.

Intuitiivsuse C++ kursusel on tsükli süntaks maetud 4. loengu kolmandale lehele teemal “operaatorid”. Silmuste süntaksi selgitamisel pööratakse erilist rõhku terminile “operaator”. Seda terminit esitatakse faktide kogumina, näiteks „sümbol; see on väide", "{} on liitlause", "tsükli põhiosa peab olema väide". Mulle see lähenemine ei meeldi, sest tundub, et see peidab olulised suhted ühe termini taha. Programmi lähtekoodi selle taseme terminiteks sõelumist vajavad kompilaatorite arendajad keele spetsifikatsiooni rakendamiseks, kuid mitte üliõpilased esmase lähendusena. Programmeerimise uustulnukad on harva piisavalt täpsed, et terminitele nii suurt tähelepanu pöörata. See on haruldane inimene, kes mäletab ja mõistab uusi sõnu esimest korda. Peaaegu keegi ei saa äsja õpitud terminit õigesti rakendada. Seetõttu saavad õpilased palju vigu, näiteks "Ma kirjutasin while(a<7);{, kuid programm ei tööta."
Minu meelest on alguses parem anda konstruktsiooni süntaks kohe sulgudega. Sulgudeta võimalust tuleks selgitada ainult siis, kui õpilasel on konkreetne küsimus: "miks sulgu pole ja see toimib."

Okulovi 2012. aasta raamatus “Programmeerimise alused” algab silmuste sissejuhatus mustriga for, seejärel antakse soovitusi selle kasutamiseks ja seejärel läheb kohe õppetunni eksperimentaalsesse osasse. Ma saan aru, et raamat on kirjutatud sellele vähemusele väga võimekatele õpilastele, kes tulevad minu tundidesse harva.

Populaarsetes raamatutes kirjutatakse alati koodifragmentide tulemus. Näiteks Shildti "Java 8. The Complete Guide" 2015. aasta väljaanne. Esiteks antakse mall, seejärel näidisprogramm ja kohe pärast seda - täitmise tulemus.

Näitena vaatleme while-tsüklit, mis teeb vastupidist
loendur algab 10-st ja kuvatakse täpselt 10 rida "meetmeid":

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

Pärast käivitamist väljastab see programm kümme "tsüklit" järgmiselt:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Malli, näidisprogrammi ja programmi tulemuse kirjeldamise lähenemist kasutatakse ka raamatus “Javascript for Kids” ja js-i kursusel saidil w3schools.com. Veebilehe formaat võimaldab isegi sellel näitel olla interaktiivne.

Stroustrupi 2016. aasta raamat "Principles and Practice Using C++" läks veelgi kaugemale. Esimese sammuna tuleb selgitada, milline tulemus peaks olema, ja pärast seda näidatakse programmi teksti. Pealegi ei võta nad näitena lihtsalt juhuslikku programmi, vaid annavad ekskursiooni ajalukku. See aitab sellele tähelepanu juhtida: „Vaata, see pole lihtsalt mingi kasutu tekst. Sa näed midagi tähenduslikku."

Iteratsiooni näitena vaadake esimest salvestatud programmimasinas (EDSAC) käivitatud programmi. Selle kirjutas David Wheeler Inglismaal Cambridge'i ülikooli arvutilaboris 6. mail 1949. aastal. See programm arvutab ja prindib lihtsa ruutude loendi.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Siin sisaldab iga rida numbrit, millele järgneb tabeldusmärk ('t') ja selle numbri ruut. Selle programmi C++ versioon näeb välja selline:

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

Huvitaval kombel pole selles raamatus süntaksimustrit kirjeldatud. Stroustrup juhendaja käsiraamatus (tõlkimine) rõhutab, et austab oma õpilaste intelligentsust. Võib-olla peetakse sellise intelligentsuse ilminguks võimet tuvastada mustrit mitmes näites.

Nagu ma ise seletan

Stroustrupi lähenemine: tulemuse kirjeldamine, seejärel probleemi lahendamine ja siis iseseisev analüüs õpilase poolt – tundub kõige läbimõeldum. Seetõttu otsustasin võtta selle aluseks, kuid rääkida sellest vähem ajaloolise näite abil - ülesandeks tuletada "sisukord". See moodustab äratuntava ankru, et saaksite seejärel öelda "jätke meelde sisukorra ülesanne" ja et õpilased mäletaksid seda täpselt. Oma näites püüdsin ära hoida veel kahte kõige levinumat eksiarvamust. Järgmisena kirjutan neist lähemalt.

Selles ülesandes tutvustatakse meile keeruliste probleemide lahendamise tehnikaid. Esialgne otsus tuleb teha primitiivne ja lihtne. Siis võite mõelda, kuidas seda lahendust paremaks muuta.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

“Mall-näide-tulemus” lähenemine erinevates kombinatsioonides viib minu tähelepanekute kohaselt ikkagi selleni, et õpilased tajuvad tsüklit hieroglüüfina. See väljendus selles, et nad ei saanud aru, miks on sinna kirjutamise tingimus, kuidas valida i++ ja i— ja muude pealtnäha ilmselgete asjade vahel. Nende väärarusaamade vältimiseks peaks tsüklitest rääkimise käsitlus rõhutama identsete toimingute kordamise ja alles seejärel struktuuri abil vormistamise tähendust. Seetõttu peate enne tsükli süntaksi andmist probleemi otsekohe lahendama. Sisukorra probleemi primitiivne lahendus näeb välja järgmine:

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

Kuidas seda parandada?
Asendage monotoonsed toimingud tsükliga.
Milliseid toiminguid korratakse järjest ilma muudatusteta?
Selles fragmendis neid pole. Sõna “Peatükk” numbriga kuvamise käsud on aga üksteisega väga sarnased.
Seetõttu on järgmiseks etapiks fragmentide erinevuse leidmine. Alles selles ülesandes on kõik ilmne, siis ei korrata mitte üksikuid käske, vaid 5-realisi või enamaid koodiplokke. Peate otsima mitte ainult käskude loendist, vaid ka hargnevate või silmuste konstruktsioonidest.
Näites on käskude erinevus numbris pärast sõna “peatükk”.
Kui erinevus on leitud, peate mõistma muutuste mustrit. Kas erinev fragment on number? Kas see kasvab pidevalt või väheneb? Kuidas muutub arvu väärtus kahe kõrvuti meeskonna vahel?
Näites suureneb arv pärast sõna “peatükk” sammuga 1. Leitakse erinevus, ilmub muster. Nüüd saate erineva fragmendi asendada muutujaga.
Sellise muutuja peate deklareerima enne esimest korduvat fragmenti. Sellist muutujat nimetatakse tavaliselt I või j või millekski detailsemaks. Selle algväärtus peab olema võrdne esimese ekraanil kuvatava väärtusega. Näites on esimene väärtus 1.
Millist algväärtust tuleks võtta, et kuvada numbriseeria “100, 101, 102, 103, 104, 105”?
Selle seeria esimene number on 100.
Pärast iga väljundkäsku peate selle muutuja väärtust 1 võrra suurendama. See ühik on muutmise samm.
Mis samm on numbrite reas "100, 102, 104, 106"?
2. samm selles reas.
Pärast erineva fragmendi asendamist muutujaga näeb kood välja järgmine:

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

Pärast koodis tehnika "väljendage muutuja mustrit" rakendamist saate mitu identsete toimingute rühma, mis lähevad järjest. Nüüd saab korduvaid toiminguid asendada silmusega.

Probleemi lahendamise jada, kus peate kasutama silmuseid, koosneb järgmistest sammudest:

  1. Lahendage "otsast" paljude eraldi käskudega
  2. Leidke muster
  3. Väljendage muutuja mustrit
  4. Disain kui tsükkel

Järgmisena võetakse kasutusele uued terminid, et õpilane ei satuks end olukorrast “Ma saan kõigest aru, aga ei oska öelda”:
— loendur on alati muutuja, mida on vaja tsükli sammude arvu jälgimiseks. Tavaliselt täisarv, mida võrreldakse piiranguga.
— counter step — loenduri muudatuste mustri kirjeldus.
- piirang - arv või muutuja, millega loendurit võrreldakse, et algoritm oleks lõplik. Loenduri väärtus muutub, et läheneda piirile.
— loop body — käskude komplekt, mida korratakse. Kui nad ütlevad, et "käsk on kirjutatud tsükli sisse", mõtlevad nad keha.
— tsükli iteratsioon — tsükli keha ühekordne täitmine.
— silmuse tingimus — loogiline avaldis, mis määrab, kas teostatakse veel üks iteratsioon. (Siin võib tekkida segadus hargnevate struktuuridega)
Peate olema valmis selleks, et algul kasutavad õpilased termineid muudel eesmärkidel. See kehtib nii tugevate kui ka nõrkade kohta. Ühise keele loomine on kunst. Nüüd kirjutan lühidalt: peate määrama ülesande "tõsta koodifragment esile <term>-ga" ja kasutama neid termineid vestluses õigesti.
Pärast silmusega teisendamist saadakse fragment:

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

Peamine eksiarvamus

Üks õpilaste seas levinud eksiarvamus on see, et nad paigutavad tsüklisse toimingud, mida tuleb teha ainult üks kord. Näiteks nii:

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

Õpilased puutuvad selle probleemiga pidevalt kokku, nii alguses kui ka keerulisemate probleemidega.
Peamine vihje sel juhul:

Mitu korda peaksite käsku kordama: üks kord või mitu korda?

Käsud sõnade "Sissejuhatus" ja "Järeldus" trükkimiseks ning muutuja i deklareerimiseks ja initsialiseerimiseks ei ole nagu muud korduvad toimingud. Neid täidetakse ainult üks kord, mis tähendab, et need tuleb kirjutada väljaspool tsükli keha.

Kõik kolm lahendusetappi peaksid jääma koodi sisse, et saaksite neile hiljem raskuste korral viidata. Piisab kahe esimese variandi kommenteerimisest, et need ei segaks.
Õpilase tähelepanu tuleks juhtida järgmistele faktidele:
— Silmusseisundis võrreldakse tavaliselt loendurit ja limiiti. Loendur võib tsükli kehas muutuda, kuid limiit mitte. Selle reegli rikkumiseks peate sõnastama kaalukad põhjused.
— Käsud sõnade “Sissejuhatus” ja “Kokkuvõte” kuvamiseks asuvad väljaspool tsükli põhiosa. Peame neid sooritama 1 kord. "Sissejuhatus" - enne toimingute kordamist, "Järeldus" - pärast.
Selle teema kinnistamisel, järgmiste valdamisel ja raskustega toimetulekul on isegi tugevatel õpilastel kasulik esitada küsimus: "Mitu korda on seda toimingut vaja teha? Üks või mitu?

Lisaoskuste arendamine

Õppetsüklite käigus areneb õpilastel ka probleemide diagnoosimise ja lahendamise oskus. Diagnostika läbiviimiseks peab õpilane esitama soovitud tulemuse ja võrdlema seda tegeliku tulemusega. Parandusmeetmed sõltuvad nendevahelisest erinevusest.
Kuna selles etapis on õpilastel "soovitavast" tulemusest veel vähe aimu, saavad nad keskenduda testiandmetele. Reeglina ei saa selles etapis veel keegi aru, mis võib valesti minna ja kuidas sellega toime tulla. Seetõttu kirjutan vihikusse tüüpiliste probleemide kirjelduse ja mitmeid viise nende lahendamiseks. Sobivaima valimine on õpilase enda ülesanne.
Kirje on vajalik selleks, et küsida "kas juhtus see, mida oodati?", "Milline neist olukordadest juhtus praegu?", "Kas rakendatud lahendus aitas?"

  1. Toimingute arv on oodatust 1 võrra väiksem või rohkem. Lahendused:
    — suurendage loenduri algväärtust 1 võrra.
    — asendada range võrdluse operaator (< või >) mitterangega (<= või >=).
    — muutke piirväärtuseks 1.
  2. Silmuse toimingud sooritatakse peatumata, lõputult. Lahendused:
    — lisage loenduri muutmise käsk, kui see puudub.
    — fikseerige loenduri muutmise käsk nii, et selle väärtus läheks piirile lähemale.
    — eemaldage piirangute muutmise käsk, kui see on tsükli põhiosas.
  3. Toimingute arv tsüklis on oodatust rohkem kui 1 võrra väiksem või suurem. Silmuse toimingut ei sooritatud isegi üks kord. Kõigepealt peate vahetult enne tsükli algust välja selgitama muutujate tegelikud väärtused. Lahendused:
    — muuta piirangu algväärtust
    — muuta loenduri algväärtust

Ülesanne 3 hõlmab tavaliselt vale muutuja kasutamist või loenduri nullimata jätmist.

Pärast seda selgitust võib õpilasel endiselt tekkida mitmesuguseid väärarusaamu silmuste toimimise kohta.
Levinumate probleemide hajutamiseks annan teile järgmised ülesanded:

  1. Millesse kasutaja sisestab limiidi, algse loenduri väärtuse või loenduri sammu.
  2. Milles tuleb mõnes aritmeetilises avaldises kasutada loenduri väärtust. Radikaalses avaldises või nimetajas on soovitatav kasutada loendurit, et erinevus oleks mittelineaarne.
  3. Kui tsükli töötamise ajal loenduri väärtust ekraanil ei kuvata. Näiteks vajaliku arvu identsete tekstifragmentide kuvamine või kujundi joonistamine kilpkonna graafikaga.
  4. Milles peate esmalt sooritama mõned korduvad toimingud ja seejärel teised.
  5. Milles peate enne ja pärast kordamist tegema muid toiminguid

Iga ülesande jaoks peate esitama testi andmed ja oodatava tulemuse.

Et mõista, kui kiiresti saate liikuda, peate lugema nende probleemide tingimusi ja küsima: "Kuidas need erinevad näitest?", "Mida tuleb nende lahendamiseks näites muuta?" Kui õpilane vastab sisukalt, siis las ta lahendab vähemalt ühe tunnis, ülejäänud aga kodus ise. Kui lahendus õnnestub, saame hakata selgitama tsüklite sees olevaid tingimusi.
Kui teil on probleeme iseseisvalt probleemide lahendamisega, peate tunnis kõik läbi töötama. Et ülesande lahendamine ei meenutaks öökulli joonistamist, soovitan esmalt lahendada probleem mitteuniversaalsel viisil. See tähendab, et lahendus läbiks esimese testi ja ei kasutaks silmuskonstruktsiooni. Seejärel rakendage lahenduse universaalsuse saavutamiseks teisendusi.

Aasad ja oksad

Minu meelest on kasulik teema “harusisesed tsüklid” eraldi välja tuua. Nii et hiljem näete erinevust tingimuse mitmekordse kontrollimise ja ühekordse kontrollimise vahel.
Konsolideerimise ülesanded seisnevad numbrite väljastamises A-st B-ni, mille kasutaja sisestab:
- alati kasvavas järjekorras.
- tõusev või kahanevalt sõltuvalt A ja B väärtustest.

Teemaga "silmuste sees hargnemine" tuleks edasi liikuda alles pärast seda, kui õpilane on omandanud tehnikad: "mustri asendamine muutujaga" ja "korduvate toimingute asendamine tsükliga".
Silmuste sees olevate okste kasutamise peamine põhjus on mustri anomaaliad. Keskel puruneb sõltuvalt algandmetest.
Neile õpilastele, kes oskavad lihtsaid võtteid kombineerides lahendust otsida, piisab, kui öelda “hargnemise saab kirjutada silmuste sisse” ja anda ülesanne “näiteks” täielikult iseseisvalt lahendada.
Näidisülesanne:

Kasutaja sisestab arvu X. Kuvage veerus numbrid vahemikus 0 kuni 9 ja lisage X-ga võrduva arvu vastas märk „+”.

Kui sisestati 00+
1
2
3
4
5
6
7
8
9

Kui sisestati 60
1
2
3
4
5
6+
7
8
9

Kui sisestati 90
1
2
3
4
5
6
7
8
9+

Kui sisestati 7770
1
2
3
4
5
6
7
8
9

Kui tsükliga kirjutamiseks lühikesest selgitusest ei piisa, siis tuleb samale probleemile ilma tsüklita saavutada universaalne lahendus.
Saate ühe kahest valikust:
Soovitud

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

Võimalik

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

Sarnase ülesande annan ette, õppides hargnemise teemat.
Kui õpilane pakub välja „võimaliku“ variandi, peate talle ütlema, et samale probleemile võib olla palju lahendusi. Need erinevad aga vastupidavuse poolest nõuete muutumisele. Esitage küsimus: "Mitu kohta koodis tuleks parandada, kui peaksin lisama teise numbri?" "Võimalikus" versioonis peate lisama veel ühe haru ja lisama uue numbri veel 10 kohta. "Soovitavas" piisab ainult ühe haru lisamisest.
Määrake ülesandeks suvand "soovitud" taasesitamine, seejärel leidke koodist muster, asendage muutuja ja kirjutage tsükkel.
Kui teil on idee, kuidas seda probleemi muul viisil ilma silmuseta lahendada, kirjutage kommentaaridesse.

Silmused silmuste sees

Selles teemas peate tähelepanu pöörama järgmisele:
— sisemise ja välimise ahela loendurid peavad olema erinevad muutujad.
— sisemise ahela loendur tuleb mitu korda lähtestada (st välimise ahela kehas).
— tekstiväljastusülesannetes ei saa kõigepealt kirjutada ühte tähte mitmele reale ja seejärel teist. Esmalt tuleb printida kõik esimese rea tähed, seejärel kõik teise rea tähed jne.

Silmuste sees olevate tsüklite teema selgitamist on kõige parem alustada loenduri nullimise olulisusest.
Näidisülesanne:

Kasutaja sisestab kaks numbrit: R ja T. Printige kaks rida "#" märke. Esimene rida peaks sisaldama R-märki. Teine rida sisaldab T tükki. Kui mõni number on negatiivne, kuvage veateade.

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

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

R = -1, T = 6R väärtus ei tohi olla negatiivne

R = 6, T = -2T väärtus ei tohi olla negatiivne

Ilmselgelt on sellel probleemil ka vähemalt kaks lahendust.
Soovitud

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

Võimalik nr 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;
}

Erinevus seisneb selles, et "võimaliku" lahenduse puhul kasutati teise rea väljastamiseks teist muutujat. Peaksite nõudma mõlema tsükli jaoks sama muutuja kasutamist. Seda piirangut saab põhjendada asjaoluga, et ühe loenduriga lahendus kahe tsükli jaoks on mõiste "loenduri lähtestamine" näide. Selle termini mõistmine on vajalik järgmiste probleemide lahendamisel. Kompromissina saate salvestada mõlemad probleemi lahendused.

Tüüpiline probleem ühe loenduri muutuja kasutamisel kahe ahela jaoks on järgmine:
R = 5, T = 11#####
######

Tähemärkide arv teisel real ei vasta T väärtusele. Kui vajate selle probleemi lahendamisel abi, siis peate uurima märkmeid tüüpiliste tsüklitega seotud probleemide kohta. See on sümptom nr 3. See diagnoositakse, kui lisate loenduri väärtuse väljundi vahetult enne teist tsüklit. Parandatud lähtestamisega. Kuid parem on seda kohe mitte öelda. Õpilane peab püüdma sõnastada vähemalt ühe hüpoteesi.

Muidugi on ka teine ​​lahendus. Aga ma pole seda kunagi õpilaste seas näinud. Tsüklite õppimise etapis tõmbab lugu selle kohta tähelepanu. Selle juurde saate hiljem stringifunktsioonide tundmaõppimisel tagasi tulla.
Võimalik nr 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));

Järgmine nõutav ülesanne:

Näidake numbreid vahemikus 0 kuni 9. Iga number peaks olema oma real. Rea numbrite arv (W) sisestatakse klaviatuurilt.

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

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

Kui õpilane on omandanud muutuja asendamise tehnika, saab ta üsna kiiresti hakkama. Võimalik probleem on taas muutuja lähtestamine. Kui te ei saa ümberkujundamisega hakkama, tähendab see, et teil oli kiire ja teil on vaja lahendada lihtsamaid probleeme.

Tänan tähelepanu eest. Like ja telli kanal.

PS Kui leiate tekstist kirjavigu või vigu, andke mulle teada. Seda saab teha, valides osa tekstist ja vajutades Macis klahvikombinatsiooni ⌘ + Enter ja klassikalistel klaviatuuridel klahvikombinatsiooni Ctrl / Enter või privaatsõnumite kaudu. Kui need valikud pole saadaval, kirjutage vigadest kommentaarides. Aitäh!

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Küsitlus karmata lugejatele

  • 20,0%Õpetan professionaalselt, +12

  • 10,0%Õpetan professionaalselt, -11

  • 70,0%Ma ei õpeta, +17

  • 0,0%Ma ei õpeta, -10

  • 0,0%Muu0

10 kasutajat hääletas. 5 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar