Kuinka opettaa voittamaan vaikeudet ja samalla kirjoittamaan syklejä

Huolimatta siitä, että puhumme yhdestä perusaiheesta, tämä artikkeli on kirjoitettu kokeneille ammattilaisille. Tavoitteena on näyttää, mitä väärinkäsityksiä aloittelijalla on ohjelmoinnissa. Harjoitteleville kehittäjille nämä ongelmat ovat jo pitkään ratkaistu, unohdettu tai niitä ei ole huomattu ollenkaan. Artikkeli voi olla hyödyllinen, jos joudut yhtäkkiä auttamaan jotakuta tämän aiheen kanssa. Artikkeli vetää yhtäläisyyksiä Schildtin, Stroustrupin, Okulovin ohjelmointia käsittelevien kirjojen aineistoon.

Aihe syklistä valittiin siksi, että melko moni jää sen ulkopuolelle ohjelmoinnin hallitsemisessa.

Tämä tekniikka on suunniteltu heikoille opiskelijoille. Vahvat ihmiset eivät pääsääntöisesti juutu tähän aiheeseen, eikä heille tarvitse keksiä erityisiä tekniikoita. Artikkelin toissijainen tavoite on siirtää tämä tekniikka "toimii kaikille opiskelijoille, mutta vain yhdelle opettajalle" -luokasta "toimii kaikille opiskelijoille, kaikille opettajille" -luokkaan. En väitä absoluuttista omaperäisyyttä. Jos käytät jo samanlaista menetelmää tämän aiheen opettamiseen, kirjoita, miten versiosi eroaa. Jos päätät käyttää sitä, kerro meille kuinka se meni. Jos vastaava tekniikka on kuvattu kirjassa, kirjoita nimi.


Työskentelin tämän tekniikan parissa 4 vuotta ja opiskelin yksilöllisesti eri koulutustasojen opiskelijoiden kanssa. Yhteensä oppilaita on noin viisikymmentä ja oppitunteja kaksi tuhatta. Aluksi oppilaat jäivät aina kiinni tähän aiheeseen ja lähtivät. Jokaisen opiskelijan jälkeen menetelmät ja materiaalit mukautettiin. Kuluneen vuoden aikana opiskelijat eivät ole enää juuttuneet tähän aiheeseen, joten päätin jakaa havaintoni.

Miksi niin monta kirjainta? Pyörät ovat niin alkeellisia!

Kuten edellä kirjoitin, harjoitteleville kehittäjille ja vahvoille opiskelijoille silmukoiden käsitteen monimutkaisuus voidaan aliarvioida. Voit esimerkiksi pitää pitkän luennon, nähdä nyökkääviä päitä ja älykkäitä silmiä. Mutta kun yritetään ratkaista mitä tahansa ongelmaa, alkaa stupor ja selittämättömät ongelmat. Luennon jälkeen opiskelijoilla oli luultavasti vain osittainen ymmärrys. Tilannetta pahentaa se, että opiskelijat itse eivät voi ilmaista, mikä heidän harhalunsa tarkalleen on.
Eräänä päivänä tajusin, että opiskelijat pitivät esimerkkini hieroglyfeinä. Eli kuin jakamattomia tekstinpätkiä, joihin sinun on lisättävä jokin "taika" kirjain ja se toimii.
Joskus huomasin, että opiskelijat ajattelevat, että tarvitset tietyn ongelman ratkaisemiseksi jotain muuta malli, jota en ole vielä käsitellyt. Vaikka ratkaisu vaati vain pientä muutosta esimerkkiin.

Joten keksin ajatuksen, että painopisteen ei pitäisi olla ilmaisujen syntaksissa, vaan ajatuksessa toistuvan koodin uudelleenmuodostamisesta silmukoiden avulla. Kun opiskelijat ovat oppineet tämän idean, mitä tahansa syntaksia voidaan parantaa pienellä harjoittelulla.

Ketä ja miksi opetan?

Koska pääsykokeita ei ole, luokissa voi olla sekä vahvoja että erittäin heikkoja opiskelijoita. Voit lukea lisää opiskelijoistani artikkelista Iltakurssin opiskelijoiden muotokuva
Pyrin varmistamaan, että kaikki, jotka haluavat oppia ohjelmoinnin, voivat oppia sen.
Tuntini pidetään yksilöllisesti ja opiskelija maksaa jokaisesta omat rahansa. Vaikuttaa siltä, ​​​​että opiskelijat optimoivat kustannukset ja vaativat minimiä. Ihmiset menevät kuitenkin kasvokkain elävän opettajan kanssa ei itse tiedon vuoksi, vaan oppimaansa luottamuksen, edistymisen tunteen ja asiantuntijan (opettajan) hyväksynnän vuoksi. Jos opiskelijat eivät tunne edistymistä oppimisessaan, he lähtevät. Yleisesti ottaen tunnit voidaan jäsentää niin, että oppilaat kokevat edistyvänsä tuttujen rakenteiden määrän lisäämisessä. Eli ensin opiskellaan yksityiskohtaisesti, sitten opiskellaan, sitten tehdään niin kauan, ja nyt meillä on valmiina tuhannen ja yhden yön kurssi, jossa kaksi kuukautta opiskellaan pelkästään syklejä ja lopussa - opiskelija, joka kirjoitti tavallinen kirjasto sanelussa. Käytännön ongelmien ratkaisemiseksi tarvitset kuitenkin materiaalin tuntemuksen lisäksi itsenäisyyttä sen soveltamisessa ja uuden tiedon etsimisessä. Siksi kasvokkain suoritetuissa kursseissa mielestäni oikea periaate on opettaa minimi ja rohkaista itsenäiseen opiskeluun vivahteita ja niihin liittyviä aiheita. Silmukoiden aiheessa pidän while-konstruktia miniminä. Siitä voi ymmärtää periaatteen. Kun tiedät periaatteen, voit hallita sekä itseäsi että tehdä samalla.

