Тема «Структурное программирование»

advertisement
Глава 2. Тема 2 «Структурное программирование»
Урок 8. Тема урока: Структуры алгоритмов и программ (1 час).
Общие замечания: На данном и последующем уроках важно акцентировать внимание
учащихся на культуре программирования, являющейся необходимым условием
формирования профессиональной компетентности будущих ИТ – специалистов.
Цель урока: Актуализация знаний учащихся по теме «Принципы структурного
программирования». Систематизация знаний учащихся программирования по основам
языка Паскаль, развитие навыков программирования.
Примерный ход урока:
1. Актуализация знаний учащихся по теме «Принципы структурного
программирования». (25 минут).
С материалом §2.2.5 учащиеся должны были разобраться дома самостоятельно, но в
учебнике ничего не сказано о причинах введения Э.Дейкстрой понятия структурного
программирования. Предложите ученикам проанализировать период развития ПО с конца
60-х до начала 70-х годов и попытаться выявить причины, побудившие программистов
заострить внимание на технологии программирования. Эти причины были связаны с
увеличением количества и сложности решаемых на компьютерах задач. Часто в
программе мог разобраться только её автор, что серьёзно затрудняло разработку
программного обеспечения в «промышленном
режиме», его сопровождение и
применение. Требовалась такая систематизация процесса разработки и структуры
программ, чтобы программу мог без особых затруднений понять не только её автор, но и
другие программисты. Применение технологии структурного программирования
позволило разрабатывать довольно крупные программные комплексы силами коллективов
разработчиков и сопровождать эти комплексы в течение многих лет, даже в случае
изменений в составе персонала. Безусловно, эта задача актуальна и сейчас.
Предложите ученикам проанализировать пример программы №4 из домашнего
задания, выполненного без соблюдения правил структурного программирования,
исправить её, сделать выводы.
Program N4;
var a,b,c,min:integer;
label p;
begin
readln(a,b,c); if a<b then
if a<c
then min:=a
else
p:
min:=c
else
if
b<c
then
min:=b
else
goto
p;
writeln(min);readln
end.
Затем обсудите второй вариант решения задачи – с последовательными
ветвлениями, сравните с предыдущим с точки зрения наглядности и простоты
программы.
Пусть
учащиеся
сформулируют
основные
принципы
структурного
программирования и оформления кода «читаемой программы». Следует ещё добавить, что
«хорошим тоном» в программировании является сопровождение программы интерфейсом
и комментариями. Кроме того, есть определённые «соглашения» по использованию имён
переменных: например, для суммы используется переменная S, а идентификаторы i, j, k,
N применяются для обозначения счетчиков и количественной характеристики.
Если учитель начнёт последовательно требовать от учащихся выполнения всех
сформулированных правил, то дальнейший процесс обучения программированию будет
значительно облегчен обеим сторонам, а у учащихся будет вырабатываться привычка
«культурного программирования».
2. Выполнение задачи №5 после §2.2.5: разработка блок-схем, составление и
отладка программ.
Необходимо подчеркнуть отличие структуры цикла «с предусловием» от цикла с
постусловием, а также напомнить о стандартном подходе к вычислению суммы: до цикла
выполнить инициализацию переменных: S:=0; I:=1.
Домашнее задание. §2.2.5, №6,7 после параграфа (блок-схемы изобразить в тетради,
программы в электронном виде).
Урок 9. Тема урока: Структуры алгоритмов и программ (1 час).
Цель урока: Закрепление знаний учащихся по теме «Принципы структурного
программирования». Систематизация знаний учащихся программирования по основам
языка Паскаль, развитие навыков по отладке программ.
Примерный ход урока:
1. Проверка и анализ выполнения домашнего задания (30 минут).
1) Наибольшие затруднения, вопросы могло вызвать задание №6. Предложите
учащимся не только представить программу решения задачи, но и попробовать передать
ход своих мыслей, этапы работы над задачей. Такая рефлексивная деятельность
способствует развитию аналитических способностей, самоанализу, и, в конечном счёте,
интеллекта учащихся.
Чтобы ответить на вопрос задания №6 о структуре алгоритма, необходимо было
составить блок-схему алгоритма. Представляя решение, можно показать учащимся, каким
образом следовало последовательно разрабатывать алгоритм, используя метод
нисходящего проектирования, т.е. сначала составить алгоритм решения задачи в общих
чертах, а затем его детализировать.
начало
начало
N
N
ДА
Nчётное
НЕТ
да
нет
Nчётное
S:=0
Вычислить
P=N!
Вычислить
сумму S
I:=1
Вычислить
P=N!
I<=N
ДА
Вывод S
Вывод P
S:=S+I
I:=I+1
Вывод P
Вывод S
конец
конец
Рис.1 Блок-схема алгоритма в
общих чертах
Рис.2 Блок-схема алгоритма c
детализацией ветви «ДА»
До разработки программы необходимо продумать типы используемых переменных.
На первый взгляд кажется, что все переменные должны быть целого типа, и, как правило,
учащиеся используют тип integer. Возможно, найдутся ученики, которые вспомнят, что
значение N! быстро растёт с увеличением N, например, 7!=5040, а 8!=40320, что
превышает максимальное значение типа integer. Так что, целесообразно
экспериментальным путём проверить, до какого значения N можно получать корректное
значение N!, используя тип longint. Предложите учащимся вспомнить причину получения
некорректного значения результата.
2) Для задачи №7 правильный ответ на вопрос: программа вычисляет сумму цифр
неотрицательного целого числа k. Обсудите решение задачи с использованием цикла с
постусловием. Приведём текст программы:
program
Sum_cifr;
var k,s:integer;
begin
Readln(k);
S:=0;
Repeat
S:=S+k mod 10;
k:=k div 10
Until k=0;
Writeln(S);
end.
Вопрос, который следует задать учащимся: совпадает ли условие задачи, решение
которой представлено в данной программе, с условием исходной задачи, или есть
принципиальные отличия? (Ответ: данная программа вычисляет сумму цифр любого
целого числа.)
Проблема кроется в результате применения операции k mod 10 к
отрицательному числу k, в получении отрицательного значения суммы цифр. Обсудите
с учащимися, как следует исправить обе программы для получения адекватного
результата. (Поскольку в математике под цифрой понимается неотрицательное значение,
то и сумма цифр – это величина неотрицательная, так что цикл надо применить к модулю
k.)
2. Следующую часть урока можно посвятить сравнительному анализу структуры
цикла с предусловием и цикла с постусловием. Всегда ли эти структуры
взаимозаменяемы?
В качестве примера можно рассмотреть задачу о нахождении наибольшего общего
делителя двух натуральных чисел: Даны 2 натуральных числа A,B. Разработать
алгоритм вычисления НОД (A,B) (алгоритм Евклида). Логика алгоритма состоит в
вычитании из большего числа меньшего, пока числа не станут равны. Полученное
значение в каждой переменной и будет ответом.
Алгоритм знаком учащимся из базового курса. Суть в вопросе: можно ли для решения
задачи применять структуру цикла с постусловием? Предложите учащимся составить и
проанализировать блок-схемы алгоритмов с использованием разных структур (рис.3,
рис.4).
Данный пример ещё раз показывает необходимость тщательного подхода к анализу и
тестированию алгоритма. При использовании цикла с постусловием ошибочная ситуация
может возникнуть при A = B, когда цикл не должен выполниться ни разу. В цикле с
постусловием тело цикла 1 раз неминуемо выполнится. Поэтому алгоритм,
представленный на рисунке 4, будет неверным.
начало
начало
A,B
A,B
нет
A<>B
да
нет
A >B
да
да
A>B
A:= A- B
нет
B:=B- A
B:=B- A
A:= A- B
нет
A=B
да
‘нод=’, A
‘нод=’, A
конец
конец
Рис.3 Алгоритм Евклида (цикл с предусловием)
Рис.4. Алгоритм Евклида (цикл с
постусловием). Неверное решение.
Подведение итогов занятия. Необходимо ещё раз остановиться на принципах
структурного программирования, структурного оформления программы, системного
подхода к выбору структуры алгоритма.
Домашнее задание: повторить материал §2.2.5, самостоятельно изучить §2.2.6.
Урок 10. Тема урока: Программирование ветвлений. Оператор выбора(1 час).
Цель урока: Актуализация знаний учащихся по теме «Разработка ветвящихся алгоритмов.
Особенности оператора выбора». Систематизация знаний учащихся по основам языка
Паскаль, развитие навыков структурного программирования.
Примерный ход урока:
Урок можно начать с обсуждения вопросов 1-3 после параграфа, обратить внимание
учащихся на серьёзное ограничение по применению оператора выбора: селектор выбора и
соответствующие ему команды могут быть только порядкового типа.
Затем проверить программы из домашнего задания и перейти к практикуму по
решению задач с использованием оператора выбора: решить задания №7, 9 из раздела
«Задачи на использование оператора выбора» работы №3.2.
Задача №7 интересна с двух точек зрения: во-первых, в ней требуется
дополнительный анализ значения y при вводе операции деления. Во-вторых, можно
сначала разработать программу, строго следуя условию задачи, а затем её переработать с
использованием символов для представления арифметических операций. Таким образом,
появится возможность поговорить о порядковых типах данных, вспомнить тип char.
Приведём текст программы с использованием символьного типа данных:
Program calc;
var x,y: real;
op:char;
begin
Writeln(‘введите 2 числа’);
Readln(x,y);
Writeln(‘введите знак арифметической операции’);
Readln(op);
case op of
'+': writeln(x,op,y,'=',x+y);
'-': writeln(x,op,y,'=',x-y);
'*': writeln(x,op,y,'=',x*y);
'/': if y=0
then writeln('на 0 делить нельзя!')
else writeln(x,op,y,'=',x/y);
else writeln('неверный знак операции')
end
end.
В задаче №9 не всё так просто, как кажется на первый взгляд. Решение усложняется
тем, что в зависимости от номера года количество дней в феврале может быть равно 28
или 29. В данной задаче необходимо более тщательно подойти к постановке задачи,
вспомнить (или найти в Интернете) условие, при котором год является високосным.
Справка: Високосным называется календарный год, содержащий 366 сут (на одни
сутки больше простого года). По новому стилю каждый год, число которого делится на
4, является високосным (кроме тех, числа которых оканчиваются на 2 нуля, но не
делятся на 400, напр., 1700, 1800).1
Program Days;
var year:integer;
month:1..12;
begin
Writeln(‘введите номер года’);
Readln(year);
Writeln(‘введите номер месяца’);
Readln(month);
Case month of
1,3,5,7,8,10,12: writeln('количество дней в ', month, 'месяце равно ', 31);
4,6,9,11:writeln('количество дней в ', month, 'месяце равно ', 30);
else
if (year mod 4=0) and not ((year mod 100=0)and (year mod 400<>0))
then writeln('количество дней в ', month, ' месяце равно ', 29)
else writeln('количество дней в ', month, ' месяце равно ', 28)
end
end.
Домашнее задание: §2.2.6, выполнить упр. №10, 13 из раздела «Задачи на использование
оператора выбора» работы №3.2 практикума.
Урок 11. Тема урока: Программирование ветвлений. (1 час).
Цель урока: Систематизация знаний учащихся по теме «Разработка ветвящихся
алгоритмов». Развитие навыков структурного программирования.
Примерный ход урока:
1. Проверка домашнего задания (10 минут). В задании №10 надо было применить
оператор выбора и провести необходимые вычисления с использованием математических
формул. В упражнении №13 решение с перебором всех вариантов является не
эффективным (но именно его часто предлагают ученики). Необходимо было увидеть
зависимость вывода ответа от цифры, на которую заканчивается возраст (исключение
составляют числа от 11 до 14). Приведём решение:
Program years;
var k:1..99;
begin
Writeln('введите число - возраст');
Readln(k);
if (k>10)and (k<15)
then writeln ('мне ',k, ' лет')
else
case k mod 10 of
1:writeln ('мне ',k, ' год');
2..4: Writeln ('мне ',k, ' года');
else Writeln ('мне ',k, ' лет')
end;
Современный толковый словарь изд. «Большая Советская Энциклопедия» (онлайн версия).
http://www.classes.ru/all-russian/russian-dictionary-encycl-term-11743.htm
1
end.
2. Решение задач с использованием условного оператора (10 минут). В §2.2.6
приведён пример задачи на определение принадлежности точки с координатами (x,y)
заштрихованной области (рис. 2.6) и три варианта решения. Можно разобрать этот же
пример, но выполненный с ошибками, подобно заданию, представленному в ЕГЭ.
Предложите ученикам обнаружить и исправить ошибки. Таким образом, проверите,
насколько внимательно учащиеся работали с учебником и как развиты их навыки анализа
программ. Также необходимо подчеркнуть особенность выполнения вложенных условных
операторов: ветвь «else» относится к ближайшему «then». В случае необходимости
изменения порядка выполнения действий следует использовать операторные скобки begin
end. Рассмотрим пример программы:
Program Variant_1;
Var x, y: real;
Begin
Write('введите координаты x, y:');
Readln(x, y);
If y<=1
then
If y>=sin(x)
then
If x>=0
then Write('Yes')
Else Write('No')
Else Write('No')
End.
В данном примере сделаны 2 ошибки:
1. Нет второго ограничения на значение x
(x должно быть <=π/2)
2. Программа не выдаст ответ при y>1
(отсутствует часть Else Write('No'))
3. Практическая работа по составлению программ на определение принадлежности
точки области (20 минут). Каждый ученик выполняет свой вариант из 2-х заданий
практической работы 3.2 раздела «Задачи на определение принадлежности точки
области». Обязательные условия: 1)составление математической модели решения задачи,
2)одна задача выполняется первым способом, описанным в учебнике, вторая – с
использованием составного логического выражения. Учитель консультирует, принимает и
оценивает работы.
4. Подведение итогов занятия, рефлексия.
Домашнее задание: §2.2.6, упр. № 4 (составить математическую модель, программу,
тесты к программе - решения биквадратных уравнений, предусмотреть все возможные
варианты).
Урок 12. Тема урока: Программирование ветвлений. Отладка программ (1 час).
Общие замечания: Занятие посвящается обсуждению процесса работы над программой
решения биквадратного уравнения. Несмотря на то, что эта задача из домашнего задания,
желательно остановиться на данном примере подробно и обсудить все этапы разработки и
отладки программы. Если учащиеся справились с заданием достаточно хорошо, то данное
занятие можно посвятить выполнению практикума.
Цель урока: Систематизация знаний учащихся по теме «Разработка ветвящихся
алгоритмов». Развитие навыков структурного программирования, тестирования
программы.
Примерный ход урока:
1. Разбор домашнего задания – решения задачи вычисления корней биквадратного
уравнения (25-35 минут). Решение данной задачи важно и с точки зрения составления
алгоритма и программы, и с точки зрения тестирования. Выясните, насколько
внимательно учащиеся подошли к анализу задачи, все ли варианты решения
предусмотрели. Математическую модель решения биквадратного уравнения можно
представить следующим образом:
При
- вывод ответа – «неверный ввод данных»
a=0
При
a≠0,
d:=b2-4*a*c
Если d<0, то вывод ответа «нет действительных корней»
{y1,y2-корни квадратного уравнения,
Если d0, то
b d
y1 
которое решается относительно y=x2}
2a
b d
y2 
2a
Если y10 и y20 , то
x1 : y 1 , x2:=-x1
Если y10, y2<0, то
x3 :
y 2 , x4:=-x3
x1 :
y 1 , x2:=-x1
Если y1<0, y20, то
x3 : y 2
x4:=-x3
Если y1<0 и y2<0,
то вывод ответа «нет действительных
корней»
Обратите внимание учеников, что если оформить математическую модель
ветвящегося алгоритма структурно, то значительно упрощается процесс разработки
алгоритма. Останется только правильно составить команды ветвления и предусмотреть
вывод результата. Обсудите блок-схему алгоритма. Мы ограничимся текстом программы:
Program bikvur;
var a,b,c,d:integer;
y1,y2,x1,x2,x3,x4:real;
begin
Writeln(‘введите коэффициенты’);
Readln(a,b,c);
If a=0
then Writeln ('неверный ввод данных')
else
begin
d:=b*b-4*a*c;{writeln('d=',d);}
If d<0
then writeln('нет действительных корней')
else
begin
y1:=(-b-sqrt(d))/2/a;
y2:=(-b+sqrt(d))/2/a;
{writeln('y1=',y1);
writeln('y2=',y2);}
If y1>=0 then
begin
x1:=sqrt(y1);
x2:=-x1;
writeln('x1=',x1,'x2=',x2)
end;
If y2>=0 then
begin
x3:=sqrt(y2);
x4:=-x3;
writeln('x3=',x3,'x4=',x4)
end;
If (y1<0) and (y2<0)
then
writeln('нет действительных корней')
end
end
end.
Остановите внимание учащихся на процессе тестирования программы. Напомните,
что тестировать надо с целью выявления ошибок в программе, предложите подумать,
какие команды «имеют риск» содержать ошибки. Пусть учащиеся представят свои тесты к
программе – тем самым станет ясно, насколько детально ученики подошли к решению
задачи. Важно показать учащимся необходимость проверки работы программы при
различных исходных данных, обязательно включая случай, когда d=0 (возможны
принципиально разные результаты, так как решением квадратного уравнения может быть
как положительное значение (тест №3), так и отрицательное (тест №4)). Анализу
результатов тестирования помогает приём вывода промежуточных значений. По
завершению этапа тестирования эти команды можно удалить или закомментировать (в
данном примере вспомогательные команды вывода оформлены в виде комментариев).
В таблице представлены примерные тесты к программе:
№ теста Значения a,b,c
Значение d Результат
Комментарии
1.
023
«неверный ввод данных»
2.
148
d=-16
«нет
действительных
корней»
3.
1 -6 9
d=0
x1=1.73205080756888
y=x2 =3
x2=-1.73205080756888
(в решении – 2
x3=1.73205080756888
кратных корня)
x4=-1.73205080756888
4.
169
d=0
«нет
действительных Так как y = x2 =-3
корней»
5.
-2 -3 5
d=49
x1=1 x2=-1
y1=1 y2=-2.5
6.
2 -3 -5
d=49
x3=1.58113883008419
x4=-1.58113883008419
y1=-1 y2=2.5
7.
2 -7 5
d=9
y1=1
y2=2.5
8.
275
d=9
x1=1
x2=-1
x3=1.58113883008419
x4=-1.58113883008419
«нет
действительных
корней»
y1=-2.5
y1=-1
2. Подведение итогов данного этапа занятия, рефлексия (5 мин.): обсудите с
учащимися, насколько их подход к решению данной задачи соответствует
решению в классе, что не предусмотрели учащиеся, выполняя работу дома, что
нового для себя узнали, какие выводы сделали.
3. Дополнительный этап (если группа быстро справилась с 1 этапом занятия) (10-15
минут). Распределение заданий к следующему уроку, разбор условий, начало
работы над заданиями.
Домашнее задание: практическая работа №3.2, раздел «Вычислительные задачи»,
выполнить свой вариант - индивидуальное задание, подготовиться к семинару по
обсуждению решённых задач. Требования: к каждой задаче оформить документацию в
текстовом процессоре, включающую: постановку задачи, математическую модель, блоксхему, программу, тесты.
Примечание: в каждый вариант входит по одной задаче из уровней 1, 2. Задача из
уровня 3 – дополнительная, для желающих, оценивается отдельно. Задания могут быть
выполнены индивидуально или в парах.
Урок 13. Тема урока: Программирование ветвлений. (1 час).
Общие замечания: Урок-закрепление. Проводится в форме презентаций решений
индивидуальных заданий. Такая форма занятия позволяет рассмотреть достаточно
большое количество задач, обсудить вероятные ошибки, а также создать банк решений,
доступный каждому ученику.
Цель урока: Систематизация знаний учащихся по теме «Разработка ветвящихся
алгоритмов», развитие навыков системного анализа, критического анализа,
коммуникативных навыков, самопрезентации.
Примерный ход урока:
Каждый ученик представляет одну из двух выполненных дома задач, отвечает на вопросы.
(Регламент – 5 минут). Если к выполнению задания есть замечания, то к следующему
уроку ученик задачу перерабатывает. Критерии оценивания работы могут быть
следующими:
Математиче блок-схема
Программа
Полнота
Сумма
ская модель алгоритма
(от 2 до 5)
тестов
(от 2 до 17)
(от 0 до 2)
(от 0 до 5)
(от 0 до 5)
Задача уровня 1
Сумма1
Задача уровня 2
Сумма2
Общая сумма за = Сумма1 + Сумма2*1,5 (1,5 –коэффициент сложности)
2 задачи:
Задача 1
Задача 2
сумма
Максим.
Балл
17
26
43
Оценка
5
4
3
% от
суммы
> 85
> 70
> 55
баллы
36
30
23
Выполненные работы учащиеся сохраняют на общем сетевом диске, копируют.
Подведение итогов занятия, оценивание работ.
Домашнее задание: проработать задачи, рассмотренные в классе. Не выступившим на
уроке учащимся подготовиться к защите работ.
Download