Si të mësoni të kapërceni vështirësitë dhe po ashtu të shkruani cikle

Megjithëse po flasim për një nga temat themelore, ky artikull është shkruar për profesionistë të përvojshëm. Qëllimi është të tregojmë se cilat janë gabimet e zakonshme që bëjnë fillestarët në programim. Për zhvilluesit që praktikojnë, këto probleme janë zgjidhur prej kohësh, janë harruar ose nuk kanë qenë fare të vërejtura. Artikulli mund të jetë i dobishëm nëse ndonjëherë duhet t'i ndihmoni dikujt me këtë temë. Në artikull, bëhen paralele me materialin nga disa libra për programim nga autorët Shildt, Stroustrup, Okulov.

Tema për ciklet është zgjedhur sepse shumë njerëz eliminohen gjatë mësimit të programimit.

Kjo metodologji është e destinuar për studentë të dobët. Në përgjithësi, të fortët nuk mbesin të ngatërruar në këtë temë dhe nuk është nevoja të inventohen metoda të veçanta për ta. Qëllimi dytësor i artikullit është të transferojë këtë metodologji nga klasa "funksionon për të gjithë studentët, por vetëm me një mësues" në klasën "funksionon për të gjithë studentët, të gjithë mësuesit". Nuk pretendoj për origjinalitet të plotë. Nëse tashmë po përdorni një metodologji të ngjashme për të mësuar këtë temë, ju lutem na tregoni se si ndryshon varianti juaj. Nëse vendosni ta aplikoni, do të isha i interesuar për rezultatet. Nëse një metodologji e ngjashme përshkruhet në ndonjë libër, ju lutem na jepni titullin.


Këtë metodologji e kam punuar për 4 vjet, duke u angazhuar individualisht me studentë të niveleve të ndryshme. Në total, rreth pesëdhjetë studentë dhe dy mijë orë mësimi. Në fillim, studentët ngeleshin për një kohë të gjatë në këtë temë dhe iknin. Pas çdo studenti, metodologjia dhe materialet janë korrigjuar. Në vitin e fundit, studentët nuk ngelën më në këtë temë, prandaj vendosa të ndaj përvojën time.

Pse ka kaq shumë shkronja? Ciklet janë elementare!

Siç kam shkruar më parë, për zhvilluesit praktikues dhe studentët e fortë, kompleksiteti i konceptit të cikleve mund të nënvlerësohet. Për shembull, mund të organizoni një leksion të gjatë, të shihni kryeveprat që lëvizin dhe sytë e mençur. Por kur përpiqen të zgjidhin ndonjë problem, fillon një ngecje dhe probleme të paqartë. Pas leksionit, studentët patjetër se kanë formuar vetëm një kuptim të pjesshëm. Situata përkeqësohet nga fakti që studentët nuk mund të shprehin vetë se ku qëndron gabimi i tyre.
Njëherë e kuptova se studentët i perceptojnë shembujt e mi si hieroglifë. Pra, si copa të pandashme teksti, në të cilat duhet të shtosh ndonjë "shkronjë magjike" dhe do të funksionojë.
Ndonjëherë kam vënë re se studentët mendojnë se për të zgjidhur një problem të konkret, nevojitet ndonjë konstrukcion tjetër që unë thjesht nuk e kam përmendur akoma. Megjithatë, për zgjidhjen e nevojshme ishte vetëm pak modifikim i shembujve.

Prandaj arrita në ide që vëmendja kryesore duhet të përqendrohet jo në sintaksën e shprehjeve, por në idenë e ristrukturimit të kodit të përsëritur me ndihmën e cikleve. Sa herë që nxënësit e kuptojnë këtë ide, çdo sintaksë arrin ta zotërojnë me anë të ushtrimeve të vogla.

Kë të mësoj dhe përse

Duke qenë se nuk ka prova hyrëse, në mësim mund të jenë si studentë të fortë ashtu dhe shumë të dobët. Më shumë rreth studentëve të mi mund të lexoni në artikullin Portreti i dëgjuesve të kurseve të mbrëmjes
Kam synuar që programimi të mësohet nga çdo njeri që dëshiron.
MĂ«simet e mia janĂ« individuale dhe studenti paguan vetĂ« çdo herĂ«. Duket se studentĂ«t do tĂ« optimizojnĂ« kostot dhe do tĂ« kĂ«rkojnĂ« minimumin. SidoqoftĂ«, njerĂ«zit vinĂ« nĂ« mĂ«sime tĂ« drejtpĂ«rdrejta me njĂ« mĂ«sues tĂ« gjallĂ« jo vetĂ«m pĂ«r diturinĂ«, por pĂ«r sigurinĂ« se ata e kanĂ« pĂ«rvetĂ«suar, pĂ«r ndjenjĂ«n e progresit dhe pĂ«r miratimin nga eksperti (mĂ«suesi). NĂ«se studentĂ«t nuk do tĂ« ndjejnĂ« progres nĂ« mĂ«simin e tyre, ata do tĂ« largohen. NĂ« pĂ«rgjithĂ«si, mund tĂ« organizohen mĂ«sime nĂ« mĂ«nyrĂ« qĂ« studentĂ«t tĂ« ndjejnĂ« progres nĂ« rritjen e numrit tĂ« konstrukcioneve tĂ« njohura. Pra, fillojmĂ« duke studiuar nĂ« detaje while, pastaj mĂ«sojmĂ« for, pastaj do while dhe ja, kemi njĂ« kurs pĂ«r njĂ« mijĂ« e njĂ« natĂ«, ku pĂ«r dy muaj studiojmĂ« vetĂ«m ciklet, dhe nĂ« fund, njĂ« student qĂ« shkruan bibliotekĂ«n standarde nĂ« dikta. MegjithatĂ«, pĂ«r tĂ« zgjidhur probleme praktike, nuk duhet vetĂ«m njohuri tĂ« materialit, por edhe pavarĂ«si nĂ« aplikimin e tij dhe nĂ« kĂ«rkimin e informacionit tĂ« ri. Prandaj, pĂ«r kursin e drejtpĂ«rdrejt, e konsideroj parimin e duhur — tĂ« mĂ«soj minimumin dhe tĂ« inkurajoj studimin e pavarur tĂ« nuancave dhe temave tĂ« afĂ«rta. NĂ« temĂ«n e cikleve, minimumi e shoh si konstrukcionin while. Me tĂ« mund tĂ« kuptohet principi. Duke njohur principin, mund tĂ« zotĂ«rohet edhe for dhe do-while nĂ« mĂ«nyrĂ« tĂ« pavarur.

PĂ«r tĂ« arritur pĂ«rvetĂ«simin e materialit nga studentĂ«t e dobĂ«t, nuk mjafton tĂ« pĂ«rshkruhet sintaksa. Duhet t'u jepet mĂ« shumĂ« detyra tĂ« thjeshta, por tĂ« larmishme dhe tĂ« shtjellohet shembujt mĂ« nĂ« detaje. NĂ« fund, shpejtĂ«sia e pĂ«rvetĂ«simit kufizohet nga aftĂ«sitĂ« e studentit pĂ«r tĂ« transformuar shprehjet dhe pĂ«r tĂ« gjetur rregulla. PĂ«r studentĂ«t e zgjuar, shumica e detyrave do tĂ« jenĂ« tĂ« mĂ«rzitshme. GjatĂ« mĂ«simit me ta, nuk Ă«shtĂ« e nevojshme tĂ« insistosh nĂ« zgjidhjen e 100% tĂ« detyrave. Materialin tim mund ta shihni nĂ« githab.com. MegjithatĂ«, repositori Ă«shtĂ« mĂ« shumĂ« si njĂ« grimuar i njĂ« magjistari—askush pĂ«rveç meje nuk do ta kuptojĂ« se çfarĂ« ndodhet kudo, dhe nĂ«se dĂ«shton kontrollin, mund tĂ« çmendet.

Metodika është e orientuar drejt praktikës.

Teoria shpjegohet në shembuj zgjidhjeje problemesh. Në mësimet për bazat e programimit, ku studiohen ndarjet dhe ciklet, thjesht nuk mund të organizohet një ligjëratë e dobishme për një temë për një orë të tërë. 15-20 minuta mjaftojnë për të shpjeguar konceptin. Vështirësitë kryesore shfaqen gjatë realizimit të detyrave praktike.
Mësuesit fillestarë mund të hedhin operatorë, ndarje, cikle dhe masa gjatë një ligjërate. Por studentët e tyre do të hasin vështirësi në të kuptuarit e kësaj informacioni.
Në fakt, nuk mjafton vetëm të tregosh materialin, por edhe të sigurohesh se dëgjuarit e kuptojnë atë.

Fakti i përvetësimit të temës përcaktohet nga mënyra se si studenti përballet me punën e pavarur.
Nëse studenti arrin të zgjidhë një problem mbi temën pa ndihmën e mësuesit, atëherë tema është përvetësuar. Për të siguruar kontrollin e pavarur, çdo detyre përshkruhet me 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 vështirë, kalimi në të ardhshme është i pafrytshëm. Ajo është akoma më e vështirë. Për të ndihmuar studentin të përballojë detyrën e tanishme të vështirë, i shpjegohet disa teknika duke marrë shembull nga detyra e parë. Në thelb, e gjithë përmbajtja e temës përqendrohet në teknikat e përballimit 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 kryhet "vetëm" menjëherë pas të parës nën mbikëqyrjen e mësuesit. Të gjitha detyrat pasuese janë të orientuara për tërhequr vëmendjen në detaje të ndryshme që mund të shkaktojnë keqkuptime.

Shpjegimi i shembullit përbën një dialog, ku studenti duhet të shkaktojë back propagation dhe cross-validation për të siguruar përvetësimin e materialit.

Do të jem banal dhe do të them se shembulli i parë mbi temën është shumë i rëndësishëm. Nëse ka materiale për punë të gjerë të pavarur, lënia pas e shembullit të parë mund të rregullohet. Nëse përveç shembullit nuk ka më asgjë, atëherë studenti ndoshta nuk do ta përvetësojë temën.

While apo for?

Një nga pyetjet e diskutueshme është zgjedhja e ndërtimit për shembullin: while apo for. Njëherë, një mik im, një zhvillues praktik pa përvojë mësimdhënie, më bindte për një orë se cikli for është më i lehti për t'u kuptuar. Argumentet reduktoheshin në "në të gjithçka është e qartë dhe i organizuar në vend". Megjithatë, arsyeja kryesore e vështirësive për fillestarët realë qëndron te ideja e ciklit, e jo në shkrimin e tij. Nëse një person nuk e kupton këtë ide, atëherë do të ketë vështirësi me sintaksën. Sapo ideja të kuptohet, atëherë problemet me formatimin e kodit zhduken vetvetiu.

Në materialet e mia, temat e cikleve pasojnë ato të ndarjeve. Ngjashmëria e jashtme midis if dhe while lejon një analogji të drejtpërdrejtë: "kur kushti në titull është i vërtetë, atëherë ekzekutohet trupi". Veçantia 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 budallaqe me mungesën e virgullave dhe kallëpeve. Fillestarët nuk kanë aq shumë zhvillim të vëmendjes dhe detajimit, sa për të shmangur automatikisht gabimet sintaksore.
Argumenti i tretë - në shumë libra të mira, while shpjegohet i pari.

