Megjithëse do të flitet për një nga temat bazë, ky artikull është shkruar për profesionistë të përvojshëm. Qëllimi është të tregojë se cilat keqkuptime ka fillestarët në programim. Për zhvilluesit praktikë, këto probleme tashmë janë zgjidhur, janë harruar ose nuk janë vënë re fare. Artikulli mund të jetë i dobishëm, nëse ndonjëherë ju duhet të ndihmoni dikë me këtë temë. Në artikull, bëhen paralelë me materialin e librave të ndryshëm në programim, autorët e të cilëve janë Schildt, Stroustrup, Okulov.
Tema për ciklet është zgjedhur për shkak se aty përzgjidhen mjaft njerëz në mësimin e programimit.
Kjo metodë është e orientuar për studentët e dobët. Si rregull, ata të fortë nuk mbeten në këtë temë dhe nuk ka nevojë të shpikim metoda të veçanta për ta. Qëllimi dytësor i artikullit është të kalojmë këtë metodë nga kategoria "funksionon për të gjithë studentët, por vetëm me një mësues" në kategorinë "funksionon për të gjithë studentët, të gjithë mësuesit". Nuk pretendoj për origjinalitet absolut. Nëse tashmë aplikoni një metodë të ngjashme për mësimin e kësaj teme, ju lutem shkruani se çfarë e bën variantin tuaj të ndryshëm. Nëse vendosni ta aplikoni, na tregoni si shkoi gjithçka. Nëse një metodë e ngjashme përshkruhet në ndonjë libër, ju lutem shkruani titullin.
Këtë metodë e kam zhvilluar për 4 vjet, duke punuar individualisht me studentë të niveleve të ndryshme. Në total rreth pesëdhjetë studentë dhe dy mijë orë mësimi. Në fillim, në këtë temë studentët ngecnin dhe largoheshin. Pas çdo studenti, metoda dhe materialet janë korrigjuar. Vitin e fundit, studentët tashmë nuk ngecin në këtë temë, kështu që vendosa të ndaj përvojat.
Pse ka kaq shumë shkronja? Ciklet janë elementare!
Siç e kam përmendur më lart, për zhvilluesit praktikë dhe për studentët e fortë, kompleksiteti i konceptit të cikleve mund të nënvlerësohet. Për shembull, mund të organizohet një ligjëratë e gjatë, të shihet kokat që lëvizin dhe sytë që duken inteligjentë. Por kur përpiqen të zgjidhin ndonjë problem, fillon ngërçi dhe probleme të paqartë. Pas ligjëratës, studentët me siguri kanë krijuar vetëm një përmbledhje të pjesshme të kuptimit. Situata përkeqësohet nga fakti se studentët nuk mund të shprehin vetë se në çfarë saktësisht është përllogaritja e tyre.
Njëherë kuptova se studentët e shihnin shembujt e mi si hieroglife. Pra, si copa të pandara teksti, në të cilat duhej të shtohej ndonjë shkronjë "magjike" dhe do të funksiononte.
Herë pas here kam vënë re se studentët mendojnë se për zgjidhjen e një problemi të caktuar nevojitet ndonjë konstrukcion tjetër që unë thjesht nuk kam përmendur akoma. Megjithatë, për zgjidhjen e tij mjaftonte të modifikohej pak shembulli.
Prandaj arrita në idenë se duhej të fokusohem jo në sintaksën e shprehjeve, por në idenë e refaktorizimit të kodit të përsëritur përmes cikleve. Sapo nxënësit e kuptojnë këtë ide, çdo sintaksë mësohet përmes disa ushtrimeve të vogla.
Kush dhe pse iu jap mësim
Duke qenë se nuk ka provime hyrëse, në mësime mund të ketë studentë të fortë, por edhe shumë të dobët. Më shumë rreth studentëve të mi mund të lexoni në artikullin
Unë kam dëshirë që programimi të mësohet nga të gjithë ata që e duan.
Mësimet e mia zhvillohen individualisht dhe studenti paguan për çdo sesion. Mund të duket se studentët do të optimizojnë shpenzimet dhe do të kërkojnë minimumin. Megjithatë, njerëzit ndjekin mësime në prani të një mësuesi të drejtpërdrejtë jo për njohuritë vetë, por për sigurinë se ata e kanë kuptuar në mënyrë të sigurt, për ndjenjën e përparimit dhe për miratimin nga eksperti (mësuesi). Nëse studentët nuk ndjejnë përparim në mësimin e tyre, ata do të largohen. Në përgjithësi, mund të organizohet mësimi në një mënyrë që studentët të ndiejnë përparim në rritjen e numrit të konstrukcioneve të njohura. Pra, fillimisht studiojmë në detaje while, pastaj studiojmë for, pastaj do while dhe ja ku kemi një kurs për një mijë e një natë, ku për dy muaj studiohen vetëm ciklet, dhe në fund kemi një student që ka shkruar në përcaktim bibliotekën standarde. Megjithatë, për të zgjidhur probleme praktike, nevojitet jo vetëm njohuri të materialit, por edhe pavarësi në aplikimin e tij dhe në kërkimin e informacionit të ri. Prandaj për kurset në klasë mendoj se është e drejtë parimi — të mësohet minimumi dhe të inkurajohet studimi i pavarur i nuancave dhe temave të lidhura. Në temën për ciklet, minimumi që mendoj është konstrukcioni while. Me të mund të kuptohet principi. Duke edituar principin një ndihmës është e mundur të arrihet përfor dhe do-while në mënyrë të pavarur.
Për të arritur përvetësimin e materialit nga studentët e dobët, përshkrimi i sintaksës nuk mjafton. Duhet të ofrohen më shumë detyra të thjeshta, por të ndryshme dhe të jepen shembuj më të detajuar. Më në fund, shpejtësia e përvetësimit kufizohet nga aftësia e studentit për të transformuar shprehjet dhe për të kërkuar rregullat. Për studentët e mprehtë, shumica e detyrave do të jenë të mërzitshme. Në mësime me ta, nuk është e nevojshme të insistosh në zgjidhjen e 100% të detyrave. Materialin tim mund ta shihni në . Megjithatë, repository duket më shumë si një grimuar i magjistarit - askush, përveç meje, nuk do ta kuptojë se çfarë ndodhet ku, dhe nëse dështon kontrollin, mund të çmendesh
Metodika është e orientuar drejt praktikës
Teoria shpjegohet nëpërmjet zgjidhjes së problemeve. Në mësimet e bazave të programimit, ku studiohen ndarjet dhe ciklet, thjesht nuk është e mundur të organizosh një ligjëratë të dobishme në një temë për një orë të tërë. 15-20 minuta janë të mjaftueshme për të përshkruar konceptin. Vështirësitë kryesore shfaqen gjatë zgjidhjes së detyrave praktike.
Mësuesit e fillimit mund të paraqesin operatorët, ndarjet, ciklet dhe array-t gjatë një ligjërate. Por studentët e tyre do të përballen me problemin e përvetësimit të kësaj informacioni.
Nuk mjafton të tregohet materiali, por gjithashtu duhet të sigurohemi që dëgjuesit e kuptojnë atë.
Fakti i përvetësimit të temës përcaktohet nga mënyra si studentët përballen me punët e pavarura.
Nëse studentit i ka arritur të zgjidhë një problem në temë pa ndihmën e mësuesit, atëherë tema është përvetësuar. Për të siguruar kontrollin e pavarur, për çdo detyrë përshkruhet një tabelë me skenarët e testeve. Detyrat kanë një rend të qartë. Nuk rekomandohet të kalohen detyra. Nëse detyra aktuale është shumë e komplikuar, është e kote të kalosh te e ardhmja. Ajo është edhe më e vështirë. Për të siguruar që studenti të përballojë detyrën e vështirë aktuale, disa teknika shpjegohen përmes shembullit të detyrës së parë. Në thelb, e gjithë përmbajtja e temës përqendrohet në teknikat e kalimit të vështirësive. Ciklet janë, më tepër, një efekt anësor.
Detyra e parë gjithmonë është një shembull. E dyta ndryshon pak dhe realizohet "pavarësisht" menjëherë pas së parës nën mbikëqyrjen e mësuesit. Të gjitha detyrat e mëvonshme janë të orientuara për të tërhequr vëmendjen mbi detaje të ndryshme, të cilat mund të shkaktojnë keqkuptime.
Shpjegimi i shembullit përbën një dialog, në të cilin studenti duhet të thërrasë back propagation dhe cross-validation për të siguruar mirëkuptimin e një sërë materialesh.
Do të jem banal dhe do të deklaroj se shembulli i parë mbi temën është shumë i rëndësishëm. Nëse ekziston materiali për një punë të gjerë vetjake, mungesat e shembullit të parë mund të korrigjohen. Nëse nuk ka asgjë tjetër përveç shembullit, atëherë studenti ndoshta nuk do ta kuptojë temën.
While apo for?
Një nga çështjet e diskutueshme është zgjedhja e konstrukcionit për shembull: while apo for. Njëherë një mik i imi, zhvillues praktik pa përvojë në mësimdhënie, më bindte për një orë se cikli for është më i thjeshtë për t'u kuptuar. Argumentet përmblidhnin se "në të gjithë është e qartë dhe e vendosur në vende". Megjithatë, shkaku kryesor i vështirësive për fillestarët në të vërtetë është vetë ideja e ciklit, dhe jo shkrimi i tij. Nëse një person nuk e kupton këtë ide, ai do të ketë vështirësi me sintaksën. Sapo ideja të kuptohet, problemet e formatimit të kodit zhduken vetë.
Në materialet e mia, tema e cikleve ndjek temën mbi rrethit. Ngjashmëria e jashtme ndërmjet if dhe while lejon të bëhet një analogji e drejtpërdrejtë: "kur kushte në titull është e vërtetë, atëherë ekzekutohet trupi". Karakteristika e ciklit është se trupi ekzekutohet shumë herë.
Argumenti im i dytë është se while kërkon më pak formatim se for. Më pak formatim - më pak gabime të budallaqëve me mungesë të pikëvënieve dhe kllapave. Fillestarët ende nuk e kanë të zhvilluar vëmendjen dhe kërkesën për detaje sa për t'u shmangur automatikisht gabimet sintaksore.
Argumenti i tretë është se në shumë libra të mirë while shpjegohet i pari.
Nëse studenti arrin të transformojë lehtësisht shprehjet, mund të flasim për for kalimthi. Studentit më pas do t'i pëlqejë të zgjedhë atë që i pëlqen më shumë. Nëse transformimet shkaktojnë vështirësi, është më mirë të mos shpërdorojmë vëmendjen. Njëherë studentit le të zgjidhë gjithçka me ndihmën e while. Kur tema e cikleve është e kuptuar, mund të riprojektohen zgjidhjet për të ushtruar transformimin e while në for.
Ciklet me post-kusht janë një kafsho e rrallë. Për këtë nuk e humbas fare kohë. Nëse studenti ka kuptuar idetë e identifikimit të rregullave dhe transformimit të shprehjeve, ai do të jetë në gjendje të kuptojë pa ndihmën time.
Kur duke demonstruar shembullin e parë për studentët e fuqishëm, theksoj se është e rëndësishme të regjistrohet jo vetëm zgjidhja, por edhe e gjithë zinxhiri i veprimeve që çuan në rezultat. Studentët e lenë mund të injorojnë shkrimin dhe të ruajnë vetëm algoritmin përfundimtar për veten e tyre. Duhet t'i bindim ata se një herë ata do të hasin një detyrë të komplikuar. Për ta zgjidhur, do të duhet të ndjekin hapat si në këtë shembull. Prandaj është e rëndësishme të regjistrohen të gjitha etapet. Në detyrat e ardhshme, mund të lë vetëm variantin përfundimtar të zgjidhjes.
Ideja kryesore e automatizimit është që ne i besojmë kompjuterit të kryejë punë rutinë në vend të njeriut. Një nga teknikat bazë është shkruajtja e cikleve. Ajo aplikohet kur në program shkruhen përsëritësisht disa veprime të njëjta.
E qartë është më mirë se e paqartë
Mund të duket si një ide e mirë në detyrën e parë për ciklet të printohet një frazë e njëjtë disa herë. Për shembull:
Ura, punon!
Ura, punon!
Ura, punon!
Ura, punon!
Ura, punon!
Ura, punon!
Ura, punon!
Ura, punon!
Ky variant është i keq sepse në printim nuk është e dukshme vlera e numëruesit. Kjo është një problem për fillestarët. Nuk duhet ta nënvlerësojmë. Në fillim, kjo detyrë ishte e para, dhe detyra për printimin e një vargu numrash në rritje ishte e dyta. Duhej të introduktoheshin terma të shtuar si "cikli N herë" dhe "cikli nga A deri në B", të cilat në thelb janë njësoj. Për të mos krijuar entitete të panevojshme, vendosa të tregoj vetëm shembullin me printimin e vargut të numrave. Disa arritin ta mbajnë në mendje numëruesin dhe ta modelojnë sjelljen e programit në mendjen e tyre pa përgatitje. Disa studentë përballen për herë të parë me modelimin "në mendje" pikërisht në temën për ciklet.
Pas disa praktikave, detyrën për të përsëritur tekstin e njëjtë e jap për zgjidhje të pavarur. Nëse e japim fillimisht numëruesin e dukshëm, e pastaj të padukshëm, studentët hasin më pak probleme. Ndonjëherë është mjaft një nxitje "mos e shkruaj numëruesin në ekran".
Si shpjegohet nga të tjerët?
Në shumicën e materialeve edukative në internet, sintaksa e ciklit jepet si pjesë e "lekturës". Për shembull, në developer.mozilla.org (në këtë moment) bashkë me ciklin while përmenden edhe disa konstruksione të tjera. Në këtë mënyrë, jepen ekskluzivisht vetë konstrukcionet në formë shabllonesh. Rezultati i ekzekutimit të tyre përshkruhet me fjalë, ndërsa ilustirimi mungon. Sipas mendimit tim, një qasje e tillë e temës zvogëlon në zero dobishmërinë e materialeve të tilla. Nxënësi mund ta ribërë kodin dhe ta ekzekutojë vetë, por një etalon për krahasim ende nevojitet. Si mund të kuptojë që shembulli është riparuar saktë, nëse nuk ka çfarë të krahasojë rezultatin?
Kur jepet vetëm shablloni, pa shembuj, studentit i bëhet edhe më e vështirë. Si mund të kuptojë që fragmentet e kodit janë vendosur saktë në shabllon? Mund të provojë ta shkruajë ndonjëherë, pastaj ta ekzekutojë. Por nëse nuk ka etalon për krahasimin e rezultatit, ekzekutimi gjithashtu nuk ndihmon.
Në kursin e C++ në Intuit, sintaksa e ciklit është e fshehur në faqen e tretë të leksionit 4 për temën "operatorët". Kur shpjegohet sintaksa e cikleve, bëhet një theks i veçantë mbi termin "operator". Termi jepet si një grup faktesh të tilla si "simbol; ky është operator", "{} është operator përbërës", "trupi i ciklit duhet të jetë operator". Mënyra ime e qasjes nuk më pëlqen, sepse me sa duket fshin lidhjet e rëndësishme pas një termini. Analiza e kodit burimor të programit në terma në atë nivel është e nevojshme për zhvilluesit e kompilatorëve për të realizuar specifikimin e gjuhës, por aspak për studentët në një afat të parë. Fillestarët në programim shkurt e kanë dhe nuk janë mjaft të gjithaqenë për të treguar kaq shumë vëmendje ndaj termaëve. Një person i rrallë e ruan dhe e kupton një fjalë të re që nga hera e parë. Praktikisht askush nuk mund ta aplikojë saktë një term që e ka mësuar vetëm tani. Prandaj, studentët krijojnë shumë gabime, si "shkrova while(a<7);{, dhe programi nuk punon."
Sipas mendimit tim, në fillim është më mirë të jepet sintaksa e konstrukcionit menjëherë me kllapa. Variante pa kllapa të shpjegohet vetëm nëse nxënësi ka një pyetje specifike "pse këtu pa kllapa dhe punon".
Në librin e Okulov «Bazat e Programimit» të vitit 2012, njohja me ciklet fillon me modelin for, pastaj jepen rekomandime për përdorimin e tij, dhe më pas, menjëherë ndodhet seksioni eksperimental i mësimit. Unë e kuptoj se libri është shkruar për atë pakicë nxënësish shumë të aftë, të cilët rrallë vijnë në mësimet e mia.
Në librat popullorë gjithmonë jepet rezultati i fragmenteve të kodit. Për shembull, te Shilti «Java 8. Udhëzues i plotë» e botuar në vitin 2015. Fillimisht jepet modeli, pastaj një shembull programi dhe menjëherë pas tij — rezultati i ekzekutimit.
Si shembull do të marrim ciklin while, në të cilin kryhet numërimi mbrapsht, duke filluar nga 10, dhe saktësisht 10 rreshta «taktesh» printohen:
отсчет, начиная с 10, и выводится ровно 10 строк «тактов»://Продемонстрировать применение оператора цикла while class While { public static void main(String args []) { int n = 10; while (n > 0) { System.out.println("такт " + n); n--; } } }Pas nismës, ky program printon dhjetë «taktesh» në mënyrën e mëposhtme:
takti 10
takti 9
takti 8
takti 7
takti 6
takti 5
takti 4
takti 3
takti 2
takti 1
Pranimi me përshkrimin e modelit, shembullit të programit dhe rezultatit të funksionimit të këtij programi përdoret gjithashtu në librin «Javascript për fëmijë» dhe në kursin js në w3schools.com. Formati i faqes së internetit madje lejon që ky shembull të bëhet interaktiv.
Në librin e Stroustrup «Parimet dhe Praktika me C++» të vitit 2016, autori kishte shkuar edhe më tej. Së pari shpjegohet çfarë rezultati duhej të arrihej, dhe vetëm më pas shfaqet teksti i programit. Madje, si shembull, nuk merret një program i rastësishëm, por jepet një ekskurs në histori. Kjo ndihmon të tërhiqet vëmendja: «Shiko, kjo nuk është thjesht një tekst i padobishëm. Ti sheh diçka të rëndësishme».
Si një shembull i iteracionit, do të shqyrtojmë programin e parë të ekzekutuar në një makinë me program të ruajtur (EDSAC). Ai u shkrua nga David Wheeler në laboratorin kompjuterik të Universitetit të Kembrixhit (Cambridge University, Angli) më 6 maj 1949. Ky program llogarit dhe printon një listë të thjeshtë të katrorëve.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801
Këtu, në çdo rresht ka një numër, që i pason me një shenjë tabulatori (‘t’) dhe katrorin e këtij numri. Versioni i këtij programi në gjuhën C++ duket kështu://Вычисляем и распечатываем таблицу квадратов чисел 0-99 int main() { int i = 0; // Начинаем с нуля while(i < 100){ cout << i << 't' << square(i) << 'n'; ++i; } }
Është interesante që modeli i sintaksës në këtë libër nuk përshkruhet. Stroustrup në udhëzuesin e instruktorit () thekson se respekton inteligjencën e studentëve të tij. Ndoshta aftësia për të identifikuar modelin në disa shembuj dhe konsiderohet një shprehje e tillë e inteligjencës.
Siç e shpjegoj unë vetë
Qasja e Stroustrup: përshkrimi i rezultatit, pastaj zgjidhja e problemit, dhe më pas analiza e pavarur nga studenti — duket si më e menduar. Prandaj vendosa ta marr si bazë atë, por do të flas për një shembull më pak historik — problemin e shfaqjes së "përmbajtjes". Kjo formon një pikë referimi të njohur, për t'u thënë më pas "kujto problemin për përmbajtjen" dhe për studentët të kujtojnë saktësisht atë. Në shembullin tim, përpiqesha të parandaloj dy nga keqkuptimet më të zakonshme. Më pas do të shkruaj për ta më hollësisht.
Në këtë problem njohim teknikat e zgjidhjes së problemeve të ndërlikuara. Zgjidhja fillestare duhet të jetë primitivë dhe e thjeshtë. Pastaj mund të mendojmë për përmirësimin e kësaj zgjidhjeje.
Hyrje
Kapitulli 1
Kapitulli 2
Kapitulli 3
Kapitulli 4
Kapitulli 5
Kapitulli 6
Kapitulli 7
Përfundim
Sipas vëzhgimeve të mia, qasja "shabllon-shembull-rezultat" në kombinime të ndryshme gjithmonë çon në faktin se studentët e perceptojnë ciklin si një hieroglif. Kjo manifestonte faktin që ata nuk kuptonin pse duhej shkruar kushti atje, si të zgjidhnin mes i++ dhe i— dhe gjëra të tjera që duken të qarta. Për të shmangur këto keqkuptime, qasja për të folur për ciklet duhet të theksojë kuptimin e përsëritjes së veprimeve të njëjta dhe vetëm më pas — formësimin e tyre përmes konstruktimeve. Prandaj, para se të jap sintaksën e ciklit, duhet të zgjidhet problemi "në fytyrë". Zgjidhja primare e problemit të përmbajtjes duket kështu:
Console.WriteLine("Hyrja");
Console.WriteLine("Kapitulli 1");
Console.WriteLine("Kapitulli 2");
Console.WriteLine("Kapitulli 3");
Console.WriteLine("Kapitulli 4");
Console.WriteLine("Kapitulli 5");
Console.WriteLine("Kapitulli 6");
Console.WriteLine("Kapitulli 7");
Console.WriteLine("Përfundimi");
Si mund të përmirësohet?
Zëvendësojeni veprimet e njëtrajtshme me një cikël.
Cilat veprime përsëriten këtu njëra pas tjetrës pa ndryshime?
Në këtë fragment nuk ka të tillë. Megjithatë, komandat për të printuar fjalën "Kapitulli" me numër janë shumë të ngjashme me njëra-tjetrën.
Prandaj, hapi tjetër është të kërkoni dallimin midis fragmenteve. Kjo vetëm në këtë problem është e qartë, më vonë do të përsëriten jo komandat e veçanta, por blloqet e kodit nga 5 rreshta e më shumë. Do të duhet të kërkoni jo vetëm në listën e komandave, por në konstruktet e deklasifikimit ose ciklit.
Në shembullin, dallimi midis komandave është në numrin pas fjalës "Kapitulli".
Sapo të gjendet dallimi, duhet të kuptohet ligjësia e ndryshimit. A është fragmeti që ndryshon një numër? A rritet apo zvogëlohet vazhdimisht? Si ndryshon vlera e numrit midis dy komandave ngjitur?
Në shembullin e dhënë, numri pas fjalës “Kapitulli” rritet me hapin 1. Diferenca është gjetur, dhe një model është zbuluar. Tani mund të zëvendësojmë fragmentin që ndryshon me një variabël.
Është e nevojshme të shpallim këtë variabël para fragmentit të parë që përsëritet. Kjo variabël zakonisht quhet I ose j ose ndonjë emër më të gjatë. Vlera e saj fillestare duhet të jetë e barabartë me vlerën e parë që shfaqet në ekran. Në shembullin, vlera e parë është 1.
Cila është vlere fillestare që duhet të merret për të shfaqur serinë e numrave «100, 101, 102, 103, 104, 105»?
Në këtë seri, numri i parë është 100.
Pas çdo komande për shfaqjen e numrave, duhet të rritet vlera e kësaj variabli me 1. Ky një është hapi i ndryshimit.
Cili do të jetë hapi në serinë e numrave «100, 102, 104, 106»?
Në këtë seri hapi është 2.
Pas zëvendësimit të fragmentit që ndryshon me një variabël, kodi do të duket kështu:
Console.WriteLine("Intro");
int i;
i = 0;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Përfundimi");
Pas aplikimit të teknikës "shprehja e modelit me variabël", në kod rezulton disa grupe veprimesh të njëjta, të cilat vijnë njëra pas tjetrës. Tani veprimet e përsëritura mund të zëvendësohen me një cikël.
Seqeuca e zgjidhjes së problemit, ku do të nevojiten ciklet, përbëhet nga etapet:
- Ta zgjidhim "në mënyrë direkte" me shumë komanda të veçanta
- Të gjejmë një model
- Të shprehni modelin me një variabël
- Të formohet si një cikël
Më pas futen terma të rinj, për të mos lënë studentin në situatën "të gjithë e kuptoj, por nuk mund të flas":
— numërues — gjithmonë një variabël, e cila është e nevojshme për të ndjekur numrin e hapave të ciklit. Zakonisht një numër tërë, që krahasohet me kufirin.
— hapi i numëruesit — përshkrimi i modelit të ndryshimit të numëruesit.
— kufiri — numri ose variabla, me të cilin krahasohet numëruesi, në mënyrë që algoritmi të jetë përfundimtar. Vlera e numëruesit ndryshon në mënyrë që të afrohet me kufirin.
— trupi i ciklit — grupi i komandave, që do të përsëriten. Kur thuhet "komanda është shkruar brenda ciklit", nënkuptojmë saktësisht trupin.
— iterimi i ciklit — një herë kryerja e trupit të ciklit.
— kushti i ciklit — shprehje logjike, nga e cila varet nëse do të realizohet një iteracion tjetër. (Këtu mund të ketë ngatërrim me strukturat e degëzimit)
Duhet të jeni të gatshëm që në fillim studentët do të përdorin terminologjinë ndryshe nga ajo që është e duhura. Kjo i përket si atyre të fortë, ashtu edhe atyre të dobët. Krijimi i një gjuhe të përbashkët është një art i tërë. Tani do ta shkruaj shkurt: duhet të vendosni detyrën "ndara fragmentin e kodit me <termin>" dhe të përdorni këto terma saktë në bisedë.
Pas transformimit me ciklin, rezulton ky fragment:
Console.WriteLine("Hyrja");
int i = 0;
while (i < 7) {
Console.WriteLine("Kapitulli " + i);
i = i + 1;
}
Console.WriteLine("Përfundimi");Mendimi kryesor
Një ngatërresë e njohur te studentët është se ata vendosin brenda strukturës së ciklit veprime që duhet të bëhen vetëm një herë. Për shembull, kështu:
;
int i = 0;
while (i < 7) {
Console.WriteLine("Hyrja")
Console.WriteLine("Kapitulli " + i);
i = i + 1;
Console.WriteLine("Përfundimi");
}
Nxënësit vazhdimisht hasin këtë problem, si në fillim ashtu edhe në detyrat më të komplikuara.
Këshilla kryesore në këtë rast:
Sa herë duhet të përsëritet ekzekutimi i komandës: një herë apo shumë?
Komandat për të shfaqur fjalët "Hyrja" dhe "Përfundimi", si dhe deklarimi dhe inicializimi i ndryshores i, nuk janë të ngjashme me veprimet e tjera që përsëriten. Ato kryhen vetëm një herë, prandaj duhet t'i shkruajmë jashtë trupit të ciklit.
Në kod duhet të mbeten të tri fazat e zgjidhjes, në mënyrë që më pas të referohemi te to në rast të ndonjë vështirësie. Dy variantet e para mjafton t'i komentoni, që të mos shqetësojnë.
Vëmendja e studentit duhet të fokusohet në faktet e mëposhtme:
— Në kushtin e ciklit zakonisht krahasohet numëruesi dhe kufiri. Numëruesi mund të ndryshojë në trupin e ciklit, ndërsa kufiri — jo. Për ta shkelur këtë rregull, janë të nevojshme arsye të forta.
— Komandat për të shfaqur fjalët "Hyrja" dhe "Përfundimi" ndodhen jashtë trupit të ciklit. Na nevojitet t'i ekzekutojmë 1 herë. "Hyrja" — para përsëritjes së veprimeve, "Përfundimi" — pas.
Në procesin e konsolidimit të kësaj teme, mastering të mëvonshëm, si dhe për të sqaruar ndërlikimet, edhe studentët e fortë është e dobishme t'i bëjnë pyetje: "Dhe ky veprim sa herë duhet të kryhet? Një apo shumë?".
Zhvillimi i aftësive të tjera
Gjatë procesit të studimit të cikleve, studentët ende ushtrojnë aftësinë për diagnozën dhe zgjidhjen e problemeve. Për të kryer diagnostikimin, studenti duhet të paraqesë rezultatin e dëshiruar dhe ta krahasojë atë me rezultatin aktual. Veprimet për të korrigjuar varen nga dallimi midis tyre.
Pasi studentët në këtë fazë ende nuk e kuptojnë mirë rezultatin e "dëshiruar", ata mund të orientojnë në të dhënat testuese. Në përgjithësi, askush në këtë fazë nuk e kupton ende se çfarë mund të shkojë keq dhe si të merret me këtë. Prandaj, unë jap për shënim në një ditar përshkrimin e problemeve tipike dhe disa mënyra për t'i zgjidhur ato. Zgjedhja e asaj më të përshtatshme është detyrë e vetë studentit.
Shënimi është i nevojshëm për të pyetur "u arrit ajo që pritej?", "Cila nga këto situata ndodhi tani?", "A ndihmoi zgjidhja e aplikuar?".
- Numri i veprimeve është 1 më pak ose më shumë se sa pritej. Mënyrat e zgjidhjes:
— rritni vlerën fillestare të numëruesit me 1.
— zëvendësoni operatorin e rreptë të krahasimit (< ose >) me atë të pa rreptë (<= ose >=).
— ndryshoni vlerën e kufirit me 1. - Veprimet në cikël ekzekutohen pa ndalesë, në mënyrë të pafund. Mënyrat e zgjidhjes:
— shtoni komandën për ndryshimin e numëruesit nëse ajo mungon.
— rregulloni komandën për ndryshimin e numëruesit në mënyrë që vlera e tij të bëhet më e afërt me kufirin.
— hiqni komandën për ndryshimin e kufirit, nëse ajo ndodhet në trupin e ciklit. - Numri i veprimeve në cikël është më shumë se 1 më pak ose më shumë se sa pritej. Një veprim në cikël nuk është ekzekutuar asnjëherë. Fillimisht, duhet të zbulohet vlerat e vërteta të variablave direkt para fillimit të ciklit. Mënyrat e zgjidhjes:
— ndryshoni vlerën fillestare të kufirit
— ndryshoni vlerën fillestare të numëruesit
Në përgjithësi, problemi 3 lidhet me përdorimin e variablës së gabuar ose me mos-anulimin e numëruesit.
Pas këtij shpjegimi, studenti ende mund të ketë keqkuptime të ndryshme në lidhje me funksionimin e cikleve.
Për të shuar këto më të zakonshmet, jap detyra:
- Në të cilën kufiri, vlera fillestare e numëruesit ose hapi i numëruesit e fut përdoruesi.
- Në të cilën vlera e numëruesit duhet të përdoret në një shprehje aritmetike. Preferohet që të jetë me numërues në shprehjen nënrrënjë ose në emërues, në mënyrë që dallimi të jetë jo-linear.
- Ku një që vlera e numëruesit nuk shfaqet në ekran gjatë punës së ciklit. Për shembuj, shfaqja e numrit të nevojshëm të fragmenteve të njëjta të tekstit ose të vizatoni një figurë me grafikën e breshkës.
- Ku duhet të kryhen fillimisht disa veprime të përsëritura, dhe pastaj të tjera.
- Ku duhet të kryhen veprime të tjera para dhe pas përsëritjeve.
Për çdo detyrë është e nevojshme të jepen të dhënat testuese dhe rezultati i pritur.
Për të kuptuar sa shpejt mund të lëvize, është e nevojshme të lejohet të lexohen kushtet e këtyre detyrave dhe të pyeten: "çfarë i ndryshon nga shembulli?", "Çfarë duhet të ndryshojë në shembull për t'i zgjidhur ato?". Nëse studenti përgjigjet me kuptim, atëherë le të zgjidhë të paktën një në mësim, ndërsa të tjerat - vetë në shtëpi. Nëse zgjidhja do të jetë e suksesshme, mund të filloni të shpjegoni rreth kushteve brenda cikleve.
Nëse ka vështirësi me zgjidhjen e pavarur, është e nevojshme të punoni gjithçka në mësim. Për të mos e bërë zgjidhjen e detyrës të duket si vizatimi i një sorkadhe, rekomandoj fillimisht të zgjidhni detyrën jo në mënyrë universale. Pra, për ta zgjidhur atë në mënyrë që zgjidhja të kalojë testin e parë dhe të mos përdorë ndërtimin e ciklit. Pastaj mund të aplikoni transformime për të arritur universialitetin e zgjidhjes.
Ciklet dhe deget
Sipas mendimit tim, është e dobishme të jepet temë "ciklet brenda degëve" veçmas. Kështu që më pas të duket ndarja midis kontrollit të shumëfishtë të kushteve dhe atij një herë.
Detyrat për konsolidim do të përmendin shfaqjen e numrave nga A në B, të cilat futen nga përdoruesi:
— gjithmonë në rritje.
— në rritje ose në rënien e varur nga vlerat e A dhe B.
Temën "deget brenda cikleve" duhet të kaloni vetëm pasi studenti të ketë zotëruar teknikat: "zëvendësimi i modelit me një variabël" dhe "zëvendësimi i veprimeve të përsëritura me një cikël".
Arsyeja kryesore për aplikimin e degëve brenda cikleve është anomali në model. Në mes të saj, ajo shkelet në varësi të të dhënave fillestare.
Atyre studentëve që janë në gjendje të kërkojnë zgjidhje duke kombinuar teknikë të thjeshta, është mjaft të thuhet "deget mund të shkruhen brenda cikleve" dhe të jepet një detyrë "për shembull" plotësisht për zgjidhje të pavarur.
Detyra për shembull:
Përdoruesi fut numrin X. Shfaqni në kolona numrat nga 0 në 9 dhe vendosni shenjën ‘+’ përpara numrit që është i barabartë me X.
Nëse është futur 00+
1
2
3
4
5
6
7
8
9
Nëse është futur 60
1
2
3
4
5
6+
7
8
9
Nëse është futur 90
1
2
3
4
5
6
7
8
9+
Nëse është futur 7770
1
2
3
4
5
6
7
8
9
Nëse mungon një shpjegim të shkurtër për të shkruar me cikël, atëherë duhet të arrijmë një zgjidhje universale për këtë detyrë pa cikël.
Do të dalë një nga dy opsionet:
E dëshiruara
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);
}
E mundshme
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+");
}
Një detyrë të ngjashme e jap më përpara, gjatë mësimit për temën e degëve.
Nëse studenti ka arritur një variant "të mundshëm", duhet të tregoni se zgjidhje të njëjtës detyrë mund të ketë shumë. Megjithatë, ato ndryshojnë në qëndrueshmërinë ndaj ndryshimeve të kërkesave. Bëni pyetje: "Sa vende në kod do të duhet të rregullohen, nëse duhet të shtojmë një numër tjetër?" Në variantin "të mundshëm", do të duhet të shtohet një degëzim tjetër dhe të shkruhen në 10 vende të tjera numri i ri. Në "variantin e dëshiruar", mjafton të shtohet vetëm një degëzim.
Vendosni detyrën për të riprodhuar "variantin e dëshiruar", pastaj gjeni në kod një rregull dhe bëni zëvendësimin e variablit dhe shkruani ciklin.
Nëse keni një ide, si ta zgjidhni këtë detyrë pa cikël në ndonjë mënyrë tjetër, ju lutem, shkruani në komentet.
Ciklet brenda cikleve
Në këtë temë duhet të kushtoni vëmendje se:
— numruesit për ciklin e brendshëm dhe atë të jashtëm duhet të jenë variabla të ndryshëm.
— numruesi për ciklin e brendshëm duhet të ri-inizializohet shumë herë (dmth. në trupin e ciklit të jashtëm).
Në problemet e shkarkimit të tekstit nuk mund të shkruani më parë një shkronjë në disa rreshta dhe pastaj një tjetër. Duhet të shkruani më parë të gjitha shkronjat e rreshtit të parë, pastaj të gjitha ato të rreshtit të dytë dhe kështu me radhë.
Shpjegimi i temës për ciklet brenda cikleve fillon më së miri me shpjegimin e rëndësisë së rrying të numruesit.
Detyra për shembull:
Përdoruesi hyn dy numra: R dhe T. Shfaqni dy rreshta karakteresh "#". Në rreshtin e parë duhen R numra karakteresh. Në rreshtin e dytë duhen T numra. Nëse ndonjë numër është negative, shfaqni një mesazh gabimi.
R=5, T=11#####
###########
R=20, T=3####################
###
R=-1, T=6Vlera e R duhet të jetë e papajtueshme
R=6, T=-2Vlera e T duhet të jetë e papajtueshme
E qartë, që kjo problematikë ka të paktën dy mundësi zgjidhjeje.
E dëshiruara
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;
}
Mundësia nr. 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;
}
Dallimi qëndron në faktin se në zgjidhjen "e mundshme" për shfaqjen e rreshtit të dytë është përdorur një variabël e dytë. Duhet insistuar në përdorimin e të njëjtës variabël për të dy ciklet. Argumentimi i këtij kufizimi mund të bëhet për faktin se zgjidhja me një numrues për dy ciklet do të ilustronte termin "rryshje numruesi". Kuptimi i këtij termi është i nevojshëm për zgjidhjen e problemeve të tjera. Si një kompromis, mund të mbahen të dy zgjidhjet e problemit.
Një problem typik me përdorimin e një varianti numrues për dy ciklet shfaqet kështu:
R=5, T=11#####
######
Numri i karaktereve në rreshtin e dytë nuk përputhet me vlerën T. Nëse keni nevojë për ndihmë me këtë problem, duhet të "tregoni me gishta" në shënimet për problemet tipike me ciklet. Ky është simptoma nr. 3. Diagnozohet nëse shtoni shfaqjen e vlerës së numruesit menjëherë përpara ciklit të dytë. Korrigjohet me një rryshje. Por nuk është më mirë të flisni menjëherë për këtë. Studenti duhet të përpiqet të formulojë të paktën një hipotezë.
Natyrisht, ka edhe një variant tjetër zgjidhjeje. Por unë nuk e kam parë kurrë atë tek studentët. Në fazën e studimit të cikleve, tregimi për të do të shpërndante vëmendjen. Mund të kthehemi te ai më vonë, gjatë studimit të funksioneve të punës me vargje.
Mundësia nr. 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));
Detyrë e ardhshme e obligueshme:
Shfaqni numrat nga 0 në 9. Çdo numër duhet të jetë në vijën e vet. Numri i numrave në rresht (W) futet nga tastiera.
W=10
1
2
3
4
5
6
7
8
9
W=100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999
Nëse studenti ka mësuar teknikën e zëvendësimit të variablave, ai do ta zgjidhë mjaft shpejt. Problemi i mundshëm do të jetë përsëri në zerozimin e variablave. Nëse nuk arrin të kryejë transformimin, do të thotë se keni nxituar dhe duhet të zgjidhni probleme më të thjeshta.
Faleminderit për vëmendjen. Jepni pëlqime, abonohuni në kanal.
P.S. Nëse keni gjetur ndonjë gabim ose shkrim të pasaktë në tekst, ju lutem më njoftoni. Këtë mund ta bëni duke theksuar një pjesë të tekstit dhe duke shtypur në Mac «⌘ + Enter», ndersa në tastierat klasike «Ctrl / Enter», ose përmes mesazheve të drejtpërdrejta. Nëse këto mundësi nuk janë të disponueshme, shkruani për gabimet në komentet. Faleminderit!
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutem.
Anketa për lexuesit pa karma
20,0%Mësoj profesionalisht, +12
10,0%Mësoj profesionalisht, -11
70,0%Nuk mësoj, +17
0,0%Nuk mësoj, -10
0,0%Tjetër0
Kanë votuar 10 përdorues. U përmbajtën 5 përdorues.
Burimi: habr.com
