Қиындықтарды қалай жеңуге, сонымен қатар циклдарды жазуға үйрету

Біз негізгі тақырыптардың бірі туралы айтатынымызға қарамастан, бұл мақала тәжірибелі мамандарға арналған. Мақсаты – жаңадан бастағандардың бағдарламалауда қандай қате түсініктері бар екенін көрсету. Тәжірибелі әзірлеушілер үшін бұл мәселелер бұрыннан шешілген, ұмытылған немесе мүлде байқалмаған. Мақала сізге кенеттен осы тақырып бойынша біреуге көмектесу керек болса пайдалы болуы мүмкін. Мақалада Шилдт, Штроуструп, Окуловтың бағдарламалау бойынша әртүрлі кітаптарындағы материалдармен параллельдер келтірілген.

Циклдер туралы тақырып бағдарламалауды меңгеру кезінде көптеген адамдар оны алып тастайтындықтан таңдалды.

Бұл әдіс әлсіз оқушыларға арналған. Әдетте, күшті адамдар бұл тақырыпта тұрып қалмайды және олар үшін арнайы әдістерді ойлап табудың қажеті жоқ. Мақаланың екінші мақсаты – бұл әдістемені «барлық оқушыларға арналған, бірақ бір ғана мұғалім» сыныбынан «барлық оқушыларға, барлық мұғалімдерге арналған жұмыстар» сыныбына көшіру. Мен абсолютті түпнұсқалықты талап етпеймін. Егер сіз осы тақырыпты оқыту үшін ұқсас әдістемені пайдаланып жатсаңыз, нұсқаңыздың айырмашылығын жазыңыз. Егер сіз оны пайдалануды шешсеңіз, оның қалай өткенін айтыңыз. Егер кітапта ұқсас техника сипатталған болса, атын жазыңыз.


Мен бұл әдістемемен 4 жыл жұмыс істедім, әр түрлі деңгейдегі студенттермен жеке оқыдым. Барлығы елуге жуық студент және екі мың сағаттық сабақ бар. Алғашында бұл тақырыпта студенттер ылғи тығырыққа тіреліп, кетіп қалды. Әр оқушыдан кейін әдістеме мен материалдар түзетілді. Соңғы бір жылда студенттер бұл тақырыпқа тоқтап қалмады, сондықтан мен өзімнің қорытындыларыммен бөлісуді жөн көрдім.

Неге сонша әріп? Циклдер өте қарапайым!

Жоғарыда жазғанымдай, тәжірибелік әзірлеушілер үшін және күшті студенттер үшін ілмектер тұжырымдамасының күрделілігін бағаламауға болады. Мысалы, сіз ұзақ дәріс оқи аласыз, бастарын изеп, ақылды көздерді көре аласыз. Бірақ кез келген мәселені шешуге тырысқанда, ессіздік пен түсініксіз мәселелер басталады. Дәрістен кейін студенттер ішінара ғана түсінген шығар. Жағдай студенттердің өздерінің адасуының не екенін айта алмайтындығынан қиындатады.
Бір күні оқушылар менің мысалдарымды иероглиф ретінде қабылдайтынын түсіндім. Яғни, мәтіннің бөлінбейтін бөліктері сияқты, оған «сиқырлы» әріп қосу керек және ол жұмыс істейді.
Кейде мен оқушылардың белгілі бір мәселені шешу үшін қажет деп ойлайтынын байқадым басқа нәрсе Мен әлі қарастырмаған дизайн. Шешім мысалды аздап өзгертуді қажет еткенімен.

Сондықтан мен назарды өрнектердің синтаксисіне емес, циклдар арқылы қайталанатын кодты қайта өңдеу идеясына аудару керек деген идеяны ойлап таптым. Студенттер бұл идеяны меңгергеннен кейін, кез келген синтаксисті аз ғана тәжірибемен жақсартуға болады.

Мен кімге және не үшін сабақ беремін?

Қабылдау емтихандары болмағандықтан, сыныптар күшті және өте әлсіз студенттерді қамтуы мүмкін. Менің студенттерім туралы толығырақ мақаладан оқи аласыз Кешкі курс студенттерінің портреті
Мен бағдарламалауды үйренгісі келетіндердің барлығының оны үйренуіне көз жеткізуге тырыстым.
Менің сабақтарым жеке өтеді және студент әрқайсысына өз ақшасын төлейді. Студенттер шығындарды оңтайландырып, минималды талап ететін сияқты. Дегенмен, адамдар тірі мұғаліммен бетпе-бет сабаққа білімнің өзі үшін емес, алған біліміне сенімді болу үшін, ілгерілеушілікті сезіну және сарапшының (мұғалім) мақұлдауын алу үшін барады. Егер студенттер оқуда ілгерілеушілік сезінбесе, олар кетеді. Жалпы алғанда, сыныптарды оқушылар таныс құрылымдардың санын көбейтуде прогресті сезінетіндей етіп құрылымдауға болады. Яғни, алдымен біз егжей-тегжейлі оқимыз, содан кейін оқимыз, содан кейін жасаймыз, ал қазір бізде мың бір түндік курс дайын, онда циклдар екі ай бойы оқытылады, ал соңында - жазған студент. диктант бойынша стандартты кітапхана. Алайда практикалық есептерді шешу үшін материалды білу ғана емес, оны қолдануда және жаңа ақпаратты іздеуде тәуелсіздік қажет. Сондықтан, менің ойымша, бетпе-бет курстар үшін минимумды оқыту және нюанстар мен байланысты тақырыптарды өз бетінше зерттеуге ынталандыру дұрыс принцип деп ойлаймын. Циклдер тақырыбында мен while конструкциясын минимум деп есептеймін. Одан принципті түсінуге болады. Принципті біле отырып, сіз өзіңіз үшін де, өзіңіз де игере аласыз.

