Како да научите како да ги надминете тешкотиите, а во исто време да пишувате циклуси

И покрај фактот дека ќе зборуваме за една од основните теми, овој напис е напишан за искусни професионалци. Целта е да се покаже какви заблуди имаат почетниците во програмирањето. За програмерите кои практикуваат, овие проблеми одамна се решени, заборавени или воопшто не се забележани. Написот може да ви помогне ако одеднаш треба да помогнете некому со оваа тема. Статијата повлекува паралели со материјали од различни книги за програмирање од Шилд, Струшруп, Окулов.

Темата за циклуси е избрана затоа што доста луѓе се исклучени од неа при совладување на програмирање.

Оваа техника е наменета за слаби ученици. По правило, силните луѓе не се заглавуваат на оваа тема и нема потреба да се смислуваат посебни техники за нив. Секундарната цел на статијата е да ја премести оваа техника од класот „работи за сите ученици, но само еден наставник“ на часот „работи за сите ученици, сите наставници“. Не тврдам апсолутна оригиналност. Ако веќе користите слична методологија за предавање на оваа тема, ве молиме напишете како се разликува вашата верзија. Ако одлучите да го користите, кажете ни како помина. Ако слична техника е опишана во книга, ве молиме напишете го името.


Работев на оваа техника 4 години, учејќи индивидуално со студенти од различни нивоа на обука. Вкупно има околу педесет ученици и две илјади часови настава. На почетокот, студентите секогаш заглавуваа на оваа тема и си заминуваа. По секој ученик се приспособуваше методологијата и материјалите. Во текот на изминатата година, студентите повеќе не беа заглавени на оваа тема, па решив да ги споделам моите наоди.

Зошто толку многу букви? Циклусите се толку елементарни!

Како што напишав погоре, за програмери кои вежбаат и за силни студенти, комплексноста на концептот на јамки може да се потцени. На пример, можете да одржите долго предавање, да видите глави кои кимнуваат и интелигентни очи. Но, кога се обидувате да решите каков било проблем, почнуваат ступор и необјасниви проблеми. По предавањето, студентите веројатно имаа само делумно разбирање. Ситуацијата ја влошува фактот што самите студенти не можат да кажат каква е нивната заблуда.
Еден ден сфатив дека студентите ги доживуваат моите примери како хиероглифи. Тоа е, како неделиви делови од текст во кои треба да додадете некоја „волшебна“ буква и ќе функционира.
Понекогаш забележав дека учениците мислат дека за да се реши одреден проблем ви треба нешто друго дизајн кој сè уште не сум го опфатил. Иако решението бараше само мала промена на примерот.

Така, дојдов до идејата дека фокусот не треба да биде на синтаксата на изразите, туку на идејата за рефакторирање на повторувачки код користејќи јамки. Откако студентите ќе ја совладаат оваа идеја, секоја синтакса може да се подобри со малку вежбање.

Кој и зошто предавам?

Бидејќи нема приемни испити, часовите може да вклучуваат и силни и многу слаби студенти. Можете да прочитате повеќе за моите студенти во статијата Портрет на студенти од вечерен курс
Се трудев да се осигурам дека секој што сака да научи програмирање може да го научи.
Моите часови се одржуваат поединечно и ученикот си плаќа сам за секој. Се чини дека студентите ќе ги оптимизираат трошоците и ќе бараат минимум. Меѓутоа, луѓето одат на часови лице в лице со наставник во живо не заради самото знаење, туку заради довербата во она што го научиле, за чувството на напредок и за одобрување од експертот (наставникот). Доколку учениците не чувствуваат напредок во учењето, тие ќе си заминат. Општо земено, часовите можат да бидат структурирани така што учениците ќе почувствуваат напредок во зголемувањето на бројот на познати структури. Односно, прво учиме додека детално, па учиме за, па правиме додека, а сега имаме подготвен илјада и една ноќ курс, во кој само циклуси се изучуваат два месеци, а на крајот - студент кој напишал стандардна библиотека под диктат. Меѓутоа, за да се решат практични проблеми, потребно е не само познавање на материјалот, туку и независност во неговата примена и во потрагата по нови информации. Затоа, за курсевите лице в лице, мислам дека правилниот принцип е да се научи минимумот и да се поттикне независно проучување на нијанси и сродни теми. Во темата за јамки, конструкцијата while ја сметам за минимум. Од него можете да го разберете принципот. Знаејќи го принципот, можете да го совладате и за себе и правите-додека.

За да се постигне совладување на материјалот од слабите ученици, опишувањето на синтаксата не е доволно. Неопходно е да се дадат поедноставни, но разновидни задачи и да се опишат примерите подетално. На крајот на краиштата, брзината на развој е ограничена од способноста на ученикот да ги трансформира изразите и да бара обрасци. За паметните студенти, повеќето задачи ќе бидат здодевни. Кога учите со нив, не мора да инсистирате на решавање на 100% од проблемите. Мојот материјал може да се погледне на мојот github. Навистина, складиштето е повеќе како гримоар на војник - никој освен мене нема да разбере што е каде, и ако не ја проверите, можете да полудите

Методологијата е ориентирана кон пракса

Теоријата е објаснета користејќи го примерот за решавање на проблем. На часовите по основи на програмирање каде се изучуваат гранки и циклуси, едноставно не е можно да се одржи корисно предавање на една тема цел час. 15-20 минути се доволни за да се објасни концептот. Главните тешкотии се јавуваат при извршување на практични задачи.
Почетните наставници можат да ги штракаат операторите, гранките, јамките и низите на едно предавање. Но, нивните студенти ќе се соочат со проблемот да ги асимилираат овие информации.
Неопходно е не само да се каже материјалот, туку и да се увериме дека слушателите го разбираат.

Фактот за совладување на тема се одредува според тоа како студентот се справува со самостојната работа.
Ако некој ученик успеал да реши проблем на тема без помош од наставник, тогаш темата е совладана. За да се обезбеди само-тестирање, секоја задача е опишана во табела со тест сценарија. Задачите имаат јасен редослед. Не се препорачува прескокнување задачи. Ако тековната задача е премногу тешка, тогаш префрлањето на следната е бескорисно. Уште покомплицирано е. За да може ученикот да ја совлада тековната сложена задача, му се објаснети неколку техники користејќи го примерот од првиот проблем. Всушност, целата содржина на темата се сведува на техники за надминување на тешкотиите. Циклусите се повеќе несакан ефект.

Првата задача е секогаш пример. Вториот малку се разликува и се изведува „независно“ веднаш по првото под надзор на наставник. Сите последователни задачи се насочени кон обрнување внимание на разни ситници кои можат да предизвикаат заблуди.

Објаснувањето на примерот е дијалог во кој ученикот треба да го врати ширењето и вкрстената валидација за да се увери дека совладал дел од материјалот.

Ќе бидам банален и ќе кажам дека првиот пример на темата е многу важен. Доколку го имате материјалот за обемна самостојна работа, пропустите од првиот пример може да се поправат. Ако нема ништо друго освен примерот, тогаш студентот најверојатно нема да ја совлада темата.

Додека или за?

Едно од контроверзните прашања е изборот на конструкција за примерот: додека или за. Еднаш, еден мој пријател програмер кој вежбаше, без искуство во наставата, помина еден час убедувајќи ме дека најлесно може да се разбере за јамката за. Аргументите се сведуваа на „сè во него е јасно и поставено на своето место“. Сепак, основната причина за тешкотиите за вистинските почетници е идејата за самиот циклус, а не за неговото пишување. Ако некое лице не ја разбира оваа идеја, тогаш ќе има потешкотии со синтаксата. Штом се реализира идејата, проблемите со дизајнот на кодот исчезнуваат сами од себе.

Во моите материјали, темата на јамките ја следи темата на разгранување. Надворешната сличност на if и while ни овозможува да извлечеме директна аналогија: „кога состојбата во заглавието е вистинита, тогаш телото се извршува“. Единствената особеност на циклусот е тоа што телото се извршува многу пати.

Мојот втор аргумент е дека додека бара помалку форматирање отколку за. Помалку форматирање значи помалку глупави грешки со запирки и загради кои недостасуваат. Почетниците сè уште немаат развиено доволно внимание и педантност за автоматски да избегнат синтаксички грешки.
Третиот аргумент е објаснет во многу добри книги како прв аргумент.

Ако ученикот може лесно да ги трансформира изразите, тогаш можете да зборувате за за во полагање. Потоа ученикот ќе избере што најмногу му се допаѓа. Ако трансформациите предизвикуваат тешкотии, тогаш подобро е да не го одвлекувате вниманието. Оставете го ученикот прво да реши сè користејќи додека. Откако ќе ја совладате темата за циклуси, можете да ги преработите решенијата за да вежбате конвертирање додека во за.
Посткондиционите јамки се прилично редок ѕвер. Воопшто не трошам време на тоа. Ако ученикот ги совладал идеите за идентификување на обрасци и трансформирање на изрази, тој може да го сфати без моја помош.

При демонстрирањето на првиот пример на силните студенти, привлекувам внимание на фактот дека во првиот пример е важно да се сними не само решението, туку и целиот синџир на дејства што доведоа до резултат. Мрзливите ученици можат да го занемарат пишувањето и да го копираат само конечниот алгоритам. Тие треба да бидат убедени дека еден ден ќе им дојде тешка задача. За да го решите, ќе треба да ги следите чекорите како во овој пример. Затоа е важно да се снимаат сите фази. Во следните проблеми ќе може да се остави само конечната верзија на решението.

Главната идеја на автоматизацијата е да му довериме на компјутер да врши рутинска работа за некоја личност. Една од основните техники е пишување јамки. Се користи кога неколку идентични дејства што се повторуваат се напишани во програма по ред.

Експлицитното е подобро од имплицитното

Можеби изгледа како добра идеја да се прикаже истата фраза повеќе пати во првата задача за циклус. На пример:

Ура, работи!
Ура, работи!
Ура, работи!
Ура, работи!
Ура, работи!
Ура, работи!
Ура, работи!
Ура, работи!

Оваа опција е лоша бидејќи вредноста на бројачот не е видлива на излезот. Ова е проблем за почетници. Не ја потценувајте. Отпрвин, оваа задача беше прва, а задачата за изведување низа броеви во растечки редослед беше втората. Беше неопходно да се воведат дополнителни термини „циклус N пати“ и „циклус од А до Б“, кои во суштина се иста работа. За да не создадам непотребни ентитети, решив да покажам само пример со излез од серија броеви. Малкумина успеваат да научат како да држат бројач во главата и да го моделираат однесувањето на програмата во главата без подготовка. Некои ученици прво се среќаваат со ментално моделирање на тема циклуси.
По малку вежбање давам задача да се повтори истиот текст да се реши самостојно. Ако прво дадете видлив бројач, а потоа невидлив, учениците ќе имаат помалку проблеми. Понекогаш е доволно навестувањето „не пишувај бројач на екранот“.

Како другите го објаснуваат тоа?

Во повеќето едукативни материјали на Интернет, синтаксата на циклусот е дадена како дел од „предавање“. На пример, на developer.mozilla.org (во моментов), неколку други конструкции се опишани заедно со јамката while. Во овој случај, само самите дизајни се дадени во форма на шаблони. Резултатот од нивното лансирање е опишан со зборови, но нема илустрација. Според мене, ваквата презентација на темата ја множи корисноста на ваквите материјали со нула. Ученикот може да го преработи кодот и сам да го изврши, но сепак му треба стандард за споредба. Како можеш да разбереш дека примерот е препишан правилно ако нема со што да се споредува резултатот?
Кога се дава само шаблон, без пример, на ученикот му станува уште потешко. Како да се разбере дека фрагментите од кодот се правилно поставени во шаблонот? Може да се обидете да напишете некако, а потоа трчајте. Но, ако нема стандард за споредба на резултатот, тогаш ниту лансирањето нема да помогне.

Во курсот C++ за Интуитивно, синтаксата на јамката е закопана на третата страница од Предавање 4 на тема „оператори“. При објаснување на синтаксата на јамките, посебен акцент се става на терминот „оператор“. Терминот е претставен како збир на факти како „симбол; ова е изјава", "{} е сложена изјава", "телото на јамката мора да биде изјава". Не ми се допаѓа овој пристап бидејќи се чини дека крие важни врски зад еден термин. Парсирањето на изворниот код на програмата во термини на ова ниво им е потребно на развивачите на компајлерите за да ја имплементираат спецификацијата на јазикот, но не и на студентите како прва апроксимација. Новодојденците во програмирањето ретко се доволно прецизни за да обрнат толку големо внимание на термините. Тоа е ретка личност која се сеќава и разбира нови зборови од прв пат. Речиси никој не може правилно да го примени терминот што штотуку го научил. Затоа, учениците добиваат многу грешки како „Напишав додека(a<7);{, но програмата не работи“.
Според мене, на почетокот е подобро да се даде синтаксата на конструкцијата веднаш со загради. Опцијата без загради треба да се објасни само ако ученикот има конкретно прашање: „зошто нема загради и функционира“.

Во книгата на Окулов од 2012 година „Основи на програмирање“, воведот во циклусите започнува со шемата за, потоа дава препораки за негова употреба, а потоа веднаш оди во експерименталниот дел од лекцијата. Разбирам дека книгата е напишана за тоа малцинство на многу способни студенти кои ретко доаѓаат на моите часови.

Во популарните книги, резултатот од фрагменти од кодот секогаш се пишува. На пример, изданието „Јава 8. Целосниот водич“ на Шилд од 2015 година. Прво, даден е шаблон, потоа пример програма и веднаш по него - резултат од извршување.

Како пример, земете ја јамката while што го прави обратно
одбројувањето почнувајќи од 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 for Kids“ и во курсот js на w3schools.com. Форматот на веб-страницата дури дозволува овој пример да биде интерактивен.

Книгата на Stroustrup од 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;
    }
}

Интересно е што синтаксната шема не е опишана во оваа книга. Stroustrup во прирачникот за инструктор (превод) нагласува дека ја почитува интелигенцијата на своите ученици. Можеби способноста да се идентификува шема во неколку примери се смета за манифестација на таквата интелигенција.

Како што се објаснувам

Пристапот на Stroustrup: опишување на резултатот, потоа решавање на проблемот, а потоа независна анализа од страна на ученикот - изгледа најпромислено. Затоа, решив да го земам како основа, но да го кажам користејќи помалку историски пример - задачата да изведе „содржина“. Формира препознатливо сидро за потоа да можете да кажете „запомни ја задачата за содржината“ и учениците да го запомнат токму ова. Во мојот пример, се обидов да спречам уште две од најчестите заблуди. Следно ќе пишувам за нив подетално.

Во оваа задача се запознаваме со техники за решавање на сложени проблеми. Првичната одлука треба да биде примитивна и едноставна. Па, тогаш можете да размислите како да го подобрите ова решение.
Введение
Глава 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 во колона и ставете знак „+“ спроти бројот што е еднаков на X.

Ако се внесе 00+
1
2
3
4
5
6
7
8
9

Ако се внесе 60
1
2
3
4
5
6+
7
8
9

Ако се внесе 90
1
2
3
4
5
6
7
8
9+

Ако се внесе 7770
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 други места. Во „посакуваното“ доволно е да се додаде само една гранка.
Поставете ја задачата да ја репродуцира „посакуваната“ опција, потоа пронајдете шема во кодот, извршете замена на променливата и напишете јамка.
Ако имате идеја како да го решите овој проблем без јамка на некој друг начин, ве молиме напишете ги во коментарите.

Јамки во Loops

Во оваа тема треба да обрнете внимание на следново:
— бројачите за внатрешната и надворешната јамка мора да бидат различни променливи.
— бројачот за внатрешната јамка мора да се ресетира многу пати (т.е. во телото на надворешната јамка).
— во задачите за излез на текст, не можете прво да напишете една буква во неколку редови, а потоа втората. Прво мора да ги испечатите сите букви од првиот ред, потоа сите букви од вториот и така натаму.

Најдобро е да се започне со објаснување на темата за јамки во јамки со објаснување на важноста од ресетирање на бројачот на нула.
Пример задача:

Корисникот внесува два броја: R и T. Отпечатете две линии со знаци „#“. Првата линија треба да содржи R знаци. Втората линија содржи Т парчиња. Ако некој број е негативен, прикажете порака за грешка.

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

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

R=-1, Т=6Вредноста R мора да биде ненегативна

R=6, Т=-2Т вредноста мора да биде ненегативна

Очигледно и овој проблем има најмалку две решенија.
Посакуван

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 Ако најдете печатни грешки или грешки во текстот, ве молам известете ме. Ова може да се направи со избирање дел од текстот и притискање на „⌘ + Enter“ на Mac и „Ctrl / Enter“ на класичните тастатури или преку приватни пораки. Ако овие опции не се достапни, пишете за грешки во коментарите. Ви благодарам!

Само регистрирани корисници можат да учествуваат во анкетата. Најави се, вие сте добредојдени.

Анкета за читатели без карма

  • 20,0%Предавам професионално, +12

  • 10,0%Предавам професионално, -11

  • 70,0%Јас не предавам, +17

  • 0,0%Јас не предавам, -10

  • 0,0%Друго0

Гласаа 10 корисници. 5 корисници беа воздржани.

Извор: www.habr.com

Додадете коментар