Kako naučiti kako savladati poteškoće, a u isto vrijeme pisati cikluse

Unatoč činjenici da ćemo govoriti o jednoj od osnovnih tema, ovaj članak je napisan za iskusne profesionalce. Cilj je pokazati kakve zablude imaju početnici u programiranju. Za programere koji prakticiraju, ovi problemi su odavno riješeni, zaboravljeni ili uopće nisu primjećeni. Članak može biti od koristi ako vam iznenada zatreba pomoć nekome s ovom temom. Članak povlači paralele s materijalom iz raznih knjiga o programiranju od strane Schildta, Stroustrupa, Okulova.

Tema o ciklusima je odabrana jer je dosta ljudi isključeno iz nje prilikom savladavanja programiranja.

Ova tehnika je dizajnirana za slabe učenike. Jaki ljudi se u pravilu ne zaglavljuju na ovoj temi i za njih nema potrebe smišljati posebne tehnike. Sekundarni cilj članka je da se ova tehnika pomjeri iz razreda „radi za sve učenike, ali samo jednog nastavnika“ u razred „radi za sve učenike, sve nastavnike“. Ne tražim apsolutnu originalnost. Ako već koristite sličnu metodologiju za podučavanje ove teme, napišite po čemu se vaša verzija razlikuje. Ako se odlučite koristiti, recite nam kako je prošlo. Ako je slična tehnika opisana u knjizi, napišite naziv.


Na ovoj tehnici sam radio 4 godine, individualno učio sa studentima različitih nivoa obuke. Ukupno ima pedesetak učenika i dvije hiljade sati nastave. U početku su studenti uvijek zaglavili na ovoj temi i odlazili. Nakon svakog studenta prilagođavana je metodologija i materijali. U protekloj godini studenti se više nisu zaglavili na ovoj temi, pa sam odlučio podijeliti svoja saznanja.

Zašto toliko slova? Ciklusi su tako elementarni!

Kao što sam gore napisao, za programere koji prakticiraju i za jake studente, složenost koncepta petlji može se potcijeniti. Na primjer, možete održati dugo predavanje, vidjeti klimave glave i inteligentne oči. Ali kada se pokuša riješiti bilo koji problem, počinje omamljenost i neobjašnjivi problemi. Nakon predavanja, studenti su vjerovatno imali samo djelimično razumijevanje. Situaciju otežava i činjenica da studenti sami ne mogu da se izjasne koja je njihova zabluda.
Jednog dana sam shvatio da studenti moje primjere doživljavaju kao hijeroglife. Odnosno, poput nedjeljivih dijelova teksta u koje trebate dodati neko "magično" slovo i uspjet će.
Ponekad sam primijetio da studenti misle da je za rješavanje određenog problema potrebno nešto drugo dizajn koji jednostavno još nisam pokrio. Iako je rješenje zahtijevalo samo malu modifikaciju primjera.

Tako sam došao na ideju da fokus ne bi trebao biti na sintaksi izraza, već na ideji refaktoriranja koda koji se ponavlja pomoću petlji. Kada učenici savladaju ovu ideju, bilo koja sintaksa se može poboljšati uz malo prakse.

Ko i zašto predajem?

Pošto nema prijemnih ispita, u nastavu mogu biti uključeni i jaki i vrlo slabi učenici. Više o mojim studentima možete pročitati u članku Portret polaznika večernjeg kursa
Trudio sam se da svi koji žele da uče programiranje mogu to naučiti.
Moji časovi se održavaju individualno i učenik plaća svoj novac za svaki. Čini se da će studenti optimizirati troškove i zahtijevati minimum. Međutim, ljudi idu na časove licem u lice sa živim nastavnikom ne zbog samog znanja, već zbog samopouzdanja u ono što su naučili, zbog osjećaja napretka i odobrenja od strane stručnjaka (nastavnika). 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 dok detaljno, pa učimo, pa radimo dok, i sad imamo spremnu hiljadu i jedan noćni kurs u kojem se dva mjeseca uče samo ciklusi, a na kraju - student koji je pisao standardna biblioteka pod diktatom. Međutim, za rješavanje praktičnih problema potrebno je ne samo poznavanje materijala, već i samostalnost u njegovoj primjeni i traženju novih informacija. Stoga, za kurseve licem u lice, mislim da je ispravan princip podučavanje minimuma i podsticanje samostalnog proučavanja nijansi i srodnih tema. U temi petlje, smatram konstrukciju while minimalnom. Iz toga možete razumjeti princip. Poznavajući princip, možete savladati i za sebe i za sebe.

Da bi slabi učenici savladali gradivo, opisivanje sintakse nije dovoljno. Potrebno je dati jednostavnije, ali raznovrsnije zadatke i detaljnije opisati primjere. Konačno, brzina razvoja je ograničena sposobnošću učenika da transformiše izraze i traži obrasce. Za pametne studente, većina zadataka će biti dosadna. Kada učite s njima, ne morate insistirati na rješavanju 100% problema. Moj materijal se može pogledati na moj github. Istina, spremište je više kao grimoar čarobnjaka - niko osim mene neće razumjeti šta je gdje, a ako ne prođete provjeru, možete poludjeti

Metodologija je orijentirana na praksu

Teorija je objašnjena na primjeru rješavanja problema. Na časovima osnova programiranja gdje se podučavaju grane i petlje, jednostavno nije moguće održati korisno predavanje o jednoj temi cijeli sat. 15-20 minuta je dovoljno da se objasni koncept. Glavne poteškoće nastaju prilikom obavljanja praktičnih zadataka.
Nastavnici početnici mogu na jednom predavanju razjasniti operatore, grane, petlje i nizove. Ali njihovi učenici će se suočiti s problemom asimilacije ovih informacija.
Neophodno je ne samo ispričati materijal, već i osigurati da ga slušaoci razumiju.

Činjenica savladavanja teme zavisi od toga 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. Da bi se osiguralo samotestiranje, svaki zadatak je opisan u tabeli sa scenarijima testiranja. Zadaci imaju jasan redoslijed. Preskakanje zadataka se ne preporučuje. Ako je trenutni zadatak pretežak, onda je prelazak na sljedeći beskorisno. Još je komplikovanije. Kako bi učenik savladao trenutni složeni zadatak, na primjeru prvog zadatka objašnjava mu se nekoliko tehnika. Zapravo, cijeli sadržaj teme svodi se na tehnike za prevazilaženje poteškoća. Ciklusi su više nuspojava.

Prvi zadatak je uvijek primjer. Drugi se malo razlikuje i izvodi se „samostalno“ odmah nakon prvog pod nadzorom nastavnika. Svi naredni zadaci imaju za cilj obraćanje pažnje na razne sitnice koje mogu izazvati zablude.

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

Biću banalan i reći da je prvi primjer na temu jako važan. Ako imate materijal za obimni samostalni rad, propusti iz prvog primjera se mogu ispraviti. Ako nema ništa drugo osim primjera, onda učenik najvjerovatnije neće savladati temu.

Dok ili za?

Jedno od kontroverznih pitanja je izbor konstrukcije za primjer: dok ili za. Jednom je moj prijatelj programer praktičar 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 „sve u njemu jasno i postavljeno na svom mestu“. Međutim, osnovni uzrok poteškoća za prave početnike je ideja samog ciklusa, a ne njegovog pisanja. Ako osoba ne razumije ovu ideju, onda će imati poteškoća sa sintaksom. Čim se ideja realizuje, problemi dizajna koda nestaju sami od sebe.

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

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

Ako učenik može lako transformirati izraze, onda možete govoriti o za u prolazu. Učenik će tada izabrati ono što mu se najviše sviđa. Ako transformacije uzrokuju poteškoće, onda je bolje da ne odvlačite pažnju. Neka učenik prvo sve riješi koristeći while. Kada savladate temu petlji, možete prepisati rješenja kako biste vježbali pretvaranje while u for.
Postuvjetne petlje su prilično rijetka zvijer. Ja uopće ne trošim vrijeme na to. Ako je učenik savladao ideje identificiranja obrazaca i transformacije izraza, može to shvatiti bez moje pomoći.

Prilikom demonstriranja prvog primjera jakim učenicima, skrećem pažnju 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 završni algoritam. Moraju biti uvjereni da će im jednog dana doći težak zadatak. Da biste to riješili, morat ćete slijediti korake kao u ovom primjeru. Zato je važno snimiti sve faze. U sljedećim problemima bit će moguće ostaviti samo konačnu verziju rješenja.

Glavna ideja automatizacije je da povjeravamo kompjuteru da obavlja rutinski posao za osobu. Jedna od osnovnih tehnika je pisanje petlji. Koristi se kada je nekoliko identičnih ponavljajućih radnji napisano u programu zaredom.

Eksplicitno je bolje nego implicitno

Možda bi se činilo dobrom idejom prikazati istu frazu više puta u prvom zadatku koji se ponavlja. Na primjer:

Ura, radi!
Ura, radi!
Ura, radi!
Ura, radi!
Ura, radi!
Ura, radi!
Ura, radi!
Ura, radi!

Ova opcija je loša jer vrijednost brojača nije vidljiva u izlazu. Ovo je problem za početnike. Ne potcenjuj je. U početku je ovaj zadatak bio prvi, a zadatak izvođenja niza brojeva u rastućem redoslijedu bio je drugi. Bilo je potrebno uvesti dodatne pojmove “ciklus N puta” i “ciklus od A do B”, koji su u suštini ista stvar. Kako ne bih stvarao nepotrebne entitete, odlučio sam prikazati samo primjer s izlazom niza brojeva. Malo ljudi uspijeva naučiti kako držati brojač u glavi i modelirati ponašanje programa u glavi bez pripreme. Neki učenici se prvi put susreću s mentalnim modeliranjem na temu ciklusa.
Nakon vežbe, dajem zadatak da ponovim isti tekst koji se samostalno rješava. Ako prvo date vidljivu brojalicu, a zatim nevidljivu, učenici će imati manje problema. Ponekad je dovoljan nagoveštaj „ne piši brojač na ekranu“.

Kako drugi to objašnjavaju?

U većini obrazovnih materijala na Internetu, sintaksa ciklusa je data kao dio „predavanja“. Na primjer, na developer.mozilla.org (trenutno), nekoliko drugih konstrukcija je opisano zajedno sa while petljom. U ovom slučaju, samo su sami dizajni dati u obliku predložaka. Rezultat njihovog lansiranja je opisan riječima, ali nema ilustracije. Po mom mišljenju, ovakva prezentacija teme množi korisnost takvih materijala sa nulom. Učenik može prepisati kod i sam ga pokrenuti, ali mu je i dalje potreban standard za poređenje. Kako možete razumjeti da je primjer ispravno prepisan ako nemate s čim uporediti rezultat?
Kada se da samo šablon, bez primera, učeniku postaje još teže. Kako razumjeti da su fragmenti koda ispravno postavljeni u šablonu? Možete pokušati pisati nekako, a zatim trčite. Ali ako ne postoji standard za upoređivanje rezultata, ni pokretanje neće pomoći.

U C++ kursu o Intuitivnom, sintaksa petlje je zakopana na trećoj stranici predavanja 4 na temu “operatori”. Kada se objašnjava sintaksa petlji, poseban naglasak je stavljen na termin „operator“. Termin je predstavljen kao skup činjenica poput „simbol; ovo je izraz", "{} je složeni izraz", "tijelo petlje mora biti izraz". Ne sviđa mi se ovakav pristup jer izgleda da krije važne veze iza jednog mandata. Raščlanjivanje izvornog koda programa u termine na ovom nivou potrebno je programerima kompajlera za implementaciju jezičke specifikacije, ali ne i studentima kao prvu aproksimaciju. Novopridošlice u programiranju rijetko su dovoljno pedantne da obrate tako veliku pažnju na termine. Rijetka je osoba koja prvi put pamti i razumije nove riječi. Gotovo niko ne može ispravno primijeniti termin koji je upravo naučio. Zbog toga učenici dobijaju mnogo grešaka poput „Pisao sam while(a<7);{, ali program ne radi.”
Po mom mišljenju, na početku je bolje dati sintaksu konstrukcije odmah sa zagradama. Opciju bez zagrada treba objasniti samo ako učenik ima konkretno pitanje: „zašto nema zagrada i radi“.

U Okulovoj knjizi iz 2012. „Osnove programiranja“, uvod u petlje počinje sa for uzorkom, zatim daje preporuke za njegovu upotrebu, a zatim odmah prelazi na eksperimentalni dio lekcije. Razumijem da je knjiga pisana za onu manjinu vrlo sposobnih učenika koji rijetko dolaze na moje časove.

U popularnim knjigama, rezultat fragmenata koda je uvijek napisan. Na primjer, Shildtov “Java 8. The Complete Guide” iz 2015. godine. Prvo se daje šablon, 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 tačno 10 redova "mjera":

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

Jednom pokrenut, ovaj program daje deset "ciklusa" na sljedeći način:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Pristup opisa šablona, ​​primjera programa i rezultata programa također se koristi u knjizi “Javascript za djecu” i u js kursu na w3schools.com. Format web stranice čak omogućava da ovaj primjer bude interaktivan.

Stroustrupova knjiga iz 2016. Principi i praksa korištenja C++-a otišla je još dalje. Prvi korak je da se objasni kakav rezultat treba da se dobije, a nakon toga se prikazuje tekst programa. Štaviše, oni ne uzimaju samo nasumični program kao primjer, već daju izlet u historiju. Ovo pomaže da se skrene pažnja na to: „Vidi, ovo nije samo neki beskorisni tekst. Vidite nešto značajno."

Kao primjer iteracije, razmotrite prvi program koji se izvršava na stroju za pohranjene programe (EDSAC). Napisao ju je David Wheeler u Laboratoriji za kompjutere Univerziteta Kembridž, Engleska, 6. maja 1949. godine. Ovaj program izračunava i ispisuje jednostavnu listu kvadrata.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Ovdje svaki red sadrži broj nakon 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 obrazac sintakse nije opisan u ovoj knjizi. Stroustrup u priručniku za instruktore (prevod) naglašava da poštuje inteligenciju svojih učenika. Možda se sposobnost prepoznavanja uzorka u nekoliko primjera smatra manifestacijom takve inteligencije.

Kao što sam objasnio

Stroustrupov pristup: opisivanje rezultata, zatim rješavanje problema, a zatim nezavisna analiza od strane učenika - čini se najpromišljenijim. Stoga sam odlučio da to uzmem kao osnovu, ali da to ispričam koristeći manje istorijski primjer - zadatak izvođenja „sadržaja“. Formira prepoznatljivo sidro tako da možete reći „zapamti zadatak o sadržaju“ i da se učenici upravo toga sjete. U svom primjeru pokušao sam spriječiti još dvije najčešće zablude. U nastavku ću pisati o njima detaljnije.

U ovom zadatku upoznajemo se sa tehnikama rješavanja složenih problema. Prvobitnu odluku treba donijeti primitivno i jednostavno. Pa, onda možete razmišljati 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 i dalje dovodi do toga da učenici ciklus doživljavaju kao hijeroglif. To se očitovalo u tome što nisu razumjeli zašto postoji uslov da se tu piše, kako birati između i++ i i— i druge naizgled očigledne stvari. Da bi se izbjegle ove zablude, pristup govoru o ciklusima trebao bi naglasiti značenje ponavljanja identičnih radnji i tek onda ih formalizirati pomoću strukture. Stoga, prije nego što date sintaksu petlje, morate riješiti problem direktno. 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?
Nema ih u ovom fragmentu. Međutim, naredbe za prikazivanje riječi “Chapter” s brojem vrlo su slične jedna drugoj.
Stoga je sljedeća faza pronalaženje razlike između fragmenata. Samo u ovom zadatku je sve očito, tada se neće ponavljati pojedinačne naredbe, već blokovi koda od 5 linija ili više. Moraćete da pretražujete ne samo u listi komandi, već i u konstrukcijama grananja ili petlje.
U primjeru, razlika između naredbi je u broju iza riječi “Chapter”.
Kada se pronađe razlika, morate razumjeti obrazac promjene. Drugi fragment je broj? Da li se stalno povećava ili smanjuje? Kako se vrijednost broja mijenja između dva tima jedan pored drugog?
U primjeru, broj iza riječi “Chapter” raste u koracima od 1. Razlika je pronađena, uzorak je otkriven. Sada možete zamijeniti različiti fragment promjenljivom.
Takvu varijablu morate deklarirati prije prvog fragmenta koji se ponavlja. Takva varijabla se 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 za prikaz serije brojeva “100, 101, 102, 103, 104, 105”?
Prvi broj u ovoj seriji 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 promjenljivom, 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, dobijate nekoliko grupa identičnih radnji koje idu u nizu. Sada se ponavljajuće radnje mogu zamijeniti petljom.

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

  1. Riješite "naprijed" s mnogo zasebnih naredbi
  2. Pronađite obrazac
  3. Izrazite obrazac varijable
  4. Dizajn kao ciklus

Zatim 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 izmjena brojača.
- ograničenje - broj ili varijabla sa kojom se upoređuje brojač tako da je algoritam konačan. Vrijednost brojača se mijenja kako bi se približila granici.
— tijelo petlje — skup naredbi koje će se ponavljati. Kada kažu „naredba je napisana unutar petlje“, misle na tijelo.
— iteracija petlje — jednokratno izvršavanje tijela petlje.
— uslov petlje — logički izraz koji određuje da li će se izvršiti još jedna iteracija. (Ovdje može doći do zabune sa strukturama grananja)
Morate biti spremni na činjenicu da će učenici u početku koristiti termine u druge svrhe. Ovo se odnosi i na jake i na slabe. Uspostavljanje zajedničkog jezika je umjetnost. Sada ću ukratko napisati: potrebno je da postavite zadatak „označite fragment koda sa <term>” i sami pravilno koristite ove termine u razgovoru.
Nakon transformacije s petljom, dobije 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 stavljaju radnje unutar petlje koje treba uraditi 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 sa ovim problemom, kako na početku tako i kod složenijih problema.
Ključni savjet u ovom slučaju:

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

Naredbe za ispis riječi "Uvod" i "Zaključak" i deklariranje i inicijalizaciju varijable i nisu kao druge radnje koje se ponavljaju. Izvršavaju se samo jednom, što znači da ih treba napisati izvan tijela petlje.

Sve tri faze rješenja trebaju ostati u kodu kako biste se kasnije mogli obratiti u slučaju poteškoća. Dovoljno je prokomentarisati prve dvije opcije da se ne miješaju.
Studentu treba skrenuti pažnju na sljedeće činjenice:
— U stanju petlje obično se porede brojač i granica. Brojač se može promijeniti u tijelu petlje, ali granica 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 konsolidacije ove teme, savladavanja narednih, kao i suočavanja sa poteškoćama, korisno je čak i jakim učenicima postaviti pitanje: „Koliko puta je potrebno izvršiti ovu radnju? Jedan ili više?

Razvoj dodatnih vještina

U procesu izučavanja ciklusa studenti razvijaju i vještinu dijagnosticiranja i rješavanja problema. Za provođenje dijagnostike student treba prikazati željeni rezultat i uporediti ga sa stvarnim rezultatom. Korektivne radnje zavise od razlike između njih.
Budući da učenici u ovoj fazi još uvijek nemaju pojma o "željenom" rezultatu, mogu se fokusirati na podatke testa. Po pravilu, niko u ovoj fazi još ne razume šta može da krene po zlu i kako da se nosi sa tim. Stoga u bilježnicu zapisujem opis tipičnih problema i nekoliko načina za njihovo rješavanje. Odabir najprikladnijeg je zadatak samog učenika.
Potreban je zapis da se pita „da li se dogodilo ono što se očekivalo?“, „Koja se od ovih situacija sada dogodila?“, „Da li je primijenjeno rješenje pomoglo?“

  1. Broj akcija je 1 manji ili veći od očekivanog. rješenja:
    — povećati početnu vrijednost brojača za 1.
    — zamijenite strogi operator poređenja (< ili >) nestriktnim (<= ili >=).
    — promijenite graničnu vrijednost na 1.
  2. Radnje u petlji se izvode bez zaustavljanja, neograničeno. rješenja:
    — dodajte naredbu za promjenu brojača ako nedostaje.
    — popraviti naredbu za promjenu brojača tako da njena vrijednost postane bliža granici.
    — uklonite naredbu za promjenu ograničenja ako se nalazi u tijelu petlje.
  3. Broj akcija u petlji je više od 1 manji ili veći od očekivanog. Akcija u petlji nije izvršena ni 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 ne resetiranje brojača na nulu.

Nakon ovog objašnjenja, učenik i dalje može imati različite zablude o tome kako petlje rade.
Da razbijem one najčešće, dajem vam sljedeće zadatke:

  1. U koje korisnik unosi granicu, početnu vrijednost brojača ili korak brojača.
  2. U kojoj 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 kojoj se vrijednost brojača ne prikazuje na ekranu dok je petlja pokrenuta. Na primjer, prikazivanje potrebnog broja identičnih fragmenata teksta ili crtanje figure s grafikom kornjače.
  4. U kojoj morate prvo izvesti neke radnje koje se ponavljaju, a zatim druge.
  5. U kojoj morate izvršiti druge radnje prije i nakon ponavljanja

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

Da biste razumjeli koliko brzo se možete kretati, morate pročitati pojmove ovih problema i pitati se: „po čemu se razlikuju od primjera?“, „Šta treba promijeniti u primjeru da biste ih riješili?“ Ako učenik odgovori smisleno, neka barem jedan riješi na času, a ostalo kod kuće sam. Ako je rješenje uspješno, onda možemo početi objašnjavati uslove unutar petlji.
Ako imate problema da sami rješavate probleme, morate sve proraditi na času. Da ne biste riješili problem koji podsjeća na crtanje sove, preporučujem da prvo riješite problem 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 provjere jednom.
Zadaci za konsolidaciju će se odnositi na izlaz brojeva od A do B, koje unese korisnik:
- uvek u rastućem redosledu.
- rastuće ili opadajuće u zavisnosti od vrednosti A i B.

Temu „grananja unutar petlji“ treba preći tek nakon što učenik savlada tehnike: „zamjena uzorka promjenljivom“ 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 učenike koji su u stanju da potraže rješenje kombinovanjem jednostavnih tehnika, dovoljno je reći „grananje se može pisati unutar petlji“ i dati problem „na primjer“ u potpunosti za samostalno rješavanje.
Primjer zadatka:

Korisnik unosi broj X. Prikažite brojeve od 0 do 9 u koloni i stavite znak '+' nasuprot broja koji je jednak X.

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

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

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

Ako je uneseno 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 za isti problem bez petlje.
Dobićete jednu od dve 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+");
}

Sličan zadatak dajem unaprijed, dok proučavam temu grananja.
Ako učenik smisli “moguću” opciju, onda mu morate reći da može postojati mnogo rješenja za isti problem. Međutim, razlikuju se po 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 "željenu" dovoljno je dodati samo jednu granu.
Postavite zadatak da reproducirate "željenu" opciju, 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 petlje

U ovoj temi morate obratiti pažnju na sljedeće:
— brojači za unutrašnju i vanjsku petlju moraju biti različite varijable.
— brojač za unutrašnju petlju mora biti resetovan više puta (tj. u telu spoljne petlje).
— u zadacima za izlaz teksta ne možete prvo napisati jedno slovo u nekoliko redova, a zatim drugo. Prvo morate ispisati sva slova prvog reda, zatim sva slova drugog i tako dalje.

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

Korisnik unosi dva broja: R i T. Odštampajte dva reda znakova "#". Prvi red treba da sadrži R znakova. Drugi red sadrži T komada. Ako je bilo koji broj negativan, prikažite poruku o greš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čigledno, i ovaj problem ima najmanje 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 reda. Trebali biste insistirati na korištenju iste varijable za obje petlje. Ovo ograničenje može se opravdati činjenicom da će rješenje sa jednim brojačem za dva ciklusa biti ilustracija pojma „resetiranje brojača“. Razumevanje ovog pojma neophodno je kada se rešavaju sledeći problemi. Kao kompromis, možete sačuvati 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 redu ne odgovara vrijednosti T. Ako vam je potrebna pomoć s ovim problemom, onda morate pogledati napomene o tipičnim problemima s petljama. Ovo je simptom #3. Dijagnostikuje se ako dodate izlaz vrijednosti brojača neposredno prije drugog ciklusa. Ispravljeno resetiranjem. Ali bolje je to ne reći odmah. Učenik mora pokušati formulirati barem jednu hipotezu.

Postoji, naravno, i drugo rješenje. Ali nikada to nisam vidio među studentima. U fazi proučavanja ciklusa, priča o tome će odvratiti pažnju. Na to se možete vratiti kasnije kada nauč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:

Prikažite brojeve od 0 do 9. Svaki broj bi trebao biti u svojoj liniji. Broj cifara u redu (W) se unosi sa tastature.

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

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

Ako je učenik savladao tehniku ​​zamjene varijable, onda će se prilično brzo snaći. Mogući problem će opet biti u resetovanju varijable. Ako ne možete podnijeti transformaciju, to znači da ste bili u žurbi i trebate riješiti jednostavnije probleme.

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

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

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite semolim.

Anketa za čitaoce bez karme

  • 20,0%Predajem profesionalno, +12

  • 10,0%Predajem profesionalno, -11

  • 70,0%Ja ne predajem, +17

  • 0,0%Ja ne predajem, -10

  • 0,0%Ostalo0

Glasalo je 10 korisnika. Uzdržano je bilo 5 korisnika.

izvor: www.habr.com

Dodajte komentar