Nëse studenti arrin të transformojë lehtësisht shprehjet, atëherë të flitet për for përmes kalimit. Studenti pastaj vetë do të zgjedhë atë që i pëlqen më shumë. Nëse megjithatë transformimet shkaktojnë vështirësi, atëherë është më mirë të mos shpërndahen vëmendjen. Le të zgjidhë studentin së pari gjithçka me while. Kur tema e cikleve është përvetësuar, mund të rishkruhen zgjidhjet për të punuar në transformimin e while në for.
Ciklet me kusht pas janë një makth mjaft i rrallë. Për to nuk humbas kohë fare. Nëse studenti ka përvetësuar idetë e zbuleve të rregullave dhe transformimin e shprehjeve, ai do të jetë në gjendje të kuptojë pa ndihmën time.

GjatĂ« demonstrimit tĂ« shembullit tĂ« parĂ« pĂ«r studentĂ«t tĂ« fortĂ«, theksoj se Ă«shtĂ« e rĂ«ndĂ«sishme qĂ« nĂ« shembullin e parĂ« tĂ« regjistrohet jo vetĂ«m zgjidhja, por gjithashtu e gjithĂ« zinxhiri i veprimeve qĂ« çuan nĂ« rezultat. StudentĂ«t qĂ« janĂ« dembelĂ« mund tĂ« nĂ«nvlerĂ«sojnĂ« shkrimin dhe tĂ« transferojnĂ« vetĂ«m algoritmin pĂ«rfundimtar. Duhet t’i bindim ata se njĂ«herĂ« do t'u dalĂ« njĂ« detyrĂ« e komplikuar. PĂ«r ta zgjidhur atĂ«, do tĂ« nevojitet tĂ« ndjekin hapat si nĂ« kĂ«tĂ« shembull. Prandaj, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« regjistrohen tĂ« gjitha etapat. NĂ« detyrat e ardhshme mund tĂ« mbetet vetĂ«m varianti pĂ«rfundimtar i zgjidhjes.

Ideja kryesore e automatizimit është se i angazhojmë kompjuterin të kryejë punë rutinë për njeriun. Një nga teknikat bazë është shkrimi i cikleve. Ajo aplikohet kur në program shkruhen disa veprime të njëjta një pas një.

E qarta është më e mirë se e paqartë

Mund të duket një ide e mirë në detyrën e parë për ciklet të nxjerrësh në ekran një frazë të njëjtë disa herë. Për shembull:

Hurrah, punon!
Hurrah, punon!
Hurrah, punon!
Hurrah, punon!
Hurrah, punon!
Hurrah, punon!
Hurrah, punon!
Hurrah, punon!

Kjo mundĂ«si Ă«shtĂ« e keqe sepse nĂ« daljen e rezultateve nuk tregohet vlera e numĂ«ruesit. Kjo Ă«shtĂ« njĂ« problem pĂ«r fillestarĂ«t. Nuk duhet ta nĂ«nvlerĂ«sojmĂ« atĂ«. NĂ« fillim, kjo detyrĂ« ishte e para, dhe detyra pĂ«r tĂ« nxjerrĂ« njĂ« seri numrash nĂ« rritje ishte e dyta. Duhej tĂ« futeshin terma shtesĂ« si “cikli N herĂ«â€ dhe “cikli nga A deri nĂ« B”, tĂ« cilat janĂ« nĂ« thelb tĂ« njĂ«jta. PĂ«r tĂ« mos krijuar entitete tĂ« panevojshme, vendosa tĂ« shfaq vetĂ«m shembullin me nxjerrjen e njĂ« serie numrash. Pak njerĂ«z e kanĂ« tĂ« lehtĂ« tĂ« mĂ«sojnĂ« tĂ« mbajnĂ« nĂ« mend numĂ«ruesin dhe tĂ« modelojnĂ« sjelljen e programit nĂ« mendje. Disa studentĂ« pĂ«rballen pĂ«r herĂ« tĂ« parĂ« me modelimin “nĂ« mendje” pikĂ«risht nĂ« temĂ«n e cikleve.
Pas disa praktikave, detyrĂ«n pĂ«r pĂ«rsĂ«ritjen e tekstit tĂ« njĂ«jtĂ« e jap pĂ«r zgjidhje tĂ« pavarur. NĂ«se mĂ« parĂ« shfaq njĂ« numĂ«rues tĂ« dukshĂ«m dhe pastaj njĂ« tĂ« padukshĂ«m, studentĂ«t kanĂ« mĂ« pak probleme. N sometimes Ă«shtĂ« e mjaftueshme njĂ« kĂ«shillĂ« “mos e shkruaj numĂ«ruesin nĂ« ekran”.

Si shpjegohet te të tjerët?

Në shumicën e materialeve mësimore në internet, sintaksa e ciklit jepet si pjesë e "lekture". Për shembull, në developer.mozilla.org (në këtë moment) së bashku me ciklin while përmenden edhe disa konstrukte të tjera. Në këtë rast jepen ekskluzivisht vetë konstruktionet në formë shablloni. Rezultati i ekzekutimit të tyre përshkruhet me fjalë, ndërsa ilustruese mungon. Në mendimin tim, një paraqitje e tillë e temës shumëfishohet me zero dobishmërinë e këtyre materialeve. Nxënësi mund ta kopjojë kodin dhe ta ekzekutojë vetë, por një referencë për krahasim akoma është e nevojshme. Si të kuptohet që shembulli është kopjuar në mënyrë të duhur nëse nuk ka çfarë të krahasosh rezultatin?
Kur jepet vetëm shablloni, pa shembuj, studentit i bëhet akoma më e vështirë. Si të kuptohet që fragmentet e kodit janë vendosur në shabllon në mënyrë të duhur? Mund të provohet të shkruhet ndonjëherë, dhe pastaj të ekzekutohet. Por nëse nuk ka një standard për krahasim të rezultatit, atëherë ekzekutimi gjithashtu nuk ndihmon. ndonjëherë, dhe pastaj të ekzekutohet. Por nëse nuk ka një standard për krahasim të rezultatit, atëherë ekzekutimi gjithashtu nuk ndihmon.

Në kursin për C++ në intuit, sintaksa e ciklit është fshehur në faqen e tretë të leksionit 4 në temën "operatorët". Gjatë shpjegimit të sintaksës së cikleve, bëhet një theks i veçantë mbi termin "operator". Termi jepet në formën e një grupi faktesh si "simbol; ky është operator", "{} ky është operator i përbërë", "trupi i ciklit duhet të jetë një operator". Mënyra e tillë nuk më pëlqen, sepse në një farë mënyre fsheh lidhjet e rëndësishme pas një termi. Analiza e kodit të burimit të programit në terma në një nivel të tillë është e nevojshme për zhvilluesit e kompilatorëve për të zbatuar specifikimin e gjuhës, por asnjëherë për studentët në një qasje të parë. Fillestarët në programim rrallë kanë mjaftueshëm vëmendje për të qënë aq të kujdesshëm me termat. Rralë ndokush e mban mend dhe e kupton fjalë të reja në herën e parë. Praktikisht askush nuk mund të aplikojë siç duhet një term që sapo ka mësuar. Prandaj, studentët kanë shumë gabime si: "shkrova while(a<7);{, dhe programa nuk punon".
Në mendimin tim, në fillim është më mirë të jepet sintaksa e konstruktionit menjëherë me kllapa. Varianti pa kllapa të shpjegohet vetëm nëse nxënësi ngre një pyetje të veçantë "pse këtu pa kllapa dhe funksionon".

Në librin e Okulov "Themelët e programimit" 2012, njohja me ciklet fillon me shabllonin for, pastaj jepen rekomandime për përdorimin e tij, dhe pastaj menjëherë shkon në një seksion eksperimental të mësimit. Unë e kuptoj që 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Ă« shkruhet rezultati i fragmenteve tĂ« kodit. PĂ«r shembull, te Shildt "Java 8. UdhĂ«zimi i PlotĂ«" i botuar nĂ« vitin 2015. NĂ« fillim jepet shablloni, pastaj shembulli i programit dhe menjĂ«herĂ« pas tij — rezultati i ekzekutimit.

Si një shembull, le të shohim ciklin while, ku bëhet numërimi pasues duke filluar nga 10 dhe printohen saktësisht 10 rreshta "taktesh":
Pas nisjes, ky program printon dhjetë "takte" në këtë mënyrë:

//ĐŸŃ€ĐŸĐŽĐ”ĐŒĐŸĐœŃŃ‚Ń€ĐžŃ€ĐŸĐČать ĐżŃ€ĐžĐŒĐ”ĐœĐ”ĐœĐžĐ” ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€Đ° цоĐșла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("таĐșт " + n);
            n--;
        }
    }
}

Qasja me përshkrimin e modelit, shembullin e programit dhe rezultatin e punës së 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.
takti 10
takti 9
takti 8
takti 7
takti 6
takti 5
takti 4
takti 3
takti 2
takti 1

Në librin e Stroustrupit "Principet dhe praktika me C++" 2016, autori e çon më tej. Fillimisht shpjegohet cilat rezultate duhen arritur, dhe pastaj tregohet teksti i programit. Për më tepër, si shembull nuk merret thjesht një program rastësor, por jepet një udhëtim në histori. Kjo ndihmon në fokusimin mbi të: "Shiko, kjo nuk është thjesht ndonjë tekst të padobishëm. Ti sheh diçka të rëndësishme".

Si një shembull të iteracionit, le të shqyrtojmë programin e parë të ekzekutuar në makinën me program të ruajtur (EDSAC). Ai u shkrua nga David Wheeler në laboratorin e kompjuterëve të Universitetit të Kembrixhit (Cambridge University, Angli) më 6 maj 1949. Ky program kalkulon dhe printon një listë të thjeshtë të katrorëve.

KĂ«tu, nĂ« çdo rresht pĂ«rfshihet njĂ« numĂ«r, i cili pason nga shenja e tabulimit (‘t’) dhe katrori i kĂ«tij numri. Versioni i kĂ«tij programi nĂ« gjuhĂ«n C++ dukej kĂ«shtu:
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