Jotta heikot opiskelijat hallitsevat materiaalin, syntaksin kuvaaminen ei riitä. On tarpeen antaa yksinkertaisempia, mutta monipuolisempia tehtäviä ja kuvata esimerkkejä yksityiskohtaisemmin. Viime kädessä kehityksen nopeutta rajoittaa opiskelijan kyky muuttaa ilmaisuja ja etsiä malleja. Älykkäille opiskelijoille useimmat tehtävät ovat tylsiä. Kun opiskelet heidän kanssaan, sinun ei tarvitse vaatia ratkaisemaan 100% ongelmista. Materiaalini on luettavissa osoitteessa minun github. Totta, arkisto on enemmän kuin velhojen grimoire - kukaan muu kuin minä ei ymmärrä missä on, ja jos epäonnistut tarkastuksessa, voit tulla hulluksi

Metodologia on käytännönläheistä

Teoria selitetään ongelmanratkaisun esimerkillä. Ohjelmoinnin perusteiden tunnilla, jossa opetetaan haaroja ja silmukoita, ei yksinkertaisesti ole mahdollista pitää hyödyllistä luentaa yhdestä aiheesta kokonaisen tunnin ajan. 15-20 minuuttia riittää käsitteen selittämiseen. Suurimmat vaikeudet syntyvät käytännön tehtävien suorittamisessa.
Aloittelevat opettajat voivat räpäyttää operaattoreita, haaroja, silmukoita ja taulukoita yhdessä luennossa. Mutta heidän oppilaansa kohtaavat tämän tiedon omaksumisen ongelman.
On välttämätöntä paitsi kertoa materiaalia, myös varmistaa, että kuulijat ymmärtävät sen.

Aiheen hallitsemisen määrää se, miten opiskelija selviytyy itsenäisestä työstä.
Jos opiskelija onnistui ratkaisemaan ongelman aiheesta ilman opettajan apua, niin aihe on hallittu. Itsetestauksen varmistamiseksi jokainen tehtävä on kuvattu taulukossa, jossa on testiskenaariot. Tehtävillä on selkeä järjestys. Tehtävien ohittamista ei suositella. Jos nykyinen tehtävä on liian vaikea, siirtyminen seuraavaan on hyödytöntä. Se on vielä monimutkaisempi. Jotta opiskelija voi hallita nykyisen monimutkaisen tehtävän, hänelle selitetään useita tekniikoita ensimmäisen ongelman esimerkin avulla. Itse asiassa koko aiheen sisältö laskeutuu tekniikoihin vaikeuksien voittamiseksi. Syklit ovat enemmän sivuvaikutuksia.

Ensimmäinen tehtävä on aina esimerkki. Toinen eroaa hieman ja suoritetaan "itsenäisesti" heti ensimmäisen jälkeen opettajan valvonnassa. Kaikki myöhemmät tehtävät on tarkoitettu kiinnittämään huomiota erilaisiin pieniin asioihin, jotka voivat aiheuttaa väärinkäsityksiä.

Esimerkin selitys on dialogi, jossa opiskelijan täytyy kutsua takaisin levitys ja ristiinvalidointi varmistaakseen, että hän on hallinnut osan materiaalista.

Olen banaali ja sanon, että ensimmäinen esimerkki aiheesta on erittäin tärkeä. Jos sinulla on materiaalia laajaan itsenäiseen työhön, voidaan ensimmäisen esimerkin puutteet korjata. Jos esimerkin lisäksi ei ole muuta, niin opiskelija ei todennäköisesti hallitse aihetta.

Sillä aikaa vai ajaksi?

Yksi kiistanalaisia ​​kysymyksiä on esimerkin rakenteen valinta: while tai for. Kerran harjoitteleva kehittäjäystäväni, jolla ei ollut opetuskokemusta, vietti tunnin vakuuttaakseen minut siitä, että for-silmukka oli helpoin ymmärtää. Argumentit kiteytyvät siihen, että "kaikki siinä on selvää ja asetettu paikalleen". Todellisten aloittelijoiden vaikeuksien perimmäinen syy on kuitenkin ajatus itse syklistä, ei sen kirjoittaminen. Jos henkilö ei ymmärrä tätä ideaa, hänellä on vaikeuksia syntaksin kanssa. Heti kun idea toteutuu, koodisuunnittelun ongelmat katoavat itsestään.

Materiaaleissani silmukoiden teema seuraa haaroittumisen teemaa. Jos ja while ulkoinen samankaltaisuus mahdollistaa suoran analogian: "kun otsikon ehto on tosi, niin runko suoritetaan." Ainoa syklin erikoisuus on, että keho suoritetaan monta kertaa.

Toinen väitteeni on, että vaikka vaatii vähemmän muotoilua kuin for. Vähemmän muotoilua tarkoittaa vähemmän typeriä virheitä puuttuvilla pilkuilla ja suluilla. Aloittelijat eivät ole vielä kehittäneet tarpeeksi tarkkaavaisuutta ja tarkkuutta välttääkseen automaattisesti syntaksivirheet.
Kolmas väite on selitetty monissa hyvissä kirjoissa ensimmäisenä argumenttina.

Jos opiskelija pystyy helposti muuttamaan ilmaisuja, voit puhua niistä ohimennen. Sitten opiskelija valitsee, mistä hän pitää eniten. Jos muutokset aiheuttavat vaikeuksia, on parempi olla häiritsemättä huomiota. Anna oppilaan ensin ratkaista kaikki käyttämällä while-toimintoa. Kun olet oppinut silmukoista, voit kirjoittaa ratkaisut uudelleen harjoitellaksesi muuntamista while muotoon for.
Postcondition-silmukat ovat melko harvinainen peto. En käytä siihen yhtään aikaa. Jos opiskelija on hallinnut ideat kuvioiden tunnistamisesta ja ilmaisujen muuntamisesta, hän voi selvittää sen ilman apuani.

Esitellessäni ensimmäistä esimerkkiä vahvoille opiskelijoille kiinnitän huomiota siihen, että ensimmäisessä esimerkissä on tärkeää tallentaa ratkaisun lisäksi myös koko tulokseen johtanut toimintaketju. Laiskot opiskelijat voivat jättää kirjoittamisen huomioimatta ja kopioida vain lopullisen algoritmin. Heidän on oltava vakuuttuneita siitä, että jonain päivänä heidän tielleen tulee vaikea tehtävä. Sen ratkaisemiseksi sinun on noudatettava tässä esimerkissä olevia vaiheita. Siksi on tärkeää tallentaa kaikki vaiheet. Seuraavissa ongelmissa on mahdollista jättää vain ratkaisun lopullinen versio.

Automaation perusideana on, että uskomme tietokoneen tekemään rutiinityöt ihmisen puolesta. Yksi perustekniikoista on silmukoiden kirjoittaminen. Sitä käytetään, kun ohjelmaan kirjoitetaan useita identtisiä toistuvia toimintoja peräkkäin.

Eksplisiitti on parempi kuin implisiittinen

Saattaa tuntua hyvältä idealta näyttää sama lause useita kertoja ensimmäisessä silmukkatehtävässä. Esimerkiksi:

Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!
Hurraa, se toimii!

Tämä vaihtoehto on huono, koska laskurin arvo ei näy lähdössä. Tämä on ongelma aloittelijoille. Älä aliarvioi häntä. Aluksi tämä tehtävä oli ensimmäinen, ja numerosarjan johtaminen nousevassa järjestyksessä oli toinen. Oli tarpeen ottaa käyttöön lisätermejä "kierto N kertaa" ja "kierto A:sta B:hen", jotka ovat olennaisesti sama asia. Jotta en luoisi tarpeettomia kokonaisuuksia, päätin näyttää vain esimerkin numerosarjan ulostulolla. Harva onnistuu oppimaan pitämään laskuria päässään ja mallintamaan ohjelman käyttäytymistä päässään ilman valmistautumista. Jotkut opiskelijat kohtaavat ensimmäisen kerran mielen mallinnuksen syklien aiheesta.
Harjoittelun jälkeen annan tehtäväksi toistaa sama teksti ratkaistavaksi itsenäisesti. Jos annat ensin näkyvän laskurin ja sitten näkymätön, opiskelijoilla on vähemmän ongelmia. Joskus vihje "älä kirjoita laskuria näytölle" riittää.

Miten muut sen selittää?

Useimmissa Internetin koulutusmateriaaleissa syklin syntaksi annetaan osana ”luetoa”. Esimerkiksi osoitteessa developer.mozilla.org (tällä hetkellä) useita muita rakenteita kuvataan while-silmukan ohella. Tässä tapauksessa vain itse mallit annetaan mallien muodossa. Niiden käynnistämisen tulos on kuvattu sanoin, mutta siinä ei ole kuvaa. Mielestäni tällainen aiheen esitys moninkertaistaa tällaisten materiaalien hyödyllisyyden nollalla. Opiskelija voi kirjoittaa koodin uudelleen ja suorittaa sen itse, mutta hän tarvitsee silti standardin vertailua varten. Kuinka voit ymmärtää, että esimerkki on kirjoitettu oikein, jos tulosta ei voi verrata mihinkään?
Kun annetaan vain malli, ilman esimerkkiä, siitä tulee opiskelijalle vielä vaikeampaa. Kuinka ymmärtää, että koodinpalat on sijoitettu oikein malliin? Voit yrittää kirjoittaa jotenkinja juokse sitten. Mutta jos tuloksen vertailua varten ei ole standardia, käynnistäminen ei myöskään auta.

Intuitiivisen C++-kurssilla silmukkasyntaksi on haudattu luennon 4 kolmannelle sivulle aiheesta "operaattorit". Silmukoiden syntaksia selitettäessä korostetaan erityisesti termiä "operaattori". Termi esitetään joukkona tosiasioita, kuten "symboli; tämä on lause, "{} on yhdistelmälause", "silmukan rungon on oltava lause". En pidä tästä lähestymistavasta, koska se näyttää piilottavan tärkeitä suhteita yhden termin taakse. Kääntäjän kehittäjät tarvitsevat ohjelman lähdekoodin jäsentämistä termeiksi tällä tasolla kielimäärityksen toteuttamiseksi, mutta eivät opiskelijoiden ensimmäisenä likiarvona. Ohjelmoinnin uudet tulokkaat ovat harvoin tarpeeksi tarkkoja kiinnittämään termeihin niin tarkkaa huomiota. Se on harvinainen henkilö, joka muistaa ja ymmärtää uudet sanat ensimmäistä kertaa. Melkein kukaan ei osaa soveltaa juuri oppimaansa termiä oikein. Siksi oppilaat saavat paljon virheitä, kuten "Kirjoitin while(a<7);{, mutta ohjelma ei toimi."
Mielestäni alussa on parempi antaa rakenteen syntaksi välittömästi suluilla. Vaihtoehto ilman sulkeita tulee selittää vain, jos opiskelijalla on erityinen kysymys: "miksi ei ole sulkuja ja se toimii."

Okulovin vuoden 2012 kirjassa "Ohjelmoinnin perusteet" silmukoiden johdatus alkaa for-kuviolla, antaa sitten suosituksia sen käyttöön ja siirtyy heti oppitunnin kokeelliseen osaan. Ymmärrän, että kirja on kirjoitettu sille vähemmistölle erittäin kykeneviä opiskelijoita, jotka tulevat harvoin luokilleni.

Suosituissa kirjoissa koodinpätkien tulos kirjoitetaan aina. Esimerkiksi Shildtin "Java 8. The Complete Guide" 2015 -versio. Ensin annetaan malli, sitten esimerkkiohjelma ja heti sen jälkeen - suorituksen tulos.

Harkitse esimerkkinä while-silmukkaa, joka toimii päinvastoin
lähtölaskenta alkaa 10:stä ja näytössä näkyy tarkalleen 10 riviä "mittauksia":

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

Kun tämä ohjelma on suoritettu, se tuottaa kymmenen "jaksoa" seuraavasti:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Mallin, esimerkkiohjelman ja ohjelman tuloksen kuvaamista lähestymistapaa käytetään myös kirjassa “Javascript for Kids” ja js-kurssilla osoitteessa w3schools.com. Web-sivun muoto mahdollistaa jopa tämän esimerkin interaktiivisuuden.

Stroustrupin 2016 kirja Principles and Practice Using C++ meni vielä pidemmälle. Ensimmäinen askel on selittää, mikä tulos pitäisi saada, ja sen jälkeen näytetään ohjelman teksti. Lisäksi he eivät ota vain satunnaista ohjelmaa esimerkkinä, vaan antavat retken historiaan. Tämä auttaa kiinnittämään siihen huomion: ”Katso, tämä ei ole vain turhaa tekstiä. Näet jotain merkityksellistä."

Esimerkkinä iteraatiosta harkitse ensimmäistä tallennetulle ohjelmakoneelle (EDSAC) suoritettua ohjelmaa. Sen kirjoitti David Wheeler Cambridgen yliopiston tietokonelaboratoriossa Englannissa 6. toukokuuta 1949. Tämä ohjelma laskee ja tulostaa yksinkertaisen neliöluettelon.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Tässä jokainen rivi sisältää luvun, jota seuraa sarkainmerkki ('t') ja tämän luvun neliö. Tämän ohjelman C++-versio näyttää tältä:

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

Mielenkiintoista on, että syntaksimallia ei kuvata tässä kirjassa. Stroustrup ohjaajan käsikirjassa (käännös) korostaa, että se kunnioittaa opiskelijoidensa älykkyyttä. Ehkä kykyä tunnistaa kuvio useissa esimerkeissä pidetään tällaisen älykkyyden ilmentymänä.

Kuten itse selitän

Stroustrupin lähestymistapa: tuloksen kuvaaminen, sitten ongelman ratkaiseminen ja sitten opiskelijan itsenäinen analyysi - vaikuttaa harkituimmalta. Siksi päätin ottaa sen perustana, mutta kerron sen vähemmän historiallisella esimerkillä - tehtävänä johtaa "sisällysluettelo". Se muodostaa tunnistettavan ankkurin, jotta voit sitten sanoa "muista sisällysluettelon tehtävä" ja jotta opiskelijat muistavat tämän tarkasti. Esimerkissäni yritin estää vielä kaksi yleisintä väärinkäsitystä. Seuraavaksi kirjoitan niistä tarkemmin.

Tässä tehtävässä tutustutaan monimutkaisten ongelmien ratkaisutekniikoihin. Alkuperäinen päätös on tehtävä primitiiviseksi ja yksinkertaiseksi. No, sitten voit miettiä, kuinka parantaa tätä ratkaisua.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Havaintojeni mukaan "malli-esimerkki-tulos" -lähestymistapa eri yhdistelmissä johtaa edelleen siihen, että opiskelijat näkevät syklin hieroglyfinä. Tämä ilmeni siinä, että he eivät ymmärtäneet, miksi sinne on kirjoitettava ehto, miten valita i++:n ja i:n välillä ja muita ilmeisen ilmeisiä asioita. Näiden väärinkäsitysten välttämiseksi sykleistä puhumisen tulisi korostaa identtisten toimintojen toistamisen merkitystä ja vasta sitten niiden formalisointia rakenteen avulla. Siksi, ennen kuin annat silmukan syntaksin, sinun on ratkaistava ongelma suoraan. Primitiivinen ratkaisu sisällysluetteloongelmaan näyttää tältä:

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

Miten sitä voidaan parantaa?
Korvaa yksitoikkoiset toiminnot syklillä.
Mitä toimia toistetaan peräkkäin ilman muutoksia?
Tässä fragmentissa niitä ei ole. Komennot sanan ”Luku” näyttämiseksi numerolla ovat kuitenkin hyvin samankaltaisia.
Siksi seuraava vaihe on löytää ero fragmenttien välillä. Vain tässä tehtävässä kaikki on ilmeistä, silloin ei toisteta yksittäisiä komentoja, vaan 5 riviä tai enemmän koodilohkoja. Sinun ei tarvitse etsiä vain komentoluettelosta, vaan haaroitus- tai silmukkarakenteista.
Esimerkissä komentojen ero on sanan ”Chapter” jälkeisessä numerossa.
Kun ero on löydetty, sinun on ymmärrettävä muutoksen malli. Eri fragmentti on numero? Lisääntyykö vai pieneneekö se jatkuvasti? Miten luvun arvo muuttuu kahden vierekkäisen joukkueen välillä?
Esimerkissä numero sanan ”luku” jälkeen kasvaa 1:n askelin. Ero löydetään, kuvio paljastetaan. Nyt voit korvata erilaisen fragmentin muuttujalla.
Sinun on ilmoitettava tällainen muuttuja ennen ensimmäistä toistuvista fragmenteista. Tällaista muuttujaa kutsutaan yleensä nimellä I tai j tai jotain yksityiskohtaisempaa. Sen alkuarvon on oltava yhtä suuri kuin ensimmäinen näytöllä näkyvä arvo. Esimerkissä ensimmäinen arvo on 1.
Mikä alkuarvo tulee ottaa numerosarjan "100, 101, 102, 103, 104, 105" näyttämiseksi?
Tämän sarjan ensimmäinen numero on 100.
Jokaisen lähtökomennon jälkeen sinun on suurennettava tämän muuttujan arvoa yhdellä. Tämä yksikkö on muutosvaihe.
Mikä askel on numerosarjassa "100, 102, 104, 106"?
Vaihe 2 tässä rivissä.
Kun eri fragmentti on korvattu muuttujalla, koodi näyttää tältä:

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

Kun olet soveltanut koodissa "ilmaista muuttujan mallia" -tekniikkaa, saat useita samanlaisia ​​​​toimintoryhmiä, jotka menevät peräkkäin. Nyt toistuvat toiminnot voidaan korvata syklillä.

Ongelman ratkaisusarja, jossa sinun on käytettävä silmukoita, koostuu seuraavista vaiheista:

  1. Ratkaise "päässä" monilla erillisillä komennoilla
  2. Etsi malli
  3. Ilmaise muuttujan kuvio
  4. Suunnittelu syklinä

Seuraavaksi otetaan käyttöön uusia termejä, jotta opiskelija ei joutuisi tilanteeseen "Ymmärrän kaiken, mutta en osaa sanoa":
— laskuri on aina muuttuja, jota tarvitaan seuraamaan silmukan vaiheiden määrää. Tyypillisesti kokonaisluku, jota verrataan rajoitukseen.
— laskurin askel — laskurin muutosmallin kuvaus.
- rajoitus - luku tai muuttuja, johon laskuria verrataan, jotta algoritmi on lopullinen. Laskurin arvo muuttuu lähestyäkseen rajaa.
— loop body — joukko komentoja, jotka toistetaan. Kun he sanovat "komento on kirjoitettu silmukan sisään", he tarkoittavat kehoa.
— silmukan iteraatio — silmukan rungon kertaluonteinen suoritus.
— silmukan ehto — looginen lauseke, joka määrittää, suoritetaanko toinen iteraatio. (Tässä voi olla sekaannusta haarautuvien rakenteiden kanssa)
Sinun on varauduttava siihen, että opiskelijat käyttävät termejä aluksi muihin tarkoituksiin. Tämä koskee sekä vahvoja että heikkoja. Yhteisen kielen perustaminen on taidetta. Kirjoitan nyt lyhyesti: sinun on asetettava tehtäväksi "korosta koodifragmentti <termillä" ja käytettävä näitä termejä itse keskustelussa oikein.
Silmukalla muuntamisen jälkeen fragmentti saadaan:

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

Pääasiallinen väärinkäsitys

Yksi opiskelijoiden keskuudessa suosittu väärinkäsitys on, että he sijoittavat silmukan sisälle toimintoja, jotka täytyy tehdä vain kerran. Esimerkiksi näin:

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

Opiskelijat törmäävät tähän ongelmaan koko ajan, sekä alussa että monimutkaisemmissa ongelmissa.
Keskeinen vinkki tässä tapauksessa:

Kuinka monta kertaa sinun tulee toistaa komento: kerran vai monta kertaa?

Komennot sanojen "Johdatus" ja "Johtopäätös" tulostamiseksi sekä muuttujan i ilmoittamiseksi ja alustamiseksi eivät ole kuin muut toistuvat toiminnot. Ne suoritetaan vain kerran, mikä tarkoittaa, että ne on kirjoitettava silmukan rungon ulkopuolelle.

Ratkaisun kaikkien kolmen vaiheen tulee pysyä koodissa, jotta voit viitata niihin myöhemmin vaikeuksien sattuessa. Riittää, kun kommentoit kahta ensimmäistä vaihtoehtoa, jotta ne eivät häiritse.
Opiskelijan huomio tulee kiinnittää seuraaviin seikkoihin:
— Silmukkatilassa yleensä verrataan laskuria ja rajaa. Laskuri voi muuttua silmukan rungossa, mutta raja ei. Tämän säännön rikkomiseksi sinun on muotoiltava pakottavia syitä.
— Komennot sanojen "Johdanto" ja "Conclusion" näyttämiseksi sijaitsevat silmukan rungon ulkopuolella. Meidän on suoritettava ne 1 kerran. "Johdatus" - ennen toimien toistamista, "Johtopäätös" - jälkeen.
Tämän aiheen lujittamisessa, seuraavien hallitsemisessa sekä vaikeuksien käsittelyssä on jopa vahvojen opiskelijoiden hyödyllistä kysyä kysymys: "Kuinka monta kertaa tämä toimenpide on suoritettava? Yksi vai monta?

Lisätaitojen kehittäminen

Opiskelujaksojen aikana opiskelija kehittää myös ongelmien diagnosointi- ja ratkaisutaitoa. Diagnostiikan suorittamiseksi opiskelijan tulee esittää haluttu tulos ja verrata sitä todelliseen tulokseen. Korjaavat toimet riippuvat niiden välisestä erosta.
Koska opiskelijoilla on tässä vaiheessa vielä vähän käsitystä "toivotusta" tuloksesta, he voivat keskittyä testitietoihin. Yleensä kukaan ei tässä vaiheessa vielä ymmärrä, mikä voi mennä pieleen ja kuinka käsitellä sitä. Siksi kirjoitan muistikirjaan kuvauksen tyypillisistä ongelmista ja useista tavoista ratkaista ne. Sopivimman valinta on opiskelijan itsensä tehtävä.
Tietue tarvitaan kysymään "tapahtuiko mitä odotettiin?", "Mikä näistä tilanteista tapahtui nyt?", "Auttoiko sovellettu ratkaisu?"

  1. Toimintoja on 1 vähemmän tai enemmän kuin odotettiin. Ratkaisut:
    — nosta laskurin alkuarvoa yhdellä.
    — korvaa tiukka vertailuoperaattori (< tai >) ei-tiukalla operaattorilla (<= tai >=).
    — muuta raja-arvoksi 1.
  2. Silmukan toiminnot suoritetaan ilman pysähtymistä, loputtomasti. Ratkaisut:
    — lisää laskurin muutoskomento, jos se puuttuu.
    — korjaa laskurin muutoskomento niin, että sen arvo tulee lähemmäksi rajaa.
    — poista rajoitteen muutoskomento, jos se on silmukan rungossa.
  3. Silmukan toimintojen määrä on yli 1 vähemmän tai enemmän kuin odotettiin. Silmukan toimintoa ei suoritettu edes kerran. Ensin sinun on selvitettävä muuttujien todelliset arvot juuri ennen silmukan alkamista. Ratkaisut:
    — muuttaa rajoitteen alkuarvoa
    — muuttaa laskurin alkuarvoa

Ongelma 3 sisältää yleensä väärän muuttujan käyttämisen tai laskurin nollaamatta jättämisen.

Tämän selityksen jälkeen opiskelijalla voi edelleen olla erilaisia ​​väärinkäsityksiä silmukoiden toiminnasta.
Hälventämään yleisimpiä, annan sinulle seuraavat tehtävät:

  1. Jossa käyttäjä syöttää rajan, alkulaskurin arvon tai laskurin askeleen.
  2. Jossa laskuriarvoa on käytettävä jossain aritmeettisessa lausekkeessa. On suositeltavaa käyttää laskuria radikaalilausekkeessa tai nimittäjässä, jotta ero on epälineaarinen.
  3. Jossa laskurin arvoa ei näytetä näytöllä silmukan ollessa käynnissä. Esimerkiksi näyttämällä tarvittava määrä identtisiä tekstinpätkiä tai piirtämällä hahmo kilpikonnagrafiikalla.
  4. Jossa sinun on suoritettava ensin joitain toistuvia toimia ja sitten muita.
  5. Jossa sinun on suoritettava muita toimintoja ennen ja jälkeen toistamisen

Jokaisesta tehtävästä on annettava testitiedot ja odotettu tulos.

Ymmärtääksesi kuinka nopeasti voit liikkua, sinun on luettava näiden ongelmien ehdot ja kysyttävä: "miten ne eroavat esimerkistä?", "Mitä esimerkissä on muutettava niiden ratkaisemiseksi?" Jos oppilas vastaa mielekkäästi, anna hänen ratkaista ainakin yksi tunnilla ja loput kotona itse. Jos ratkaisu onnistuu, voimme alkaa selittämään ehtoja silmukoiden sisällä.
Jos sinulla on ongelmia ongelmien ratkaisemisessa itse, sinun on suoritettava kaikki luokassa. Jotta ongelman ratkaiseminen ei muistuttaisi pöllön piirtämistä, suosittelen ensin ratkaisemaan ongelman epäuniversaalisella tavalla. Eli niin, että ratkaisu läpäisee ensimmäisen testin eikä käytä silmukkarakennetta. Käytä sitten muunnoksia ratkaisun universaalisuuden saavuttamiseksi.

Silmukat ja oksat

Minusta on hyödyllistä antaa aihe "syklit haarojen sisällä" erikseen. Jotta myöhemmin voit nähdä eron tilan tarkistamisen useaan kertaan ja kerran tarkistamisen välillä.
Konsolidointitehtävät koskevat lukujen tulostamista A:sta B:hen, jotka käyttäjä syöttää:
- aina nousevassa järjestyksessä.
- nouseva tai laskeva A:n ja B:n arvoista riippuen.

Aiheeseen "haarautuminen silmukoiden sisällä" tulisi siirtyä vasta, kun opiskelija on hallinnut tekniikat: "kuvion korvaaminen muuttujalla" ja "toistuvien toimintojen korvaaminen syklillä".
Pääsyy oksien käyttämiseen silmukoiden sisällä on kuvion poikkeavuudet. Keskellä se katkeaa alkutiedoista riippuen.
Niille opiskelijoille, jotka pystyvät etsimään ratkaisua yksinkertaisia ​​tekniikoita yhdistämällä, riittää, että sanotaan "haaroitus voidaan kirjoittaa silmukoiden sisään" ja antaa tehtävä "esimerkiksi" kokonaan ratkaista itsenäisesti.
Esimerkkitehtävä:

Käyttäjä syöttää luvun X. Näytä luvut 0–9 sarakkeessa ja lisää '+'-merkki sen numeron viereen, joka on yhtä suuri kuin X.

Jos syötettiin 00+
1
2
3
4
5
6
7
8
9

Jos syötettiin 60
1
2
3
4
5
6+
7
8
9

Jos syötettiin 90
1
2
3
4
5
6
7
8
9+

Jos syötettiin 7770
1
2
3
4
5
6
7
8
9

Jos lyhyt selitys ei riitä kirjoittamiseen silmukalla, sinun on saavutettava universaali ratkaisu samaan ongelmaan ilman silmukkaa.
Saat yhden kahdesta vaihtoehdosta:
Haluttu

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

mahdollista

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

Annan samanlaisen tehtävän etukäteen tutkiessani haarautumisaihetta.
Jos opiskelija keksii "mahdollisen" vaihtoehdon, sinun on kerrottava hänelle, että samaan ongelmaan voi olla monia ratkaisuja. Ne eroavat kuitenkin toisistaan ​​​​kestävyydestään vaatimusten muutoksiin. Esitä kysymys: "Kuinka monta kohtaa koodissa pitäisi korjata, jos minun pitäisi lisätä toinen numero?" "Mahdollisessa" versiossa sinun on lisättävä yksi haara ja lisättävä uusi numero 10 muuhun paikkaan. "Toivottuun" kohtaan riittää vain yhden haaran lisääminen.
Aseta tehtäväksi toistaa "haluttu" vaihtoehto, etsi sitten kuvio koodista, suorita muuttujan vaihto ja kirjoita silmukka.
Jos sinulla on idea ratkaista tämä ongelma ilman silmukkaa jollain muulla tavalla, kirjoita kommentteihin.

Silmukat silmukoiden sisällä

Tässä aiheessa sinun on kiinnitettävä huomiota seuraaviin:
— sisä- ja ulkosilmukan laskurien on oltava eri muuttujia.
— sisemmän silmukan laskuri on nollattava useita kertoja (eli ulomman silmukan rungossa).
— tekstinsyöttötehtävissä et voi kirjoittaa ensin yhtä kirjainta usealle riville ja sitten toista. Sinun on ensin tulostettava kaikki ensimmäisen rivin kirjaimet, sitten kaikki toisen rivin kirjaimet ja niin edelleen.

Silmukoiden sisällä olevien silmukoiden aiheen selittäminen on parasta aloittaa selittämällä laskurin nollauksen tärkeys.
Esimerkkitehtävä:

Käyttäjä syöttää kaksi numeroa: R ja T. Tulosta kaksi riviä "#"-merkkejä. Ensimmäisen rivin tulee sisältää R-merkkiä. Toinen rivi sisältää T-kappaleita. Jos jokin luku on negatiivinen, näytä virheilmoitus.

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

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

R = -1, T = 6R-arvon tulee olla ei-negatiivinen

R = 6, T = -2T-arvon on oltava ei-negatiivinen

Ilmeisesti tälle ongelmalle on myös ainakin kaksi ratkaisua.
Haluttu

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

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

Erona on, että "mahdollisessa" ratkaisussa toisen rivin tulostamiseen käytettiin toista muuttujaa. Sinun tulisi vaatia saman muuttujan käyttöä molemmissa silmukaissa. Tämä rajoitus voidaan perustella sillä, että ratkaisu, jossa on yksi laskuri kahdelle jaksolle, on esimerkki termistä "laskurin nollaus". Tämän termin ymmärtäminen on välttämätöntä, kun ratkaistaan ​​seuraavat ongelmat. Kompromissina voit tallentaa molemmat ratkaisut ongelmaan.

Tyypillinen ongelma yhden laskurimuuttujan käyttämisessä kahdelle silmukalle näyttää tältä:
R = 5, T = 11#####
######

Toisen rivin merkkien määrä ei vastaa T:n arvoa. Jos tarvitset apua tähän ongelmaan, sinun on tutkittava huomautuksia tyypillisistä silmukoiden ongelmista. Tämä on oire nro 3. Se diagnosoidaan, jos lisäät laskurin arvon välittömästi ennen toista jaksoa. Korjattu nollauksella. Mutta parempi olla kertomatta tätä heti. Opiskelijan tulee yrittää muotoilla vähintään yksi hypoteesi.

On tietysti toinenkin ratkaisu. Mutta en ole koskaan nähnyt sitä opiskelijoiden keskuudessa. Syklien opiskeluvaiheessa tarina siitä häiritsee huomion. Voit palata siihen myöhemmin, kun opit merkkijonofunktioista.
Mahdollinen nro 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));

Seuraava pakollinen tehtävä:

Näytä numerot 0–9. Jokaisen numeron tulee olla omalla rivillään. Rivin numeroiden määrä (W) syötetään näppäimistöltä.

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

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

Jos opiskelija on hallinnut muuttujan korvaamisen tekniikan, hän selviytyy melko nopeasti. Mahdollinen ongelma on jälleen muuttujan nollaaminen. Jos et pysty käsittelemään muutosta, se tarkoittaa, että sinulla oli kiire ja sinun oli ratkaistava yksinkertaisempia ongelmia.

Kiitos huomiostasi. Tykkää ja tilaa kanava.

PS Jos löydät kirjoitusvirheitä tai virheitä tekstistä, kerro minulle. Tämä voidaan tehdä valitsemalla osa tekstistä ja painamalla "⌘ + Enter" Macilla ja "Ctrl / Enter" perinteisillä näppäimistöillä tai lähettämällä yksityisviestejä. Jos nämä vaihtoehdot eivät ole käytettävissä, kirjoita virheistä kommentteihin. Kiitos!

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Äänestys lukijoille ilman karmaa

  • 20,0%Opetan ammattimaisesti, +12

  • 10,0%Opetan ammattimaisesti, -11

  • 70,0%En opeta, +17

  • 0,0%En opeta, -10

  • 0,0%Muu0

10 käyttäjää äänesti. 5 käyttäjää pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti