Kako naučiti kako prevladati poteškoće, au isto vrijeme pisati cikluse

Unatoč činjenici da ćemo govoriti o jednoj od osnovnih tema, ovaj je članak napisan za iskusne stručnjake. Cilj je pokazati kakve zablude početnici imaju u programiranju. Za praktične programere, ti su problemi odavno riješeni, zaboravljeni ili uopće nisu primijećeni. Članak vam može biti od koristi ako nekome iznenada trebate pomoći s ovom temom. U članku se povlače paralele s materijalom iz raznih knjiga o programiranju autora Schildt, Stroustrup, Okulov.

Tema o ciklusima je odabrana jer je dosta ljudi isključeno iz nje pri savladavanju programiranja.

Ova tehnika je namijenjena slabijim učenicima. U pravilu, jaki ljudi ne zaglave na ovoj temi i nema potrebe za njima smišljati posebne tehnike. Sekundarni cilj članka je premjestiti ovu tehniku ​​iz razreda „radi za sve učenike, ali samo jednog učitelja” u razred „radi za sve učenike, sve učitelje”. Ne tvrdim za apsolutnu originalnost. Ako već koristite sličnu metodologiju za podučavanje ove teme, napišite po čemu se vaša verzija razlikuje. Ako ga odlučite koristiti, recite nam kako je prošlo. Ako je slična tehnika opisana u knjizi, napišite naziv.


Radio sam na ovoj tehnici 4 godine, učeći individualno sa studentima različitih razina obuke. Ukupno ima pedesetak studenata i dvije tisuće sati nastave. U početku su studenti uvijek zapeli na ovoj temi i otišli. Za svakog učenika prilagođena je metodologija i materijali. Tijekom prošle godine studenti više nisu zapeli na ovoj temi, pa sam odlučio podijeliti svoja otkrića.

Zašto toliko slova? Ciklusi su tako elementarni!

Kao što sam gore napisao, za praktične programere i za snažne studente, složenost koncepta petlji može se podcijeniti. Na primjer, možete održati dugo predavanje, vidjeti klimanje glava i inteligentne oči. Ali kada pokušavate riješiti bilo koji problem, započinju stupor i neobjašnjivi problemi. Nakon predavanja studenti su vjerojatno imali tek djelomično razumijevanje. Situaciju otežava činjenica da studenti sami ne mogu reći što je točno njihova zabluda.
Jednog sam dana shvatio da učenici moje primjere doživljavaju kao hijeroglife. Odnosno, poput nedjeljivih djelića teksta u koje treba dodati neko “čarobno” slovo i radit će.
Ponekad sam primijetio da studenti misle da je potrebno riješiti određeni problem nešto drugo dizajn koji još nisam obradio. Iako je rješenje zahtijevalo tek neznatnu modifikaciju primjera.

Pa sam došao na ideju da fokus ne bi trebao biti na sintaksi izraza, već na ideji refaktoriranja ponavljajućeg koda pomoću petlji. Nakon što učenici svladaju ovu ideju, bilo koja se sintaksa može poboljšati uz malo vježbe.

Koga i zašto podučavam?

Budući da nema prijemnog ispita, u nastavu mogu biti uključeni i jaki i vrlo slabi učenici. Više o mojim učenicima možete pročitati u članku Portret studenata večernjeg tečaja
Nastojao sam da svi koji žele naučiti programiranje mogu to naučiti.
Moja nastava se održava individualno i svaki student plaća sam. Čini se da će studenti optimizirati troškove i zahtijevati minimum. Međutim, ljudi idu na nastavu licem u lice s učiteljem uživo ne zbog samog znanja, već zbog povjerenja u ono što su naučili, zbog osjećaja napretka i odobrenja stručnjaka (učitelja). Ako učenici ne osjete napredak u učenju, otići će. Općenito, nastava se može strukturirati tako da učenici osjete napredak u povećanju broja poznatih struktura. Odnosno, prvo učimo detaljno, zatim učimo, pa radimo dok, a sada imamo spreman tečaj tisuću i jedne noći u kojem se dva mjeseca uče samo ciklusi, a na kraju - student koji je napisao standardna biblioteka pod diktatom. No, za rješavanje praktičnih problema nije potrebno samo poznavanje gradiva, već i samostalnost u njegovoj primjeni i traženju novih informacija. Stoga, za tečajeve licem u lice, mislim da je ispravno načelo poučavanje minimuma i poticanje samostalnog proučavanja nijansi i srodnih tema. U temi o petljama, smatram da je konstrukcija while minimum. Iz toga možete razumjeti princip. Poznavajući princip, možete svladati i za sebe i za sebe.

Da bi se postiglo savladavanje gradiva od strane slabih učenika, opisivanje sintakse nije dovoljno. Potrebno je dati više jednostavnih, ali raznovrsnih zadataka i detaljnije opisati primjere. U konačnici, brzina razvoja ograničena je sposobnošću učenika da transformira izraze i traži obrasce. Pametnim će učenicima većina zadataka biti dosadna. Kada učite s njima, ne morate inzistirati na rješavanju 100% problema. Moj materijal možete pogledati na moj github. Istina, spremište je više poput grimorija čarobnjaka - nitko osim mene neće razumjeti što je gdje, a ako ne prođete provjeru, možete poludjeti

Metodologija je orijentirana na praksu

Teorija se objašnjava na primjeru rješavanja problema. Na satu osnova programiranja gdje se uče grananja i petlje, jednostavno nije moguće održati korisno predavanje o jednoj temi cijeli sat. Dovoljno je 15-20 minuta da objasnite koncept. Glavne poteškoće nastaju pri izvođenju praktičnih zadataka.
Nastavnici početnici mogu na jednom predavanju razglabati o operatorima, granama, petljama i nizovima. Ali njihovi će se učenici suočiti s problemom asimilacije ovih informacija.
Potrebno je ne samo ispričati materijal, već i osigurati da ga slušatelji razumiju.

Savladanost teme određena je time kako se student snalazi u samostalnom radu.
Ako je učenik uspio riješiti problem na temu bez pomoći nastavnika, onda je tema savladana. Kako bi se osiguralo samotestiranje, svaki zadatak je opisan u tablici s testnim scenarijima. Zadaci imaju jasan redoslijed. Ne preporučuje se preskakanje zadataka. Ako je trenutni zadatak pretežak, onda je prelazak na sljedeći beskoristan. Još je kompliciranije. Kako bi učenik mogao savladati trenutni složeni zadatak, objašnjava mu se nekoliko tehnika na primjeru prvog problema. Zapravo, cijeli sadržaj teme svodi se na tehnike prevladavanja poteškoća. Ciklusi su više nuspojava.

Prvi zadatak uvijek je primjer. Drugi se neznatno razlikuje i izvodi se “samostalno” odmah nakon prvog pod nadzorom učitelja. Svi daljnji zadaci usmjereni su na obraćanje pozornosti na razne sitnice koje mogu izazvati pogrešne predodžbe.

Objašnjenje primjera je dijalog u kojem učenik treba pozvati povratnu propagaciju i unakrsnu provjeru kako bi se uvjerio da je savladao dio gradiva.

Bit ću banalan i reći da je prvi primjer na temu jako bitan. Ako imate materijala za opsežan samostalan rad, propusti prvog primjera mogu se ispraviti. Ako nema ništa drugo osim primjera, tada učenik najvjerojatnije neće savladati temu.

Dok ili za?

Jedno od kontroverznih pitanja je izbor konstrukcije za primjer: dok ili za. Jednom je moj prijatelj praktičan programer bez iskustva u podučavanju proveo sat vremena uvjeravajući me da je for petlju najlakše razumjeti. Argumenti su se svodili na to da je "u njemu sve jasno i postavljeno na svoje mjesto". Međutim, glavni uzrok poteškoća za prave početnike je ideja samog ciklusa, a ne njegovo pisanje. Ako osoba ne razumije ovu ideju, tada će imati poteškoća sa sintaksom. Čim se ideja realizira, problemi dizajna koda nestaju sami od sebe.

U mojim materijalima, tema petlji prati temu grananja. Vanjska sličnost if i while omogućuje nam da povučemo izravnu analogiju: "kada je uvjet u zaglavlju istinit, tada se tijelo izvršava." Jedina posebnost ciklusa je da se tijelo izvodi mnogo puta.

Moj drugi argument je da while zahtijeva manje formatiranja nego for. Manje oblikovanja znači manje glupih pogrešaka s nedostajućim zarezima i zagradama. Početnici još nisu razvili dovoljno pažnje i pedantnosti da automatski izbjegnu sintaktičke pogreške.
Treći argument je objašnjen u mnogim dobrim knjigama kao prvi argument.

Ako učenik može lako transformirati izraze, tada možete usput razgovarati o for. Učenik će zatim odabrati ono što mu se najviše sviđa. Ako transformacije uzrokuju poteškoće, onda je bolje ne odvratiti vašu pozornost. Neka učenik najprije sve riješi koristeći while. Nakon što svladate temu petlji, možete ponovno napisati rješenja kako biste uvježbali pretvaranje while u for.
Petlje postuvjeta prilično su rijetka zvijer. Uopće ne trošim vrijeme na to. Ako je učenik ovladao idejama identificiranja uzoraka i transformacije izraza, može to shvatiti i bez moje pomoći.

Prilikom demonstracije prvog primjera jakim učenicima, skrećem pozornost na činjenicu da je u prvom primjeru važno zabilježiti ne samo rješenje, već i cijeli lanac radnji koje su dovele do rezultata. Lijeni učenici mogu zanemariti pisanje i kopirati samo konačni algoritam. Treba ih uvjeriti da će jednog dana pred njih doći težak zadatak. Da biste to riješili, morat ćete slijediti korake kao u ovom primjeru. Zato je važno zabilježiti sve faze. U sljedećim problemima bit će moguće ostaviti samo konačnu verziju rješenja.

Glavna ideja automatizacije je da računalu povjerimo obavljanje rutinskih poslova za osobu. Jedna od osnovnih tehnika je pisanje petlji. Koristi se kada je u programu u nizu zapisano više identičnih radnji koje se ponavljaju.

Eksplicitno je bolje od implicitnog

Moglo bi se činiti kao dobra ideja prikazati istu frazu više puta u prvom zadatku ponavljanja. Na primjer:

Hura, radi!
Hura, radi!
Hura, radi!
Hura, radi!
Hura, radi!
Hura, radi!
Hura, radi!
Hura, radi!

Ova opcija je loša jer vrijednost brojača nije vidljiva u izlazu. Ovo je problem za početnike. Ne podcjenjuj je. Isprva je ovaj zadatak bio prvi, a zadatak izvođenja niza brojeva u rastućem redoslijedu drugi. Bilo je potrebno uvesti dodatne pojmove “ciklus N puta” i “ciklus od A do B”, koji su u biti iste stvari. Kako ne bih stvarao nepotrebne entitete, odlučio sam pokazati samo primjer s izlazom niza brojeva. Malo ljudi uspije bez pripreme naučiti držati brojač u glavi i modelirati ponašanje programa u glavi. Neki se učenici prvi put susreću s mentalnim modeliranjem na temu ciklusa.
Nakon malo vježbanja dajem zadatak ponavljanja istog teksta na samostalno rješavanje. Ako prvo date vidljivu brojalicu, a zatim nevidljivu, učenici će imati manje problema. Ponekad je savjet "nemojte pisati brojač na ekranu" dovoljan.

Kako to drugi objašnjavaju?

U većini obrazovnih materijala na Internetu, sintaksa ciklusa je dana kao dio "predavanja". Na primjer, na developer.mozilla.org (trenutačno), nekoliko drugih konstrukcija je opisano zajedno s while petljom. U ovom slučaju samo su sami dizajni dani u obliku šablona. Rezultat njihovog lansiranja opisan je riječima, ali nema ilustracije. Po mom mišljenju, takav prikaz teme umnožava korisnost takvih materijala s nulom. Učenik može sam prepisati kod i pokrenuti ga, ali mu ipak treba standard za usporedbu. Kako možete shvatiti da je primjer ispravno prepisan ako nema s čime usporediti rezultat?
Kada se daje samo predložak, bez primjera, učeniku postaje još teže. Kako razumjeti da su fragmenti koda ispravno postavljeni u predlošku? Možete pokušati pisati nekako, a zatim trčite. Ali ako ne postoji standard za usporedbu rezultata, ni pokretanje neće pomoći.

U tečaju C++ na Intuitive, sintaksa petlje je zakopana na trećoj stranici predavanja 4 o temi "operatori". Prilikom objašnjenja sintakse petlji poseban naglasak je stavljen na pojam “operator”. Pojam je predstavljen kao skup činjenica poput “simbol; ovo je izjava", "{} je složena izjava", "tijelo petlje mora biti izjava". Ne sviđa mi se ovakav pristup jer se čini da iza jednog pojma skriva važne odnose. Raščlanjivanje izvornog koda programa u termine na ovoj razini potrebno je programerima prevoditelja za implementaciju specifikacije jezika, ali ne studentima kao prvoj aproksimaciji. Novopridošli u programiranje rijetko su dovoljno pedantni da obrate tako veliku pozornost na termine. Rijetka je osoba koja pamti i razumije nove riječi iz prvog puta. Gotovo nitko ne može ispravno primijeniti pojam koji je upravo naučio. Stoga studenti dobivaju puno grešaka poput "Napisao sam while(a<7);{, ali program ne radi."
Po mom mišljenju, na početku je bolje dati sintaksu konstrukcije odmah u zagradama. Opciju bez zagrada treba objasniti samo ako učenik ima konkretno pitanje: "zašto nema zagrada i radi."

U Okulovljevoj knjizi "Osnove programiranja" iz 2012. uvod u petlje počinje s for uzorkom, zatim daje preporuke za njegovu upotrebu, a zatim odmah prelazi na eksperimentalni dio lekcije. Razumijem da je knjiga napisana za onu manjinu vrlo sposobnih studenata koji rijetko dolaze na moju nastavu.

U popularnim knjigama uvijek se piše rezultat fragmenata koda. Na primjer, Shildtovo izdanje "Java 8. The Complete Guide" iz 2015. Prvo se daje predložak, zatim primjer programa i odmah nakon njega - rezultat izvršenja.

Kao primjer, razmotrite while petlju koja radi obrnuto
odbrojavanje počinje od 10, a prikazuje se točno 10 redaka “mjera”:

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

Nakon pokretanja, ovaj program daje deset "ciklusa" kako slijedi:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Pristup opisivanja predloška, ​​primjera programa i rezultata programa također se koristi u knjizi “Javascript za djecu” i u js tečaju na w3schools.com. Format web stranice čak omogućuje da ovaj primjer bude interaktivan.

Stroustrupova knjiga iz 2016. Principles and Practice Using C++ otišla je još dalje. Prvo se objašnjava kakav rezultat treba dobiti, a nakon toga se prikazuje tekst programa. Štoviše, oni ne uzimaju samo slučajni program kao primjer, već daju izlet u povijest. To pomaže privući pozornost na to: “Gledajte, ovo nije samo neki beskoristan tekst. Vidite nešto značajno."

Kao primjer iteracije, razmotrite prvi program koji se izvodi na stroju s pohranjenim programom (EDSAC). Napisao ju je David Wheeler u Računalnom laboratoriju Sveučilišta Cambridge, Engleska, 6. svibnja 1949. godine. Ovaj program izračunava i ispisuje jednostavan popis kvadrata.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Ovdje svaki redak sadrži broj iza kojeg slijedi tabulator ('t') i kvadrat tog broja. C++ verzija ovog programa izgleda ovako:

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

Zanimljivo je da sintaksni uzorak nije opisan u ovoj knjizi. Stroustrup u priručniku za instruktore (prijevod) ističe da poštuje inteligenciju svojih učenika. Možda se sposobnost prepoznavanja uzorka u nekoliko primjera smatra manifestacijom takve inteligencije.

Kako sam sebi objašnjavam

Stroustrupov pristup: opisivanje rezultata, zatim rješavanje problema, pa samostalna analiza od strane učenika – čini se najpromišljenijim. Stoga sam ga odlučio uzeti kao osnovu, ali ispričati ga koristeći manje povijesni primjer - zadatak izvođenja "sadržaja". Formira prepoznatljivo sidro kako biste onda mogli reći “sjetite se zadatka o sadržaju” i kako bi učenici zapamtili upravo to. U svom sam primjeru pokušao spriječiti još dvije najčešće zablude. Zatim ću pisati o njima detaljnije.

U ovom zadatku upoznajemo se s tehnikama rješavanja složenih problema. Početna odluka mora biti primitivna i jednostavna. Pa, onda možete razmisliti o tome kako poboljšati ovo rješenje.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Prema mojim zapažanjima, pristup “predložak-primjer-rezultat” u raznim kombinacijama još uvijek dovodi do toga da učenici percipiraju ciklus kao hijeroglif. To se očitovalo u tome što im nije bilo jasno zašto postoji uvjet da se tu piše, kako birati između i++ i i— i druge naizgled očite stvari. Kako bi se izbjegle te zablude, pristup govoru o ciklusima trebao bi naglašavati značenje ponavljanja identičnih radnji i tek ih onda formalizirati pomoću strukture. Stoga, prije davanja sintakse petlje, morate izravno riješiti problem. Primitivno rješenje problema sa sadržajem izgleda ovako:

Console.WriteLine("Введение");
Console.WriteLine("Глава 1");
Console.WriteLine("Глава 2");
Console.WriteLine("Глава 3");
Console.WriteLine("Глава 4");
Console.WriteLine("Глава 5");
Console.WriteLine("Глава 6");
Console.WriteLine("Глава 7");
Console.WriteLine("Заключение");

Kako se može poboljšati?
Zamijenite monotone radnje ciklusom.
Koje se radnje ponavljaju u nizu bez promjena?
U ovom fragmentu ih nema. Međutim, naredbe za prikaz riječi "Chapter" s brojem vrlo su slične jedna drugoj.
Stoga je sljedeća faza pronaći razliku između fragmenata. Samo u ovom zadatku sve je očito, tada se neće ponavljati pojedinačne naredbe, već blokovi koda od 5 redaka ili više. Morat ćete pretraživati ​​ne samo u popisu naredbi, već iu konstrukcijama grananja ili petlje.
U primjeru, razlika između naredbi je u broju iza riječi “Chapter”.
Kad se razlika pronađe, morate razumjeti obrazac promjene. Različiti fragment je broj? Raste li stalno ili opada? Kako se mijenja vrijednost broja između dva tima jedan do drugoga?
U primjeru, broj iza riječi "poglavlje" povećava se u koracima od 1. Razlika je pronađena, uzorak je otkriven. Sada možete zamijeniti različiti fragment varijablom.
Morate deklarirati takvu varijablu prije prvog od fragmenata koji se ponavljaju. Takva se varijabla obično naziva I ili j ili nešto detaljnije. Njegova početna vrijednost mora biti jednaka prvoj vrijednosti prikazanoj na ekranu. U primjeru, prva vrijednost je 1.
Koju početnu vrijednost treba uzeti da bi se prikazao niz brojeva “100, 101, 102, 103, 104, 105”?
Prvi broj u ovom nizu je 100.
Nakon svake izlazne naredbe, trebate povećati vrijednost ove varijable za 1. Ova jedinica je korak promjene.
Koji će korak biti u nizu brojeva “100, 102, 104, 106”?
Korak 2 u ovom redu.
Nakon zamjene različitog fragmenta varijablom, kod će izgledati ovako:

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

Nakon primjene tehnike "izrazi uzorak varijable" u kodu, dobivate nekoliko grupa identičnih akcija koje idu u nizu. Sada se radnje koje se ponavljaju mogu zamijeniti petljom.

Redoslijed rješavanja problema u kojem trebate koristiti petlje sastoji se od sljedećih koraka:

  1. Riješite "head-on" s mnogo zasebnih naredbi
  2. Pronađite uzorak
  3. Izrazite uzorak varijable
  4. Dizajn kao ciklus

Dalje se uvode novi pojmovi kako se učenik ne bi našao u situaciji “sve razumijem, ali ne mogu reći”:
— brojač je uvijek varijabla koja je potrebna za praćenje broja koraka u petlji. Obično cijeli broj koji se uspoređuje s ograničenjem.
— korak brojača — opis obrasca promjena brojača.
- ograničenje - broj ili varijabla s kojom se uspoređuje brojač kako bi algoritam bio konačan. Vrijednost brojača se mijenja kako bi se približila granici.
— tijelo petlje — skup naredbi koje će se ponavljati. Kad kažu "naredba je zapisana unutar petlje", misle na tijelo.
— iteracija petlje — jednokratno izvršavanje tijela petlje.
— uvjet petlje — logički izraz koji određuje hoće li se izvršiti druga iteracija. (Ovdje može doći do zabune sa strukturama grananja)
Morate biti spremni na činjenicu da će u početku učenici koristiti pojmove u druge svrhe. To se odnosi i na jake i na slabe. Uspostaviti zajednički jezik je umjetnost. Sada ću ukratko napisati: trebate postaviti zadatak "istaknite fragment koda s <termin>" i sami ispravno koristite ove pojmove u razgovoru.
Nakon transformacije s petljom, dobiva se fragment:

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

Glavna zabluda

Jedna popularna zabluda među studentima je da oni smještaju radnje unutar petlje koje moraju biti učinjene samo jednom. Na primjer ovako:

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

Učenici se stalno susreću s ovim problemom, kako na početku tako i kod složenijih problema.
Ključni savjet u ovom slučaju:

Koliko puta trebate ponoviti naredbu: jednom ili više puta?

Naredbe za ispis riječi "Uvod" i "Zaključak" te deklariranje i inicijaliziranje varijable i nisu poput drugih radnji koje se ponavljaju. Izvode se samo jednom, što znači da se moraju pisati izvan tijela petlje.

Sve tri faze rješenja trebaju ostati u kodu kako biste ih kasnije mogli pogledati u slučaju poteškoća. Dovoljno je komentirati prve dvije opcije kako ne bi smetale.
Studentu treba skrenuti pozornost na sljedeće činjenice:
— U stanju petlje obično se uspoređuju brojač i granica. Brojač se može promijeniti u tijelu petlje, ali ograničenje ne može. Da biste prekršili ovo pravilo, morate formulirati uvjerljive razloge.
— Naredbe za prikaz riječi “Uvod” i “Zaključak” nalaze se izvan tijela petlje. Moramo ih izvesti 1 put. "Uvod" - prije ponavljanja radnji, "Zaključak" - nakon.
U procesu učvršćivanja ove teme, svladavanja sljedećih, kao i suočavanja s poteškoćama, korisno je čak i za jake učenike postaviti pitanje: „Koliko puta treba izvesti ovu radnju? Jedan ili više?

Razvoj dodatnih vještina

U procesu studiranja ciklusa studenti također razvijaju vještinu dijagnosticiranja i rješavanja problema. Za provođenje dijagnostike student treba prikazati željeni rezultat i usporediti ga sa stvarnim rezultatom. Korektivne radnje ovise o razlici među njima.
Budući da učenici u ovoj fazi još uvijek nemaju pojma o "željenom" rezultatu, mogu se usredotočiti na podatke testa. U pravilu, nitko u ovoj fazi još ne razumije što može poći po zlu i kako se s tim nositi. Stoga u bilježnicu pišem opis tipičnih problema i nekoliko načina za njihovo rješavanje. Odabir najprikladnijeg zadatak je samog učenika.
Potreban je zapis za pitanje "je li se dogodilo ono što se očekivalo?", "Koja se od ovih situacija sada dogodila?", "Je li primijenjeno rješenje pomoglo?"

  1. Broj radnji je 1 manji ili veći od očekivanog. rješenja:
    — povećati početnu vrijednost brojača za 1.
    — zamijenite strogi operator usporedbe (< ili >) s nestriktnim (<= ili >=).
    — promijenite graničnu vrijednost na 1.
  2. Radnje u petlji se izvode bez zaustavljanja, neograničeno dugo. rješenja:
    — dodajte naredbu za promjenu brojača ako nedostaje.
    — popraviti naredbu promjene brojača tako da njegova vrijednost postane bliža granici.
    — uklonite naredbu za promjenu ograničenja ako je u tijelu petlje.
  3. Broj radnji u petlji je više od 1 manji ili veći od očekivanog. Akcija u petlji nije izvršena niti jednom. Prvo morate saznati stvarne vrijednosti varijabli neposredno prije početka petlje. rješenja:
    — promijeniti početnu vrijednost ograničenja
    — promijeniti početnu vrijednost brojača

Problem 3 obično uključuje korištenje pogrešne varijable ili nepostavljanje brojača na nulu.

Nakon ovog objašnjenja, učenik može i dalje imati različite pogrešne predodžbe o tome kako petlje rade.
Kako bih odagnao najčešće, dajem vam sljedeće zadatke:

  1. U koji korisnik unosi granicu, početnu vrijednost brojača ili korak brojača.
  2. U kojem se vrijednost brojača mora koristiti u nekom aritmetičkom izrazu. Preporučljivo je koristiti brojač u radikalnom izrazu ili u nazivniku kako bi razlika bila nelinearna.
  3. U kojem se vrijednost brojača ne prikazuje na ekranu dok petlja radi. Na primjer, prikazivanje potrebnog broja identičnih fragmenata teksta ili crtanje figure s grafikom kornjače.
  4. U kojem prvo morate izvesti neke radnje koje se ponavljaju, a zatim druge.
  5. U kojem trebate izvršiti druge radnje prije i nakon ponavljanja

Za svaki zadatak morate dati testne podatke i očekivani rezultat.

Da biste razumjeli koliko se brzo možete kretati, morate pročitati uvjete ovih problema i zapitati se: "kako se razlikuju od primjera?", "Što treba promijeniti u primjeru da ih se riješi?" Ako učenik smisleno odgovori, neka barem jedan riješi na satu, a ostalo sam kod kuće. Ako je rješenje uspješno, tada možemo početi objašnjavati uvjete unutar petlji.
Ako imate problema sa samim rješavanjem problema, morate sve proraditi na satu. Kako rješavanje problema ne bi podsjećalo na crtanje sove, preporučujem prvo rješavanje problema na neuniverzalan način. Odnosno, tako da rješenje prođe prvi test i ne koristi konstrukciju petlje. Pa, onda primijenite transformacije kako biste postigli univerzalnost rješenja.

Petlje i grane

Po mom mišljenju, korisno je posebno dati temu „ciklusi unutar grana“. Tako da kasnije možete vidjeti razliku između višestruke provjere uvjeta i jednom provjere.
Zadaci za konsolidaciju će se odnositi na ispisivanje brojeva od A do B, koje upisuje korisnik:
- uvijek uzlaznim redoslijedom.
- rastući ili silazni ovisno o vrijednostima A i B.

Tema "grananja unutar petlji" trebala bi se nastaviti tek nakon što učenik savlada tehnike: "zamjena uzorka varijablom" i "zamjena ponavljajućih radnji ciklusom."
Glavni razlog za korištenje grana unutar petlji su anomalije u uzorku. U sredini se lomi ovisno o početnim podacima.
Za one studente koji su u stanju tražiti rješenje kombinirajući jednostavne tehnike, dovoljno je reći "grananje se može pisati unutar petlji" i dati problem "na primjer" u potpunosti samostalno riješiti.
Primjer zadatka:

Korisnik upisuje broj X. Brojeve od 0 do 9 prikazati u stupcu i ispred broja koji je jednak X staviti znak '+'.

Ako je unesena 00+
1
2
3
4
5
6
7
8
9

Ako je unesena 60
1
2
3
4
5
6+
7
8
9

Ako je unesena 90
1
2
3
4
5
6
7
8
9+

Ako je unesena 7770
1
2
3
4
5
6
7
8
9

Ako kratko objašnjenje nije dovoljno za pisanje s petljom, onda morate postići univerzalno rješenje istog problema bez petlje.
Dobit ćete jednu od dvije opcije:
Poželjno

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

moguće

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

Dajem sličan zadatak unaprijed, dok proučavam temu grananja.
Ako učenik smisli "moguću" opciju, tada mu morate reći da može postojati mnogo rješenja za isti problem. Međutim, razlikuju se po svojoj otpornosti na promjene u zahtjevima. Postavite pitanje: "Koliko bi mjesta u kodu trebalo ispraviti ako bih morao dodati još jedan broj?" U "mogućoj" verziji morat ćete dodati još jednu granu i dodati novi broj na 10 drugih mjesta. U "željeno" je dovoljno dodati samo jednu granu.
Postavite zadatak za reprodukciju "željene" opcije, zatim pronađite uzorak u kodu, izvršite zamjenu varijable i napišite petlju.
Ako imate ideju kako riješiti ovaj problem bez petlje na neki drugi način, napišite u komentarima.

Petlje unutar petlji

U ovoj temi morate obratiti pozornost na sljedeće:
— brojači za unutarnju i vanjsku petlju moraju biti različite varijable.
— brojač za unutarnju petlju mora se resetirati mnogo puta (to jest, u tijelu vanjske petlje).
— u zadacima ispisa teksta ne možete prvo napisati jedno slovo u nekoliko redaka, a zatim drugo. Prvo morate ispisati sva slova prvog retka, zatim sva slova drugog i tako dalje.

Najbolje je početi objašnjavati temu petlji unutar petlje objašnjavajući važnost vraćanja brojača na nulu.
Primjer zadatka:

Korisnik upisuje dva broja: R i T. Ispišite dva retka znakova "#". Prvi red treba sadržavati R znakove. Drugi red sadrži T komada. Ako je bilo koji broj negativan, prikazati poruku o pogrešci.

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

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

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

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

Očito i ovaj problem ima barem dva rješenja.
Poželjno

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

Moguće #1

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
int j = 0;
j = 0;
while (j < T)
{
    Console.Write("#");
    j = j + 1;
}

Razlika je u tome što je u "mogućem" rješenju druga varijabla korištena za izlaz drugog retka. Trebali biste inzistirati na korištenju iste varijable za obje petlje. Ovo ograničenje može se opravdati činjenicom da će rješenje s jednim brojačem za dva ciklusa biti ilustracija izraza "resetiranje brojača". Razumijevanje ovog pojma je neophodno pri rješavanju sljedećih problema. Kao kompromis, možete spremiti oba rješenja problema.

Tipičan problem s korištenjem jedne varijable brojača za dvije petlje izgleda ovako:
R=5, T=11#####
######

Broj znakova u drugom retku ne odgovara vrijednosti T. Ako trebate pomoć s ovim problemom, trebate pogledati napomene o tipičnim problemima s petljama. Ovo je simptom broj 3. Dijagnosticira se ako dodate izlaznu vrijednost brojača neposredno prije drugog ciklusa. Ispravljeno resetiranjem. Ali bolje je ne reći ovo odmah. Student mora pokušati formulirati barem jednu hipotezu.

Postoji, naravno, još jedno rješenje. Ali to nikad nisam vidio među studentima. U fazi proučavanja ciklusa, priča o tome će odvratiti pažnju. Možete mu se vratiti kasnije kada učite o funkcijama niza.
Moguće #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));

Sljedeći obavezan zadatak:

Pokažite brojeve od 0 do 9. Svaki broj treba biti u svom retku. Broj znamenki u retku (W) upisuje se s tipkovnice.

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

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

Ako je učenik savladao tehniku ​​zamjene varijable, tada će se vrlo brzo snaći. Mogući problem će opet biti u resetiranju varijable. Ako ne možete podnijeti transformaciju, znači da ste bili u žurbi i da morate riješiti jednostavnije probleme.

Hvala vam na pažnji. Lajkajte i pretplatite se na kanal.

PS Ako pronađete pravopisne pogreške ili pogreške u tekstu, javite mi. To možete učiniti odabirom dijela teksta i pritiskom na “⌘ + Enter” na Macu, odnosno “Ctrl / Enter” na klasičnim tipkovnicama ili putem privatnih poruka. Ako ove opcije nisu dostupne, pišite o pogreškama u komentarima. Hvala vam!

U anketi mogu sudjelovati samo registrirani korisnici. Prijaviti se, molim.

Anketa za čitatelje bez karme

  • 20,0%Stručno predajem, +12

  • 10,0%Profesionalno podučavam, -11

  • 70,0%Ne predajem, +17

  • 0,0%Ne predajem, -10

  • 0,0%Ostalo0

Glasovalo je 10 korisnika. Suzdržano je bilo 5 korisnika.

Izvor: www.habr.com

Dodajte komentar