Kaip išmokyti įveikti sunkumus ir tuo pačiu rašyti ciklus

Nepaisant to, kad kalbėsime apie vieną iš pagrindinių temų, šis straipsnis yra skirtas patyrusiems specialistams. Tikslas – parodyti, kokių klaidingų supratimų programuodami turi pradedantieji. Praktikuojantiems kūrėjams šios problemos jau seniai išspręstos, pamirštos arba visai nepastebėtos. Straipsnis gali būti naudingas, jei staiga prireiks kam nors padėti šia tema. Straipsnyje brėžiamos paralelės su medžiaga iš įvairių Schildto, Stroustrupo, Okulovo knygų apie programavimą.

Tema apie ciklus pasirinkta todėl, kad įsisavinant programavimą nemažai žmonių iš jos yra pašalinami.

Ši technika skirta silpniems mokiniams. Paprastai stiprūs žmonės šioje temoje neužstringa ir jiems nereikia sugalvoti specialių technikų. Antrinis straipsnio tikslas yra perkelti šią techniką iš klasės „darbai visiems mokiniams, bet tik vienam mokytojui“ į klasę „darbai visiems mokiniams, visiems mokytojams“. Nepretenduoju į absoliutų originalumą. Jei jau naudojate panašią metodiką dėstydami šią temą, parašykite, kuo skiriasi jūsų versija. Jei nuspręsite jį naudoti, papasakokite, kaip sekėsi. Jei panaši technika aprašyta knygoje, parašykite pavadinimą.


Prie šios technikos dirbau 4 metus, individualiai mokiausi su įvairaus pasirengimo mokiniais. Iš viso yra apie penkiasdešimt studentų ir du tūkstančiai valandų. Iš pradžių mokiniai vis įstrigo prie šios temos ir išeidavo. Po kiekvieno mokinio buvo koreguojama metodika ir medžiaga. Per pastaruosius metus studentai nebeužstrigo šia tema, todėl nusprendžiau pasidalinti savo atradimais.

Kodėl tiek daug laiškų? Ciklas yra toks elementarus!

Kaip jau rašiau aukščiau, praktikuojantiems kūrėjams ir stipriems studentams kilpų sąvokos sudėtingumas gali būti neįvertintas. Pavyzdžiui, galite skaityti ilgą paskaitą, pamatyti linkčiojančias galvas ir protingas akis. Tačiau bandant išspręsti bet kokią problemą, prasideda stuporas ir nepaaiškinamos problemos. Po paskaitos studentai tikriausiai tik iš dalies suprato. Situaciją apsunkina tai, kad patys mokiniai negali išsakyti, kas yra jų kliedesys.
Vieną dieną supratau, kad mokiniai mano pavyzdžius suvokia kaip hieroglifus. Tai yra, kaip nedalomos teksto dalys, kuriose reikia pridėti kokią nors „stebuklingą“ raidę ir ji veiks.
Kartais pastebėjau, kad studentai galvoja, kad norint išspręsti konkrečią problemą, reikia kažkas kito dizainas, kurio aš dar neaprėpiau. Nors sprendimui reikėjo tik šiek tiek modifikuoti pavyzdį.

Taigi aš sugalvojau, kad dėmesys turėtų būti sutelktas ne į išraiškų sintaksę, o į pasikartojančio kodo pertvarkymo idėją naudojant kilpas. Kai mokiniai įsisavina šią idėją, bet kurią sintaksę galima patobulinti mažai praktikuojant.

Kas ir kodėl aš mokau?

Kadangi stojamųjų egzaminų nėra, į klases gali būti tiek stiprūs, tiek labai silpni mokiniai. Daugiau apie mano mokinius galite perskaityti straipsnyje Vakarinių kursų studentų portretas
Siekiau, kad visi norintys išmokti programuoti galėtų jo išmokti.
Mano pamokos vyksta individualiai ir mokinys už kiekvieną moka savo pinigus. Atrodytų, kad studentai optimizuos išlaidas ir reikalaus minimumo. Tačiau į užsiėmimus akis į akį pas gyvą mokytoją žmonės eina ne dėl pačių žinių, o dėl pasitikėjimo tuo, ką išmoko, dėl pažangos jausmo ir dėl eksperto (mokytojo) pritarimo. Jei mokiniai nejaučia mokymosi pažangos, jie išeis. Apskritai, klasės gali būti struktūrizuotos taip, kad mokiniai jaustų pažangą didindami pažįstamų struktūrų skaičių. Tai yra, iš pradžių mokomės kol detaliai, tada mokomės, tada darome kol, o dabar turime paruoštą tūkstantis ir vienos nakties kursą, kuriame du mėnesius mokosi vien ciklai, o pabaigoje - studentas, kuris rašė. standartinė diktuojama biblioteka. Tačiau norint išspręsti praktines problemas, reikia ne tik medžiagos išmanymo, bet ir savarankiškumo ją taikant bei ieškant naujos informacijos. Todėl tiesioginiuose kursuose, manau, teisingas principas yra dėstyti minimumą ir skatinti savarankiškai studijuoti niuansus ir susijusias temas. Kilpų temoje konstrukciją while laikau minimumu. Iš to galite suprasti principą. Žinodami principą, galite įvaldyti ir patys, ir daryti.

Norint, kad silpni mokiniai įsisavintų medžiagą, neužtenka apibūdinti sintaksės. Būtina pateikti paprastesnių, bet įvairesnių užduočių ir išsamiau aprašyti pavyzdžius. Galiausiai vystymosi greitį riboja mokinio gebėjimas transformuoti išraiškas ir ieškoti modelių. Protingiems studentams dauguma užduočių bus nuobodžios. Studijuojant su jais nereikia reikalauti išspręsti 100% problemų. Mano medžiagą galite peržiūrėti adresu mano github. Tiesa, saugykla panašesnė į burtininko grimuarą – niekas, išskyrus mane, nesupras, kas yra kur, o jei nepavyks patikrinti, gali išprotėti

Metodika orientuota į praktiką

Teorija paaiškinama naudojant problemos sprendimo pavyzdį. Programavimo pagrindų pamokoje, kurioje mokoma šakų ir kilpų, visą valandą naudingos paskaitos viena tema tiesiog neįmanoma. Sąvokai paaiškinti pakanka 15-20 minučių. Pagrindiniai sunkumai iškyla atliekant praktines užduotis.
Pradedantieji mokytojai per vieną paskaitą gali barškinti operatorius, šakas, kilpas ir matricas. Tačiau jų mokiniai susidurs su šios informacijos įsisavinimo problema.
Reikia ne tik papasakoti medžiagą, bet ir įsitikinti, kad klausytojai ją supranta.

Temos įsisavinimo faktą lemia tai, kaip mokinys susidoroja su savarankišku darbu.
Jei mokiniui be mokytojo pagalbos pavyko išspręsti temos uždavinį, vadinasi, tema įsisavinta. Siekiant užtikrinti savitikrą, kiekviena užduotis aprašyta lentelėje su testavimo scenarijais. Užduotys turi aiškią tvarką. Nerekomenduojama praleisti užduočių. Jei dabartinė užduotis yra per sunki, pereiti prie kitos yra nenaudinga. Tai dar sudėtingiau. Kad studentas galėtų įvaldyti esamą sudėtingą užduotį, jam paaiškinamos kelios technikos, naudojant pirmosios problemos pavyzdį. Tiesą sakant, visas temos turinys priklauso nuo metodų, kaip įveikti sunkumus. Ciklai yra daugiau šalutinis poveikis.

Pirmoji užduotis visada yra pavyzdys. Antrasis šiek tiek skiriasi ir atliekamas „savarankiškai“ iškart po pirmojo, prižiūrint mokytojui. Visos tolesnės užduotys yra skirtos atkreipti dėmesį į įvairias smulkmenas, kurios gali sukelti klaidingą nuomonę.

Pavyzdžio paaiškinimas yra dialogas, kuriame studentas turi atšaukti sklaidą ir kryžminį patvirtinimą, kad įsitikintų, jog jis įsisavino dalį medžiagos.

Būsiu banalus ir pasakysiu, kad pirmas pavyzdys temoje labai svarbus. Jei turite medžiagos plačiam savarankiškam darbui, pirmojo pavyzdžio praleidimus galima ištaisyti. Jei be pavyzdžio nieko kito nėra, greičiausiai studentas neįvaldys temos.

Kol ar už?

Vienas iš ginčytinų klausimų yra pavyzdžio konstrukcijos pasirinkimas: while arba for. Kartą vienas mano draugas kūrėjas, neturintis mokymo patirties, praleido valandą įtikinėdamas mane, kad „for“ ciklas yra lengviausiai suprantamas. Argumentai susivedė į „viskas jame aišku ir išdėstyta savo vietoje“. Tačiau pagrindinė sunkumų priežastis tikriems pradedantiesiems yra paties ciklo idėja, o ne jo rašymas. Jei žmogus nesupranta šios minties, jam bus sunku su sintaksė. Vos tik idėją įgyvendinus, kodo dizaino problemos išnyksta pačios.