ËshtĂ« interesante se modeli i sintaksĂ«s nĂ« kĂ«tĂ« libĂ«r nuk pĂ«rshkruhet. Stroustrup nĂ« udhĂ«zuesin e instruktorit (

//Đ’Ń‹Ń‡ĐžŃĐ»ŃĐ”ĐŒ Đž распДчатыĐČĐ°Đ”ĐŒ Ń‚Đ°Đ±Đ»ĐžŃ†Ńƒ ĐșĐČĐ°ĐŽŃ€Đ°Ń‚ĐŸĐČ Ń‡ĐžŃĐ”Đ» 0-99
int main()
{
    int i = 0; // ĐĐ°Ń‡ĐžĐœĐ°Đ”ĐŒ с ĐœŃƒĐ»Ń
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

) thekson se respekton inteligjencën e studentëve të tij. Ndoshta aftësia për të zbuluar një model në disa shembuj konsiderohet një shenjë e tillë inteligjence.përkthimSiç shpjegoj unë vetë

Qasja e Stroustrupit: pĂ«rshkrimi i rezultatit, pastaj zgjidhja e problemit, dhe mĂ« pas analiza e pavarur nga studenti — duket si mĂ« e arsyeshmja. Prandaj, vendosa ta marr si bazĂ« pikĂ«risht kĂ«tĂ« qasje, por pĂ«r ta treguar nĂ« njĂ« shembull mĂ« pak historik — njĂ« problem lidhur me printimin e "pĂ«rmbajtjes". Kjo formon njĂ« ankorĂ« tĂ« njohur, qĂ« mĂ« pas tĂ« themi "kujto problemin mbi pĂ«rmbajtjen" dhe qĂ« studentĂ«t ta kujtojnĂ« atĂ«. NĂ« shembullin tim, pĂ«rpiqem tĂ« paralajmĂ«roj dy nga e keqja mĂ« tĂ« zakonshme. MĂ« pas do tĂ« shkruaj mĂ« shumĂ« rreth tyre.

Në këtë problem kemi njohuri me teknikat për zgjidhjen e problemeve komplekse. Zgjidhja fillestare duhet të jetë primitive dhe e thjeshtë. Më pas mund të mendojmë se si ta përmirësojmë këtë zgjidhje.

Nga vĂ«zhgimet e mia, qasja "model-shembull-rezultati" nĂ« kombinime tĂ« ndryshme ende sjell nĂ« mĂ«nyrĂ« qĂ« studentĂ«t ta perceptojnĂ« ciklin si njĂ« hieroglif. Kjo u shfaq nĂ« faktin se ata nuk kuptonin pse duhet tĂ« shkruanin kushte, si tĂ« zgjidhnin mes i++ dhe i-- dhe gjĂ«ra tĂ« tjera qĂ« dukeshin tĂ« qarta. PĂ«r tĂ« shmangur kĂ«to keqkuptime, qasja pĂ«r tĂ« folur mbi ciklet duhet tĂ« theksojĂ« kuptimin e pĂ«rsĂ«ritjes sĂ« veprimeve tĂ« njĂ«jta dhe vetĂ«m pastaj — formatizimin e tyre pĂ«rmes konstrukcioneve. Prandaj, para se tĂ« jepet sintaksa e ciklit, duhen zgjidhur problemet "drejt". NjĂ« zgjidhje primitive pĂ«r problemin e pĂ«rmbajtjes Ă«shtĂ« si mĂ« poshtĂ«:
Hyrje
Kreu 1
Kreu 2
Kreu 3
Kreu 4
Kapitulli 5
Kreu 6
Kreu 7
Përfundimi

Console.WriteLine("Hyrje"); 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 ta përmirësojmë atë?

Të zëvendësojmë veprimet uniforme me një cikël.
Cilat veprime përsëriten këtu radhazi pa ndryshime?
Në këtë fragment nuk ka asnjë. Megjithatë, komandat për të printuar fjalën "Kapitulli" me numër janë shumë të ngjashme me njëra-tjetrën.
Prandaj, hapi i ardhshëm është të gjejmë diferencën ndërmjet fragmenteve. Kjo vetëm në këtë problem është gjithçka e qartë, më vonë do të përsëriten jo vetëm komandat individuale, por blloqe kodi prej 5 rreshtash e më shumë. Do të duhet të kërkohet jo thjesht në listën e komandave, por në struktura të ndarjes ose ciklit.
Në shembullin, diferenca midis komandave është numri pas fjalës "Kapitulli".
Sapoh që ndodhet diferenca, duhen kuptuar rregullat e ndryshimit. A është frangenti ndryshe numri? A rritet ose zvogëlohet vazhdimisht? Si ndryshon vlera e numrit ndërmjet dy komandave afër njëra-tjetrës?
Në shembull, numri pas fjalës "Kapitulli" rritet me hap 1. Diferenca është gjetur, rregulli është zbuluar. Tani mund të zëvendësojmë fragmentin e ndryshuar me një variabël.
Deklarimi i tillë i variablës duhet të bëhet përpara të parës nga fragmentet që përsëriten. Kjo variabël zakonisht quhet I ose j ose ndonjë emër më të avancuar. Vlera e saj fillestare duhet të jetë e barabartë me vlerën e parë që printohet në ekran. Në shembull vlera e parë është 1.
Cila vlerë fillestare duhet të merret për printimin e radhës së numrave "100, 101, 102, 103, 104, 105"?
Në këtë radhë, numri i parë është 100.
Pas çdo komande printimi, duhet të rritet vlera e kësaj variabile me 1. Ky hap është ndryshimi.
Pas çdo komandë të daljes, është e nevojshme të rritet vlera e kësaj variabli me 1. Ky njësi është hapi i ndryshimit.
Cili është hapi në serinë e numrave «100, 102, 104, 106»?
Në këtë seri hapi është 2.
Pas zëvendësimit të fragmentit të ndryshëm me një variabël, kodi do të duket kështu:

Console.WriteLine("Hyrje");
int i;
i = 0;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Kreu " + i);
i = i + 1;
Console.WriteLine("Përfundim");

Pas aplikimit të teknikës «shprehi rregullin me një variabël» në kod, rezultojnë disa grupe të njëjtave veprime, të cilat vijnë njëra pas tjetrës. Tani veprimet e përsëritura mund të zëvendësohen me një cikël.

Sezoni i zgjidhjes së detyrës, ku duhet të përdoren ciklet, përbëhet nga etapet:

  1. Zgjidhni «drejt» me një sërë komandash të veçanta
  2. Gjeni rregullin
  3. Shprehni rregullin me një variabël
  4. Formuloni në formën e një cikli

Më pas prezantohen terma të rinj, për të mos e lënë studentin në situatën «po kuptoj gjithçka, por nuk mund të them»:
— numĂ«rues — gjithmonĂ« Ă«shtĂ« njĂ« variabĂ«l qĂ« Ă«shtĂ« e nevojshme pĂ«r tĂ« ndjekur numrin e hapat tĂ« ciklit. Zakonisht Ă«shtĂ« njĂ« numĂ«r i tĂ«rĂ«, i cili krahasohet me kufirin.
— hapi i numĂ«ruesit — pĂ«rshkrimi i rregullit tĂ« ndryshimit tĂ« numĂ«ruesit.
— kufiri — numri ose variabla me tĂ« cilĂ«n krahasohet numĂ«ruesi, qĂ« algoritmi tĂ« jetĂ« i pĂ«rfunduar. 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Ă«nkuptohet pikĂ«risht trupi.
— iteracioni i ciklit — ekzekutimi i njĂ« herĂ« i trupit tĂ« ciklit.
— kushti i ciklit — njĂ« shprehje logjike, nga e cila varet nĂ«se do tĂ« ekzekutohet njĂ« iteracion tjetĂ«r. (KĂ«tu mund tĂ« ketĂ« konfuzion me ndarjet e degĂ«ve)
Duhet të jeni të përgatitur për faktin se për herë të parë studentët do të aplikojnë terma jo sipas qëllimit. Kjo përfshin si të fortët ashtu edhe të dobëtit. Krijimi i një gjuhe të përbashkët është një art i tërë. Tani do ta shkruaj shkurt: duhet t'i vënë detyrën «izolo fragmentin e kodit me <termin>» dhe vetë të përdorin këto terma saktësisht në bisedë.
Pas transformimit me ciklin, rezulton fragmenti:

Console.WriteLine("Hyrje");
int i = 0;
while (i < 7) {
    Console.WriteLine("Kreu " + i);
    i = i + 1;
}
Console.WriteLine("Përfundim");

Keqkuptimi kryesor

Një keqkuptim i njohur nga 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("Hyrje")
    Console.WriteLine("Kreu " + i);
    i = i + 1;
    Console.WriteLine("Përfundim");
}

Nxënësit hasin vazhdimisht në 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 shkruarja e komandës: një herë apo shumë?

Komandat për daljen e fjalëve «Hyrje» dhe «Përfundim», si dhe shpallja dhe inicializimi i variablës i nuk janë të ngjashme me veprimet e tjera të përsëritura. Ato ekzekutohen vetëm një herë, prandaj duhen shkruar jashtë trupit të ciklit.

Në kod duhet të mbesin të tre etapet e zgjidhjes, që më pas të referohen për t'u ndihmuar në rast vështirësish. Dy variantet e para mjafton të komentohet, që të mos pengojnë.
Vëmendja e studentëve duhet të përqendrohet në faktet e mëposhtme:
— NĂ« kushtin e ciklit zakonisht krahasohet numĂ«ruesi dhe kufiri. NumĂ«ruesi mund tĂ« ndryshojĂ« brenda trupit tĂ« ciklit, ndĂ«rsa kufiri — jo. PĂ«r ta shkelur kĂ«tĂ« rregull, duhet tĂ« formulohet njĂ« arsye tĂ« fortĂ«.
— Komandat pĂ«r tĂ« dalĂ« me fjalĂ«t «Hyrje» dhe «PĂ«rfundim» ndodhen jashtĂ« trupit tĂ« ciklit. Ne duam t'i ekzekutojmĂ« ato 1 herĂ«. «Hyrja» — para pĂ«rsĂ«ritjes sĂ« veprimeve, «PĂ«rfundimi» — pas saj.
Gjatë procesit të konsolidimit të kësaj teme, përvetësimit të të tjerave, si dhe zgjidhjes së vështirësive, madje edhe studentëve më të fortë u ndihmon të përshkruajnë pyetjen: «Sa herë duhet të ekzekutohet ky veprim? Një apo shumë?».

Zhvillimi i aftësive shtesë

Gjatë procesit të studimit të cikleve, studentët gjithashtu stërviten në diagnostikimin dhe zgjidhjen e problemeve. Për të kryer një diagnostikim, studentit duhet të paraqesë rezultate të dëshiruara dhe t'i krahasojë ato me rezultatet reale. Nga ndryshimi midis tyre varen veprimet për t'u korrigjuar.
Duke qenë se studentët në këtë fazë ende nuk e kanë idenë e mirë për rezultatin «të dëshiruar», ata mund të orientojnë në të dhënat testuese. Zakonisht askush në këtë fazë nuk e kupton se çfarë mund të shkojë keq dhe si të bëjnë përballë saj. Prandaj unë ofroj në regjistrim në ditar përshkrimin e problemeve tipike dhe disa mënyra për t'i zgjidhur ato. Zgjedhja e më të përshtatshmes është detyra e vetë studentit.
Regjistrimi është i nevojshëm për të pyetur "a doli siç 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. Mënyrat e zgjidhjes:
    — rritni vlerĂ«n fillestare tĂ« numĂ«ruesit me 1.
    — zĂ«vendĂ«soni operatorin e rreptĂ« tĂ« krahasimit (< ose >) me atĂ« jo- tĂ« rreptĂ« (<= ose >=).
    — ndryshoni vlerĂ«n e kufizimit me 1.
  2. Veprimet në cikël ekzekutohen pa ndalesë, pa fund. Mënyrat e zgjidhjes:
    — shtoni komandĂ«n pĂ«r ndryshimin e numĂ«ruesit, nĂ«se ajo mungon.
    — korrigjoni komandĂ«n pĂ«r ndryshimin e numĂ«ruesit nĂ« mĂ«nyrĂ« qĂ« vlera e tij tĂ« afrohet kufizimit.
    — hiqni komandĂ«n pĂ«r ndryshimin e kufizimit, nĂ«se ajo ndodhet brenda ciklit.
  3. Numri i veprimeve në cikël është më shumë se 1 më pak ose më shumë se sa pritej. Veprimi në cikël nuk u ekzekutua asnjëherë. Së pari, duhet të zbulojmë vlerat aktuale të variablave menjëherë para fillimit të ciklit. Mënyrat e zgjidhjes:
    — ndryshoni vlerĂ«n fillestare tĂ« kufizimit
    — ndryshoni vlerĂ«n fillestare tĂ« numĂ«ruesit

Zakonisht problemi 3 lidhet me përdorimin e variablës së gabuar ose pa zeroimin e numëruesit.

Pas këtij shpjegimi, studenti ende mund të ketë keqkuptime të ndryshme rreth funksionimit të cikleve.
Për të shuar keqkuptimet më të zakonshme, po jap detyra:

  1. Në të cilën kufizimi, vlera fillestare e numëruesit ose hapi i numëruesit hyhet nga përdoruesi.
  2. Në të cilën vlera e numëruesit duhet të përdoret në ndonjë shprehje aritmetike. Preferohet me numëruesin në shprehjen nënrrënjore ose në emërues, për të siguruar që diferenca të jetë jo lineare.
  3. Në të cilën vlera e numëruesit nuk shfaqet në ekran gjatë punës së ciklit. Për shembull, shfaqja e numrit të kërkuar të fragmenteve të njëjta të tekstit ose shkrimi i një forme me grafikën e bletëve.
  4. Në të cilën është e nevojshme të kryhen fillimisht disa veprime të përsëritura, dhe më pas disa të tjera.
  5. Në të cilën duhet të kryhen veprime të tjera para dhe pas atyre të përsëritura.

Për secilën detyrë duhet të jepni të dhëna testuese dhe rezultatin e pritur.

PĂ«r tĂ« kuptuar se sa shpejt mund tĂ« ecet, duhet tĂ« lejohet tĂ« lexojĂ« kushtet e kĂ«tyre detyrave dhe tĂ« pyesim: "si ndryshojnĂ« ato nga shembulli?", "ÇfarĂ« duhet tĂ« ndryshohet nĂ« shembull pĂ«r t'i zgjidhur ato?". NĂ«se studenti pĂ«rgjigjet nĂ« mĂ«nyrĂ« tĂ« kuptueshme, atĂ«herĂ« le t'i zgjidhĂ« tĂ« paktĂ«n njĂ« nĂ« klasĂ«, dhe tĂ« tjerat nĂ« shtĂ«pi. NĂ«se zgjidhja Ă«shtĂ« e suksesshme, mund tĂ« fillojmĂ« shpjegimin mbi kushtet brenda cikleve.
Nëse ka vështirësi me zgjidhjen e vetme, atëherë duhet të punojmë gjithçka në klasë. Për të mos i ngjallur detyrat, unë rekomandoj që fillimisht të zgjidhni detyrën në një mënyrë jo universale. Pra, në mënyrë që zgjidhja të kalojë testin e parë dhe të mos përdorë strukturën e ciklit. Pastaj, të aplikohet transformimi për të arritur universalisht.

Ciklet dhe degëzimet

Sipas mendimit tim, është e dobishme të jepet tema "ciklet brenda degëzimeve" ndaras. Kështu, në mënyrë që më pas të shihet dallimi midis kontrollit të shumëfishtë të kushteve dhe atij njëfishtë.
Detyrat për konsolidim do të jenë për shfaqjen e numrave nga A në B, të cilat hyjnë nga përdoruesi:
— gjithmonĂ« nĂ« rritje.
— nĂ« rritje ose nĂ« rĂ«nie nĂ« varĂ«si tĂ« vlerave A dhe B.

Për temën "degëzimet brenda cikleve" duhet të kalojmë vetëm pasi studenti të ketë zotëruar teknikën: "zëvendësimi i rregullit me një variabël" dhe "zëvendësimi i veprimeve të përsëritura me një cikël".
Shkaku kryesor pĂ«r aplikimin e degĂ«zimeve brenda cikleve — anomalitĂ« nĂ« rregull. Ajo prishet nĂ« mes nĂ« varĂ«si tĂ« tĂ« dhĂ«nave hyrĂ«se.
Studentëve që janë në gjendje të kërkojnë zgjidhje duke kombinuar metoda të thjeshta, mjafton të thuhet "degëzimet mund të shkruhen brenda cikleve" dhe t'u jepet detyra "për shembull" plotësisht për zgjidhje të pavarur.
Detyrë për shembull:

PĂ«rdoruesi hyn nĂ« numrin X. Shfaq nĂ« kolonĂ« numrat nga 0 nĂ« 9 dhe vendos njĂ« shenjĂ« ‘+’ pĂ«rpara atij numri qĂ« Ă«shtĂ« i barabartĂ« me X.

Nëse u fut 00+
1
2
3
4
5
6
7
8
9

Nëse u fut 60
1
2
3
4
5
6+
7
8
9

Nëse u fut 90
1
2
3
4
5
6
7
8
9+

Nëse u fut 7770
1
2
3
4
5
6
7
8
9

Nëse shpjegimi i shkurtër mjafton për të shkruar me cikël, atëherë duhet të arrijmë një zgjidhje universale të kësaj detyre pa cikël.
Do të rezultojë 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 mundur

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 jap më herët, gjatë studimit të temës për degëzimin.
Nëse studentit i doli një variant "i mundshëm", duhet të tregoni se zgjidhjet e së njëjtës detyrë mund të jenë të shumta. Megjithatë, ato ndryshojnë në qëndrueshmërinë ndaj ndryshimeve të kërkesave. Bëni pyetjen: "Sa vende në kod do të duhej të rregulloheshin, nëse do të duhet të shtoni një numër të ri?" Në variantin "e mundshëm" do të duhej të shtonit një degëzim të ri dhe të shkruani në 10 vende të tjera numrin e ri. Në "të dëshiruara" është mjaft të shtoni vetëm një degëzim.
Të vendosni detyrën për të riprodhuar variantin "e dëshiruar", pastaj të gjeni në kod një rregull, të bëni zëvendësimin e variablit dhe të shkruani një cikël.
Nëse keni një ide se si ta zgjidhni këtë detyrë pa cikël përmes një metode tjetër, ju lutemi shkruani në komentet.

Ciklet brenda cikleve

Në këtë temë duhet të kushtoni vëmendje se:
— numĂ«ruesit pĂ«r ciklin e brendshĂ«m dhe tĂ« jashtĂ«m duhet tĂ« jenĂ« variabla tĂ« ndryshĂ«m.
— numĂ«ruesi pĂ«r ciklin e brendshĂ«m duhet tĂ« riparojĂ« shumĂ« herĂ« (pra brenda trupit tĂ« ciklit tĂ« jashtĂ«m).
— nĂ« detyrat pĂ«r nxjerrjen e tekstit, nuk mund tĂ« shkruani fillimisht njĂ« shkronjĂ« nĂ« disa rreshta, dhe pastaj njĂ« tjetĂ«r. Duhet fillimisht tĂ« nxirrni tĂ« gjitha shkronjat e rreshtit tĂ« parĂ«, pastaj tĂ« gjitha shkronjat e rreshtit tĂ« dytĂ« e kĂ«shtu me radhĂ«.

Shpjegimi i temës për ciklet brenda cikleve është më mirë të fillohet me shpjegimin e rëndësisë së riparimit të numëruesit.
Detyrë për shembull:

Përdoruesi jep dy numra: R dhe T. Nxirrni dy rreshta karakteresh "#". Në rreshtin e parë duhet të jenë R simbole. Në rreshtin e dytë T simbole. Nëse ndonjë numër është negativ, nxirrni 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

Sigurisht, që kjo detyrë ka të paktën dy variante 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;
}

I mundshĂ«m №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 mundshëm" për nxjerrjen e rreshtit të dytë u përdor një variablë e dytë. Duhet të insistoni në përdorimin e të njëjtit variablë për të dy ciklet. Mund të argumentoni këtë kufizim duke thënë se zgjidhja me një numërues për dy cikle do të ilustronte termin "riparimi i numëruesit". Kuptimi i këtij termini është i nevojshëm për zgjidhjen e detyrave të ardhshme. Si një kompromis, mund të mbani të dy zgjidhjet e detyrës.

Një problem tipik me përdorimin e një variabli numërues për dy cikle shfaqet kështu:
R=5, T=11#####
######

Numri i simboleve nĂ« rreshtin e dytĂ« nuk korrespondon me vlerĂ«n T. NĂ«se keni nevojĂ« pĂ«r ndihmĂ« me kĂ«tĂ« problem, duhet "tĂ« tregoni me gishta" nĂ« pĂ«rmbledhjen mbi problemet tipike me ciklet. Ky Ă«shtĂ« simptoma №3. Diagnostikohet nĂ«se shtoni nxjerrjen e vlerĂ«s numĂ«ruesit menjĂ«herĂ« para ciklit tĂ« dytĂ«. Rregullohet me riparimin. Por Ă«shtĂ« mĂ« mirĂ« tĂ« mos e tregoni menjĂ«herĂ«. Studenti duhet tĂ« pĂ«rpiqet tĂ« formullojĂ« tĂ« paktĂ«n njĂ« hipotezĂ«.

Sigurisht, ka edhe një variant tjetër zgjidhjeje. Por unë nuk e kam parë atë tek studentët. Në fazën e studimit të cikleve, tregimi i tij do të shpërqendronte vëmendjen. Mund të kthehemi te ai më vonë, gjatë studimit të funksioneve që lidhen me shenjat.
I mundshĂ«m №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 obligueshme:

Nxirrni nĂ« ekran numrat nga 0 nĂ« 9. Çdo numĂ«r duhet tĂ« jetĂ« nĂ« rreshtin e vet. Numri i numrave nĂ« rresht (W) jepet pĂ«rmes tastierĂ«s.

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 zotëruar teknikën e zëvendësimit të variables, atëherë ai do ta përballojë mjaft shpejt. Problemi mund të jetë përsëri në zerimin e variables. Nëse nuk arrin të kryejë konvertimin, do të thotë se jeni nxituar dhe duhet të zgjidhni detyra më të lehta.

Faleminderit për vëmendjen. Jepni pëlqime dhe regjistrohuni në kanal.

P.S. NĂ«se keni gjetur gabime ose shkrime tĂ« gabuara nĂ« tekst, ju lutem mĂ« njoftoni. Kjo mund tĂ« bĂ«het duke theksuar njĂ« pjesĂ« tĂ« tekstit dhe duke shtypur nĂ« Mac «⌘ + Enter», ose nĂ« tastierat klasike «Ctrl / Enter», ose pĂ«rmes mesazheve private. 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ë. Hyni, ju lutemi.

Anketë për lexuesit pa karma

  • 20,0%MĂ«soj profesionist, +12

  • 10,0%MĂ«soj profesionist, -11

  • 70,0%Nuk mĂ«soj, +17

  • 0,0%Nuk mĂ«soj, -10

  • 0,0%TjetĂ«r0

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

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster