Nola irakatsi zailtasunak gainditzen, eta, aldi berean, zikloak idazten

Oinarrizko gaietako bati buruz hitz egingo dugun arren, artikulu hau esperientziadun profesionalentzat idatzita dago. Hastapenek programazioan zer uste okerrak dituzten erakustea da helburua. Garatzaile praktikatzaileentzat, arazo hauek aspaldi konpondu dira, ahaztuak edo batere nabaritu gabeak. Artikulua ondo etor daiteke bat-batean norbaiti gai honekin lagundu behar baduzu. Artikuluak paralelismoa egiten du Schildt, Stroustrup, Okuloven programazioari buruzko hainbat liburutako materialarekin.

Zikloei buruzko gaia aukeratu zen, programazioa menperatzeko orduan jende dezente kanpoan geratzen delako.

Teknika hau ikasle ahulentzat diseinatuta dago. Oro har, jende indartsua ez da gai honetan trabatuta geratzen eta ez dago haientzako teknika berezirik sortu beharrik. Artikuluaren bigarren helburua da teknika hau “ikasle guztientzat, baina irakasle bakarra” klasetik “ikasle guztientzat, irakasle guztientzat” klasera pasatzea. Ez dut erabateko originaltasuna aldarrikatzen. Gai hau irakasteko antzeko metodologia erabiltzen ari bazara, idatzi zure bertsioa nola desberdina den. Erabiltzea erabakitzen baduzu, kontatu nola joan den. Liburu batean antzeko teknika bat azaltzen bada, idatzi izena.


Teknika hau 4 urtez landu nuen, prestakuntza maila ezberdinetako ikasleekin bakarka ikasiz. Guztira, berrogeita hamar ikasle inguru eta bi mila orduko klaseak dira. Hasieran, ikasleak beti trabatu egiten ziren gai honetan eta alde egiten zuten. Ikasle bakoitzaren ondoren, metodologia eta materialak egokitu ziren. Azken urtean, ikasleak jada ez dira gai honi lotuta geratu, beraz, nire aurkikuntzak partekatzea erabaki nuen.

Zergatik hainbeste letra? Zikloak hain dira oinarrizkoak!

Goian idatzi dudan bezala, garatzaile praktikatzaileentzat eta ikasle indartsuentzat, begizten kontzeptuaren konplexutasuna gutxietsi daiteke. Esate baterako, hitzaldi luze bat eman dezakezu, buru keinuak eta begi adimentsuak ikusi. Baina edozein arazo konpontzen saiatzean, estupora eta arazo azalezinak hasten dira. Hitzaldiaren ostean, ziurrenik ikasleek ulermen partzial bat besterik ez zuten izan. Egoera larriagotu egiten da, ikasleek beraiek ezin dutelako adierazi zein den zehazki beren engainua.
Egun batean konturatu nintzen ikasleek nire adibideak hieroglifo gisa hautematen zituztela. Hau da, testu zati zatiezinak bezala, zeinetan letra "magiko" batzuk gehitu behar dituzun eta funtzionatuko du.
Batzuetan ohartu naiz ikasleek pentsatzen dutela arazo zehatz bat konpontzeko behar dela beste zerbait oraindik landu ez dudan diseinua. Irtenbideak adibidearen aldaketa txiki bat besterik ez zuen behar izan arren.

Beraz, fokua esamoldeen sintaxian egon behar ez zela pentsatu nuen, kode errepikakorra begiztak erabiliz birfaktorizatzea baizik. Ikasleek ideia hori menperatzen dutenean, edozein sintaxia hobetu daiteke praktika gutxirekin.

Nori eta zergatik irakasten dut?

Sarrera-probarik ez dagoenez, klaseetan ikasle indartsuak zein oso ahulak egon daitezke. Nire ikasleei buruzko informazio gehiago irakurri dezakezu artikuluan Arratsaldeko ikastaroko ikasleen erretratua
Programazioa ikasi nahi duten guztiek ikas dezaten ahalegindu nintzen.
Nire klaseak banaka ematen dira eta bakoitzak bere dirua ordaintzen du. Badirudi ikasleek kostuak optimizatuko dituztela eta gutxienekoa eskatuko dutela. Hala ere, jendea zuzeneko irakasle batekin klase presentzialetara joaten da ez ezagutzagatik beragatik, ikasitakoaren konfiantzagatik baizik, aurrerapen sentsazioagatik eta adituaren (irakaslea) onespenagatik. Ikasleek ikaskuntzan aurrerapenik sentitzen ez badute, alde egingo dute. Oro har, klaseak egituratu daitezke, ikasleek egitura ezagunen kopurua handitzean aurrerapena senti dezaten. Hau da, lehen aldiz ikasten dugu zehatz-mehatz, gero ikasten dugu, gero egiten dugu bitartean, eta orain mila eta bat gaueko ikastaroa dugu prest, zeinetan zikloak bakarrik ikasten diren bi hilabetez, eta amaieran - idatzi zuen ikasle bat diktatuta dagoen liburutegi estandarra. Dena den, arazo praktikoak konpontzeko, materialaren ezagutza ez ezik, bere aplikazioan eta informazio berria bilatzeko independentzia ere behar duzu. Hori dela eta, ikastaro presentzialetarako, printzipio zuzena gutxienekoak irakastea eta ñabardurak eta erlazionatutako gaien azterketa independentea sustatzea dela uste dut. Loops gaian, while konstrukzioa gutxienekotzat hartzen dut. Printzipioa bertatik uler dezakezu. Printzipioa ezagututa, zuk zeuk menpera dezakezu biak eta egin bitartean.

Ikasle ahulek materiala menperatzea lortzeko, sintaxia deskribatzea ez da nahikoa. Beharrezkoa da zeregin sinpleagoak baina askotarikoagoak ematea eta adibideak zehatzago deskribatzea. Azken batean, garapen-abiadura ikasleak adierazpenak eraldatzeko eta ereduak bilatzeko duen gaitasunak mugatzen du. Ikasle adimentsuentzat, zeregin gehienak aspergarriak izango dira. Haiekin ikasten duzunean, ez duzu arazoen %100 konpontzen tematu behar. Nire materiala hemen ikus daiteke nire github. Egia da, biltegia sorgin baten grimorioa baino gehiago da - nik ez ezik inork ez du ulertuko non dagoen, eta egiaztapena huts egiten baduzu, erotu zaitezke.

Metodologia praktikara bideratuta dago

Teoria problema bat ebazteko adibidea erabiliz azaltzen da. Adarrak eta begiztak irakasten diren programazioaren oinarrizko klase batean, ezinezkoa da ordu osoan gai bati buruzko hitzaldi baliagarri bat ematea. 15-20 minutu nahikoa dira kontzeptua azaltzeko. Zailtasun nagusiak zeregin praktikoak egitean sortzen dira.
Hastapeneko irakasleek operadoreak, adarrak, begiztak eta arrayak sakatu ditzakete hitzaldi batean. Baina haien ikasleek informazio hori asimilatzeko arazoa izango dute.
Materiala kontatzeaz gain, entzuleek ulertzen dutela ziurtatu behar da.

Gai bat menperatzea ikasleak lan independenteari nola aurre egiten dion arabera zehazten da.
Ikasle batek gai bati buruzko arazo bat irakasle baten laguntzarik gabe konpontzea lortzen badu, orduan gaia menperatu da. Auto-probak ziurtatzeko, zeregin bakoitza proba-egoerak dituen taula batean deskribatzen da. Zereginek ordena argia dute. Ez da gomendagarria zereginak saltea. Oraingo zeregina oso zaila bada, hurrengora pasatzea alferrikakoa da. Are konplikatuagoa da. Ikasleak egungo zeregin konplexua menperatu dezan, hainbat teknika azaltzen zaizkio lehenengo problemaren adibidea erabiliz. Izan ere, gaiaren eduki osoa zailtasunak gainditzeko tekniketara dator. Zikloak bigarren mailako efektu bat gehiago dira.

Lehenengo zeregina adibide bat da beti. Bigarrena apur bat desberdina da eta "independenteki" egiten da lehenengoaren ondoren, irakasle baten gainbegiratuta. Ondorengo zeregin guztiak uste okerrak sor ditzaketen hainbat gauza txikiri arreta eskaintzera zuzenduta daude.

Adibidearen azalpena elkarrizketa bat da, non ikasleak hedapenari eta baliozkotze gurutzatua deitu behar dion materialaren zati bat menderatu duela ziurtatzeko.

Hutsala izango naiz eta esango dut gaiari buruzko lehen adibidea oso garrantzitsua dela. Lan independente zabalerako materiala baduzu, lehen adibidearen hutsuneak zuzendu daitezke. Adibideaz gain beste ezer ez badago, ikaslea ziurrenik ez du gaia menperatuko.

Bitartean ala?

Gai polemikoetako bat adibiderako eraikuntza aukeratzea da: bitartean edo for. Behin, irakaskuntza-esperientziarik gabeko nire garatzaile lankide batek ordubete eman ninduen konbentzitzen for begizta zela ulertzen errazena. Argudioak "dena argi dago eta bere lekuan ezarrita" daude. Hala ere, benetako hasiberrientzako zailtasunen arrazoia zikloaren beraren ideia da, eta ez bere idazkera. Pertsona batek ideia hau ulertzen ez badu, zailtasunak izango ditu sintaxiarekin. Ideia gauzatu bezain laster, kodearen diseinuaren arazoak bere kabuz desagertzen dira.

Nire materialetan, begizten gaiak adarkatzearen gaiari jarraitzen dio. If eta while-en kanpoko antzekotasunak analogia zuzena egiteko aukera ematen digu: "goiburuko baldintza egiazkoa denean, gorputza exekutatzen da". Zikloaren berezitasun bakarra gorputza askotan exekutatzen dela da.

Nire bigarren argudioa da, while for-ek baino formatu gutxiago behar duela. Formatu gutxiago egiteak akats ergel gutxiago esan nahi du koma eta parentesiak falta direnean. Hasiberriek ez dute oraindik sintaxi akatsak automatikoki saihesteko behar adinako arreta eta zorroztasun garatu.
Hirugarren argumentua liburu on askotan azaltzen da lehenengo argumentu gisa.

Ikasleak esamoldeak erraz eraldatzen baditu, orduan buruz hitz egin dezakezu. Ondoren, ikasleak gehien gustatzen zaiona aukeratuko du. Eraldaketak zailtasunak eragiten badituzte, hobe da arreta ez desbideratzea. Utzi ikasleari dena ebazten lehenik while erabiliz. Begizken gaia menperatzen duzunean, konponbideak berridatzi ditzakezu while to for bihurtzeko.
Baldintza osteko begiztak nahiko piztia arraroak dira. Ez dut batere denborarik ematen. Ikasle batek ereduak identifikatzeko eta esamoldeak eraldatzeko ideiak menperatzen baditu, nire laguntzarik gabe asmatu dezake.

Ikasle indartsuei lehen adibidea erakusterakoan, arreta jartzen dut lehen adibidean konponbidea ez ezik, emaitza ekarri duten ekintzen kate osoa ere grabatzea garrantzitsua dela. Ikasle alferrak idatzia alde batera utzi eta azken algoritmoa soilik kopiatu dezakete. Sinetsi behar dute egunen batean lan zaila etorriko zaiela. Hori konpontzeko, adibide honetan bezala urratsak jarraitu beharko dituzu. Horregatik garrantzitsua da etapa guztiak grabatzea. Ondorengo arazoetan irtenbidearen azken bertsioa bakarrik uztea posible izango da.

Automatizazioaren ideia nagusia ordenagailu bati pertsona bati ohiko lanak egitea da. Oinarrizko tekniketako bat begiztak idaztea da. Programa batean errenkadan errepikatzen diren hainbat ekintza berdin idazten direnean erabiltzen da.

Esplizitua hobe da inplizitua baino

Ideia ona dirudi esaldi bera behin baino gehiagotan bistaratzea lehenengo looping-atazan. Adibidez:

Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!
Aupa, funtzionatzen du!

Aukera hau txarra da, kontagailuaren balioa irteeran ikusten ez delako. Hau hasiberrientzako arazoa da. Ez gutxietsi. Hasieran, zeregin hori izan zen lehena, eta zenbaki sorta bat goranzko ordenan ateratzea bigarrena. Beharrezkoa zen "zikloa N aldiz" eta "zikloa A-tik B-ra" termino gehigarriak sartu, funtsean gauza bera direnak. Alferrikako entitateak ez sortzeko, zenbaki sorta baten irteerarekin adibide bat soilik erakustea erabaki nuen. Inor gutxik lortzen du kontagailua buruan nola eusten eta programa baten jokabidea buruan modelatzen ikastea prestatu gabe. Ikasle batzuek lehen aldiz zikloen gaiari buruzko eredu mentala egiten dute topo.
Praktikatu ondoren, testu bera errepikatzeko zeregina ematen dut modu independentean ebazteko. Lehenengo kontagailu ikusgai bat eta gero ikusezin bat ematen baduzu, ikasleek arazo gutxiago izango dituzte. Batzuetan, nahikoa da "ez idatzi kontagailua pantailan" iradokizuna.

Nola azaltzen dute besteek?

Interneten dauden hezkuntza-material gehienetan, zikloaren sintaxia “hitzaldi” baten barruan ematen da. Adibidez, developer.mozilla.org webgunean (gaur egun), beste hainbat eraikuntza deskribatzen dira while begiztarekin batera. Kasu honetan, diseinuak beraiek bakarrik ematen dira txantiloi moduan. Beren abiaraztearen emaitza hitzez deskribatzen da, baina ez dago ilustraziorik. Nire ustez, gaiaren aurkezpenak halako materialen erabilgarritasuna zeroz biderkatzen du. Ikasleak kodea berridatzi eta berak exekutatu dezake, baina oraindik estandar bat behar du alderatzeko. Nola uler dezakezu adibide bat behar bezala berridatzi izana emaitza konparatzeko ezer ez badago?
Txantiloi bat bakarrik ematen denean, adibiderik gabe, are zailagoa egiten zaio ikasleari. Nola ulertu kode zatiak txantiloian behar bezala jarrita daudela? Saia zaitezke idazten nolabait, eta gero exekutatu. Baina emaitza konparatzeko estandarrik ez badago, abiarazteak ere ez du lagunduko.

Intuitiboari buruzko C++ ikastaroan, begizta sintaxia lurperatuta dago 4. hitzaldiko hirugarren orrialdean “eragileak” gaiari buruz. Begizten sintaxia azaltzerakoan, arreta berezia jartzen zaio "operadore" terminoari. Terminoa “sinboloa; hau sententzia bat da", "{} adierazpen konposatua da", "begiztaren gorputzak adierazpen bat izan behar du". Ez zait gustatzen ikuspegi hau termino baten atzean harreman garrantzitsuak ezkutatzen dituelako. Programa baten iturburu-kodea maila honetako terminoetan analizatzea hizkuntzaren espezifikazioa ezartzeko konpiladoreen garatzaileek behar dute, baina ez ikasleek lehen hurbilpen gisa. Programaziora etorri berriak oso gutxitan dira aski zorrotzak terminoei hain arreta eskaintzeko. Pertsona arraroa da lehen aldiz hitz berriak gogoratzen eta ulertzen dituena. Ia inork ezin du behar bezala aplikatu ikasi berri duen termino bat. Hori dela eta, ikasleek akats asko jasotzen dituzte, adibidez, "Why write(a<7);{, baina programak ez du funtzionatzen".
Nire ustez, hasieran hobe da eraikuntzaren sintaxia berehala parentesiekin ematea. Parentesirik gabeko aukera ikasleak galdera zehatz bat badu soilik azaldu behar da: "zergatik ez dago parentesirik eta funtzionatzen du".

Okulov-en 2012ko "Programazioaren oinarriak" liburuan, begizten sarrera bat for ereduarekin hasten da, gero erabilerarako gomendioak ematen ditu eta berehala ikasgaiaren atal esperimentalera joaten da. Ulertzen dut liburua nire klaseetara oso gutxitan etortzen diren ikasle oso gaitasunen gutxiengo horrentzat idatzi zela.

Herri liburuetan, kode zatien emaitza beti idazten da. Adibidez, Shildten "Java 8. The Complete Guide" 2015 edizioa. Lehenik eta behin, txantiloi bat ematen da, ondoren programa adibide bat eta berehala - exekuzioaren emaitza.

Adibide gisa, kontuan hartu alderantzizkoa egiten duen while begizta bat
10etik aurrera atzerako kontaketa, eta zehazki 10 "neurri" lerro bistaratzen dira:

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

Exekutatu ondoren, programa honek hamar "ziklo" ateratzen ditu honela:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Txantiloi bat, programa adibide bat eta programaren emaitza deskribatzeko planteamendua "Javascript for Kids" liburuan eta w3schools.com-eko js ikastaroan ere erabiltzen da. Web-orriaren formatuak adibide hau interaktiboa izatea ahalbidetzen du.

Stroustrup-en 2016ko Principles and Practice Using C++ liburua are urrunago joan zen. Lehen urratsa zer emaitza lortu behar den azaltzea da, eta horren ostean programaren testua erakusten da. Gainera, ausazko programa bat ez ezik, historiara txango bat ematen dute adibide gisa. Horrek arreta pizten laguntzen du: «Begira, hau ez da alferrikako testu bat. Zerbait esanguratsua ikusten duzu».

Iterazio adibide gisa, kontuan hartu gordetako programa-makina batean (EDSAC) exekutatutako lehen programa. David Wheeler-ek idatzi zuen Ingalaterrako Cambridge Unibertsitateko Computer Laboratory-n 6ko maiatzaren 1949an. Programa honek karratuen zerrenda sinple bat kalkulatzen eta inprimatzen du.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Hemen, lerro bakoitzak zenbaki bat dauka, ondoren tabulazio karaktere bat ('t') eta zenbaki horren karratua. Programa honen C++ bertsioak itxura hau du:

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

Interesgarria da liburu honetan sintaxi eredua ez dela azaltzen. Stroustrup irakaslearen eskuliburuan (itzulpen) ikasleen adimena errespetatzen duela azpimarratzen du. Agian hainbat adibidetan eredu bat identifikatzeko gaitasuna adimen horren adierazgarritzat hartzen da.

Nire burua azaltzen dudanez

Stroustrup-en planteamendua: emaitza deskribatzea, gero arazoa konpontzea eta, ondoren, ikaslearen azterketa independentea - pentsakorrena dirudi. Hori dela eta, oinarritzat hartzea erabaki nuen, baina kontatzea adibide ez hain historiko bat erabiliz: "aurkibidea" ateratzeko zeregina. Aingura ezagugarri bat osatzen du, gero "gogoratu aurkibideari buruzko zeregina" esan dezazun eta ikasleek hori zehazki gogora dezaten. Nire adibidean, ohikoenak diren beste bi uste oker saihesten saiatu naiz. Jarraian, zehatzago idatziko dut haiei buruz.

Zeregin honetan problema konplexuak ebazteko teknikak aurkezten zaizkigu. Hasierako erabakia primitiboa eta sinplea izan behar da. Beno, orduan irtenbide hau nola hobetu pentsa dezakezu.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Nire behaketen arabera, hainbat konbinaziotan "txantiloi-adibidea-emaitza" ikuspegiak oraindik ere ikasleek zikloa hieroglifo gisa hautematea dakar. Horrek agerian utzi zuen ez zutela ulertzen zergatik zegoen baldintza bat han idazteko, nola aukeratu i++ eta i- eta itxuraz agerikoak ziren beste gauza batzuk. Uste oker horiek saihesteko, zikloei buruz hitz egiteko planteamenduak ekintza berdinak errepikatzearen esanahia azpimarratu behar du eta, ondoren, egitura bat erabiliz formalizatzea. Horregatik, begizta sintaxia eman aurretik, arazoa aurrez aurre konpondu behar duzu. Aurkibidearen arazoaren irtenbide primitibo bat honelakoa da:

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

Nola hobetu daiteke?
Ordeztu ekintza monotonoak ziklo batekin.
Zein ekintza errepikatzen dira segidan aldaketarik gabe?
Zati honetan ez dago inor. Hala ere, "Kapitulua" hitza zenbaki batekin bistaratzeko komandoak oso antzekoak dira elkarren artean.
Beraz, hurrengo etapa zatien arteko aldea aurkitzea da. Zeregin honetan dena begi-bistakoa da, orduan ez dira komando bakarrak errepikatuko, 5 lerro edo gehiagoko kode blokeak baizik. Komandoen zerrendan ez ezik, adarkatze edo begizta eraikuntzan bilatu beharko duzu.
Adibidean, komandoen arteko aldea "Kapitulu" hitzaren ondorengo zenbakian dago.
Desberdintasuna aurkitu ondoren, aldaketaren eredua ulertu behar duzu. Zati ezberdina zenbakia da? Etengabe handitzen al da gutxitzen? Nola aldatzen da zenbaki baten balioa bi talde elkarren artean?
Adibidean, "Kapitulua" hitzaren ondorengo zenbakia 1eko gehikuntzan handitzen da. Aldea aurkitzen da, eredua agerian geratzen da. Orain zati ezberdina aldagai batekin ordez dezakezu.
Aldagai hori errepikatzen den zatien lehena baino lehen adierazi behar duzu. Aldagai hori normalean I edo j edo zerbait zehatzagoa deitzen da. Bere hasierako balioa pantailan bistaratzen den lehen balioaren berdina izan behar du. Adibidean, lehenengo balioa 1 da.
Zein hasierako balio hartu behar da “100, 101, 102, 103, 104, 105” zenbaki-seriea bistaratzeko?
Serie honetako lehen zenbakia 100 da.
Irteerako komando bakoitzaren ondoren, aldagai honen balioa 1ean handitu behar duzu. Unitate hau aldaketa urratsa da.
Zein urrats izango da “100, 102, 104, 106” zenbakien seriean?
2. urratsa ilara honetan.
Zati ezberdina aldagai batekin ordezkatu ondoren, kodea honela izango da:

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

Kodean "adierazi aldagai baten eredua" teknika aplikatu ondoren, segidan doazen ekintza berdinen hainbat talde lortzen dituzu. Orain errepikatzen diren ekintzak ziklo batekin ordezka daitezke.

Begiztak erabili behar dituzun arazo bat ebazteko sekuentzia urrats hauek ditu:

  1. Ebatzi "buruz" komando bereizi askorekin
  2. Aurkitu eredu bat
  3. Adierazi aldagai baten eredua
  4. Antolatu ziklo gisa

Ondoren, termino berriak sartzen dira, ikaslea "dena ulertzen dut, baina ezin dut esan" egoeran aurkitzen ez dadin:
— Kontadorea beti da begizta bateko pauso kopurua jarraitzeko behar den aldagaia. Normalean mugarekin alderatzen den zenbaki oso bat.
— counter step — kontagailu aldaketen ereduaren deskribapena.
- murriztapena - zenbagailua konparatzen den zenbaki edo aldagai bat, algoritmoa behin betikoa izan dadin. Kontadorearen balioa aldatzen da mugara hurbiltzeko.
— begizta gorputza — errepikatuko den komando multzoa. "Komandoa begizta baten barruan idatzita dago" esaten dutenean, gorputza esan nahi dute.
— begizta iterazioa — begizta gorputzaren behin-behineko exekuzioa.
— begizta baldintza — beste iterazio bat exekutatuko den ala ez zehazten duen adierazpen logikoa. (Adarkatze-egiturekin nahasmena egon daiteke hemen)
Prest egon behar duzu hasieran ikasleek terminoak beste helburu batzuetarako erabiliko dituztelako. Hau indartsu zein ahulei aplikatzen zaie. Hizkuntza komun bat ezartzea arte bat da. Orain laburki idatziko dut: "nabarmendu kode zatia <termino>-rekin" zeregina ezarri behar duzu eta zuk zeuk erabili behar dituzu termino hauek elkarrizketan.
Begizta batekin eraldatu ondoren, zatia lortzen da:

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

Uste oker nagusia

Ikasleen artean uste oker bat da ekintzak behin bakarrik egin beharreko begizta baten barruan kokatzen dituztela. Adibidez, honela:

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

Ikasleek arazo honekin topo egiten dute denbora guztian, bai hasieran bai arazo konplexuagoetan.
Kasu honetan funtsezko aholkua:

Zenbat aldiz errepikatu behar duzu agindua: behin edo askotan?

"Sarrera" eta "Ondorioa" hitzak inprimatzeko eta i aldagaia deklaratzeko eta hasieratzeko komandoak ez dira beste ekintza errepikakorrak bezalakoak. Behin bakarrik exekutatzen dira, hau da, begizta gorputzetik kanpo idatzi behar dira.

Konponbidearen hiru faseak kodean geratu behar dira, zailtasunak izanez gero geroago haietara jotzeko. Nahikoa da lehenengo bi aukerak iruzkintzea oztopatu ez dezaten.
Ikaslearen arreta honako gertakari hauetara deitu behar da:
— Begizta egoeran, kontagailu bat eta muga bat alderatu ohi dira. Kontagailua begiztaren gorputzean alda daiteke, baina muga ezin. Arau hau hausteko, arrazoi sinesgarriak azaldu behar dituzu.
— "Sarrera" eta "Ondorioa" hitzak bistaratzeko komandoak begiztaren gorputzetik kanpo daude. 1 aldiz egin behar ditugu. "Sarrera" - ekintzak errepikatu aurretik, "Ondorioa" - ondoren.
Gai hau finkatzeko prozesuan, hurrengoak menperatzeaz gain, zailtasunei aurre egiteko, baliagarria da ikasle indartsuentzat ere galdera hau egitea: “Zenbat aldiz egin behar da ekintza hau? Bat ala asko?

Gaitasun osagarrien garapena

Zikloak ikasteko prozesuan, ikasleek arazoak diagnostikatzeko eta ebazteko trebetasuna ere garatzen dute. Diagnostikoak egiteko, ikasleak nahi duen emaitza aurkeztu eta benetako emaitzarekin alderatu behar du. Ekintza zuzentzaileak haien arteko desberdintasunaren araberakoak dira.
Etapa honetako ikasleek oraindik "nahi den" emaitzaren ideia gutxi dutenez, probaren datuetan zentratu daitezke. Oro har, fase honetan inork ez du ulertzen zer oker egon daitekeen eta nola aurre egin. Horregatik, koaderno batean arazo tipikoen deskribapena eta horiek konpontzeko hainbat modu idazten ditut. Egokiena aukeratzea ikaslearen beraren egitekoa da.
Erregistro bat behar da galdetzeko "espero zena gertatu al zen?", "Egoera hauetako zein gertatu zen orain?", "Aplikaturiko irtenbideak lagundu al du?"

  1. Ekintza kopurua espero baino 1 txikiagoa edo handiagoa da. Irtenbideak:
    — handitu kontagailuaren hasierako balioa 1.
    — ordezkatu konparazio-operadore zorrotza (< edo >) zorrotza ez den batekin (<= edo >=).
    — Aldatu muga-balioa 1era.
  2. Begizta bateko ekintzak gelditu gabe egiten dira, mugagabean. Irtenbideak:
    — gehitu kontagailua aldatzeko komandoa falta bada.
    — konpondu kontagailua aldatzeko komandoa, bere balioa mugara hurbildu dadin.
    — kendu mugak aldatzeko komandoa begiztaren gorputzean badago.
  3. Begizta bateko ekintza kopurua espero baino 1 baino gehiago edo txikiagoa da. Begiztako ekintza ez da behin ere exekutatu. Lehenik eta behin aldagaien benetako balioak ezagutu behar dituzu begizta hasi baino lehen. Irtenbideak:
    — mugaren hasierako balioa aldatzea
    — Kontagailuaren hasierako balioa aldatu

3. arazoak normalean aldagai okerra erabiltzea edo kontagailua zerora ez berrezartzea dakar.

Azalpen honen ondoren, ikasleak begiztak nola funtzionatzen duenari buruzko hainbat uste oker izan ditzake oraindik.
Ohikoenak uxatzeko, zeregin hauek ematen dizkizut:

  1. Muga, hasierako kontagailuaren balioa edo kontagailuaren urratsa erabiltzaileak sartzen dituenean.
  2. Bertan kontagailuaren balioa adierazpen aritmetikoren batean erabili behar da. Adierazpen erradikalean edo izendatzailean kontagailua erabiltzea komeni da, aldea ez-lineala izan dadin.
  3. Non kontagailuaren balioa pantailan bistaratzen ez den begizta martxan dagoen bitartean. Adibidez, testu-zati berdinen behar den kopurua bistaratzea edo irudi bat marraztea dortoka grafikoekin.
  4. Bertan, lehenengo ekintza errepikakorrak egin behar dituzu, eta gero beste batzuk.
  5. Errepikatu aurretik eta ondoren beste ekintza batzuk egin behar dituzu

Zeregin bakoitzerako proba-datuak eta espero den emaitza eman behar dituzu.

Zein azkar mugi zaitezkeen ulertzeko, arazo hauen baldintzak irakurri behar dituzu eta galdetu: "nola desberdintzen dira adibidetik?", "Zer aldatu behar da adibidean horiek konpontzeko?" Ikasleak esanguratsu erantzuten badu, utzi gutxienez bat ebazten klasean, eta gainerakoak bere kabuz etxean. Irtenbidea arrakastatsua bada, begizten barruko baldintzak azaltzen has gaitezke.
Arazoak zure kabuz konpontzeko arazoak badituzu, klasean dena landu behar duzu. Arazoa konpontzea hontza marraztea gogorarazten ez dezan, lehenik eta behin arazoa modu ez-unibertsalean konpontzea gomendatzen dut. Hau da, soluzioak lehenengo proba gaindi dezan eta begizta eraikuntza ez dezan erabili. Tira, orduan aplikatu eraldaketak irtenbidearen unibertsaltasuna lortzeko.

Begiztak eta adarrak

Nire ustez, komenigarria da gaia “zikloak adarretan” bereizita ematea. Beraz, geroago baldintza bat hainbat aldiz egiaztatzearen eta behin egiaztatzearen arteko aldea ikus dezakezu.
Finkatzeko zereginak A-tik B-ra zenbakiak ateratzea izango dira, erabiltzaileak sartzen dituenak:
- beti goranzko ordenan.
- goranzkoa edo beherakorra A eta B balioen arabera.

Ikasleak teknikak menperatu ondoren bakarrik mugitu behar da "adarkada-begiztan" gaia: "Eredu bat aldagai batekin ordezkatzea" eta "Ekintza errepikakorrak ziklo batekin ordezkatzea".
Adarrak begizten barruan erabiltzeko arrazoi nagusia ereduaren anomaliak dira. Erdian hasierako datuen arabera apurtzen da.
Teknika errazak konbinatuz irtenbide bat bilatzeko gai diren ikasleentzat, nahikoa da "adarkadura begizten barruan idatzi daiteke" esatea eta arazoa "adibidez" ematea guztiz independentean ebazteko.
Zeregin adibidea:

Erabiltzaileak X zenbakia sartzen du. Erakutsi 0tik 9rako zenbakiak zutabe batean eta jarri '+' ikurra X-ren berdina den zenbakiaren parean.

0 sartu bazen0+
1
2
3
4
5
6
7
8
9

6 sartu bazen0
1
2
3
4
5
6+
7
8
9

9 sartu bazen0
1
2
3
4
5
6
7
8
9+

777 sartu bazen0
1
2
3
4
5
6
7
8
9

Azalpen labur bat begizta batekin idazteko nahikoa ez bada, orduan arazo beraren irtenbide unibertsala lortu behar duzu begiztarik gabe.
Bi aukera hauetako bat izango duzu:
Desiratua

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

Posible

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

Antzeko zeregina ematen dut aldez aurretik, adarkatzearen gaia aztertzen ari naizen bitartean.
Ikasleak aukera "posible" bat planteatzen badu, arazo beraren konponbide asko egon daitezkeela esan behar diozu. Hala ere, eskakizunen aldaketekiko erresistentzian desberdinak dira. Egin galdera: "Kodeko zenbat leku zuzendu beharko lirateke beste zenbaki bat gehitu beharko banu?" Bertsio "posiblean", beste adar bat gehitu eta beste 10 lekutan zenbaki berri bat gehitu beharko duzu. "Nahi"-an nahikoa da adar bakarra gehitzea.
Ezarri zeregina "nahi den" aukera erreproduzitzeko, eta, ondoren, bilatu eredu bat kodean, egin aldagaien ordezkapena eta idatzi begizta bat.
Arazo hau begiztarik gabe beste modu batean konpontzeko ideiarik baduzu, idatzi iruzkinetan.

Loops barruan Loops

Gai honetan honako hauei arreta jarri behar diezu:
— Barneko eta kanpoko begiztetako kontagailuek aldagai desberdinak izan behar dute.
— barneko begiztaren kontadorea hainbat aldiz berrezarri behar da (hau da, kanpoko begiztaren gorputzean).
— Testua ateratzeko atazetan, ezin duzu lehenengo letra bat idatzi hainbat lerrotan, eta gero bigarrena. Lehenengo lerroko letra guztiak inprimatu behar dituzu, gero bigarrenaren letra guztiak, eta abar.

Hobe da begizten gaia begizten barruan azaltzen hastea kontagailua zerora berrezartzearen garrantzia azalduz.
Zeregin adibidea:

Erabiltzaileak bi zenbaki sartzen ditu: R eta T. "#" karaktereen bi lerro inprimatu. Lehen lerroak R karaktereak izan behar ditu. Bigarren lerroak T piezak ditu. Zenbakiren bat negatiboa bada, erakutsi errore-mezu bat.

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

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

R=-1, T=6R balioak ez-negatiboa izan behar du

R=6, T=-2T balioak ez-negatiboa izan behar du

Jakina, arazo honek ere bi irtenbide ditu gutxienez.
Desiratua

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

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

Desberdintasuna da "posible" irtenbidean bigarren aldagai bat erabili zela bigarren lerroa ateratzeko. Bi begiztetarako aldagai bera erabiltzen tematu beharko zenuke. Muga hori justifika daiteke bi zikloetarako kontagailu bat duen soluzioa "kontagailua berrezarri" terminoaren ilustrazioa izango dela. Termino hau ulertzea beharrezkoa da ondorengo problemak ebazteko. Konpromiso gisa, arazoaren bi irtenbideak gorde ditzakezu.

Bi begiztetarako kontagailu-aldagai bat erabiltzearen ohiko arazo bat honela agertzen da:
R=5, T=11#####
######

Bigarren lerroko karaktere kopurua ez dator bat T-ren balioarekin. Arazo honekin laguntza behar baduzu, begiztekin ohiko arazoei buruzko oharrak aztertu behar dituzu. Hau #3 sintoma da. Bigarren zikloaren aurretik kontagailu-balioaren irteera gehitzen baduzu diagnostikatzen da. Berrezarriz zuzenduta. Baina hobe da hau berehala ez kontatzea. Ikaslea gutxienez hipotesi bat formulatzen saiatu behar da.

Bada, noski, beste irtenbide bat. Baina ez dut inoiz ikusi ikasleen artean. Zikloak ikasteko etapan, horri buruzko istorioak arreta kenduko du. Gerora itzuli zaitezke kate-funtzioei buruz ikasten duzunean.
Posiblea #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));

Beharrezko hurrengo zeregina:

Bistaratu 0tik 9rako zenbakiak. Zenbaki bakoitzak bere lerroan egon behar du. Lerro bateko zifra kopurua (W) teklatutik sartzen da.

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

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

Ikasle batek aldagai bat ordezkatzeko teknika menperatzen badu, orduan nahiko azkar egingo du aurre. Arazo posible bat aldagaia berrezartzean izango da berriro. Ezin baduzu eraldaketa kudeatu, presaka zeundela eta arazo sinpleagoak konpondu behar dituzula esan nahi du.

Eskerrik asko zure arretagatik. Atsegin dut eta harpidetu kanalera.

PS Testuan akatsak edo akatsak aurkitzen badituzu, mesedez, jakinarazi iezadazu. Testuaren zati bat hautatu eta Mac-en "⌘ + Sartu" eta "Ctrl / Sartu" sakatuta egin daiteke teklatu klasikoetan edo mezu pribatuen bidez. Aukera hauek erabilgarri ez badira, idatzi akatsei buruz iruzkinetan. Eskerrik asko!

Erregistratutako erabiltzaileek soilik parte hartu dezakete inkestan. Hasi saioa, mesedez.

Karmarik gabeko irakurleentzako inkesta

  • 20,0%Profesionalki irakasten dut, +12

  • 10,0%Profesionalki irakasten dut, -11

  • 70,0%Ez dut irakasten, +17

  • 0,0%Ez dut irakasten, -10

  • 0,0%Besteak0

10 erabiltzailek eman dute botoa. 5 erabiltzaile abstenitu ziren.

Iturria: www.habr.com

Gehitu iruzkin berria