Как да научите как да преодолявате трудностите и в същото време да пишете цикли

Въпреки факта, че ще говорим за една от основните теми, тази статия е написана за опитни професионалисти. Целта е да се покаже какви заблуди имат начинаещите в програмирането. За практикуващите разработчици тези проблеми отдавна са решени, забравени или изобщо не са забелязани. Статията може да ви бъде полезна, ако изведнъж трябва да помогнете на някого по тази тема. Статията прави паралели с материали от различни книги по програмиране на Шилд, Страуструп, Окулов.

Темата за циклите е избрана, защото доста хора са изключени от нея при усвояване на програмирането.

Тази техника е предназначена за слаби ученици. По правило силните хора не се забиват в тази тема и не е необходимо да се измислят специални техники за тях. Вторичната цел на статията е да премести тази техника от класа „работи за всички ученици, но само един учител“ към класа „работи за всички ученици, всички учители“. Не претендирам за абсолютна оригиналност. Ако вече използвате подобна методология за преподаване на тази тема, моля, напишете с какво се различава вашата версия. Ако решите да го използвате, кажете ни как е минало. Ако подобна техника е описана в книга, моля, напишете името.


Работих върху тази техника в продължение на 4 години, като се обучавах индивидуално с ученици от различни нива на обучение. Общо има около петдесет студенти и две хиляди учебни часа. В началото студентите винаги се забиваха на тази тема и си тръгваха. След всеки ученик методологията и материалите бяха коригирани. През изминалата година учениците вече не бяха закъсали по тази тема, затова реших да споделя моите открития.

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

Както писах по-горе, за практикуващи разработчици и за силни ученици сложността на концепцията за цикли може да бъде подценена. Например, можете да изнесете дълга лекция, да видите кимащи глави и интелигентни очи. Но когато се опитвате да разрешите някакъв проблем, започва ступор и необясними проблеми. След лекцията студентите вероятно са имали само частично разбиране. Ситуацията се утежнява от факта, че самите студенти не могат да изразят каква точно е заблудата им.
Един ден разбрах, че учениците възприемат моите примери като йероглифи. Тоест като неделими парчета текст, в които трябва да добавите някаква „магическа“ буква и тя ще работи.
Понякога забелязах, че учениците смятат, че за решаване на конкретен проблем е необходимо нещо друго дизайн, който просто още не съм покрил. Въпреки че решението изисква само лека модификация на примера.

Така че стигнах до идеята, че фокусът не трябва да бъде върху синтаксиса на изразите, а върху идеята за рефакторинг на повтарящ се код с помощта на цикли. След като учениците усвоят тази идея, всеки синтаксис може да бъде подобрен с малко практика.

Кого и защо преподавам?

Тъй като няма приемни изпити, в паралелките могат да се включват както силни, така и много слаби ученици. Можете да прочетете повече за моите ученици в статията Портрет на студенти от вечерен курс
Стремях се всеки, който иска да научи програмиране, да може да го научи.
Заниманията ми се провеждат индивидуално и всеки ученик заплаща сам. Изглежда, че студентите ще оптимизират разходите и ще изискват минимума. Хората обаче отиват на присъствени часове с учител на живо не заради самите знания, а заради увереността в наученото, за усещане за напредък и за одобрение от експерта (учителя). Ако учениците не усетят напредък в обучението си, те ще напуснат. Като цяло часовете могат да бъдат структурирани така, че учениците да усетят напредък в увеличаването на броя на познатите структури. Тоест първо учим подробно, след това учим, след това правим и сега имаме готов курс за хиляда и една нощ, в който се изучават само цикли за два месеца и накрая - студент, който е написал стандартна библиотека под диктовка. За решаването на практически проблеми обаче е необходимо не само познаване на материала, но и самостоятелност в прилагането му и в търсенето на нова информация. Ето защо, за курсовете лице в лице, мисля, че правилният принцип е да се преподава минимумът и да се насърчава независимото изучаване на нюанси и свързани теми. В темата за циклите смятам конструкцията while за минимум. Можете да разберете принципа от него. Познавайки принципа, можете да овладеете както за, така и за себе си.

За да се постигне овладяване на материала от слабите ученици, описанието на синтаксиса не е достатъчно. Необходимо е да се дадат по-прости, но разнообразни задачи и да се опишат примери по-подробно. В крайна сметка скоростта на развитие е ограничена от способността на ученика да трансформира изрази и да търси модели. За умните ученици повечето задачи ще бъдат скучни. Когато учите с тях, не е нужно да настоявате за решаване на 100% от проблемите. Материалите ми могат да се видят на моят github. Вярно, хранилището е по-скоро като гримоар на магьосник - никой освен мен няма да разбере кое къде е и ако не успееш да провериш, можеш да полудееш

Методиката е ориентирана към практиката

Теорията се обяснява на примера за решаване на задача. В час по основи на програмирането, където се преподават разклонения и цикли, просто не е възможно да се изнесе полезна лекция по една тема за цял час. 15-20 минути са достатъчни за обяснение на концепцията. Основните трудности възникват при изпълнение на практически задачи.
Начинаещите учители могат да се запознаят с оператори, разклонения, цикли и масиви в една лекция. Но техните ученици ще се сблъскат с проблема с усвояването на тази информация.
Необходимо е не само да разкажете материала, но и да се уверите, че слушателите го разбират.

Фактът на усвояване на дадена тема се определя от това как ученикът се справя със самостоятелната работа.
Ако ученик е успял да реши задача по дадена тема без помощта на учител, значи темата е усвоена. За да се осигури самопроверка, всяка задача е описана в таблица с тестови сценарии. Задачите имат ясен ред. Пропускането на задачи не се препоръчва. Ако текущата задача е твърде трудна, преминаването към следващата е безполезно. Още по-сложно е. За да може ученикът да овладее текущата сложна задача, му се обясняват няколко техники, използвайки примера на първия проблем. Всъщност цялото съдържание на темата се свежда до техники за преодоляване на трудностите. Циклите са по-скоро страничен ефект.

Първата задача винаги е примерна. Второто се различава леко и се изпълнява „самостоятелно“ веднага след първото под наблюдението на учител. Всички следващи задачи са насочени към обръщане на внимание на различни малки неща, които могат да причинят погрешни схващания.

Обяснението на примера е диалог, в който студентът трябва да извика обратно разпространение и кръстосано валидиране, за да се увери, че е усвоил част от материала.

Ще бъда банален и ще кажа, че първият пример по темата е много важен. Ако имате материал за обширна самостоятелна работа, пропуските в първия пример могат да бъдат коригирани. Ако няма нищо друго освен примера, тогава ученикът най-вероятно няма да усвои темата.

Докато или за?

Един от спорните въпроси е изборът на конструкция за примера: докато или за. Веднъж мой приятел практикуващ разработчик без опит в преподаването прекара един час, убеждавайки ме, че цикълът for е най-лесният за разбиране. Аргументите се свеждаха до това, че „всичко в него е ясно и подредено на мястото си“. Основната причина за трудностите за истинските начинаещи обаче е идеята за самия цикъл, а не неговото писане. Ако човек не разбира тази идея, тогава ще има затруднения със синтаксиса. Веднага след като идеята се реализира, проблемите с дизайна на кода изчезват сами.

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

Вторият ми аргумент е, че while изисква по-малко форматиране от for. По-малко форматиране означава по-малко глупави грешки с липсващи запетаи и скоби. Начинаещите все още не са развили достатъчно внимание и педантичност, за да избягват автоматично синтактични грешки.
Третият аргумент се обяснява в много добри книги като първия аргумент.

Ако ученикът може лесно да трансформира изрази, тогава можете да говорите за за мимоходом. След това ученикът ще избере това, което му харесва най-много. Ако трансформациите създават трудности, тогава е по-добре да не отвличате вниманието си. Нека ученикът първо да реши всичко с помощта на while. След като усвоите темата за циклите, можете да пренапишете решенията, за да упражните преобразуването while във for.
Циклите с постусловия са доста рядък звяр. Изобщо не отделям време за това. Ако ученикът е усвоил идеите за идентифициране на модели и трансформиране на изрази, той може да го разбере без моята помощ.

Когато демонстрирам първия пример на силни ученици, обръщам внимание на факта, че в първия пример е важно да се запише не само решението, но и цялата верига от действия, довели до резултата. Мързеливите ученици могат да пренебрегнат писането и да копират само крайния алгоритъм. Те трябва да бъдат убедени, че един ден пред тях ще се изправи трудна задача. За да го разрешите, ще трябва да следвате стъпките като в този пример. Ето защо е важно да се записват всички етапи. В следващите задачи ще бъде възможно да оставите само крайната версия на решението.

Основната идея на автоматизацията е, че поверяваме на компютър да върши рутинна работа вместо човек. Една от основните техники е писането на цикли. Използва се, когато в една програма са записани последователно няколко еднакви повтарящи се действия.

Явно е по-добре от имплицитно

Може да изглежда като добра идея да показвате една и съща фраза няколко пъти в първата задача за цикъл. Например:

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

Тази опция е лоша, защото стойността на брояча не се вижда в изхода. Това е проблем за начинаещи. Не я подценявайте. Отначало тази задача беше първата, а задачата за извеждане на поредица от числа във възходящ ред беше втората. Беше необходимо да се въведат допълнителни термини „цикъл N пъти“ и „цикъл от А до Б“, които по същество са едно и също нещо. За да не създавам ненужни обекти, реших да покажа само пример с изхода на поредица от числа. Малко хора успяват да се научат как да държат брояч в главата си и да моделират поведението на програма в главата си без подготовка. Някои ученици за първи път се сблъскват с умствено моделиране по темата за циклите.
След известно упражнение давам задачата за повторение на един и същ текст за самостоятелно решаване. Ако първо дадете видим брояч и след това невидим, учениците ще имат по-малко проблеми. Понякога подсказката „не пишете брояча на екрана“ е достатъчна.

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

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

В курса по C++ Intuitive, синтаксисът на цикъла е заровен в третата страница на Лекция 4 по темата „оператори“. Когато се обяснява синтаксиса на циклите, специално внимание се поставя върху термина „оператор“. Терминът е представен като набор от факти като „символ; това е израз", "{} е съставен оператор", "тялото на цикъла трябва да бъде оператор". Не харесвам този подход, защото изглежда крие важни взаимоотношения зад един термин. Разборът на изходния код на програма в термини на това ниво е необходим на разработчиците на компилатори за прилагане на спецификацията на езика, но не и на студентите като първо приближение. Новодошлите в програмирането рядко са достатъчно педантични, за да обърнат толкова внимание на термините. Рядък е човек, който помни и разбира нови думи от първия път. Почти никой не може да приложи правилно термин, който току-що е научил. Следователно учениците получават много грешки като „Написах докато(a<7);{, но програмата не работи.“
Според мен в началото е по-добре да се даде синтаксиса на конструкцията веднага със скоби. Опцията без скоби трябва да се обяснява само ако ученикът има конкретен въпрос: „защо няма скоби и работи.“

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

В популярните книги резултатът от кодови фрагменти винаги е написан. Например „Java 8. Пълното ръководство“ на Shildt от 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 за деца“ и в курса по 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 в ръководството на инструктора (превод) подчертава, че уважава интелигентността на своите ученици. Може би способността да се идентифицира модел в няколко примера се счита за проява на такава интелигентност.

Както си обяснявам

Подходът на Страуструп: описване на резултата, след това решаване на проблема и след това независим анализ от ученика - изглежда най-обмислен. Затова реших да го взема като основа, но да го разкажа с по-малко исторически пример - задачата за извличане на „съдържание“. Той образува разпознаваема котва, така че след това можете да кажете „запомнете задачата относно съдържанието“ и така че учениците да запомнят точно това. В моя пример се опитах да предотвратя още две от най-често срещаните погрешни схващания. След това ще пиша за тях по-подробно.

В тази задача се запознаваме с техники за решаване на сложни проблеми. Първоначалното решение трябва да бъде примитивно и просто. Е, тогава можете да помислите как да подобрите това решение.
Введение
Глава 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. Дизайн като цикъл

След това се въвеждат нови термини, така че ученикът да не се окаже в ситуацията „Разбирам всичко, но не мога да го кажа“:
— броячът винаги е променлива, която е необходима за проследяване на броя на стъпките в цикъл. Обикновено цяло число, което се сравнява с ограничението.
— стъпка на брояча — описание на модела на промените на брояча.
- ограничение - число или променлива, с която се сравнява брояча, така че алгоритъмът да е окончателен. Стойността на брояча се променя, за да се доближи до границата.
— тяло на цикъл — набор от команди, които ще се повтарят. Когато казват „командата е написана в цикъл“, те имат предвид тялото.
— итерация на цикъл — еднократно изпълнение на тялото на цикъла.
— условие за цикъл — логически израз, който определя дали ще бъде изпълнена друга итерация. (Тук може да има объркване с разклонените структури)
Трябва да сте подготвени за факта, че в началото учениците ще използват термини за други цели. Това се отнася както за силните, така и за слабите. Създаването на общ език е изкуство. Сега ще напиша накратко: трябва да зададете задачата „маркиране на кодовия фрагмент с <термин>“ и сами да използвате тези термини правилно в разговор.
След трансформация с цикъл се получава фрагментът:

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. В който трябва да извършите други действия преди и след повторение

За всяка задача трябва да предоставите тестови данни и очаквания резултат.

За да разберете колко бързо можете да се движите, трябва да прочетете условията на тези задачи и да попитате: „как се различават от примера?“, „Какво трябва да се промени в примера, за да ги разрешите?“ Ако ученикът отговаря смислено, нека реши поне едно в час, а останалите вкъщи сам. Ако решението е успешно, тогава можем да започнем да обясняваме условията вътре в циклите.
Ако имате проблеми с решаването на проблеми сами, трябва да работите през всичко в клас. За да избегнете решаването на задачата да напомня на рисуване на бухал, препоръчвам първо да решите задачата по неуниверсален начин. Тоест, така че решението да премине първия тест и да не използва конструкцията на цикъла. Е, тогава приложете трансформации, за да постигнете универсалност на решението.

Примки и разклонения

Според мен е полезно темата „цикли в клонове“ да се даде отделно. Така че по-късно можете да видите разликата между проверката на условие многократно и проверката му веднъж.
Задачите за консолидация ще бъдат за извеждане на числа от А до Б, които се въвеждат от потребителя:
- винаги във възходящ ред.
- възходящ или низходящ в зависимост от стойностите на A и B.

Темата за „разклоняване в рамките на цикли“ трябва да се премине само след като ученикът е усвоил техниките: „замяна на модел с променлива“ и „замяна на повтарящи се действия с цикъл“.
Основната причина за използването на разклонения вътре в контурите са аномалии в модела. По средата се чупи в зависимост от първоначалните данни.
За онези ученици, които могат да търсят решение чрез комбиниране на прости техники, достатъчно е да се каже, че „разклоняването може да бъде написано вътре в цикли“ и да се даде на проблема „например“ напълно за самостоятелно решаване.
Примерна задача:

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

Цикли в циклите

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

Най-добре е да започнете да обяснявате темата за циклите в рамките на циклите, като обясните важността на нулирането на брояча.
Примерна задача:

Потребителят въвежда две числа: R и T. Отпечатайте два реда от символи "#". Първият ред трябва да съдържа R символи. Вторият ред съдържа T части. Ако някое число е отрицателно, покажете съобщение за грешка.

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

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

R=-1, T=6Стойността на R трябва да е неотрицателна

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

В анкетата могат да участват само регистрирани потребители. Впиши се, Моля те.

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

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

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

  • 70,0%Не преподавам, +17

  • 0,0%Не преподавам, -10

  • 0,0%Друго0

10 потребители гласуваха. 5 потребители се въздържаха.

Източник: www.habr.com

Добавяне на нов коментар