Mano medžiagose kilpų tema seka šakojimosi tema. Išorinis if ir while panašumas leidžia nubrėžti tiesioginę analogiją: „kai antraštėje esanti sąlyga yra teisinga, tada kūnas vykdomas“. Vienintelis ciklo ypatumas yra tas, kad kūnas yra vykdomas daugybę kartų.

Antrasis mano argumentas yra tas, kad nors reikia mažiau formatuoti nei už. Mažiau formatavimo reiškia mažiau kvailų klaidų, kai trūksta kablelių ir skliaustų. Pradedantieji dar neišugdė pakankamai atidumo ir kruopštumo, kad automatiškai išvengtų sintaksės klaidų.
Trečiasis argumentas daugelyje gerų knygų paaiškinamas kaip pirmasis argumentas.

Jei mokinys gali lengvai transformuoti posakius, tuomet apie tai galite kalbėti pro šalį. Tada mokinys išsirinks tai, kas jam labiausiai patinka. Jei transformacijos sukelia sunkumų, geriau nekreipti dėmesio. Leiskite mokiniui pirmiausia viską išspręsti naudodamas laiką. Įvaldę kilpų temą, galite perrašyti sprendimus ir praktikuoti konvertavimą while į for.
Postcondition kilpos yra gana retas žvėris. Visiškai tam neskiriu laiko. Jei mokinys įvaldė modelių nustatymo ir išraiškų transformavimo idėjas, jis gali tai išsiaiškinti be mano pagalbos.

Pirmąjį pavyzdį demonstruodamas stipriems mokiniams atkreipiu dėmesį į tai, kad pirmajame pavyzdyje svarbu užfiksuoti ne tik sprendimą, bet ir visą veiksmų grandinę, atvedusią prie rezultato. Tingūs studentai gali nepaisyti rašymo ir nukopijuoti tik galutinį algoritmą. Jie turi būti įtikinti, kad vieną dieną jų laukia sunki užduotis. Norėdami tai išspręsti, turėsite atlikti veiksmus, kaip nurodyta šiame pavyzdyje. Štai kodėl svarbu įrašyti visus etapus. Toliau pateiktose problemose bus galima palikti tik galutinę sprendimo versiją.

Pagrindinė automatizavimo idėja yra ta, kad įprastus darbus žmogui patikime atlikti kompiuteriui. Vienas iš pagrindinių metodų yra rašymo kilpos. Jis naudojamas, kai programoje iš eilės įrašomi keli identiški pasikartojantys veiksmai.

Aiškus yra geriau nei numanomas

Gali atrodyti gera idėja tą pačią frazę rodyti kelis kartus atliekant pirmąją kilpos užduotį. Pavyzdžiui:

Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!
Hurray, tai veikia!

Ši parinktis yra bloga, nes skaitiklio reikšmė išvestyje nematoma. Tai pradedančiųjų problema. Nenuvertink jos. Iš pradžių ši užduotis buvo pirmoji, o išvesti skaičių seką didėjančia tvarka buvo antra. Reikėjo įvesti papildomus terminus „ciklas N kartų“ ir „ciklas nuo A iki B“, kurie iš esmės yra tas pats. Kad nesusidarytų nereikalingų objektų, nusprendžiau parodyti tik pavyzdį su skaičių serijos išvestimi. Nedaugeliui žmonių pavyksta be pasiruošimo išmokti laikyti skaitiklį galvoje ir modeliuoti programos elgesį galvoje. Kai kurie studentai pirmą kartą susiduria su mentaliniu modeliavimu ciklų tema.
Po tam tikros praktikos duodu užduotį kartoti tą patį tekstą išspręsti savarankiškai. Jei pirmiausia pateikiate matomą skaitiklį, o paskui nematomą, mokiniai turės mažiau problemų. Kartais užtenka užuominos „nerašyk skaitiklio ekrane“.

Kaip kiti tai paaiškina?

Daugumoje mokomosios medžiagos internete ciklo sintaksė pateikiama kaip „paskaitos“ dalis. Pvz., developer.mozilla.org (šiuo metu) kartu su while ciklu aprašyta keletas kitų konstrukcijų. Šiuo atveju šablonų pavidalu pateikiami tik patys dizainai. Jų paleidimo rezultatas aprašytas žodžiais, tačiau iliustracijos nėra. Mano nuomone, toks temos pristatymas tokių medžiagų naudingumą padaugina iš nulio. Studentas gali perrašyti kodą ir jį paleisti pats, tačiau jam vis tiek reikia palyginimo standarto. Kaip suprasti, kad pavyzdys perrašytas teisingai, jei nėra su kuo lyginti rezultato?
Kai pateikiamas tik šablonas, be pavyzdžio, mokiniui tampa dar sunkiau. Kaip suprasti, kad šablone kodo fragmentai įdedami teisingai? Galite pabandyti rašyti kažkaip, o tada paleisti. Bet jei nėra rezultato palyginimo standarto, paleidimas taip pat nepadės.

C++ kurso intuityviajame ciklo sintaksė yra palaidota trečiame 4 paskaitos puslapyje tema „operatoriai“. Aiškinant kilpų sintaksę ypatingas dėmesys skiriamas terminui „operatorius“. Terminas pateikiamas kaip faktų rinkinys, pavyzdžiui, „simbolis; tai yra teiginys“, „{} yra sudėtinis teiginys“, „ciklo turinys turi būti teiginys“. Man nepatinka toks požiūris, nes atrodo, kad po vienu terminu slepiami svarbūs santykiai. Išanalizuoti programos šaltinio kodą į šio lygio terminus turi kompiliatorių kūrėjai, norėdami įdiegti kalbos specifikaciją, bet ne studentai, kaip pirmasis apytikslis veiksmas. Programavimo naujokai retai būna pakankamai kruopštūs, kad skirtų tokį didelį dėmesį terminams. Tai retas žmogus, kuris pirmą kartą prisimena ir supranta naujus žodžius. Beveik niekas negali teisingai pritaikyti ką tik išmokto termino. Todėl mokiniai gauna daug klaidų, pvz., „Rašiau while(a<7);{, bet programa neveikia“.
Mano nuomone, pradžioje geriau pateikti konstrukcijos sintaksę iš karto su skliaustais. Variantas be skliaustų turėtų būti paaiškintas tik tuo atveju, jei mokiniui kyla konkretus klausimas: „kodėl nėra skliaustų ir tai veikia“.

2012 m. Okulovo knygoje „Programavimo pagrindai“ įvadas į kilpas pradedamas modeliu for, tada pateikiamos jo naudojimo rekomendacijos ir iškart pereinama prie eksperimentinės pamokos dalies. Suprantu, kad knyga parašyta mažumai labai gabių mokinių, kurie retai ateina į mano pamokas.

Populiariose knygose visada rašomas kodo fragmentų rezultatas. Pavyzdžiui, Shildto „Java 8. The Complete Guide“ 2015 m. leidimas. Pirmiausia pateikiamas šablonas, tada pavyzdinė programa ir iškart po jo – vykdymo rezultatas.

Kaip pavyzdį apsvarstykite ciklą, kuris veikia atvirkščiai
atgalinis skaičiavimas prasideda nuo 10 ir rodoma tiksliai 10 eilučių „priemonių“:

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

Paleidus, ši programa išveda dešimt „ciklų“ taip:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Šablono, pavyzdinės programos ir programos rezultato aprašymo metodas taip pat naudojamas knygoje „Javascript for Kids“ ir js kurse, esančiame w3schools.com. Tinklalapio formatas netgi leidžia šiam pavyzdžiui būti interaktyviam.

2016 m. išleista Stroustrup knyga Principai ir praktika naudojant C++ nuėjo dar toliau. Pirmiausia reikia paaiškinti, kokį rezultatą reikia gauti, o po to rodomas programos tekstas. Be to, jie ima ne tik atsitiktinę programą kaip pavyzdį, bet ir suteikia ekskursiją į istoriją. Tai padeda atkreipti į tai dėmesį: „Žiūrėk, tai ne šiaip nenaudingas tekstas. Matai kažką prasmingo“.

Kaip iteracijos pavyzdį apsvarstykite pirmąją programą, vykdomą saugomoje programos mašinoje (EDSAC). Ją 6 m. gegužės 1949 d. parašė Davidas Wheeleris Kembridžo universiteto kompiuterių laboratorijoje, Anglijoje. Ši programa apskaičiuoja ir atspausdina paprastą kvadratų sąrašą.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Čia kiekvienoje eilutėje yra skaičius, po kurio yra tabuliavimo simbolis („t“) ir to skaičiaus kvadratas. Šios programos C++ versija atrodo taip:

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

Įdomu tai, kad sintaksės modelis šioje knygoje neaprašytas. Stroustrup instruktoriaus vadove (vertimas) pabrėžia, kad gerbia savo mokinių sumanumą. Galbūt gebėjimas atpažinti modelį keliuose pavyzdžiuose laikomas tokio intelekto pasireiškimu.

Kaip aš pats aiškinu

Stroustrup požiūris: rezultato aprašymas, problemos sprendimas ir savarankiška studento analizė – atrodo apgalvočiausiai. Todėl nusprendžiau remtis juo kaip pagrindu, bet papasakoti naudodamas mažiau istorinį pavyzdį - užduotį sudaryti „turinį“. Jis sudaro atpažįstamą inkarą, kad galėtumėte pasakyti „prisiminti užduotį apie turinį“ ir kad mokiniai tiksliai tai prisimintų. Savo pavyzdyje bandžiau išvengti dar dviejų dažniausiai pasitaikančių klaidingų nuomonių. Toliau apie juos parašysiu plačiau.

Šioje užduotyje mes supažindinami su sudėtingų problemų sprendimo būdais. Pradinis sprendimas turi būti primityvus ir paprastas. Na, tada galite galvoti, kaip patobulinti šį sprendimą.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Mano pastebėjimais, požiūris „šablonas-pavyzdys-rezultatas“ įvairiuose deriniuose vis dar lemia tai, kad studentai ciklą suvokia kaip hieroglifą. Tai pasireiškė tuo, kad jie nesuprato, kodėl ten yra sąlyga rašyti, kaip pasirinkti tarp i++ ir i— ir kitų iš pažiūros akivaizdžių dalykų. Norint išvengti šių klaidingų nuomonių, kalbant apie ciklus reikėtų pabrėžti identiškų veiksmų kartojimo ir tik tada formalizavimo naudojant struktūrą prasmę. Todėl prieš pateikdami ciklo sintaksę, turite išspręsti problemą tiesiai. Primityvus turinio problemos sprendimas atrodo taip:

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

Kaip tai galima pagerinti?
Pakeiskite monotoniškus veiksmus ciklu.
Kokie veiksmai kartojami iš eilės be pakeitimų?
Šiame fragmente jų nėra. Tačiau komandos, rodančios žodį „Skyrius“ su skaičiumi, yra labai panašios viena į kitą.
Todėl kitas etapas – rasti skirtumą tarp fragmentų. Tik šioje užduotyje viskas aišku, tada bus kartojamos ne atskiros komandos, o 5 ar daugiau eilučių kodo blokai. Teks ieškoti ne tik komandų sąraše, bet ir išsišakojusiose arba kilpos konstrukcijose.
Pavyzdyje komandų skirtumas yra skaičiuje po žodžio „Chapter“.
Radę skirtumą, turite suprasti pokyčių modelį. Skirtingas fragmentas yra skaičius? Ar jis nuolat didėja ar mažėja? Kaip keičiasi skaičiaus vertė tarp dviejų komandų?
Pavyzdyje skaičius po žodžio „Skyrius“ didėja 1 žingsniu. Skirtumas randamas, atskleidžiamas modelis. Dabar skirtingą fragmentą galite pakeisti kintamuoju.
Tokį kintamąjį turite deklaruoti prieš pirmąjį pasikartojantį fragmentą. Toks kintamasis paprastai vadinamas I arba j arba kažkuo detalesniu. Jo pradinė vertė turi būti lygi pirmajai ekrane rodomai reikšmei. Pavyzdyje pirmoji reikšmė yra 1.
Kokia pradinė vertė turėtų būti paimta, kad būtų rodoma skaičių serija „100, 101, 102, 103, 104, 105“?
Pirmasis šios serijos skaičius yra 100.
Po kiekvienos išvesties komandos turite padidinti šio kintamojo reikšmę 1. Šis vienetas yra keitimo žingsnis.
Koks žingsnis bus skaičių serijoje „100, 102, 104, 106“?
2 veiksmas šioje eilutėje.
Pakeitus skirtingą fragmentą kintamuoju, kodas atrodys taip:

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

Kode pritaikę „išreikškite kintamojo modelį“ techniką, gausite kelias identiškų veiksmų grupes, kurios vyksta iš eilės. Dabar pasikartojančius veiksmus galima pakeisti kilpa.

Problemos, kai reikia naudoti kilpas, sprendimo seka susideda iš šių veiksmų:

  1. Išspręskite „priešais“ naudodami daug atskirų komandų
  2. Raskite modelį
  3. Išreikškite kintamojo modelį
  4. Dizainas kaip ciklas

Toliau įvedami nauji terminai, kad mokinys neatsidurtų situacijoje „Aš viską suprantu, bet negaliu pasakyti“:
— skaitiklis visada yra kintamasis, kurio reikia norint sekti žingsnių skaičių cikle. Paprastai sveikasis skaičius, lyginamas su apribojimu.
— skaitiklio žingsnis — skaitiklio pakeitimų modelio aprašymas.
- apribojimas - skaičius arba kintamasis, su kuriuo lyginamas skaitiklis, kad algoritmas būtų galutinis. Skaitiklio vertė pasikeičia, kad artėtų prie ribos.
— loop body — komandų, kurios bus kartojamos, rinkinys. Kai jie sako, kad „komanda parašyta kilpoje“, jie turi omenyje kūną.
— ciklo iteracija — vienkartinis ciklo korpuso vykdymas.
— ciklo sąlyga — loginė išraiška, nurodanti, ar bus vykdoma kita iteracija. (Čia gali kilti painiavos su išsišakojusiomis struktūromis)
Turite būti pasiruošę, kad iš pradžių studentai terminus naudos kitiems tikslams. Tai galioja ir stipriesiems, ir silpniesiems. Sukurti bendrą kalbą yra menas. Dabar parašysiu trumpai: jums reikia nustatyti užduotį „paryškinti kodo fragmentą su <term>“ ir teisingai naudoti šiuos terminus pokalbyje.
Po transformacijos kilpa gaunamas fragmentas:

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

Pagrindinis klaidingas supratimas

Populiarus klaidingas mokinių supratimas yra tai, kad jie atlieka veiksmus, kuriuos reikia atlikti tik vieną kartą. Pavyzdžiui taip:

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

Mokiniai nuolat susiduria su šia problema tiek pradžioje, tiek sudėtingesnių problemų atveju.
Pagrindinis patarimas šiuo atveju:

Kiek kartų turėtumėte kartoti komandą: vieną ar daug kartų?

Žodžių „Įvadas“ ir „Išvada“ spausdinimo bei kintamojo i deklaravimo ir inicijavimo komandos nėra panašios į kitus pasikartojančius veiksmus. Jie vykdomi tik vieną kartą, o tai reiškia, kad jie turi būti parašyti už ciklo korpuso ribų.

Visi trys sprendimo etapai turėtų likti kode, kad vėliau, iškilus sunkumams, galėtumėte į juos kreiptis. Pakanka pakomentuoti pirmus du variantus, kad jie netrukdytų.
Mokinio dėmesį reikėtų atkreipti į šiuos faktus:
— Kilpoje paprastai lyginami skaitiklis ir riba. Skaitiklis gali keistis kilpos korpuse, bet ne riba. Norėdami sulaužyti šią taisyklę, turite suformuluoti įtikinamų priežasčių.
— Žodžių „Įvadas“ ir „Išvada“ rodymo komandos yra už kilpos dalies. Turime juos atlikti 1 kartą. „Įvadas“ - prieš kartojant veiksmus, „Išvada“ - po.
Tvirtinant šią temą, įsisavinant kitas, taip pat sprendžiant sunkumus, net ir stipriems studentams naudinga užduoti klausimą: „Kiek kartų reikia atlikti šį veiksmą? Vienas ar daug?

Papildomų įgūdžių ugdymas

Studijų ciklų procese studentai taip pat ugdo problemų diagnozavimo ir sprendimo įgūdžius. Norėdami atlikti diagnostiką, studentas turi pateikti norimą rezultatą ir palyginti jį su tikruoju rezultatu. Koregavimo veiksmai priklauso nuo jų skirtumo.
Kadangi šiame etape studentai dar mažai žino apie „geidžiamą“ rezultatą, jie gali sutelkti dėmesį į testo duomenis. Paprastai niekas šiame etape dar nesupranta, kas gali nutikti ir kaip su tuo susidoroti. Todėl į sąsiuvinį rašau tipinių problemų aprašymą ir kelis jų sprendimo būdus. Išsirinkti tinkamiausią – paties mokinio užduotis.
Įrašas reikalingas norint paklausti „ar atsitiko tai, ko tikėtasi?“, „Kuri iš šių situacijų atsitiko dabar?“, „Ar pritaikytas sprendimas padėjo?“

  1. Veiksmų skaičius yra 1 mažiau arba daugiau nei tikėtasi. Sprendimai:
    - padidinkite pradinę skaitiklio vertę 1.
    — griežto palyginimo operatorius (< arba >) pakeisti negriežtu (<= arba >=).
    — pakeisti ribinę vertę į 1.
  2. Veiksmai kilpoje atliekami be sustojimo, neribotą laiką. Sprendimai:
    — pridėkite skaitiklio keitimo komandą, jei jos trūksta.
    — pataisykite skaitiklio keitimo komandą, kad jos reikšmė būtų arčiau ribos.
    — pašalinkite apribojimo keitimo komandą, jei ji yra ciklo turinyje.
  3. Veiksmų cikle yra daugiau nei 1 mažiau arba daugiau nei tikėtasi. Veiksmas kilpoje nebuvo atliktas net vieną kartą. Pirmiausia turite sužinoti tikrąsias kintamųjų vertes prieš pat ciklo pradžią. Sprendimai:
    — pakeisti pradinę apribojimo reikšmę
    — pakeisti pradinę skaitiklio vertę

3 problema paprastai apima netinkamo kintamojo naudojimą arba skaitiklio nenustatymą į nulį.

Po šio paaiškinimo studentas vis dar gali turėti įvairių klaidingų nuomonių apie kilpų veikimą.
Norėdami išsklaidyti dažniausiai pasitaikančias problemas, duodu jums šias užduotis:

  1. Kuriame ribą, pradinę skaitiklio vertę arba skaitiklio žingsnį įveda vartotojas.
  2. Kurioje skaitiklio reikšmė turi būti naudojama kurioje nors aritmetinėje išraiškoje. Radikalio išraiškoje arba vardiklyje patartina naudoti skaitiklį, kad skirtumas būtų netiesinis.
  3. Kai skaitiklio reikšmė nerodoma ekrane, kol ciklas veikia. Pavyzdžiui, parodyti reikiamą skaičių identiškų teksto fragmentų arba nupiešti figūrą vėžlio grafika.
  4. Kuriame pirmiausia turite atlikti kelis pasikartojančius veiksmus, o paskui kitus.
  5. Kuriame reikia atlikti kitus veiksmus prieš ir po kartojimo

Kiekvienai užduočiai reikia pateikti testo duomenis ir laukiamą rezultatą.

Norėdami suprasti, kaip greitai galite judėti, turite perskaityti šių problemų sąlygas ir paklausti: „kuo jie skiriasi nuo pavyzdžio?“, „Ką reikia pakeisti pavyzdyje, kad jas išspręstumėte? Jei mokinys atsako prasmingai, tai bent vieną tegul jis išsprendžia klasėje, o likusius – namuose savarankiškai. Jei sprendimas sėkmingas, galime pradėti aiškinti sąlygas kilpų viduje.
Jei kyla problemų sprendžiant problemas savarankiškai, turite viską atlikti klasėje. Kad problemos sprendimas neprimintų pelėdos piešimo, pirmiausia rekomenduoju problemą išspręsti neuniversaliu būdu. Tai yra, kad sprendimas išlaikytų pirmąjį testą ir nenaudotų kilpos konstrukcijos. Na, tada pritaikykite transformacijas, kad pasiektumėte sprendimo universalumą.

Kilpos ir šakos

Mano nuomone, temą „ciklai šakose“ naudinga pateikti atskirai. Kad vėliau pamatytumėte skirtumą tarp patikrinimo kelis kartus ir vieną kartą.
Konsolidavimo užduotys bus susijusios su skaičių nuo A iki B išvedimu, kuriuos įveda vartotojas:
- visada didėjančia tvarka.
- didėjanti arba mažėjanti, atsižvelgiant į A ir B reikšmes.

Temą „išsišakojimas kilpose“ reikėtų perkelti tik tada, kai mokinys įvaldo metodus: „schemos pakeitimas kintamuoju“ ir „pasikartojančių veiksmų pakeitimas ciklu“.
Pagrindinė šakų naudojimo kilpose priežastis yra modelio anomalijos. Viduryje jis nutrūksta priklausomai nuo pradinių duomenų.
Tiems studentams, kurie geba ieškoti sprendimo derindami nesudėtingas technikas, pakanka pasakyti „šakojimą galima rašyti kilpų viduje“ ir duoti uždavinį „pavyzdžiui“ visiškai išspręsti savarankiškai.
Užduoties pavyzdys:

Vartotojas įveda skaičių X. Pateikite skaičius nuo 0 iki 9 stulpelyje ir priešais skaičių, lygų X, įdėkite ženklą „+“.

Jei buvo įvestas 00+
1
2
3
4
5
6
7
8
9

Jei buvo įvestas 60
1
2
3
4
5
6+
7
8
9

Jei buvo įvestas 90
1
2
3
4
5
6
7
8
9+

Jei buvo įvestas 7770
1
2
3
4
5
6
7
8
9

Jei trumpo paaiškinimo neužtenka norint parašyti su kilpa, tuomet reikia pasiekti universalų tos pačios problemos sprendimą be kilpos.
Gausite vieną iš dviejų variantų:
Norima

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

Galima

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

Panašią užduotį duodu iš anksto, studijuodamas šakojimo temą.
Jei studentas sugalvoja „galimą“ variantą, turite jam pasakyti, kad gali būti daug tos pačios problemos sprendimų. Tačiau jie skiriasi atsparumu reikalavimų pokyčiams. Užduokite klausimą: „Kiek kodo vietų reikėtų pataisyti, jei turėčiau pridėti kitą numerį? „Galima“ versijoje turėsite pridėti dar vieną šaką ir pridėti naują numerį dar 10 vietų. Į „pageidaujamą“ pakanka pridėti tik vieną šaką.
Nustatykite užduotį atkurti „norimą“ parinktį, tada suraskite kode šabloną, pakeiskite kintamąjį ir parašykite kilpą.
Jei turite idėją, kaip kitaip išspręsti šią problemą be kilpos, parašykite komentaruose.

Kilpos kilpose

Šioje temoje reikia atkreipti dėmesį į šiuos dalykus:
— vidinės ir išorinės kilpos skaitikliai turi būti skirtingų kintamųjų.
— vidinės kilpos skaitiklį reikia daug kartų nustatyti iš naujo (ty išorinės kilpos korpuse).
— teksto išvesties užduotyse negalite iš pradžių parašyti vienos raidės keliose eilutėse, o paskui – antrosios. Pirmiausia turite atspausdinti visas pirmosios eilutės raides, tada visas antrosios eilutės raides ir pan.

Kilpų kilpose temą geriausia pradėti aiškinant, kaip svarbu atstatyti skaitiklį į nulį.
Užduoties pavyzdys:

Vartotojas įveda du skaičius: R ir T. Išspausdinkite dvi „#“ simbolių eilutes. Pirmoje eilutėje turi būti R simboliai. Antroje eilutėje yra T gabalai. Jei kuris nors skaičius yra neigiamas, parodykite klaidos pranešimą.

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

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

R = -1, T = 6R reikšmė turi būti ne neigiama

R = 6, T = -2T reikšmė turi būti neneigiama

Akivaizdu, kad ši problema taip pat turi bent du sprendimus.
Norima

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

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

Skirtumas tas, kad „galimame“ sprendime antrajai eilutei išvesti buvo naudojamas antras kintamasis. Turėtumėte primygtinai reikalauti, kad abiejose kilpose būtų naudojamas tas pats kintamasis. Šį apribojimą galima pateisinti tuo, kad sprendimas su vienu skaitikliu dviem ciklams bus termino „skaitiklio atstatymas“ iliustracija. Suprasti šį terminą būtina sprendžiant šias problemas. Kaip kompromisą galite išsaugoti abu problemos sprendimus.

Įprasta problema naudojant vieną skaitiklio kintamąjį dviem kilpoms atrodo taip:
R = 5, T = 11#####
######

Simbolių skaičius antroje eilutėje neatitinka T reikšmės. Jei jums reikia pagalbos sprendžiant šią problemą, turite pažvelgti į pastabas apie tipines kilpų problemas. Tai simptomas #3. Jis diagnozuojamas, jei pridedate skaitiklio vertės išvestį prieš pat antrąjį ciklą. Ištaisyta iš naujo nustatant. Bet geriau to nesakyti iš karto. Mokinys turi pabandyti suformuluoti bent vieną hipotezę.

Žinoma, yra ir kitas sprendimas. Bet aš niekada to nemačiau tarp studentų. Studijų ciklų etape istorija apie tai atitrauks dėmesį. Galite prie jo grįžti vėliau, kai sužinosite apie eilučių funkcijas.
Galimas #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));

Kita reikalinga užduotis:

Rodyti skaičius nuo 0 iki 9. Kiekvienas skaičius turi būti savo eilutėje. Skaičių skaičius eilutėje (W) įvedamas klaviatūra.

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

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

Jei studentas įvaldė kintamojo pakeitimo techniką, jis susidoros gana greitai. Galima problema vėl bus iš naujo nustatant kintamąjį. Jei negalite susidoroti su transformacija, vadinasi, jūs skubėjote ir turite išspręsti paprastesnes problemas.

Ačiū už dėmesį. Pamėgti ir prenumeruoti kanalą.

PS Jei tekste radote rašybos klaidų ar klaidų, praneškite man. Tai galima padaryti pasirinkus dalį teksto ir paspaudus „⌘ + Enter“ „Mac“ sistemoje ir „Ctrl / Enter“ klasikinėje klaviatūroje arba siunčiant asmeninius pranešimus. Jei šių parinkčių nėra, apie klaidas parašykite komentaruose. Ačiū!

Apklausoje gali dalyvauti tik registruoti vartotojai. Prisijungti, Prašau.

Apklausa skaitytojams be karmos

  • 20,0%Mokau profesionaliai, +12

  • 10,0%Dėstau profesionaliai, -11

  • 70,0%Nemoku, +17

  • 0,0%Aš nemoku, -10

  • 0,0%Kita0

Balsavo 10 vartotojų. 5 vartotojai susilaikė.

Šaltinis: www.habr.com

Добавить комментарий