Qanday qilib qiyinchiliklarni engib o'tishni o'rgatish va shu bilan birga tsikllarni yozish

Asosiy mavzulardan biri haqida gapirishimizga qaramay, ushbu maqola tajribali mutaxassislar uchun yozilgan. Maqsad yangi boshlanuvchilar dasturlashda qanday noto'g'ri tushunchalarga ega ekanligini ko'rsatishdir. Amaliy ishlab chiquvchilar uchun bu muammolar uzoq vaqtdan beri hal qilingan, unutilgan yoki umuman sezilmagan. Agar siz to'satdan ushbu mavzu bo'yicha kimgadir yordam berishingiz kerak bo'lsa, maqola foydali bo'lishi mumkin. Maqolada Shildt, Stroustrup, Okulovning dasturlash bo'yicha turli kitoblari materiallari bilan parallellik keltirilgan.

Dasturlashni o'zlashtirishda juda ko'p odamlar undan tashqarida bo'lganligi sababli tsikllar haqidagi mavzu tanlangan.

Ushbu usul zaif talabalar uchun mo'ljallangan. Qoida tariqasida, kuchli odamlar bu mavzuga yopishib olishmaydi va ular uchun maxsus texnikani o'ylab topishning hojati yo'q. Maqolaning ikkinchi darajali maqsadi ushbu texnikani "barcha o'quvchilar uchun ishlaydi, lekin faqat bitta o'qituvchi" sinfidan "barcha o'quvchilar, barcha o'qituvchilar uchun ishlaydi" sinfiga o'tkazishdir. Men mutlaq originallikka da'vo qilmayman. Agar siz ushbu mavzuni o'rgatish uchun shunga o'xshash metodologiyadan foydalanayotgan bo'lsangiz, sizning versiyangiz qanday farq qilishini yozing. Agar siz undan foydalanishga qaror qilsangiz, bu qanday o'tganini bizga ayting. Agar shunga o'xshash texnika kitobda tasvirlangan bo'lsa, iltimos, nomini yozing.


Men ushbu texnika ustida 4 yil ishladim, turli darajadagi o'quvchilar bilan yakka tartibda o'qidim. Hammasi bo'lib ellikka yaqin talaba va ikki ming soat dars mavjud. Avvaliga talabalar doimo bu mavzuda qolib ketishdi va ketishdi. Har bir talabadan keyin metodika va materiallar moslashtirildi. O'tgan yil davomida talabalar endi bu mavzuga yopishib qolishmadi, shuning uchun men o'z xulosalarimni baham ko'rishga qaror qildim.

Nega shuncha ko'p harflar? Velosipedlar juda oddiy!

Yuqorida yozganimdek, amaliyotchi ishlab chiquvchilar va kuchli talabalar uchun looplar kontseptsiyasining murakkabligini e'tiborsiz qoldirish mumkin. Masalan, siz uzoq ma'ruza o'qishingiz, bosh irg'adi va aqlli ko'zlarni ko'rishingiz mumkin. Ammo har qanday muammoni hal qilishga urinayotganda, bema'nilik va tushunarsiz muammolar boshlanadi. Ma'ruzadan so'ng, talabalar, ehtimol, faqat qisman tushunchaga ega bo'lishdi. Vaziyatni talabalarning o'zlari o'zlarining yolg'onlari nima ekanligini aytib bera olmasligi bilan yanada og'irlashtiradi.
Bir kuni o'quvchilar mening misollarimni ieroglif sifatida qabul qilishlarini angladim. Ya'ni, matnning bo'linmas qismlari kabi, siz "sehrli" harfni qo'shishingiz kerak va u ishlaydi.
Ba'zida men o'quvchilar aniq bir muammoni hal qilish uchun sizga kerak deb o'ylashlarini payqadim boshqa bir narsa Men hali ko'rib chiqmagan dizayn. Garchi yechim misolni ozgina o'zgartirishni talab qilsa ham.

Shunday qilib, men asosiy e'tibor iboralar sintaksisiga emas, balki tsikllar yordamida takrorlanuvchi kodni qayta tiklash g'oyasiga qaratilishi kerak degan fikrga keldim. Talabalar bu fikrni o‘zlashtirgandan so‘ng, har qanday sintaksisni ozgina mashq qilish bilan yaxshilash mumkin.

Men kimga va nima uchun dars beraman?

Kirish imtihonlari bo'lmagani uchun sinflar kuchli va juda zaif talabalarni o'z ichiga olishi mumkin. Maqolada mening talabalarim haqida ko'proq ma'lumot olishingiz mumkin Kechki kurs talabalari portreti
Men dasturlashni o'rganmoqchi bo'lgan har bir kishi uni o'rganishi uchun harakat qildim.
Mening darslarim individual tarzda o'tkaziladi va talaba har biri uchun o'z pulini to'laydi. Aftidan, talabalar xarajatlarni optimallashtiradi va minimal talab qiladi. Biroq, odamlar jonli o'qituvchi bilan yuzma-yuz mashg'ulotlarga bilimning o'zi uchun emas, balki o'rgangan narsalariga ishonch, taraqqiyotni his qilish va mutaxassis (o'qituvchi) tomonidan ma'qullash uchun boradilar. Agar talabalar o'z o'rganishlarida muvaffaqiyatga erisha olmasalar, ular ketishadi. Umuman olganda, sinflar shunday tuzilishi mumkinki, talabalar tanish tuzilmalar sonini ko'paytirishda muvaffaqiyatlarni his qilishadi. Ya'ni, avval batafsil o'rganamiz, keyin o'rganamiz, keyin vaqt qilamiz va hozir bizda ming bir kecha kursi tayyor, unda faqat tsikllar ikki oy davomida o'rganiladi va oxirida - yozgan talaba diktant ostida standart kutubxona. Biroq, amaliy masalalarni hal qilish uchun nafaqat materialni bilish, balki uni qo'llash va yangi ma'lumotlarni qidirishda mustaqillik ham kerak. Shuning uchun, yuzma-yuz kurslar uchun, menimcha, to'g'ri tamoyil, minimal darajani o'rgatish va nuanslar va tegishli mavzularni mustaqil o'rganishni rag'batlantirishdir. Looplar mavzusida men while konstruktsiyasini minimal deb hisoblayman. Undan siz printsipni tushunishingiz mumkin. Printsipni bilgan holda, siz o'zingiz uchun ham, hozir ham o'zlashtirishingiz mumkin.

Zaif o'quvchilar tomonidan materialni o'zlashtirishga erishish uchun sintaksisni tavsiflashning o'zi etarli emas. Ko'proq sodda, ammo turli xil vazifalarni berish va misollarni batafsilroq tasvirlash kerak. Oxir oqibat, rivojlanish tezligi talabaning ifodalarni o'zgartirish va naqshlarni qidirish qobiliyati bilan cheklangan. Aqlli talabalar uchun ko'pchilik topshiriqlar zerikarli bo'ladi. Ular bilan o'qiyotganda, muammolarni 100% hal qilishni talab qilish shart emas. Mening materialimni ko'rish mumkin mening githubim. To'g'ri, ombor ko'proq sehrgarning grimuariga o'xshaydi - mendan boshqa hech kim qaerda ekanligini tushunmaydi va agar tekshiruvdan o'tmasangiz, aqldan ozishingiz mumkin.

Metodologiya amaliyotga yo'naltirilgan

Nazariya masalani yechish misolida tushuntiriladi. Tarmoqlar va tsikllar o'qitiladigan dasturlash asoslari darsida butun bir soat davomida bitta mavzu bo'yicha foydali ma'ruza o'qib bo'lmaydi. Kontseptsiyani tushuntirish uchun 15-20 daqiqa kifoya qiladi. Asosiy qiyinchiliklar amaliy vazifalarni bajarishda yuzaga keladi.
Boshlang'ich o'qituvchilar bitta ma'ruzada operatorlar, filiallar, tsikllar va massivlarni chalg'itishi mumkin. Ammo ularning talabalari ushbu ma'lumotni o'zlashtirish muammosiga duch kelishadi.
Axir siz nafaqat materialni aytib berishingiz, balki tinglovchilar uni tushunishlariga ishonch hosil qilishingiz kerak.

Mavzuni o'zlashtirish haqiqati talabaning mustaqil ishni qanday uddalashi bilan belgilanadi.
Agar talaba o‘qituvchi yordamisiz mavzu bo‘yicha masalani yechishga muvaffaq bo‘lsa, mavzu o‘zlashtirildi. O'z-o'zini sinab ko'rishni ta'minlash uchun har bir vazifa test stsenariylari bilan jadvalda tavsiflanadi. Vazifalar aniq tartibga ega. Vazifalarni o'tkazib yuborish tavsiya etilmaydi. Agar hozirgi vazifa juda qiyin bo'lsa, keyingisiga o'tish foydasizdir. Bu yanada murakkabroq. Talaba joriy murakkab vazifani o'zlashtira olishi uchun unga birinchi masala misolida bir nechta texnikalar tushuntiriladi. Darhaqiqat, mavzuning barcha mazmuni qiyinchiliklarni engish usullariga to'g'ri keladi. Tsikllar ko'proq yon ta'sirga ega.

Birinchi vazifa har doim namunadir. Ikkinchisi biroz farq qiladi va birinchidan so'ng darhol o'qituvchining nazorati ostida "mustaqil ravishda" amalga oshiriladi. Barcha keyingi vazifalar noto'g'ri tushunchalarni keltirib chiqaradigan turli xil kichik narsalarga e'tibor berishga qaratilgan.

Misolni tushuntirish dialog bo'lib, unda talaba materialning bir qismini o'zlashtirganligiga ishonch hosil qilish uchun targ'ibot va o'zaro tasdiqlashni qaytarishi kerak.

Men oddiy bo'laman va mavzu bo'yicha birinchi misol juda muhimligini aytaman. Agar sizda keng qamrovli mustaqil ish uchun material bo'lsa, birinchi misolning kamchiliklari tuzatilishi mumkin. Agar misoldan boshqa hech narsa bo'lmasa, talaba mavzuni o'zlashtira olmaydi.

Qachonki yoki uchunmi?

Munozarali masalalardan biri - bu misol uchun qurilishni tanlash: while yoki for. Bir marta, o'qituvchilik tajribasiga ega bo'lmagan, amaliyotchi dasturchi do'stim bir soat davomida meni for tsiklini tushunish eng oson ekanligiga ishontirdi. Bahslar "undagi hamma narsa aniq va o'z o'rnida joylashtirilgan" ga qadar qaynab ketdi. Biroq, haqiqiy yangi boshlanuvchilar uchun qiyinchiliklarning asosiy sababi uning yozilishi emas, balki tsiklning o'zi g'oyasidir. Agar kishi bu fikrni tushunmasa, u holda sintaksis bilan qiynaladi. G'oya amalga oshishi bilan kodni loyihalash muammolari o'z-o'zidan yo'qoladi.

Mening materiallarimda ilmoqlar mavzusi dallanish mavzusiga mos keladi. If va while ning tashqi o'xshashligi bizga to'g'ridan-to'g'ri o'xshatish imkonini beradi: "sarlavhadagi shart to'g'ri bo'lsa, u holda tana bajariladi". Tsiklning yagona o'ziga xos xususiyati shundaki, tananing ko'p marta ijro etilishi.

Mening ikkinchi argumentim shuki, while ga qaraganda kamroq formatlashni talab qiladi. Kamroq formatlash vergul va qavslar yo'qligi bilan kamroq ahmoqona xatolarni anglatadi. Yangi boshlanuvchilar hali sintaksis xatolaridan avtomatik ravishda qochish uchun etarlicha ehtiyotkorlik va ehtiyotkorlikni rivojlantirmagan.
Uchinchi dalil ko'plab yaxshi kitoblarda birinchi dalil sifatida tushuntirilgan.

Agar talaba iboralarni osongina o'zgartira olsa, u holda siz "for" haqida gapirishingiz mumkin. Shundan so'ng talaba o'zi yoqtirgan narsani tanlaydi. Agar transformatsiyalar qiyinchiliklarga olib kelsa, e'tiboringizni chalg'itmaslik yaxshiroqdir. Talaba avval hamma narsani while yordamida hal qilsin. Looplar mavzusini o'zlashtirganingizdan so'ng, while ga o'zgartirishni mashq qilish uchun echimlarni qayta yozishingiz mumkin.
Postcondition looplar juda kam uchraydigan hayvondir. Men bunga umuman vaqt ajratmayman. Agar talaba naqshlarni aniqlash va ifodalarni o'zgartirish g'oyalarini o'zlashtirgan bo'lsa, u mening yordamimsiz buni aniqlay oladi.

Kuchli talabalarga birinchi misolni ko'rsatayotganda, men birinchi misolda nafaqat yechimni, balki natijaga olib kelgan barcha harakatlar zanjirini qayd etish muhimligiga e'tibor qarataman. Dangasa talabalar yozishni e'tiborsiz qoldirib, faqat yakuniy algoritmni nusxalashlari mumkin. Ular bir kun kelib qiyin vazifa kelishiga ishonch hosil qilishlari kerak. Buni hal qilish uchun siz ushbu misoldagi kabi amallarni bajarishingiz kerak bo'ladi. Shuning uchun barcha bosqichlarni yozib olish muhimdir. Quyidagi masalalarda yechimning faqat yakuniy versiyasini qoldirish mumkin bo'ladi.

Avtomatlashtirishning asosiy g'oyasi shundan iboratki, biz kompyuterga odam uchun odatiy ishlarni bajarishni ishonib topshiramiz. Asosiy usullardan biri bu looplarni yozishdir. Dasturda bir nechta bir xil takrorlanuvchi amallar ketma-ket yozilganda qo'llaniladi.

Yopiqdan ko'ra ochiq-oydinroq

Birinchi tsikl topshirig'ida bir xil iborani bir necha marta ko'rsatish yaxshi fikr bo'lib tuyulishi mumkin. Masalan:

Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!
Huray, ishlaydi!

Ushbu parametr yomon, chunki hisoblagich qiymati chiqishda ko'rinmaydi. Bu yangi boshlanuvchilar uchun muammo. Uni kamsitmang. Dastlab, bu vazifa birinchi bo'lib, o'sish tartibida raqamlar qatorini chiqarish vazifasi ikkinchi edi. "Tsikl N marta" va "A dan B gacha aylanish" qo'shimcha atamalarini kiritish kerak edi, ular aslida bir xil. Keraksiz ob'ektlarni yaratmaslik uchun men faqat bir qator raqamlar chiqishi bilan misol ko'rsatishga qaror qildim. Bir nechta odam o'z boshida hisoblagichni qanday tutishni o'rganadi va tayyorgarliksiz boshidagi dasturning xatti-harakatlarini modellashtiradi. Ba'zi talabalar birinchi navbatda tsikllar mavzusida aqliy modellashtirishga duch kelishadi.
Bir oz mashq qilgandan so'ng, men mustaqil yechish uchun bir xil matnni takrorlash vazifasini beraman. Agar siz avval ko'rinadigan hisoblagichni, keyin esa ko'rinmas hisoblagichni bersangiz, talabalar kamroq muammolarga duch kelishadi. Ba'zan "ekranda hisoblagichni yozmang" degan maslahat etarli.

Boshqalar buni qanday tushuntirishadi?

Internetdagi aksariyat o'quv materiallarida tsiklning sintaksisi "ma'ruza" ning bir qismi sifatida berilgan. Masalan, developer.mozilla.org saytida (hozirda) while tsikli bilan birga bir qancha boshqa konstruksiyalar tasvirlangan. Bunday holda, faqat dizaynlarning o'zlari shablon shaklida beriladi. Ularning ishga tushirilishi natijasi so'zlar bilan tasvirlangan, ammo hech qanday tasvir yo'q. Menimcha, mavzuning bunday taqdimoti bunday materiallarning foydaliligini nolga ko'paytiradi. Talaba kodni qayta yozishi va uni o'zi ishga tushirishi mumkin, lekin u hali ham taqqoslash uchun standartga muhtoj. Natijani solishtirish uchun hech narsa bo'lmasa, misol to'g'ri yozilganligini qanday tushunish mumkin?
Misolsiz faqat shablon berilsa, talaba uchun yanada qiyinlashadi. Kod bo'laklari shablonda to'g'ri joylashtirilganligini qanday tushunish mumkin? Siz yozishga harakat qilishingiz mumkin qandaydir tarzda, va keyin choping. Ammo natijani solishtirish uchun standart bo'lmasa, ishga tushirish ham yordam bermaydi.

Intuitiv bo'yicha C++ kursida sikl sintaksisi "operatorlar" mavzusidagi 4-ma'ruzaning uchinchi sahifasida ko'milgan. Looplar sintaksisini tushuntirishda "operator" atamasiga alohida urg'u beriladi. Bu atama “ramz; bu gap", "{} - qo'shma gap", "siklning tanasi bayonot bo'lishi kerak". Menga bu yondashuv yoqmaydi, chunki u muhim munosabatlarni bir muddat orqasida yashirganga o'xshaydi. Ushbu darajadagi dasturning manba kodini atamalarga ajratish til spetsifikatsiyasini amalga oshirish uchun kompilyator ishlab chiquvchilarga kerak bo'ladi, lekin birinchi taxmin sifatida talabalar tomonidan emas. Dasturlashga yangi kelganlar kamdan-kam hollarda atamalarga shunchalik diqqat bilan e'tibor berishadi. Bu yangi so'zlarni birinchi marta eslab, tushunadigan kamdan-kam odam. Deyarli hech kim o'zi o'rgangan atamani to'g'ri qo'llay olmaydi. Shuning uchun o‘quvchilar “I write while(a<7);{, lekin dastur ishlamayapti” kabi ko‘plab xatolarga yo‘l qo‘yishadi.
Menimcha, boshida konstruksiya sintaksisini darhol qavslar bilan bergan ma'qul. Qavssiz variant faqat talabaning aniq savoli bo'lsa, tushuntirilishi kerak: "nega qavslar yo'q va u ishlaydi".

Okulovning 2012 yildagi "Dasturlash asoslari" kitobida tsikllarga kirish for naqshidan boshlanadi, so'ngra undan foydalanish bo'yicha tavsiyalar beradi va keyin darhol darsning eksperimental qismiga o'tadi. Men bu kitob mening darslarimga kamdan-kam keladigan juda qobiliyatli talabalar uchun yozilganligini tushunaman.

Mashhur kitoblarda kod bo'laklarining natijasi har doim yoziladi. Misol uchun, Shildtning "Java 8. The Complete Guide" 2015 yil nashri. Birinchidan, shablon, so'ngra dasturning namunasi va undan so'ng darhol bajarilish natijasi beriladi.

Misol tariqasida, teskari harakatni bajaradigan while tsiklini ko'rib chiqing
10 dan boshlab ortga hisoblash va aniq 10 qator "o'lchovlar" ko'rsatiladi:

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

Ishga tushgandan so'ng, ushbu dastur quyidagi tarzda o'nta "tsikl" chiqaradi:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Shablonni, dastur namunasini va dastur natijasini tavsiflash yondashuvi “Bolalar uchun JavaScript” kitobida va w3schools.com saytidagi js kursida ham qo'llaniladi. Veb-sahifa formati hatto ushbu misolning interaktiv bo'lishiga imkon beradi.

Stroustrupning 2016-yilda chop etilgan “Principles and Practice using C++” kitobi bundan ham uzoqroqqa bordi. Birinchi qadam qanday natijaga erishish kerakligini tushuntirish va shundan so'ng dastur matni ko'rsatiladi. Bundan tashqari, ular nafaqat tasodifiy dasturni misol qilib olishadi, balki tarixga ekskursiya qilishadi. Bu unga e'tiborni qaratishga yordam beradi: “Mana, bu shunchaki keraksiz matn emas. Siz mazmunli narsani ko'rasiz."

Iteratsiyaga misol sifatida saqlangan dastur mashinasida (EDSAC) bajarilgan birinchi dasturni ko'rib chiqing. U 6-yil 1949-mayda Angliyaning Kembrij universiteti kompyuter laboratoriyasida Devid Uillar tomonidan yozilgan. Ushbu dastur kvadratchalarning oddiy ro'yxatini hisoblab chiqadi va chop etadi.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Bu erda har bir satr raqamdan keyin yorliq belgisi ('t') va bu raqamning kvadratini o'z ichiga oladi. Ushbu dasturning C++ versiyasi quyidagicha ko'rinadi:

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

Qizig'i shundaki, bu kitobda sintaksis namunasi tasvirlanmagan. O'qituvchi qo'llanmasida Stroustrup (tarjima) o‘quvchilarining aql-zakovatini hurmat qilishini ta’kidlaydi. Ehtimol, bir nechta misollarda naqshni aniqlash qobiliyati bunday aqlning namoyon bo'lishi hisoblanadi.

Men o'zimni tushuntirganimdek

Stroustrupning yondashuvi: natijani tasvirlash, keyin muammoni hal qilish, so'ngra talaba tomonidan mustaqil tahlil qilish - eng o'ylangan ko'rinadi. Shuning uchun, men buni asos qilib olishga qaror qildim, lekin uni kamroq tarixiy misol - "tarkib" ni yaratish vazifasi yordamida aytib bering. Bu taniqli langarni hosil qiladi, shunda siz "munozaraga oid topshiriqni eslab qoling" deb aytishingiz va talabalar buni aniq eslab qolishlari mumkin. Mening misolimda men yana ikkita eng keng tarqalgan noto'g'ri tushunchaning oldini olishga harakat qildim. Keyinchalik ular haqida batafsilroq yozaman.

Ushbu topshiriqda biz murakkab muammolarni hal qilish texnikasi bilan tanishamiz. Dastlabki qaror ibtidoiy va sodda bo'lishi kerak. Xo'sh, keyin siz ushbu yechimni qanday yaxshilash haqida o'ylashingiz mumkin.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Mening kuzatishlarimga ko'ra, turli xil kombinatsiyalardagi "shablon-misol-natija" yondashuvi hali ham o'quvchilar tsiklni ieroglif sifatida qabul qilishiga olib keladi. Bu ular nima uchun u erda yozish sharti borligini, i++ va i o'rtasida qanday tanlash kerakligini va boshqa aniq ko'rinadigan narsalarni tushunmasliklarida namoyon bo'ldi. Ushbu noto'g'ri tushunchalarga yo'l qo'ymaslik uchun tsikllar haqida gapirishga yondashuv bir xil harakatlarni takrorlash ma'nosini ta'kidlashi va shundan keyingina ularni struktura yordamida rasmiylashtirishi kerak. Shuning uchun, tsikl sintaksisini berishdan oldin, muammoni boshdan kechirishingiz kerak. Mundarija muammosining ibtidoiy yechimi quyidagicha ko'rinadi:

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

Uni qanday yaxshilash mumkin?
Monoton harakatlarni tsikl bilan almashtiring.
Qanday harakatlar ketma-ket o'zgarishsiz takrorlanadi?
Ushbu fragmentda hech kim yo'q. Biroq, "Bob" so'zini raqam bilan ko'rsatish uchun buyruqlar bir-biriga juda o'xshash.
Shuning uchun keyingi bosqich bo'laklar orasidagi farqni topishdir. Faqat bu vazifada hamma narsa aniq, keyin bitta buyruqlar emas, balki 5 yoki undan ortiq satr kod bloklari takrorlanadi. Siz faqat buyruqlar ro'yxatida emas, balki tarmoqli yoki pastadir konstruktsiyalarida qidirishingiz kerak bo'ladi.
Misolda, buyruqlar orasidagi farq "Bob" so'zidan keyingi raqamda.
Farq topilgach, siz o'zgarish naqshini tushunishingiz kerak. Turli fragment - bu raqam? Doimiy ravishda ortib bormoqdami yoki kamaymoqdami? Raqamning qiymati yonma-yon ikki jamoa o'rtasida qanday o'zgaradi?
Misolda “Bob” so‘zidan keyingi son 1 ga oshib ortadi. Farqi topiladi, naqsh ochiladi. Endi siz boshqa fragmentni o'zgaruvchi bilan almashtirishingiz mumkin.
Bunday o'zgaruvchini takrorlanuvchi fragmentlarning birinchisidan oldin e'lon qilishingiz kerak. Bunday o'zgaruvchi odatda I yoki j yoki batafsilroq narsa deb ataladi. Uning boshlang'ich qiymati ekranda ko'rsatilgan birinchi qiymatga teng bo'lishi kerak. Misolda birinchi qiymat 1 ga teng.
“100, 101, 102, 103, 104, 105” raqamlar qatorini ko‘rsatish uchun qanday boshlang‘ich qiymatni olish kerak?
Ushbu seriyadagi birinchi raqam 100.
Har bir chiqish buyrug'idan keyin siz ushbu o'zgaruvchining qiymatini 1 ga oshirishingiz kerak. Bu birlik o'zgartirish bosqichidir.
"100, 102, 104, 106" raqamlari qatorida qanday qadam bo'ladi?
Ushbu qatordagi 2-bosqich.
Turli fragmentni o'zgaruvchi bilan almashtirgandan so'ng, kod quyidagicha ko'rinadi:

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

Kodda "o'zgaruvchining naqshini ifodalash" usulini qo'llaganingizdan so'ng, siz ketma-ket ketadigan bir xil harakatlarning bir nechta guruhini olasiz. Endi takrorlanadigan harakatlar pastadir bilan almashtirilishi mumkin.

Looplardan foydalanish kerak bo'lgan muammoni hal qilish ketma-ketligi quyidagi bosqichlardan iborat:

  1. Ko'p alohida buyruqlar bilan "boshqa" hal qiling
  2. Shakl toping
  3. O‘zgaruvchining naqshini ifodalang
  4. Dizayn tsikl sifatida

Keyin talaba “Men hamma narsani tushunaman, lekin ayta olmayman” vaziyatiga tushib qolmasligi uchun yangi atamalar kiritiladi:
— hisoblagich har doim tsikldagi qadamlar sonini kuzatish uchun zarur bo'lgan o'zgaruvchidir. Odatda cheklash bilan taqqoslanadigan butun son.
— taymer qadami — hisoblagich o‘zgarishlari sxemasining tavsifi.
- cheklash - algoritm yakuniy bo'lishi uchun hisoblagich taqqoslanadigan raqam yoki o'zgaruvchi. Hisoblagich qiymati chegaraga yaqinlashish uchun o'zgaradi.
— sikl tanasi — takrorlanadigan buyruqlar toʻplami. Ular "buyruq halqa ichida yozilgan" deganda, ular tanani anglatadi.
— sikl iteratsiyasi — halqa tanasining bir martalik bajarilishi.
— sikl sharti — mantiqiy ifoda, boshqa iteratsiya bajarilishini belgilaydi. (Bu erda shoxlangan tuzilmalar bilan chalkashlik bo'lishi mumkin)
Siz dastlab talabalar atamalarni boshqa maqsadlarda ishlatishiga tayyor bo'lishingiz kerak. Bu kuchlilarga ham, kuchsizlarga ham tegishli. Umumiy tilni o'rnatish - bu san'at. Endi men qisqacha yozaman: siz "<term> bilan kod bo'lagini ajratib ko'rsatish" vazifasini qo'yishingiz va suhbatda ushbu atamalarni o'zingiz to'g'ri ishlatishingiz kerak.
Pastadir bilan o'zgartirilgandan so'ng, fragment olinadi:

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

Asosiy noto'g'ri tushuncha

Talabalar orasida keng tarqalgan noto'g'ri tushunchalardan biri shundaki, ular faqat bir marta bajarilishi kerak bo'lgan harakatlarni halqa ichiga joylashtiradilar. Masalan, shunday:

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

Talabalar bu muammoga doimo boshida ham, murakkabroq masalalarda ham duch kelishadi.
Bu holatda asosiy maslahat:

Buyruqni necha marta takrorlash kerak: bir marta yoki ko'p marta?

"Kirish" va "Xulosa" so'zlarini chop etish va i o'zgaruvchisini e'lon qilish va ishga tushirish buyruqlari boshqa takrorlanuvchi harakatlarga o'xshamaydi. Ular faqat bir marta bajariladi, ya'ni ular tsikl tanasidan tashqarida yozilishi kerak.

Yechimning barcha uch bosqichi kodda qolishi kerak, shunda qiyinchiliklar yuzaga kelganda ularga keyinroq murojaat qilishingiz mumkin. Birinchi ikkita variantni izohlash kifoya, shunda ular aralashmaydi.
Talabaning e'tiborini quyidagi faktlarga qaratish kerak:
— Loop holatida odatda hisoblagich va chegara solishtiriladi. Hisoblagich tsiklning tanasida o'zgarishi mumkin, lekin chegara o'zgartira olmaydi. Ushbu qoidani buzish uchun siz jiddiy sabablarni shakllantirishingiz kerak.
— “Kirish” va “Xulosa” so‘zlarini ko‘rsatish buyruqlari tsiklning tanasidan tashqarida joylashgan. Biz ularni 1 marta bajarishimiz kerak. "Kirish" - harakatlarni takrorlashdan oldin, "Xulosa" - keyin.
Ushbu mavzuni mustahkamlash, keyingi mavzularni o‘zlashtirish, shuningdek, qiyinchiliklarni bartaraf etish jarayonida kuchli o‘quvchilar ham shunday savol berishlari foydali: “Bu harakatni necha marta bajarish kerak? Bir yoki ko'pmi?

Qo'shimcha ko'nikmalarni rivojlantirish

Tsikllarni o'rganish jarayonida talabalarda diagnostika va muammolarni hal qilish ko'nikmalari ham shakllanadi. Diagnostika o'tkazish uchun talaba kerakli natijani taqdim etishi va uni haqiqiy natija bilan taqqoslashi kerak. Tuzatish harakatlari ular orasidagi farqga bog'liq.
Ushbu bosqichdagi talabalar hali ham "kerakli" natija haqida ozgina tasavvurga ega bo'lganligi sababli, ular test ma'lumotlariga e'tibor berishlari mumkin. Qoida tariqasida, bu bosqichda hech kim hali nima noto'g'ri bo'lishi mumkinligini va u bilan qanday kurashish kerakligini tushunmaydi. Shuning uchun men daftarga tipik muammolarning tavsifini va ularni hal qilishning bir necha usullarini yozaman. Eng mosini tanlash talabaning o'zi vazifasidir.
"Kutilayotgan narsa sodir bo'ldimi?", "Ushbu vaziyatlarning qaysi biri hozir sodir bo'ldi?", "Qo'llaniladigan yechim yordam berdimi?" Deb so'rash uchun yozuv kerak.

  1. Harakatlar soni kutilganidan 1 ta kam yoki ko'p. Yechimlar:
    — hisoblagichning dastlabki qiymatini 1 ga oshirish.
    — qat'iy taqqoslash operatorini (< yoki >) qat'iy bo'lmagan (<= yoki >=) bilan almashtiring.
    — chegara qiymatini 1 ga o'zgartiring.
  2. Loopdagi harakatlar to'xtamasdan, cheksiz ravishda amalga oshiriladi. Yechimlar:
    — hisoblagichni oʻzgartirish buyrugʻi yoʻq boʻlsa, qoʻshing.
    — hisoblagichni o'zgartirish buyrug'ini uning qiymati chegaraga yaqinlashishi uchun tuzating.
    — cheklovni o'zgartirish buyrug'ini, agar u tsiklning tanasida bo'lsa, olib tashlang.
  3. Loopdagi harakatlar soni kutilganidan 1 tadan kam yoki ko'proq. Loopdagi harakat bir marta ham bajarilmadi. Avval siz tsikl boshlanishidan oldin o'zgaruvchilarning haqiqiy qiymatlarini bilib olishingiz kerak. Yechimlar:
    — cheklovning boshlang‘ich qiymatini o‘zgartirish
    — hisoblagichning boshlang‘ich qiymatini o‘zgartirish

3-muammo odatda noto'g'ri o'zgaruvchidan foydalanish yoki hisoblagichni nolga qaytarmaslikni o'z ichiga oladi.

Ushbu tushuntirishdan so'ng, talaba hali ham halqalarning qanday ishlashi haqida turli xil noto'g'ri tushunchalarga ega bo'lishi mumkin.
Eng keng tarqalganlarini yo'q qilish uchun men sizga quyidagi vazifalarni beraman:

  1. Bunda chegara, dastlabki hisoblagich qiymati yoki hisoblagich qadami foydalanuvchi tomonidan kiritiladi.
  2. Bunda hisoblagich qiymati ba'zi arifmetik ifodalarda ishlatilishi kerak. Radikal ifodada yoki maxrajda hisoblagichdan foydalanish maqsadga muvofiqdir, shunda farq chiziqli bo'lmaydi.
  3. Bunda sikl ishlayotgan vaqtda hisoblagich qiymati ekranda ko'rsatilmaydi. Masalan, kerakli miqdordagi bir xil matn qismlarini ko'rsatish yoki toshbaqa grafikasi bilan rasm chizish.
  4. Bunda siz birinchi navbatda takrorlanadigan harakatlarni, keyin esa boshqalarni bajarishingiz kerak.
  5. Bunda siz takrorlashdan oldin va keyin boshqa harakatlarni bajarishingiz kerak

Har bir vazifa uchun siz test ma'lumotlarini va kutilgan natijani taqdim etishingiz kerak.

Siz qanchalik tez harakat qilishingiz mumkinligini tushunish uchun siz ushbu muammolarning shartlarini o'qib chiqishingiz va so'rashingiz kerak: "ular misoldan qanday farq qiladi?", "Ularni hal qilish uchun misolda nimani o'zgartirish kerak?" Agar talaba mazmunli javob bersa, hech bo‘lmaganda bittasini sinfda, qolganini esa uyda o‘zi hal qilsin. Agar yechim muvaffaqiyatli bo'lsa, unda biz looplar ichidagi shartlarni tushuntirishni boshlashimiz mumkin.
Muammolarni o'zingiz hal qilishda muammolaringiz bo'lsa, sinfda hamma narsani sinab ko'rishingiz kerak. Muammoni boyo'g'li chizishni eslatib qo'ymaslik uchun birinchi navbatda muammoni universal bo'lmagan tarzda hal qilishni maslahat beraman. Ya'ni, eritma birinchi sinovdan o'tadi va pastadir konstruktsiyasidan foydalanmaydi. Xo'sh, keyin yechimning universalligiga erishish uchun o'zgarishlarni qo'llang.

Looplar va novdalar

Menimcha, "tarmoqlar ichidagi sikllar" mavzusini alohida berish foydalidir. Shunday qilib, keyinchalik shartni bir necha marta tekshirish va uni bir marta tekshirish o'rtasidagi farqni ko'rishingiz mumkin.
Birlashtirish uchun vazifalar foydalanuvchi tomonidan kiritilgan A dan B gacha raqamlarni chiqarish bo'ladi:
- har doim o'sish tartibida.
- A va B qiymatlariga qarab o'sish yoki pasayish.

“Ko‘chadan tarmoqlanish” mavzusini talaba “naqshni o‘zgaruvchi bilan almashtirish” va “takroriy harakatlarni tsikl bilan almashtirish” usullarini o‘zlashtirgandan keyingina ko‘chirish kerak.
Looplar ichidagi shoxlardan foydalanishning asosiy sababi naqshdagi anomaliyalardir. O'rtada dastlabki ma'lumotlarga qarab buziladi.
Oddiy usullarni birlashtirgan holda yechim izlay oladigan o'quvchilar uchun "tarmoqlarni halqalar ichida yozish mumkin" deb aytish va mustaqil hal qilish uchun masalani to'liq "masalan" berish kifoya.
Misol topshiriq:

Foydalanuvchi X raqamini kiritadi. 0 dan 9 gacha bo'lgan raqamlarni ustunda ko'rsating va X ga teng bo'lgan raqamning qarshisiga "+" belgisini qo'ying.

Agar 0 kiritilgan bo'lsa0+
1
2
3
4
5
6
7
8
9

Agar 6 kiritilgan bo'lsa0
1
2
3
4
5
6+
7
8
9

Agar 9 kiritilgan bo'lsa0
1
2
3
4
5
6
7
8
9+

Agar 777 kiritilgan bo'lsa0
1
2
3
4
5
6
7
8
9

Agar pastadir bilan yozish uchun qisqacha tushuntirish etarli bo'lmasa, unda siz bir xil muammoning halqasiz universal echimiga erishishingiz kerak.
Siz ikkita variantdan birini olasiz:
Xohlagan

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

Mumkin

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

Men shoxlanish mavzusini o'rganayotganda shunga o'xshash topshiriqni oldindan beraman.
Agar talaba "mumkin" variantni o'ylab topsa, unda siz ularga bir xil muammoning ko'plab echimlari bo'lishi mumkinligini aytishingiz kerak. Biroq, ular talablarning o'zgarishiga qarshilik ko'rsatishda farqlanadi. Savol bering: "Agar boshqa raqam qo'shishim kerak bo'lsa, kodning nechta joyini tuzatish kerak bo'ladi?" "Mumkin" versiyada siz yana bitta filialni qo'shishingiz va 10 ta boshqa joyga yangi raqam qo'shishingiz kerak bo'ladi. "Istalgan" ga faqat bitta filialni qo'shish kifoya.
"Istalgan" variantni ko'paytirish vazifasini qo'ying, so'ngra kodda naqsh toping, o'zgaruvchini almashtirishni bajaring va pastadir yozing.
Agar sizda bu muammoni halqasiz boshqa yo'l bilan qanday hal qilish haqida fikringiz bo'lsa, sharhlarda yozing.

Loops ichidagi tsikllar

Ushbu mavzuda siz quyidagilarga e'tibor berishingiz kerak:
— ichki va tashqi ko'chadan uchun hisoblagichlar turli o'zgaruvchilar bo'lishi kerak.
— ichki pastadir uchun hisoblagich ko'p marta qayta o'rnatilishi kerak (ya'ni, tashqi pastadir tanasida).
— matnni chiqarish vazifalarida avval bir nechta satrda bitta harfni, keyin esa ikkinchisini yozish mumkin emas. Avval birinchi qatorning barcha harflarini, keyin ikkinchisining barcha harflarini va hokazolarni chop etishingiz kerak.

Hisoblagichni nolga qaytarish muhimligini tushuntirish orqali halqa ichidagi halqalar mavzusini tushuntirishni boshlash yaxshidir.
Misol topshiriq:

Foydalanuvchi ikkita raqamni kiritadi: R va T. "#" belgilarning ikkita qatorini chop eting. Birinchi qatorda R belgilar bo'lishi kerak. Ikkinchi qatorda T bo'laklari mavjud. Agar biron bir raqam salbiy bo'lsa, xato xabarini ko'rsating.

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

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

R=-1, T=6R qiymati manfiy bo'lmasligi kerak

R=6, T=-2T qiymati manfiy bo'lmasligi kerak

Shubhasiz, bu muammo ham kamida ikkita echimga ega.
Xohlagan

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

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

Farqi shundaki, "mumkin" yechimda ikkinchi qatorni chiqarish uchun ikkinchi o'zgaruvchidan foydalanilgan. Ikkala tsikl uchun bir xil o'zgaruvchidan foydalanishni talab qilishingiz kerak. Ushbu cheklovni ikkita tsikl uchun bitta hisoblagichga ega bo'lgan yechim "taymerni qayta tiklash" atamasining tasviri bo'lishi bilan oqlanishi mumkin. Ushbu atamani tushunish quyidagi muammolarni hal qilishda zarur. Murosa sifatida siz muammoning ikkala yechimini ham saqlashingiz mumkin.

Ikki tsikl uchun bitta hisoblagich o'zgaruvchidan foydalanish bilan bog'liq odatiy muammo quyidagicha ko'rinadi:
R=5, T=11#####
######

Ikkinchi qatordagi belgilar soni T qiymatiga to'g'ri kelmaydi. Agar sizga ushbu muammo bo'yicha yordam kerak bo'lsa, unda siz looplar bilan bog'liq odatiy muammolar haqida eslatmalarni ko'rib chiqishingiz kerak. Bu №3 alomat. Agar siz ikkinchi tsikldan oldin hisoblagich qiymati chiqishini qo'shsangiz, tashxis qo'yiladi. Qayta o'rnatish orqali tuzatildi. Ammo buni darhol aytmaslik yaxshiroqdir. Talaba kamida bitta gipotezani shakllantirishga harakat qilishi kerak.

Albatta, boshqa yechim bor. Lekin men buni talabalar orasida ko'rmaganman. Tsikllarni o'rganish bosqichida u haqidagi hikoya diqqatni chalg'itadi. String funktsiyalari haqida o'rganganingizda, unga keyinroq qaytishingiz mumkin.
Mumkin №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));

Keyingi talab qilinadigan vazifa:

0 dan 9 gacha raqamlarni ko'rsating. Har bir raqam o'z satrida bo'lishi kerak. Qatordagi raqamlar soni (Vt) klaviaturadan kiritiladi.

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

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

Agar talaba o'zgaruvchini almashtirish texnikasini o'zlashtirgan bo'lsa, u tezda engadi. Mumkin bo'lgan muammo yana o'zgaruvchini qayta o'rnatishda bo'ladi. Agar siz o'zgarishlarni bajara olmasangiz, bu siz shoshayotganingizni va oddiyroq muammolarni hal qilishingiz kerakligini anglatadi.

E'tiboringiz uchun rahmat. Like bosing va kanalga obuna bo'ling.

P.S. Agar matnda xato yoki xato topsangiz, iltimos, menga xabar bering. Buni matnning bir qismini tanlash va Mac-da “⌘ + Enter” va klassik klaviaturalarda “Ctrl / Enter” tugmachalarini yoki shaxsiy xabarlar orqali amalga oshirish mumkin. Agar ushbu variantlar mavjud bo'lmasa, izohlarda xatolar haqida yozing. Rahmat!

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. tizimga kirishiltimos.

Karmasiz o'quvchilar uchun so'rov

  • 20,0%Men professional tarzda dars beraman, +12

  • 10,0%Men professional tarzda dars beraman, -11

  • 70,0%Men o'rgatmayman, +17

  • 0,0%Men o'rgatmayman, -10

  • 0,0%Boshqa 0

10 foydalanuvchi ovoz berdi. 5 nafar foydalanuvchi betaraf qolgan.

Manba: www.habr.com

a Izoh qo'shish