Әлсіз оқушылардың материалды меңгеруіне синтаксисті сипаттау жеткіліксіз. Қарапайым, бірақ әртүрлі тапсырмалар беріп, мысалдарды толығырақ сипаттау қажет. Сайып келгенде, даму жылдамдығы оқушының өрнектерді түрлендіру және үлгілерді іздеу қабілетімен шектеледі. Ақылды студенттер үшін тапсырмалардың көпшілігі жалықтыратын болады. Олармен бірге оқу кезінде сіз 100% мәселелерді шешуді талап етпеуіңіз керек. Менің материалымды мына жерден көруге болады менің github. Рас, репозиторий балуанның гримуарына ұқсайды - меннен басқа ешкім ненің қайда екенін түсінбейді, ал егер сіз тексеруден өтсеңіз, есіңізден шығуыңыз мүмкін.

Әдістеме тәжірибеге бағытталған

Теория есепті шешудің мысалы арқылы түсіндіріледі. Тармақтар мен циклдар оқытылатын бағдарламалау негіздері сабағында бір тақырып бойынша бір сағат бойы пайдалы дәріс оқу мүмкін емес. Ұғымды түсіндіру үшін 15-20 минут жеткілікті. Негізгі қиындықтар практикалық тапсырмаларды орындау кезінде туындайды.
Жаңадан бастаған мұғалімдер бір лекцияда операторларды, тармақтарды, циклдарды және массивтерді ажырата алады. Бірақ олардың студенттері бұл ақпаратты ассимиляциялау мәселесіне тап болады.
Материалды айтып қана қоймай, тыңдаушылар түсінетініне көз жеткізу керек.

Тақырыпты меңгеру фактісі студенттің өзіндік жұмысты қалай орындайтынымен анықталады.
Егер оқушы тақырып бойынша мәселені мұғалімнің көмегінсіз шеше алса, онда тақырып игерілді. Өзін-өзі тексеруді қамтамасыз ету үшін әрбір тапсырма сынақ сценарийлері бар кестеде сипатталған. Тапсырмалардың нақты тәртібі бар. Тапсырмаларды өткізіп жіберу ұсынылмайды. Ағымдағы тапсырма тым қиын болса, келесіге көшу пайдасыз. Бұл одан да күрделі. Студент ағымдағы күрделі тапсырманы меңгеруі үшін оған бірінші есептің мысалы арқылы бірнеше әдістемелер түсіндіріледі. Шын мәнінде, тақырыптың барлық мазмұны қиындықтарды жеңу әдістеріне байланысты. Циклдер жанама әсерлер болып табылады.

Бірінші тапсырма әрқашан үлгі болып табылады. Екіншісі аздап ерекшеленеді және біріншіден кейін бірден мұғалімнің бақылауымен «өз бетінше» орындалады. Барлық кейінгі тапсырмалар қате түсініктерді тудыруы мүмкін әртүрлі ұсақ-түйектерге назар аударуға бағытталған.

Мысалды түсіндіру диалог болып табылады, онда студент материалдың бір бөлігін игергеніне көз жеткізу үшін тарату және айқас тексеруді кері шақыруы керек.

Мен банальды боламын және тақырып бойынша бірінші мысал өте маңызды екенін айтамын. Егер сізде кең көлемді өзіндік жұмыс үшін материал болса, бірінші мысалдағы кемшіліктерді түзетуге болады. Мысалдан басқа ештеңе болмаса, студент тақырыпты меңгере алмайды.

Әзірге немесе үшін?

Даулы мәселелердің бірі - мысал үшін құрылысты таңдау: while немесе for. Бірде менің оқыту тәжірибесі жоқ тәжірибеші әзірлеуші ​​досым for циклін түсіну оңай екеніне бір сағат жұмсады. Дәлелдер «ондағы бәрі анық және өз орнына қойылған» дегенге дейін созылды. Дегенмен, жаңадан бастаушылар үшін қиындықтардың негізгі себебі - оны жазу емес, циклдің өзі. Егер адам бұл ойды түсінбесе, онда ол синтаксистен қиналады. Идея жүзеге асырыла салысымен кодты жобалау проблемалары өздігінен жойылады.

Менің материалдарымда ілмектер тақырыбы тармақталу тақырыбына сәйкес келеді. if және while сыртқы ұқсастығы бізге тікелей ұқсастық жасауға мүмкіндік береді: «тақырыптағы шарт ақиқат болғанда, дене орындалады». Циклдің жалғыз ерекшелігі - дененің бірнеше рет орындалуы.

Менің екінші дәлелім, while бағдарламасына қарағанда пішімдеуді азырақ талап етеді. Аз пішімдеу үтірлер мен жақшаларсыз аз ақымақ қателерді білдіреді. Жаңадан бастаушылар синтаксистік қателерді автоматты түрде болдырмау үшін жеткілікті ұқыптылық пен мұқияттылықты әлі дамытпаған.
Үшінші дәлел көптеген жақсы кітаптарда бірінші дәлел ретінде түсіндіріледі.

Егер студент өрнектерді оңай түрлендіре алса, онда сіз үшін туралы сөз қозғауға болады. Содан кейін оқушы өзіне ұнайтын нәрсені таңдайды. Егер трансформация қиындықтар тудырса, назарыңызды аудармағаныңыз жөн. Алдымен оқушы бәрін while көмегімен шешсін. Циклдер тақырыбын меңгергеннен кейін, while түрлендіруге машықтандыру үшін шешімдерді қайта жазуға болады.
Посткондициялық циклдар өте сирек кездесетін аң. Мен оған мүлдем уақыт жұмсамаймын. Егер студент үлгілерді анықтау және өрнектерді түрлендіру идеяларын меңгерсе, ол менің көмегімсіз оны анықтай алады.

Мықты оқушыларға бірінші мысалды көрсеткенде, бірінші мысалда тек шешімді ғана емес, нәтижеге әкелген барлық әрекеттер тізбегін жазу маңызды екеніне назар аударамын. Жалқау студенттер жазуды елемей, тек соңғы алгоритмді көшіре алады. Олар бір күні қиын жұмыстың келетініне сенімді болуы керек. Оны шешу үшін осы мысалдағыдай қадамдарды орындау қажет. Сондықтан барлық кезеңдерді жазып алу маңызды. Келесі есептерде шешімнің соңғы нұсқасын ғана қалдыруға болады.

Автоматтандырудың негізгі идеясы - біз компьютерге адамға күнделікті жұмысты сеніп тапсырамыз. Негізгі әдістердің бірі - ілмектерді жазу. Ол бағдарламада бір қатарда бірнеше қайталанатын әрекеттер жазылғанда қолданылады.

Ашық емес, жасырын емес

Бірінші циклдік тапсырмада бірдей фразаны бірнеше рет көрсету жақсы идея болып көрінуі мүмкін. Мысалы:

Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!
Ура, ол жұмыс істейді!

Бұл опция нашар, себебі есептегіш мәні шығыста көрінбейді. Бұл жаңадан бастағандар үшін проблема. Оны бағалама. Алдымен бұл тапсырма бірінші, ал өсу ретімен сандар қатарын шығару тапсырмасы екінші болды. «Цикл N рет» және «А-дан В-ға дейінгі цикл» қосымша терминдерін енгізу қажет болды, олар бір нәрсе. Қажетсіз нысандарды жасамау үшін мен тек сандар сериясының шығысымен мысалды көрсетуді шештім. Дайындалмай-ақ басындағы есептегішті ұстауды және бағдарламаның әрекетін өз басындағы үлгілеуді үйренетін адамдар аз. Кейбір студенттер алдымен циклдер тақырыбы бойынша психикалық модельдеумен кездеседі.
Біраз жаттығудан кейін өз бетінше шешу үшін сол мәтінді қайталау тапсырмасын беремін. Алдымен көрінетін, содан кейін көрінбейтін есептегішті берсеңіз, оқушыларда қиындықтар аз болады. Кейде «есептегішті экранға жазбаңыз» деген кеңес жеткілікті.

Басқалар мұны қалай түсіндіреді?

Интернеттегі оқу материалдарының көпшілігінде цикл синтаксисі «дәріс» бөлігі ретінде беріледі. Мысалы, developer.mozilla.org сайтында (қазіргі уақытта) while циклімен бірге бірнеше басқа конструкциялар сипатталған. Бұл жағдайда үлгілер түрінде тек конструкциялардың өздері беріледі. Олардың іске қосылуының нәтижесі сөзбен сипатталған, бірақ суретте жоқ. Менің ойымша, тақырыпты бұлай баяндау мұндай материалдардың пайдалылығын нөлге көбейтеді. Студент кодты қайта жазып, өзі іске қоса алады, бірақ оған бәрібір салыстыру үшін стандарт қажет. Нәтижені салыстыратын ештеңе болмаса, мысалдың дұрыс жазылғанын қалай түсінуге болады?
Үлгісіз үлгі ғана берілсе, оқушыға қиындай түседі. Үлгіде код фрагменттері дұрыс орналастырылғанын қалай түсінуге болады? Сіз жазып көріңіз әйтеуір, содан кейін іске қосыңыз. Бірақ нәтижені салыстыру үшін стандарт болмаса, іске қосу да көмектеспейді.

C++ курсының Intuitive курсында цикл синтаксисі «операторлар» тақырыбы бойынша 4-дәрістің үшінші бетінде көмілген. Циклдердің синтаксисін түсіндіргенде «оператор» терминіне ерекше назар аударылады. Термин фактілер жиынтығы ретінде «символ; бұл оператор», «{} — құрама оператор», «цикл денесі оператор болуы керек». Маған бұл тәсіл ұнамайды, өйткені ол бір терминнің артында маңызды қарым-қатынастарды жасыратын сияқты. Бағдарламаның бастапқы кодын осы деңгейде терминдерге талдау тіл спецификациясын іске асыру үшін компилятор әзірлеушілеріне қажет, бірақ студенттерге бірінші жуықтау ретінде емес. Бағдарламалауға жаңадан келгендер терминдерге соншалықты мұқият назар аудару үшін сирек кездеседі. Бұл жаңа сөздерді алғаш рет есте сақтайтын және түсінетін сирек адам. Жаңа ғана үйренген терминді ешкім дерлік дұрыс қолдана алмайды. Сондықтан студенттер «Мен while(a<7);{ жаздым, бірақ бағдарлама жұмыс істемейді» сияқты көптеген қателер алады.
Меніңше, басында құрылыстың синтаксисін бірден жақшамен берген дұрыс. Жақшасыз опцияны студентте «неге жақша жоқ және ол жұмыс істейді» деген нақты сұрақ туындаса ғана түсіндіру керек.

Окуловтың 2012 жылғы «Бағдарламалау негіздері» кітабында циклдерге кіріспе for үлгісінен басталады, содан кейін оны пайдалану бойынша ұсыныстар береді, содан кейін бірден сабақтың эксперименттік бөліміне өтеді. Бұл кітап менің сабағыма сирек келетін өте қабілетті студенттерге арналған деп түсінемін.

Танымал кітаптарда код фрагменттерінің нәтижесі әрқашан жазылады. Мысалы, Шилдттің «Java 8. The Complete Guide» 2015 жылғы басылымы. Алдымен шаблон беріледі, содан кейін бағдарламаның мысалы және одан кейін бірден орындалу нәтижесі.

Мысал ретінде кері әрекетті жасайтын уақытша циклды қарастырайық
10-нан басталатын кері санақ және дәл 10 «өлшемдер» жолы көрсетіледі:

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

Іске қосылғаннан кейін бұл бағдарлама келесідей он «цикл» шығарады:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Үлгіні, бағдарлама үлгісін және бағдарлама нәтижесін сипаттау тәсілі «Балаларға арналған Javascript» кітабында және w3schools.com сайтындағы js курсында да қолданылады. Веб-бет пішімі тіпті бұл мысалдың интерактивті болуына мүмкіндік береді.

Строуструптың 2016 жылғы C++ қолдану принциптері мен тәжірибесі бұдан да жоғары болды. Бірінші қадам - ​​қандай нәтиже алу керектігін түсіндіру, содан кейін бағдарлама мәтіні көрсетіледі. Оның үстіне олар кездейсоқ бағдарламаны мысалға алып қоймай, тарихқа экскурсия жасайды. Бұл оған назар аударуға көмектеседі: «Міне, бұл жай ғана пайдасыз мәтін емес. Сіз мағыналы нәрсені көресіз ».

Итерацияның мысалы ретінде сақталған бағдарлама машинасында (EDSAC) орындалатын бірінші бағдарламаны қарастырайық. Оны 6 жылы 1949 мамырда Англиядағы Кембридж университетінің компьютерлік зертханасында Дэвид Уилер жазған. Бұл бағдарлама квадраттардың қарапайым тізімін есептейді және басып шығарады.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Мұнда әрбір жолда қойынды таңбасы ('t') және сол санның квадраты болатын сан бар. Бұл бағдарламаның C++ нұсқасы келесідей:

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

Бір қызығы, бұл кітапта синтаксистік үлгі сипатталмаған. Строструп нұсқаушы нұсқаулығында (аударма) өз оқушыларының зерделілігін құрметтейтінін атап көрсетеді. Мүмкін, бірнеше мысалдардағы үлгіні анықтау мүмкіндігі осындай интеллекттің көрінісі болып саналады.

Мен өзімді түсіндіремін

Штроструптың тәсілі: нәтижені сипаттау, содан кейін мәселені шешу, содан кейін студенттің өз бетімен талдауы - ең ойлы болып көрінеді. Сондықтан мен оны негізге алуды жөн көрдім, бірақ оны азырақ тарихи мысал - «мазмұнды» шығару тапсырмасы арқылы айтайын. Ол «мазмұн туралы тапсырманы есте сақта» деп айта алатындай және оқушылардың дәл осыны есте сақтауы үшін танылатын якорь құрайды. Мен өз мысалымда тағы екі жиі кездесетін қате түсініктердің алдын алуға тырыстым. Келесі мен олар туралы толығырақ жазамын.

Бұл тапсырмада біз күрделі есептерді шешу әдістерімен танысамыз. Бастапқы шешім қарапайым және қарапайым болуы керек. Сонда сіз бұл шешімді қалай жақсартуға болатынын ойлай аласыз.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Менің байқауымша, әртүрлі комбинациялардағы «үлгі-мысал-нәтиже» тәсілі әлі де оқушылардың циклды иероглиф ретінде қабылдауына әкеледі. Бұл олардың бұл жерде неліктен жазу шарты бар екенін, i++ мен i арасында қалай таңдауға болатынын және басқа да айқын көрінетін нәрселерді түсінбеуінен көрінді. Бұл қате түсініктерді болдырмау үшін циклдар туралы сөйлесу тәсілі бірдей әрекеттерді қайталаудың мағынасына баса назар аударуы керек, содан кейін оларды құрылымды пайдалана отырып рәсімдеу керек. Сондықтан, цикл синтаксисін бермес бұрын, мәселені тікелей шешу керек. Мазмұн мәселесінің қарапайым шешімі келесідей:

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

Оны қалай жақсартуға болады?
Монотонды әрекеттерді циклмен ауыстырыңыз.
Қандай әрекеттер өзгеріссіз қатарынан қайталанады?
Бұл фрагментте ешқайсысы жоқ. Дегенмен, «Тарау» сөзін нөмірмен көрсету командалары бір-біріне өте ұқсас.
Сондықтан келесі кезең фрагменттердің айырмашылығын табу болып табылады. Тек осы тапсырмада бәрі анық, содан кейін бір команда қайталанбайды, бірақ 5 немесе одан да көп жолдық код блоктары қайталанады. Сізге тек командалар тізімінде ғана емес, тармақталған немесе цикл конструкцияларында іздеу керек болады.
Мысалда командалар арасындағы айырмашылық «Тарау» сөзінен кейінгі санда.
Айырмашылық табылғаннан кейін сіз өзгеріс үлгісін түсінуіңіз керек. Әр түрлі фрагмент - бұл сан? Ол үнемі өсіп отыр ма, әлде азая ма? Екі команда қатарласып, санның мәні қалай өзгереді?
Мысалда «Тарау» сөзінен кейінгі сан 1-ге өседі. Айырмашылық табылды, үлгі ашылады. Енді әр түрлі фрагментті айнымалымен ауыстыруға болады.
Мұндай айнымалыны қайталанатын фрагменттердің біріншісіне дейін жариялау керек. Мұндай айнымалы әдетте I немесе j немесе егжей-тегжейлі нәрсе деп аталады. Оның бастапқы мәні экранда көрсетілген бірінші мәнге тең болуы керек. Мысалда бірінші мән 1.
«100, 101, 102, 103, 104, 105» сандар қатарын көрсету үшін қандай бастапқы мәнді алу керек?
Бұл қатардағы бірінші сан 100.
Әрбір шығыс пәрменінен кейін осы айнымалының мәнін 1-ге көбейту керек. Бұл бірлік өзгерту қадамы болып табылады.
«100, 102, 104, 106» сандар қатарында қандай қадам болады?
Осы қатардағы 2-қадам.
Әртүрлі фрагментті айнымалымен ауыстырғаннан кейін код келесідей болады:

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

Кодта «айнымалының үлгісін өрнектеу» әдісін қолданғаннан кейін сіз қатарда жүретін бірдей әрекеттердің бірнеше тобын аласыз. Енді қайталанатын әрекеттерді циклмен ауыстыруға болады.

Циклдерді қолдану қажет мәселені шешу тізбегі келесі қадамдардан тұрады:

  1. Көптеген жеке пәрмендермен «басқа» шешіңіз
  2. Үлгіні табыңыз
  3. Айнымалының үлгісін көрсетіңіз
  4. Дизайн цикл ретінде

Әрі қарай студент «Мен бәрін түсінемін, бірақ айта алмаймын» жағдайына тап болмас үшін жаңа терминдер енгізіледі:
— есептегіш әрқашан циклдегі қадамдар санын бақылау үшін қажет айнымалы болып табылады. Әдетте шектеумен салыстырылатын бүтін сан.
— қарсы қадам — санауыш өзгерістер үлгісін сипаттау.
- шектеу – алгоритм түпкілікті болуы үшін есептегіш салыстырылатын сан немесе айнымалы. Есептегіш мән шектеуге жақындау үшін өзгереді.
— цикл денесі — қайталанатын командалар жиыны. Олар «пәрмен цикл ішінде жазылған» дегенде, олар денені білдіреді.
— цикл итерациясы — цикл денесінің бір реттік орындалуы.
— цикл шарты — басқа итерацияның орындалатынын немесе орындалатынын анықтайтын логикалық өрнек. (Мұнда тармақталған құрылымдармен шатасу болуы мүмкін)
Сіз алдымен студенттер терминдерді басқа мақсатта қолданатынына дайын болуыңыз керек. Бұл күштіге де, әлсізге де қатысты. Ортақ тіл орнату – өнер. Енді мен қысқаша жазамын: сізге «<term> арқылы код фрагментін бөлектеңіз» тапсырмасын қою керек және осы терминдерді сөйлесуде өзіңіз дұрыс қолданыңыз.
Циклмен түрлендіруден кейін фрагмент алынады:

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

Негізгі қате түсінік

Студенттер арасында кең таралған қате түсініктердің бірі - олар тек бір рет орындалуы керек әрекеттерді цикл ішінде орналастырады. Мысалы, келесідей:

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

Студенттер бұл мәселеге әрқашан басында да, күрделірек есептерде де кездеседі.
Бұл жағдайда негізгі кеңес:

Пәрменді неше рет қайталау керек: бір немесе бірнеше рет?

«Кіріспе» және «Қорытынды» сөздерін басып шығару және i айнымалысын жариялау және инициализациялау командалары басқа қайталанатын әрекеттер сияқты емес. Олар тек бір рет орындалады, яғни олар цикл денесінің сыртында жазылуы керек.

Шешімнің барлық үш кезеңі кодта қалуы керек, осылайша қиындықтар туындаған жағдайда кейінірек оларға сілтеме жасай аласыз. Алғашқы екі нұсқаға кедергі жасамас үшін түсініктеме беру жеткілікті.
Студенттің назарын келесі фактілерге аудару керек:
— Цикл жағдайында әдетте санауыш пен шек салыстырылады. Есептегіш циклдің денесінде өзгеруі мүмкін, бірақ шектеу мүмкін емес. Бұл ережені бұзу үшін сізге дәлелді себептерді тұжырымдау керек.
— «Кіріспе» және «Қорытынды» сөздерін бейнелеуге арналған командалар цикл мәтінінің сыртында орналасқан. Біз оларды 1 рет орындауымыз керек. «Кіріспе» - әрекеттерді қайталау алдында, «Қорытынды» - кейін.
Бұл тақырыпты бекіту, келесі тақырыптарды меңгеру, сондай-ақ қиындықтармен күресу барысында тіпті күшті студенттерге де: «Бұл әрекетті неше рет орындау керек? Бір немесе көп пе?

Қосымша дағдыларды дамыту

Циклдерді оқу процесінде студенттерде диагностикалау және есептерді шешу дағдылары да қалыптасады. Диагностиканы жүргізу үшін студент қалаған нәтижені ұсынуы және оны нақты нәтижемен салыстыруы керек. Түзету әрекеттері олардың арасындағы айырмашылыққа байланысты.
Осы кезеңдегі студенттер әлі де «қалаған» нәтиже туралы аз түсінетіндіктен, олар сынақ деректеріне назар аудара алады. Әдетте, бұл кезеңде ешкім ненің дұрыс емес болуы мүмкін екенін және онымен қалай күресуге болатынын әлі түсінбейді. Сондықтан мен дәптерге типтік есептердің сипаттамасын және оларды шешудің бірнеше жолдарын жазамын. Ең қолайлысын таңдау – оқушының өз міндеті.
«Күтілген жағдай болды ма?», «Осы жағдайлардың қайсысы қазір болды?», «Қолданылған шешім көмектесті ме?» Деген сұрақ қою үшін жазба қажет.

  1. Әрекеттер саны күтілгеннен 1-ге аз немесе көп. Шешімдер:
    — санауыштың бастапқы мәнін 1-ге көбейтіңіз.
    — қатаң салыстыру операторын (< немесе >) қатаң емеспен (<= немесе >=) ауыстырыңыз.
    — шекті мәнді 1-ге өзгертіңіз.
  2. Циклдегі әрекеттер тоқтаусыз, шексіз орындалады. Шешімдер:
    — егер ол жоқ болса, есептегішті өзгерту пәрменін қосыңыз.
    — санауышты өзгерту пәрменін оның мәні шекке жақындайтындай етіп бекітіңіз.
    — шектеуді өзгерту пәрменін алып тастаңыз, егер ол цикл денесінде болса.
  3. Циклдегі әрекеттер саны күтілгеннен 1-ден аз немесе көп. Циклдегі әрекет бір рет те орындалмады. Алдымен цикл басталмас бұрын айнымалылардың нақты мәндерін білу керек. Шешімдер:
    — шектеудің бастапқы мәнін өзгерту
    — санауыштың бастапқы мәнін өзгерту

3-мәселе әдетте қате айнымалыны пайдалануды немесе есептегішті нөлге қайтармауды қамтиды.

Осы түсініктемеден кейін студент әлі де ілмектердің қалай жұмыс істейтіні туралы әртүрлі қате түсініктерге ие болуы мүмкін.
Ең көп тарағандарды жою үшін мен сізге келесі тапсырмаларды беремін:

  1. Пайдаланушы шекті, бастапқы санауыш мәнін немесе санау қадамын енгізеді.
  2. Мұнда санауыш мәні кейбір арифметикалық өрнекте қолданылуы керек. Айырма сызықты емес болуы үшін радикалды өрнекте немесе бөлгіште санауышты қолданған жөн.
  3. Цикл жұмыс істеп тұрған кезде санауыш мәні экранда көрсетілмейді. Мысалы, бірдей мәтін фрагменттерінің қажетті санын көрсету немесе тасбақа графикасы бар фигураны салу.
  4. Онда алдымен бірнеше қайталанатын әрекеттерді, содан кейін басқаларын орындау керек.
  5. Қайталауға дейін және кейін басқа әрекеттерді орындау керек

Әрбір тапсырма үшін сынақ деректерін және күтілетін нәтижені беру қажет.

Қаншалықты жылдам қозғала алатыныңызды түсіну үшін осы есептердің шарттарын оқып, «олардың мысалдан айырмашылығы неде?», «Оларды шешу үшін мысалда нені өзгерту керек?» Деген сұрақ қою керек. Егер оқушы мәнді жауап берсе, онда ең болмағанда біреуін сабақта, ал қалғанын үйде өз бетінше шешсін. Егер шешім сәтті болса, онда біз циклдар ішіндегі шарттарды түсіндіруге кірісеміз.
Егер сізде есептерді өз бетіңізше шешуде қиындықтар туындаса, сабақта барлығын пысықтау керек. Мәселенің шешімін үкі салуды еске түсірмеу үшін алдымен мәселені әмбебап емес жолмен шешуді ұсынамын. Яғни, шешім бірінші сынақтан өтіп, цикл құрылысын қолданбауы үшін. Ал, шешімнің әмбебаптығына қол жеткізу үшін түрлендірулерді қолданыңыз.

Ілмектер мен тармақтар

Менің ойымша, «тармақтар ішіндегі циклдар» тақырыбын бөлек берген тиімді. Шартты бірнеше рет тексеру мен оны бір рет тексеру арасындағы айырмашылықты кейінірек көруге болады.
Біріктіру тапсырмалары пайдаланушы енгізетін А-дан В-ға дейінгі сандарды шығару туралы болады:
- әрқашан өсу ретімен.
- А және В мәндеріне байланысты өсу немесе кему.

«Циклдер ішінде тармақталу» тақырыбын студент «үлгіні айнымалымен ауыстыру» және «қайталанатын әрекеттерді циклмен ауыстыру» әдістерін меңгергеннен кейін ғана жылжыту керек.
Ілмектер ішіндегі бұтақтарды пайдаланудың негізгі себебі - үлгідегі ауытқулар. Ортасында бастапқы деректерге байланысты үзіледі.
Қарапайым әдістерді біріктіру арқылы шешімді іздей алатын оқушылар үшін «тармақтарды ілмектердің ішіне жазуға болады» деп айту және өз бетінше шешу үшін «мысалы» есепті толығымен беру жеткілікті.
Мысал тапсырма:

Пайдаланушы X санын енгізеді. 0-ден 9-ға дейінгі сандарды бағанға шығарып, Х-ке тең санға қарама-қарсы «+» белгісін қойыңыз.

Егер 0 енгізілсе0+
1
2
3
4
5
6
7
8
9

Егер 6 енгізілсе0
1
2
3
4
5
6+
7
8
9

Егер 9 енгізілсе0
1
2
3
4
5
6
7
8
9+

Егер 777 енгізілсе0
1
2
3
4
5
6
7
8
9

Циклмен жазу үшін қысқаша түсініктеме жеткіліксіз болса, онда бір есептің циклсыз әмбебап шешіміне жету керек.
Сіз екі нұсқаның бірін аласыз:
Қалаған

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

Мүмкін

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

Бұтақтану тақырыбын оқи отырып, осыған ұқсас тапсырманы алдын ала беремін.
Егер студент «мүмкін» нұсқасын ойлап тапса, онда бір мәселенің көптеген шешімдері болуы мүмкін екенін айту керек. Дегенмен, олар талаптардың өзгеруіне төзімділігімен ерекшеленеді. Сұрақ қойыңыз: «Егер басқа нөмір қосу керек болса, кодтың қанша жерін түзету керек еді?» «Мүмкін» нұсқасында сізге тағы бір филиал қосып, 10 басқа жерге жаңа нөмір қосу керек. «Қалаулымда» тек бір тармақты қосу жеткілікті.
«Қалаған» опцияны ойнату үшін тапсырманы орнатыңыз, содан кейін кодтан үлгіні табыңыз, айнымалыны ауыстыруды орындаңыз және циклды жазыңыз.
Егер сізде бұл мәселені басқа жолмен қалай шешуге болатыны туралы идея болса, түсініктемелерде жазыңыз.

Циклдар ішіндегі циклдар

Бұл тақырыпта сіз мыналарға назар аударуыңыз керек:
— ішкі және сыртқы ілмектер үшін есептегіштер әртүрлі айнымалы болуы керек.
— ішкі циклге арналған есептегішті бірнеше рет қалпына келтіру керек (яғни сыртқы циклдің корпусында).
— мәтінді шығару тапсырмаларында алдымен бірнеше жолға бір әріпті, содан кейін екіншісін жазуға болмайды. Алдымен бірінші жолдың барлық әріптерін, содан кейін екіншісінің барлық әріптерін және т.б. басып шығару керек.

Есептегішті нөлге қайта орнатудың маңыздылығын түсіндіру арқылы циклдар ішіндегі циклдар тақырыбын түсіндіруді бастаған дұрыс.
Мысал тапсырма:

Пайдаланушы екі санды енгізеді: R және T. «#» таңбаларының екі жолын басып шығарыңыз. Бірінші жолда R таңбалары болуы керек. Екінші жолда T бөліктері бар. Кез келген сан теріс болса, қате туралы хабарды көрсетіңіз.

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

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

R=-1, T=6R мәні теріс емес болуы керек

R=6, T=-2T мәні теріс емес болуы керек

Әлбетте, бұл мәселенің де кем дегенде екі шешімі бар.
Қалаған

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

Мүмкін №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;
}

Айырмашылығы мынада, «мүмкін» шешімде екінші жолды шығару үшін екінші айнымалы қолданылды. Екі цикл үшін бірдей айнымалы мәнді пайдалануды талап ету керек. Бұл шектеуді екі цикл үшін бір есептегіші бар шешім «есептегішті қалпына келтіру» терминінің суреті болатынымен негіздеуге болады. Бұл терминді түсіну келесі есептерді шешу кезінде қажет. Ымыра ретінде сіз мәселенің екі шешімін де сақтай аласыз.

Екі цикл үшін бір есептегіш айнымалыны пайдаланудың әдеттегі мәселесі келесідей көрінеді:
R=5, T=11#####
######

Екінші жолдағы таңбалар саны T мәніне сәйкес келмейді. Егер сізге осы мәселе бойынша көмек қажет болса, онда циклдармен типтік мәселелер туралы ескертпелерді қарау керек. Бұл №3 симптом. Есептегіш мән шығысын екінші цикл алдында бірден қоссаңыз, ол диагностикаланады. Қалпына келтіру арқылы түзетілді. Бірақ бұл туралы бірден айтпаған дұрыс. Студент кем дегенде бір гипотезаны тұжырымдауға тырысуы керек.

Әрине, басқа шешім бар. Бірақ мен оны студенттер арасында көрген емеспін. Циклдерді оқу кезеңінде ол туралы әңгіме назарды аударады. Жол функцияларымен танысқан кезде оған кейінірек оралуға болады.
Мүмкін №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));

Келесі міндетті тапсырма:

0-ден 9-ға дейінгі сандарды көрсетіңіз. Әрбір сан өз жолында болуы керек. Жолдағы цифрлар саны (W) пернетақтадан енгізіледі.

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

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

Егер студент айнымалыны ауыстыру техникасын меңгерсе, онда ол өте тез төтеп береді. Ықтимал мәселе айнымалы мәнді қайта орнатуда болады. Трансформацияны орындай алмасаңыз, бұл сіздің асығыс болғаныңызды және қарапайым мәселелерді шешуіңіз керек екенін білдіреді.

Назарларыңызға рахмет. Лайк басып каналға жазылыңыз.

PS Егер мәтінде қателер немесе қателер тапсаңыз, маған хабарлаңыз. Мұны мәтіннің бір бөлігін таңдап, Mac жүйесінде «⌘ + Enter» және классикалық пернетақталарда «Ctrl / Enter» пернелерін басу немесе жеке хабарламалар арқылы жасауға болады. Бұл опциялар қол жетімді болмаса, қателер туралы түсініктемелерде жазыңыз. Рақмет сізге!

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Кармасы жоқ оқырмандарға арналған сауалнама

  • 20,0%Мен кәсіби түрде сабақ беремін, +12

  • 10,0%Мен кәсіби түрде сабақ беремін, -11

  • 70,0%Мен оқытпаймын, +17

  • 0,0%Мен үйретпеймін, -10

  • 0,0%Басқа 0

10 пайдаланушы дауыс берді. 5 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру