Si të mësoni se si të kapërceni vështirësitë, dhe në të njëjtën kohë të shkruani cikle

Përkundër faktit se do të flasim për një nga temat themelore, ky artikull është shkruar për profesionistë me përvojë. Qëllimi është të tregojmë se çfarë keqkuptimesh kanë fillestarët në programim. Për zhvilluesit praktikues, këto probleme janë zgjidhur prej kohësh, harruar ose nuk janë vënë re fare. Artikulli mund të jetë i dobishëm nëse papritmas keni nevojë të ndihmoni dikë me këtë temë. Artikulli tërheq paralele me materiale nga libra të ndryshëm mbi programimin nga Schildt, Stroustrup, Okulov.

Tema për ciklet u zgjodh sepse mjaft njerëz janë të përjashtuar nga ajo kur zotërojnë programimin.

Kjo teknikë është krijuar për nxënës të dobët. Si rregull, njerëzit e fortë nuk ngecin në këtë temë dhe nuk ka nevojë të dalësh me teknika të veçanta për ta. Qëllimi dytësor i artikullit është ta zhvendosë këtë teknikë nga klasa "punon për të gjithë nxënësit, por vetëm një mësues" në klasën "punon për të gjithë nxënësit, të gjithë mësuesit". Unë nuk pretendoj origjinalitet absolut. Nëse po përdorni tashmë një metodologji të ngjashme për të mësuar këtë temë, ju lutemi shkruani se si ndryshon versioni juaj. Nëse vendosni ta përdorni, na tregoni se si shkoi. Nëse një teknikë e ngjashme përshkruhet në një libër, ju lutemi shkruani emrin.


Kam punuar në këtë teknikë për 4 vjet, duke studiuar individualisht me studentë të niveleve të ndryshme të trajnimit. Gjithsej janë rreth pesëdhjetë studentë dhe dy mijë orë orë mësimi. Në fillim, studentët gjithmonë ngecnin në këtë temë dhe largoheshin. Pas çdo studenti u rregullua metodologjia dhe materialet. Gjatë vitit të kaluar, studentët nuk kanë qenë më të mbërthyer në këtë temë, kështu që vendosa të ndaj gjetjet e mia.

Pse kaq shumë letra? Ciklet janë kaq elementare!

Siç shkrova më lart, për zhvilluesit praktikues dhe për studentët e fortë, kompleksiteti i konceptit të sytheve mund të nënvlerësohet. Për shembull, mund të jepni një leksion të gjatë, të shihni kokat që tundin dhe sytë inteligjentë. Por kur përpiqeni të zgjidhni ndonjë problem, fillon marrëzia dhe problemet e pashpjegueshme. Pas leksionit, studentët ndoshta kishin vetëm një mirëkuptim të pjesshëm. Situata rëndohet nga fakti se vetë studentët nuk mund të shprehin se cili është saktësisht iluzioni i tyre.
Një ditë kuptova se studentët i perceptonin shembujt e mi si hieroglife. Kjo do të thotë, si pjesë të pandashme të tekstit në të cilat duhet të shtoni një shkronjë "magjike" dhe do të funksionojë.
Ndonjëherë kam vënë re se studentët mendojnë se për të zgjidhur një problem specifik ju nevojitet diçka tjetër një dizajn që thjesht nuk e kam mbuluar ende. Megjithëse zgjidhja kërkonte vetëm një modifikim të vogël të shembullit.

Kështu që unë dola me idenë që fokusi nuk duhet të jetë në sintaksën e shprehjeve, por në idenë e rifaktorimit të kodit të përsëritur duke përdorur sythe. Pasi studentët ta kenë zotëruar këtë ide, çdo sintaksë mund të përmirësohet me pak praktikë.

Kush dhe pse mësoj?

Meqenëse nuk ka provime pranuese, klasat mund të përfshijnë studentë të fortë dhe shumë të dobët. Ju mund të lexoni më shumë rreth studentëve të mi në artikull Portret i studentëve të kursit të mbrëmjes
Unë u përpoqa të siguroja që të gjithë ata që duan të mësojnë programim mund ta mësojnë atë.
Klasat e mia zhvillohen individualisht dhe studenti paguan paratë e tij për secilën. Duket se studentët do të optimizojnë kostot dhe do të kërkojnë minimumin. Megjithatë, njerëzit shkojnë në mësime ballë për ballë me një mësues të drejtpërdrejtë jo për vetë njohuritë, por për besimin e asaj që kanë mësuar, për një ndjenjë përparimi dhe për miratim nga eksperti (mësuesi). Nëse nxënësit nuk ndiejnë përparim në mësimin e tyre, ata do të largohen. Në përgjithësi, klasat mund të strukturohen në mënyrë që studentët të ndjejnë përparim në rritjen e numrit të strukturave të njohura. Kjo do të thotë, së pari ne studiojmë ndërsa në detaje, pastaj studiojmë për, pastaj bëjmë ndërsa, dhe tani kemi një kurs një mijë e një natë gati, në të cilin vetëm ciklet studiohen për dy muaj, dhe në fund - një student që shkroi një bibliotekë standarde nën diktim. Megjithatë, për të zgjidhur problemet praktike, ju duhet jo vetëm njohuri për materialin, por edhe pavarësi në zbatimin e tij dhe në kërkimin e informacionit të ri. Prandaj, për kurset ballë për ballë, mendoj se parimi i saktë është të mësoni minimumin dhe të inkurajoni studimin e pavarur të nuancave dhe temave të lidhura me to. Në temën e sytheve, konstruktin while e konsideroj minimumin. Ju mund ta kuptoni parimin prej tij. Duke ditur parimin, ju mund të zotëroni si për veten ashtu edhe për ta bërë atë.

Për të arritur zotërimin e materialit nga nxënësit e dobët, përshkrimi i sintaksës nuk mjafton. Është e nevojshme të jepen detyra më të thjeshta por të larmishme dhe të përshkruhen shembuj më në detaje. Në fund të fundit, shpejtësia e zhvillimit është e kufizuar nga aftësia e studentit për të transformuar shprehjet dhe për të kërkuar modele. Për studentët e zgjuar, shumica e detyrave do të jenë të mërzitshme. Kur studioni me ta, nuk keni pse të këmbëngulni për të zgjidhur 100% të problemeve. Materiali im mund të shikohet në github im. Vërtetë, depoja është më shumë si grimoire e një luftëtari - askush përveç meje nuk do ta kuptojë se ku është, dhe nëse dështon kontrollin, mund të çmendesh

Metodologjia është e orientuar drejt praktikës

Teoria shpjegohet duke përdorur shembullin e zgjidhjes së një problemi. Në një klasë themelore të programimit ku mësohen degët dhe unazat, thjesht nuk është e mundur të jepet një leksion i dobishëm për një temë për një orë të tërë. 15-20 minuta janë të mjaftueshme për të shpjeguar konceptin. Vështirësitë kryesore lindin gjatë kryerjes së detyrave praktike.
Mësuesit fillestarë mund të trondisin operatorët, degët, sythe dhe vargje në një leksion. Por studentët e tyre do të përballen me problemin e asimilimit të këtij informacioni.
Është e nevojshme jo vetëm të tregohet materiali, por edhe të sigurohet që dëgjuesit ta kuptojnë atë.

Fakti i zotërimit të një teme përcaktohet nga mënyra se si studenti e përballon punën e pavarur.
Nëse një student arrin të zgjidhë një problem në një temë pa ndihmën e një mësuesi, atëherë tema është zotëruar. Për të siguruar vetë-testimin, çdo detyrë përshkruhet në një tabelë me skenarë testimi. Detyrat kanë një rend të qartë. Nuk rekomandohet kapërcimi i detyrave. Nëse detyra aktuale është shumë e vështirë, atëherë kalimi në tjetrin është i padobishëm. Është edhe më e ndërlikuar. Në mënyrë që studenti të zotërojë detyrën komplekse aktuale, i shpjegohen disa teknika duke përdorur shembullin e problemit të parë. Në fakt, e gjithë përmbajtja e temës zbret në teknika për tejkalimin e vështirësive. Ciklet janë më shumë një efekt anësor.

Detyra e parë është gjithmonë një shembull. E dyta ndryshon pak dhe kryhet "në mënyrë të pavarur" menjëherë pas së parit nën mbikëqyrjen e një mësuesi. Të gjitha detyrat e mëvonshme kanë për qëllim t'i kushtojnë vëmendje gjërave të ndryshme të vogla që mund të shkaktojnë keqkuptime.

Shpjegimi i shembullit është një dialog në të cilin studenti duhet të rikthejë përhapjen dhe verifikimin e kryqëzuar për t'u siguruar që ai ka zotëruar një pjesë të materialit.

Do të jem banal dhe do të them se shembulli i parë në këtë temë është shumë i rëndësishëm. Nëse keni material për punë të gjerë të pavarur, lëshimet e shembullit të parë mund të korrigjohen. Nëse nuk ka asgjë tjetër përveç shembullit, atëherë studenti me shumë mundësi nuk do ta zotërojë temën.

Ndërsa apo për?

Një nga çështjet e diskutueshme është zgjedhja e ndërtimit për shembull: ndërsa ose për. Një herë, një mik i imi praktikues i zhvilluesit pa përvojë në mësimdhënie, kaloi një orë duke më bindur se cikli for ishte më i lehtë për t'u kuptuar. Argumentet përbëheshin në "çdo gjë në të është e qartë dhe e paraqitur në vendin e vet". Sidoqoftë, shkaku kryesor i vështirësive për fillestarët e vërtetë është ideja e vetë ciklit, dhe jo shkrimi i tij. Nëse një person nuk e kupton këtë ide, atëherë ai do të ketë vështirësi me sintaksën. Sapo ideja realizohet, problemet e dizajnimit të kodit zhduken vetë.

Në materialet e mia, tema e sytheve ndjek temën e degëzimit. Ngjashmëria e jashtme e if dhe while na lejon të nxjerrim një analogji të drejtpërdrejtë: "kur kushti në kokë është i vërtetë, atëherë trupi ekzekutohet". E vetmja veçori e ciklit është se trupi ekzekutohet shumë herë.

Argumenti im i dytë është se ndërsa kërkon më pak formatim sesa për. Më pak formatim do të thotë më pak gabime të trashë me presjet dhe kllapat që mungojnë. Fillestarët nuk kanë zhvilluar ende vëmendje dhe përpikëri të mjaftueshme për të shmangur automatikisht gabimet sintaksore.
Argumenti i tretë shpjegohet në shumë libra të mirë si argumenti i parë.

Nëse nxënësi mund t'i transformojë lehtësisht shprehjet, atëherë mund të flisni për kalimthi. Më pas nxënësi do të zgjedhë atë që i pëlqen më shumë. Nëse transformimet shkaktojnë vështirësi, atëherë është më mirë të mos shpërqendroni vëmendjen tuaj. Lëreni nxënësin së pari të zgjidhë gjithçka duke përdorur while. Pasi të keni zotëruar temën e sytheve, mund t'i rishkruani zgjidhjet për të praktikuar konvertimin ndërsa në për.
Sythet pas gjendjes janë një kafshë mjaft e rrallë. Nuk shpenzoj fare kohë për të. Nëse një student i ka zotëruar idetë e identifikimit të modeleve dhe transformimit të shprehjeve, ai mund ta kuptojë këtë pa ndihmën time.

Kur u demonstroj shembullin e parë studentëve të fortë, tërheq vëmendjen për faktin se në shembullin e parë është e rëndësishme të regjistrohet jo vetëm zgjidhja, por edhe i gjithë zinxhiri i veprimeve që çuan në rezultat. Studentët dembelë mund të lënë pas dore shkrimin dhe të kopjojnë vetëm algoritmin përfundimtar. Ata duhet të binden se një ditë do t'u dalë një detyrë e vështirë. Për ta zgjidhur atë, do t'ju duhet të ndiqni hapat si në këtë shembull. Kjo është arsyeja pse është e rëndësishme të regjistrohen të gjitha fazat. Në problemet e mëposhtme do të jetë e mundur të lihet vetëm versioni përfundimtar i zgjidhjes.

Ideja kryesore e automatizimit është që ne i besojmë një kompjuteri për të bërë punë rutinë për një person. Një nga teknikat bazë është shkrimi i sytheve. Përdoret kur disa veprime të njëjta përsëritëse shkruhen në një program me radhë.

E qartë është më mirë se e nënkuptuar

Mund të duket si një ide e mirë për të shfaqur të njëjtën frazë disa herë në detyrën e parë të ciklit. Për shembull:

Urra, funksionon!
Urra, funksionon!
Urra, funksionon!
Urra, funksionon!
Urra, funksionon!
Urra, funksionon!
Urra, funksionon!
Urra, funksionon!

Ky opsion është i keq sepse vlera e numëruesit nuk është e dukshme në dalje. Ky është një problem për fillestarët. Mos e nënvlerësoni atë. Në fillim, kjo detyrë ishte e para, dhe detyra e nxjerrjes së një serie numrash në rend rritës ishte e dyta. Ishte e nevojshme të futeshin termat shtesë "cikli N herë" dhe "cikli nga A në B", të cilat në thelb janë e njëjta gjë. Për të mos krijuar entitete të panevojshme, vendosa të tregoj vetëm një shembull me daljen e një serie numrash. Pak njerëz arrijnë të mësojnë se si të mbajnë një numërues në kokë dhe të modelojnë sjelljen e një programi në kokën e tyre pa përgatitje. Disa nxënës fillimisht ndeshen me modelimin mendor në temën e cikleve.
Pas pak praktike, jap detyrën e përsëritjes së të njëjtit tekst për t'u zgjidhur në mënyrë të pavarur. Nëse së pari jepni një numërues të dukshëm dhe më pas një të padukshëm, studentët do të kenë më pak probleme. Ndonjëherë sugjerimi "mos e shkruani numëruesin në ekran" është i mjaftueshëm.

Si e shpjegojnë të tjerët?

Në shumicën e materialeve edukative në internet, sintaksa e ciklit jepet si pjesë e një "leksioni". Për shembull, në developer.mozilla.org (aktualisht), disa konstruksione të tjera përshkruhen së bashku me ciklin while. Në këtë rast, vetëm vetë dizajnet jepen në formën e shablloneve. Rezultati i lëshimit të tyre përshkruhet me fjalë, por nuk ka asnjë ilustrim. Sipas mendimit tim, një prezantim i tillë i temës e shumëfishon dobinë e materialeve të tilla me zero. Studenti mund ta rishkruajë kodin dhe ta ekzekutojë vetë, por ai ende ka nevojë për një standard për krahasim. Si mund ta kuptoni që një shembull është rishkruar saktë nëse nuk ka asgjë për të krahasuar rezultatin?
Kur jepet vetëm një shabllon, pa shembull, bëhet edhe më e vështirë për studentin. Si të kuptoni që fragmentet e kodit janë vendosur saktë në shabllon? Mund të provoni të shkruani disi, dhe pastaj vraponi. Por nëse nuk ka standard për të krahasuar rezultatin, atëherë nisja nuk do të ndihmojë as.

Në kursin C++ në Intuitive, sintaksa e ciklit është varrosur në faqen e tretë të Leksionit 4 me temën "operatorët". Kur shpjegohet sintaksa e sytheve, theks i veçantë i kushtohet termit "operator". Termi paraqitet si një grup faktesh si “simbol; kjo është një deklaratë", "{} është një pohim i përbërë", "trupi i ciklit duhet të jetë një deklaratë". Nuk më pëlqen kjo qasje, sepse duket se fsheh marrëdhënie të rëndësishme pas një termi. Analizimi i kodit burimor të një programi në terma në këtë nivel nevojitet nga zhvilluesit e përpiluesit për të zbatuar specifikimin e gjuhës, por jo nga studentët si përafrim i parë. Të sapoardhurit në programim rrallëherë janë mjaft të përpiktë për t'u kushtuar një vëmendje kaq të madhe termave. Është një person i rrallë që kujton dhe kupton fjalë të reja herën e parë. Pothuajse askush nuk mund të zbatojë saktë një term që sapo mësoi. Prandaj, studentët marrin shumë gabime si "Kam shkruar while(a<7);{, por programi nuk funksionon."
Për mendimin tim, në fillim është më mirë të jepet sintaksa e ndërtimit menjëherë me kllapa. Opsioni pa kllapa duhet të shpjegohet vetëm nëse studenti ka një pyetje specifike: "pse nuk ka kllapa dhe funksionon".

Në librin e Okulov të vitit 2012 "Bazat e programimit", një hyrje në sythe fillon me modelin for, më pas jep rekomandime për përdorimin e tij dhe më pas shkon menjëherë në seksionin eksperimental të mësimit. E kuptoj që libri është shkruar për atë pakicë studentësh shumë të aftë që vijnë rrallë në klasat e mia.

Në librat e njohur, rezultati i fragmenteve të kodit shkruhet gjithmonë. Për shembull, edicioni i Shildt-it "Java 8. The Complete Guide" 2015. Së pari, jepet një shabllon, më pas një shembull i programit dhe menjëherë pas tij - rezultati i ekzekutimit.

Si shembull, merrni parasysh një lak while që bën të kundërtën
numërimi mbrapsht duke filluar nga 10, dhe shfaqen saktësisht 10 rreshta "masash":

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

Pasi të ekzekutohet, ky program nxjerr dhjetë "cikle" si më poshtë:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Qasja e përshkrimit të një shablloni, një programi shembullor dhe rezultatit të programit 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ë jetë interaktiv.

Libri i Stroustrup 2016 Parimet dhe praktika duke përdorur C++ shkoi edhe më tej. Hapi i parë është të shpjegohet se çfarë rezultati duhet të merret, dhe pas kësaj shfaqet teksti i programit. Për më tepër, ata marrin jo vetëm një program të rastësishëm si shembull, por japin një ekskursion në histori. Kjo ndihmon për të tërhequr vëmendjen ndaj tij: “Shiko, ky nuk është thjesht një tekst i padobishëm. Ju shikoni diçka kuptimplote”.

Si shembull i përsëritjes, merrni parasysh programin e parë të ekzekutuar në një makinë programi të ruajtur (EDSAC). Është shkruar nga David Wheeler në Laboratorin Kompjuterik të Universitetit të Kembrixhit, Angli më 6 maj 1949. Ky program llogarit dhe printon një listë të thjeshtë katrorësh.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Këtu, çdo rresht përmban një numër të ndjekur nga një karakter tab ('t') dhe katrorin e atij numri. Versioni C++ i këtij programi duket si ky:

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

Është interesante se modeli sintaksor nuk përshkruhet në këtë libër. Stroustrup në manualin e instruktorit (përkthim) thekson se respekton inteligjencën e nxënësve të saj. Ndoshta aftësia për të identifikuar një model në disa shembuj konsiderohet një manifestim i një inteligjence të tillë.

Siç e shpjegoj vetë

Qasja e Stroustrup: përshkrimi i rezultatit, më pas zgjidhja e problemit dhe më pas një analizë e pavarur nga studenti - duket më e menduara. Prandaj, vendosa ta marr atë si bazë, por ta tregoj duke përdorur një shembull më pak historik - detyrën e nxjerrjes së një "tabela të përmbajtjes". Ai formon një spirancë të dallueshme në mënyrë që më pas të mund të thoni "mbani mend detyrën në lidhje me tabelën e përmbajtjes" dhe në mënyrë që studentët ta mbajnë mend saktësisht këtë. Në shembullin tim, u përpoqa të parandaloja dy të tjera nga keqkuptimet më të zakonshme. Më tej do të shkruaj për to në mënyrë më të detajuar.

Në këtë detyrë ne njihemi me teknikat për zgjidhjen e problemeve komplekse. Vendimi fillestar duhet të bëhet primitiv dhe i thjeshtë. Epo, atëherë mund të mendoni se si ta përmirësoni këtë zgjidhje.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Sipas vëzhgimeve të mia, qasja "shabllon-shembull-rezultat" në kombinime të ndryshme ende çon në faktin që studentët e perceptojnë ciklin si një hieroglif. Kjo u shfaq në faktin se ata nuk e kuptonin pse ekzistonte një kusht për të shkruar atje, si të zgjidhnin midis i++ dhe i— dhe gjëra të tjera në dukje të dukshme. Për të shmangur këto keqkuptime, qasja për të folur për cikle duhet të theksojë kuptimin e përsëritjes së veprimeve identike dhe vetëm atëherë formalizimi i tyre duke përdorur një strukturë. Prandaj, përpara se të jepni sintaksën e lakut, duhet ta zgjidhni problemin kokë më kokë. Një zgjidhje primitive për problemin e tabelës së përmbajtjes duket si kjo:

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

Si mund të përmirësohet?
Zëvendësoni veprimet monotone me një cikël.
Cilat veprime përsëriten me radhë pa ndryshime?
Nuk ka asnjë në këtë fragment. Sidoqoftë, komandat për shfaqjen e fjalës "Kapitull" me një numër janë shumë të ngjashme me njëra-tjetrën.
Prandaj, faza tjetër është të gjesh ndryshimin midis fragmenteve. Është vetëm në këtë detyrë që gjithçka është e qartë, atëherë nuk do të përsëriten komanda të vetme, por blloqe kodi prej 5 rreshtash ose më shumë. Ju do të duhet të kërkoni jo vetëm në listën e komandave, por në ndërtimet e degëzimit ose ciklit.
Në shembull, ndryshimi midis komandave është në numrin pas fjalës "Kapitulli".
Pasi të gjendet ndryshimi, duhet të kuptoni modelin e ndryshimit. Fragmenti i ndryshëm është numri? A është vazhdimisht në rritje apo në rënie? Si ndryshon vlera e një numri midis dy skuadrave krah për krah?
Në shembull, numri pas fjalës "Kapitull" rritet në rritje prej 1. Gjendet ndryshimi, zbulohet modeli. Tani mund të zëvendësoni fragmentin e ndryshëm me një ndryshore.
Ju duhet të deklaroni një variabël të tillë përpara fragmentit të parë të përsëritur. Një variabël i tillë zakonisht quhet I ose j ose diçka më e detajuar. Vlera e tij fillestare duhet të jetë e barabartë me vlerën e parë të shfaqur në ekran. Në shembull, vlera e parë është 1.
Çfarë vlere fillestare duhet marrë për të shfaqur serinë e numrave “100, 101, 102, 103, 104, 105”?
Numri i parë në këtë seri është 100.
Pas çdo komande dalëse, ju duhet të rrisni vlerën e kësaj ndryshore me 1. Kjo njësi është hapi i ndryshimit.
Cili hap do të jetë në serinë e numrave "100, 102, 104, 106"?
Hapi 2 në këtë rresht.
Pas zëvendësimit të fragmentit të ndryshëm me një ndryshore, kodi do të duket si ky:

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

Pas aplikimit të teknikës "shpreh modelin e një ndryshoreje" në kod, ju merrni disa grupe veprimesh identike që shkojnë me radhë. Tani veprimet e përsëritura mund të zëvendësohen me një cikël.

Sekuenca e zgjidhjes së një problemi ku duhet të përdorni sythe përbëhet nga hapat e mëposhtëm:

  1. Zgjidheni "kokë më kokë" me shumë komanda të veçanta
  2. Gjeni një model
  3. Shprehni modelin e një ndryshoreje
  4. Dizajni si një cikël

Më pas, futen terma të rinj në mënyrë që studenti të mos gjendet në situatën "Unë kuptoj gjithçka, por nuk mund ta them":
— një numërues është gjithmonë një variabël që nevojitet për të gjurmuar numrin e hapave në një lak. Zakonisht një numër i plotë që krahasohet me kufizimin.
— hapi kundër — përshkrimi i modelit të ndryshimeve të numëruesit.
- kufizim - një numër ose variabël me të cilin numëruesi krahasohet në mënyrë që algoritmi të jetë përfundimtar. Vlera e numëruesit ndryshon për t'iu afruar kufirit.
— trupi i lakut — një grup komandash që do të përsëriten. Kur thonë "urdhëri është shkruar brenda një lak", ata nënkuptojnë trupin.
— përsëritja e lakut — ekzekutimi një herë i trupit të lakut.
— kushti i ciklit — një shprehje logjike që përcakton nëse do të ekzekutohet një përsëritje tjetër. (Këtu mund të ketë konfuzion me strukturat e degëzimit)
Ju duhet të jeni të përgatitur për faktin se në fillim studentët do të përdorin terma për qëllime të tjera. Kjo vlen si për të fortët ashtu edhe për të dobëtit. Krijimi i një gjuhe të përbashkët është një art. Tani do të shkruaj shkurtimisht: duhet të vendosni detyrën "të theksoni fragmentin e kodit me <term>" dhe t'i përdorni vetë këto terma saktë në bisedë.
Pas transformimit me një lak, fragmenti merret:

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

Keqkuptimi kryesor

Një keqkuptim i përhapur midis studentëve është se ata vendosin veprime brenda një laku që duhet të bëhen vetëm një herë. Për shembull si kjo:

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

Nxënësit ndeshen me këtë problem gjatë gjithë kohës, si në fillim ashtu edhe në probleme më komplekse.
Këshilla kryesore në këtë rast:

Sa herë duhet të përsërisni komandën: një herë apo shumë herë?

Komandat për shtypjen e fjalëve "Hyrje" dhe "Përfundim" dhe deklarimin dhe inicializimin e ndryshores i nuk janë si veprimet e tjera të përsëritura. Ato ekzekutohen vetëm një herë, që do të thotë se duhet të shkruhen jashtë trupit të lakut.

Të tre fazat e zgjidhjes duhet të mbeten në kod në mënyrë që t'i referoheni më vonë në rast vështirësish. Mjafton të komentohen dy opsionet e para që të mos ndërhyjnë.
Vëmendja e studentit duhet të tërhiqet në faktet e mëposhtme:
— Në një gjendje loop, zakonisht krahasohen një numërues dhe një kufi. Numëruesi mund të ndryshojë në trupin e lakut, por kufiri nuk mundet. Për të thyer këtë rregull, duhet të formuloni arsye bindëse.
— Komandat për shfaqjen e fjalëve "Hyrje" dhe "Përfundim" ndodhen jashtë trupit të lakut. Ne duhet t'i kryejmë ato 1 herë. "Hyrje" - para se të përsërisni veprimet, "Përfundim" - pas.
Në procesin e konsolidimit të kësaj teme, përvetësimit të atyre të radhës, si dhe përballjes së vështirësive, është e dobishme që edhe nxënësit e fortë të shtrojnë pyetjen: “Sa herë duhet të kryhet ky veprim? Një apo shumë?

Zhvillimi i aftësive shtesë

Në procesin e cikleve të studimit, nxënësit zhvillojnë edhe aftësinë e diagnostikimit dhe zgjidhjes së problemeve. Për të kryer diagnostikimin, studenti duhet të paraqesë rezultatin e dëshiruar dhe ta krahasojë atë me rezultatin aktual. Veprimet korrigjuese varen nga ndryshimi midis tyre.
Meqenëse studentët në këtë fazë kanë ende pak ide për rezultatin "të dëshiruar", ata mund të fokusohen në të dhënat e testit. Si rregull, askush në këtë fazë ende nuk e kupton se çfarë mund të shkojë keq dhe si të merret me të. Prandaj, unë shkruaj në një fletore një përshkrim të problemeve tipike dhe disa mënyra për t'i zgjidhur ato. Zgjedhja më e përshtatshme është detyrë e vetë studentit.
Nevojitet një procesverbal për të pyetur "a ndodhi ajo që pritej?", "Cila nga këto situata ndodhi tani?", "A ndihmoi zgjidhja e aplikuar?"

  1. Numri i veprimeve është 1 më pak ose më shumë se sa pritej. Zgjidhjet:
    — rrisni vlerën fillestare të numëruesit me 1.
    — zëvendësoni operatorin e rreptë të krahasimit (< ose >) me një jo të rreptë (<= ose >=).
    — ndryshoni vlerën kufi në 1.
  2. Veprimet në një lak kryhen pa u ndalur, për një kohë të pacaktuar. Zgjidhjet:
    - shtoni një komandë për ndryshimin e numëruesit nëse mungon.
    — rregulloni komandën e ndryshimit të numëruesit në mënyrë që vlera e tij të jetë më afër kufirit.
    — hiqni komandën e ndryshimit të kufizimeve nëse është në trupin e ciklit.
  3. Numri i veprimeve në një cikli është më shumë se 1 më pak ose më shumë se sa pritej. Veprimi në lak nuk u ekzekutua as edhe një herë. Së pari ju duhet të zbuloni vlerat aktuale të variablave pak para fillimit të ciklit. Zgjidhjet:
    — ndryshoni vlerën fillestare të kufizimit
    — ndryshoni vlerën fillestare të numëruesit

Problemi 3 zakonisht përfshin përdorimin e ndryshores së gabuar ose mos rivendosjen e numëruesit në zero.

Pas këtij shpjegimi, studenti mund të ketë ende keqkuptime të ndryshme rreth mënyrës se si funksionojnë unazat.
Për të hequr ato më të zakonshmet, unë ju jap detyrat e mëposhtme:

  1. Në të cilin kufiri, vlera fillestare e numëruesit ose hapi i numëruesit futet nga përdoruesi.
  2. Në të cilin vlera e numëruesit duhet të përdoret në disa shprehje aritmetike. Këshillohet që të përdoret një numërues në shprehjen radikale ose në emërues në mënyrë që diferenca të jetë jolineare.
  3. Në të cilën vlera e numëruesit nuk shfaqet në ekran gjatë kohës që qarku është në punë. Për shembull, shfaqja e numrit të kërkuar të fragmenteve identike të tekstit ose vizatimi i një figure me grafikë breshkash.
  4. Në të cilat duhet të kryeni së pari disa veprime të përsëritura, dhe më pas të tjerat.
  5. Në të cilën duhet të kryeni veprime të tjera para dhe pas përsëritjes

Për çdo detyrë ju duhet të jepni të dhënat e testit dhe rezultatin e pritur.

Për të kuptuar se sa shpejt mund të lëvizni, duhet të lexoni termat e këtyre problemeve dhe të pyesni: "si ndryshojnë nga shembulli?", "Çfarë duhet ndryshuar në shembull për t'i zgjidhur ato?" Nëse nxënësi përgjigjet me kuptim, atëherë le ta zgjidhë të paktën një në klasë, dhe pjesën tjetër në shtëpi vetë. Nëse zgjidhja është e suksesshme, atëherë mund të fillojmë të shpjegojmë kushtet brenda sytheve.
Nëse keni probleme me zgjidhjen e problemeve vetë, duhet të punoni me gjithçka në klasë. Për të shmangur që zgjidhja e problemit të kujton vizatimin e një bufi, rekomandoj fillimisht ta zgjidhni problemin në një mënyrë jo universale. Kjo do të thotë, në mënyrë që zgjidhja të kalojë testin e parë dhe të mos përdorë ndërtimin e lakut. Epo, atëherë aplikoni transformimet për të arritur universalitetin e zgjidhjes.

Sythe dhe degë

Sipas mendimit tim, është e dobishme të japim veçmas temën "ciklet brenda degëve". Kështu që më vonë mund të shihni ndryshimin midis kontrollimit të një gjendjeje disa herë dhe kontrollit të tij një herë.
Detyrat për konsolidim do të kenë të bëjnë me nxjerrjen e numrave nga A në B, të cilët futen nga përdoruesi:
- gjithmonë në rend rritës.
- në rritje ose në zbritje në varësi të vlerave të A dhe B.

Tema e "degëzimit brenda sytheve" duhet të zhvendoset vetëm pasi studenti të ketë zotëruar teknikat: "Zëvendësimi i një modeli me një ndryshore" dhe "Zëvendësimi i veprimeve të përsëritura me një cikël".
Arsyeja kryesore për përdorimin e degëve brenda sytheve janë anomalitë në model. Në mes prishet në varësi të të dhënave fillestare.
Për ata studentë që janë në gjendje të kërkojnë një zgjidhje duke kombinuar teknika të thjeshta, mjafton të thuhet "degëzimi mund të shkruhet brenda sytheve" dhe të jepet problemi "për shembull" plotësisht për t'u zgjidhur në mënyrë të pavarur.
Shembull i detyrës:

Përdoruesi vendos numrin X. Paraqitni numrat nga 0 deri në 9 në një kolonë dhe vendosni një shenjë '+' përballë 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 një shpjegim i shkurtër nuk mjafton për të shkruar me një lak, atëherë duhet të arrini një zgjidhje universale për të njëjtin problem pa një lak.
Ju do të merrni një nga dy opsionet:
Dëshiruar

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

Unë jap një detyrë të ngjashme paraprakisht, ndërsa studioj temën e degëzimit.
Nëse studenti del me një opsion "të mundshëm", atëherë ju duhet t'i tregoni atyre se mund të ketë shumë zgjidhje për të njëjtin problem. Megjithatë, ato ndryshojnë në rezistencën e tyre ndaj ndryshimeve në kërkesat. Bëni pyetjen: "Sa vende në kod do të duhej të korrigjoheshin nëse do të më duhej të shtoja një numër tjetër?" Në versionin "e mundur", do t'ju duhet të shtoni një degë më shumë dhe të shtoni një numër të ri në 10 vende të tjera. Në "dëshiruar" mjafton të shtoni vetëm një degë.
Vendosni detyrën për të riprodhuar opsionin "e dëshiruar", më pas gjeni një model në kod, kryeni një zëvendësim të ndryshores dhe shkruani një lak.
Nëse keni një ide se si ta zgjidhni këtë problem pa një lak në ndonjë mënyrë tjetër, ju lutemi shkruani në komente.

Unazat brenda sytheve

Në këtë temë duhet t'i kushtoni vëmendje sa vijon:
— numëruesit për unazat e brendshme dhe të jashtme duhet të jenë variabla të ndryshëm.
- numëruesi për lakin e brendshëm duhet të rivendoset shumë herë (d.m.th., në trupin e lakut të jashtëm).
— në detyrat e prodhimit të tekstit, nuk mund të shkruani fillimisht një shkronjë në disa rreshta dhe pastaj të dytën. Fillimisht duhet të printoni të gjitha shkronjat e rreshtit të parë, pastaj të gjitha shkronjat e rreshtit të dytë, e kështu me radhë.

Është më mirë të filloni të shpjegoni temën e sytheve brenda sytheve duke shpjeguar rëndësinë e rivendosjes së numëruesit në zero.
Shembull i detyrës:

Përdoruesi fut dy numra: R dhe T. Shtypni dy rreshta me karaktere "#". Rreshti i parë duhet të përmbajë karaktere R. Rreshti i dytë përmban pjesë T. Nëse ndonjë numër është negativ, shfaqni një mesazh gabimi.

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

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

R=-1, T=6Vlera R duhet të jetë jo negative

R=6, T=-2Vlera T duhet të jetë jo negative

Natyrisht, ky problem gjithashtu ka të paktën dy zgjidhje.
Dëshiruar

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

E mundur #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 është se në zgjidhjen "e mundshme", një ndryshore e dytë u përdor për të nxjerrë rreshtin e dytë. Duhet të insistoni të përdorni të njëjtën variabël për të dy unazat. Ky kufizim mund të justifikohet me faktin se një zgjidhje me një numërues për dy cikle do të jetë një ilustrim i termit "rivendosje kundërvlerësimi". Kuptimi i këtij termi është i nevojshëm kur zgjidhen problemet e mëposhtme. Si një kompromis, ju mund të ruani të dyja zgjidhjet e problemit.

Një problem tipik me përdorimin e një ndryshoreje numërues për dy sythe shfaqet si kjo:
R=5, T=11#####
######

Numri i karaktereve në rreshtin e dytë nuk korrespondon me vlerën e T. Nëse keni nevojë për ndihmë me këtë problem, atëherë duhet të shikoni shënimet për problemet tipike me sythe. Ky është simptoma numër 3. Diagnostikohet nëse shtoni një dalje të vlerës së numëruesit menjëherë përpara ciklit të dytë. Korrigjohet duke rivendosur. Por është më mirë të mos e thuash këtë menjëherë. Nxënësi duhet të përpiqet të formulojë të paktën një hipotezë.

Sigurisht që ka një zgjidhje tjetër. Por nuk e kam parë kurrë mes studentëve. Në fazën e cikleve të studimit, historia për të do të tërheqë vëmendjen. Mund t'i riktheheni më vonë kur të mësoni rreth funksioneve të vargut.
E mundur #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));

Detyra tjetër e kërkuar:

Paraqitni numrat nga 0 deri në 9. Çdo numër duhet të jetë në rreshtin e vet. Numri i shifrave në një 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 një student ka zotëruar teknikën e zëvendësimit të një ndryshoreje, atëherë ai do ta përballojë mjaft shpejt. Një problem i mundshëm do të jetë përsëri në rivendosjen e ndryshores. Nëse nuk e përballoni dot transformimin, do të thotë se keni qenë me nxitim dhe keni nevojë të zgjidhni probleme më të thjeshta.

Faleminderit per vemendjen. Pëlqejeni dhe abonohuni në kanal.

PS Nëse gjeni gabime shtypi ose gabime në tekst, ju lutem më njoftoni. Kjo mund të bëhet duke zgjedhur një pjesë të tekstit dhe duke shtypur "⌘ + Enter" në Mac dhe "Ctrl / Enter" në tastierat klasike ose përmes mesazheve private. Nëse këto opsione nuk janë të disponueshme, shkruani për gabimet në komente. Faleminderit!

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, te lutem

Sondazh për lexuesit pa karma

  • 20,0%Mësoj profesionalisht, +12

  • 10,0%Mësoj profesionalisht, -11

  • 70,0%Unë nuk jap mësim, +17

  • 0,0%Unë nuk jap mësim, -10

  • 0,0%Të tjera0

10 përdorues votuan. 5 përdorues abstenuan.

Burimi: www.habr.com

Shto një koment