Методический комментарий для учителя к уроку «Исполнители и алгоритмы»

Урок 9. «Исполнители и алгоритмы»

На этом уроке ученики повторяют Школьный (учебный) Алгоритмический Язык (АЯ) – учебный язык программирования. Этот язык был придуман во второй половине 80-х годов XX века группой ученых и педагогов во главе с академиком Андреем Петровичем Ершовым. Школьный Алгоритмический Язык похож на Алгол и Паскаль и, говоря формально,  вместе с этими языками  относится к группе процедурных языков последовательного программирования. Работая с АЯ, ученики знакомятся с основными понятиями и конструкциями подобных языков – ветвлениями, циклами (повторениями), вспомогательными алгоритмами (подпрограммами). В курсе 5-го класса были введены основные понятия и простые линейные алгоритмы, в курсе 6 класса будут представлены более сложные конструкции языка.

Важную роль в процессе обучения играет практическая работа в системе программирования  Кумир. Эта система разработана в отделе учебной информатики НИИ системных исследований РАН (зав. отделом – А. Г. Кушниренко).

Система Кумир и Школьный Алгоритмический Язык имеют ряд особенностей, важных для преподавания информатики:

1.   АЯ основан на русской лексике: все служебные слова языка записаны кириллицей, имена величин и алгоритмов также могут записываться на русском языке. Это особенно важно для преподавания в 5 – 6 классах.

2.   АЯ и система Кумир позволяют подключать к системе Учебные Миры (отсюда и название: КУМир – Комплект Учебных Миров), в которых действуют различные виртуальные исполнители – как уже знакомые вам Водолей, Кузнечик и Робот, так и многие другие.

3.   В системе Кумир удобно организована выдача сообщений об ошибках: в отличие от профессиональных систем, сообщение размещается на экране непосредственно рядом с местом ошибки («на полях» программы).

4.   При пошаговом выполнении программы ученик может видеть на полях программы результаты проверок условий и результаты команд присваивания. Это позволяет проводить отладку программы, отслеживая результат каждого шага,  не отвлекаясь на добавление отладочных команд вывода.

5.   В системе Кумир можно разрабатывать практикумы – системы заданий, каждое из которых снабжено проверяющей программой. Выполняя задания практикума, каждый ученик может индивидуально работать в своем темпе, проверяя успешность своей работы без помощи учителя, то есть учитель избавлен от той части работы по проверке заданий ученика, которая может быть выполнена автоматически.

Подробнее о системе Кумир можно узнать в поставляемых вместе с системой справочных материалах.

 

Ошибки в алгоритмах

Что значит – «программа содержит ошибку»? В простейшем случае ошибка – это синтаксическая ошибка, то есть нарушение формальных правил языка программирования. Однако и синтаксически правильная программа может содержать ошибки: ее результат может быть совсем не такой, который нужен составителю программы. Таким образом, прежде чем анализировать программу, мы должны понимать:

– что дано, т. е. что мы знаем о входных данных программы (например, что на вход программы подается четное положительное число, не превосходящее 100);

– что надо, т. е. как результат программы связан с входными данными (например, если на вход программы было подано число x, то результат вычисляется по формуле x/2 +1).

Условие «дано» в научной литературе называется предусловием алгоритма, а условие «надо» – постусловием. Для школьников эти термины излишни, но в книге для учителя ими удобно пользоваться.

Фактически, предусловие и постусловие и составляют условие задачи на построение алгоритма (так же происходит и в задачах на построение в курсе геометрии). Очень важно, чтобы ученики, приступая к решению задачи, ясно понимали, что известно об исходных данных («дано» – предусловие) и каким требованиям должен удовлетворять результат («надо» – постусловие).

В АЯ есть специальные ключевые слова  дано и надо, они могут располагаться в заголовке алгоритма между строками, которые начинаются словами алг и нач. После слов дано и надо можно записывать, соответственно, предусловие и постусловие. Эти условия можно записать как логические выражения АЯ. Тогда подсистема выполнения алгоритмов системы Кумир проверит, соответствуют ли входные данные предусловию и соответствуют ли результаты постусловию. При несоответствии системой будет выдано сообщение об ошибке выполнения. Для шестиклассников, которые еще не знакомы с логическими выражениями, это слишком сложно. Однако полезно записывать пред- и постусловия в конструкциях дано и надо как комментарии. В этом случае система не сможет контролировать корректность входных данных и результатов, но для того чтобы ученики научились понимать задачи на построение алгоритмов, это очень полезно.  

К сожалению, сразу написать программу без ошибок получается очень редко. В современном программировании разработаны и разрабатываются специальные приёмы, позволяющие уменьшить количество ошибок при написании программ и облегчить обнаружение ошибок. Ученики должны понять, что мало написать программу, про которую они думают, что программа работает правильно. Нужно убедиться, что программа работает правильно. Эта мысль кажется простой, но вам с вашими учениками, возможно, придется возвращаться к ней снова и снова.

В реальном программировании, когда создаются комплексы программ, содержащие сотни тысяч команд, разработаны специальные методики тестирования, то есть проверки правильности работы программы на специально подобранных и реальных примерах – тестах. Такая проверка не гарантирует правильности работы программы во всех случаях: точно так же разбор примеров не является заменой доказательства теоремы. Однако если примеры для тестирования подобраны хорошо и опытная эксплуатация проводилась достаточно долго (месяцы, иногда – годы) и тщательно, то программы на практике работают достаточно надежно.

Так как программа (алгоритм) – это текст, написанный на формальном языке, то можно ставить вопрос и о доказательстве правильности программ.  К сожалению, сейчас на практике это возможно только для относительно небольших программ, и основным методом, позволяющим убедиться в правильности работы программы и найти ошибки, все-таки является тестирование.

В курсе основной школы ученик должен освоить идею тестирования, научиться составлять наборы тестов для учебных программ. Он должен понимать, что отладка (поиск ошибок) является такой же неотъемлемой частью программирования, как и придумывание алгоритма и его запись на алгоритмическом языке. Другая важная мысль (мы уже говорили об этом) – нельзя говорить о правильности программы, если четко не сформулировано, что она должна делать. Поэтому мы советуем уделять внимание описанию исходных данных программы (поля после слова дано) и требований к результатам программы (поля после слова надо). 

Разберемся подробнее, чему именно мы хотим научить школьника в связи с ошибками в алгоритмах и способами обнаружения ошибок.

1.   Синтаксические ошибки.

Языки программирования (в том числе и АЯ) – формальные языки. Их синтаксис (правила записи алгоритмов) строго определен. В отличие от естественных языков нельзя заменить слово синонимом, изменить порядок слов и т. п.

К счастью, современные системы программирования (точнее, их специальные компоненты – синтаксические анализаторы) распознают синтаксические ошибки и сообщают о них программисту. Система Кумир, которой мы рекомендуем пользоваться при обучении, проверяет наличие ошибок в программе после каждого изменения строки программы. При этом не только подчеркивается место ошибки, но и сообщается, в чем она состоит.  В сложных случаях система может «не понять», в чем именно состоит ошибка, но в нашем курсе такие ситуации маловероятны.

Таким образом, в результате обучения ученик должен:

– понимать,  что язык программирования – это формальный язык со строгими формальными правилами записи алгоритмов;

– знать правила записи алгоритмов на АЯ (в объеме, нужном в данном курсе);

– уметь исправлять ошибки, пользуясь указаниями системы программирования;

– понимать, что отсутствие синтаксических ошибок не гарантирует того, что программа – правильная, то есть делает именно то, что мы от нее ожидаем.

2.   Содержательные ошибки.

Повторим: синтаксически правильная программа необязательно делает то, что мы хотим, то есть ее поведение необязательно следует описаниям данонадо. В программах, которые будут встречаться в нашем курсе, при конкретных входных данных будет легко убедиться, соответствует ли результат тому, что нам нужно. Например, в задачах про Водолея видно, получено ли в одном из сосудов нужное количество воды.  Более того, часто в условии задачи явно указан набор входных данных (например, размеры сосудов Водолея и начальное количество воды в каждом из сосудов), при котором нас интересует работа программы.

В реальной жизни (например, если нам нужно решить довольно сложное уравнение) понять, является ли результат работы правильным, бывает трудно. Это одна из причин, почему необходимо тщательное тестирование программ.

Таким образом, в результате обучения ученик должен:

– понимать необходимость точного описания требований к создаваемому алгоритму (данонадо), понимать такие описания, в несложных случаях – формулировать их;

– понимать, что написанную программу нужно запустить и убедиться, что она работает правильно на нужных примерах, то есть ее поведение на этих примерах соответствует требованиям к программе;

– уметь (если это требуется в условиях задачи) самостоятельно придумать набор примеров исходных данных, на которых следует проверить правильность работы программы;

– понимать, что в случае обнаружения ошибки в программе нужно попытаться исправить ее и снова перейти к проверке правильности работы программы.

Отладка программы, по сути, представляет собой экспериментальную работу по ее изучению. С таким видом работы дети практически не встречаются в школе (хотя на ранних этапах жизни каждый ребенок много экспериментирует).  Поэтому, особенно вначале, сама идея проверки правильности работы программы и анализа результатов этой проверки может вызвать трудности у некоторых детей.


Последнее изменение: Tuesday, 6 August 2024, 20:40