Тема «Процедуры и функции»
Предварительно отметим, что в старших версиях Турбо Паскаля принято считать процедуры своего рода структурами данных. Однако на данном этапе обучения этот взгляд обосновать нелегко, и лучше интерпретировать процедуры и функции более традиционно, как средства реализации вспомогательных алгоритмов.
После усвоения учащимися предшествующих разделов Паскаля можно приниматься за решение задач, в которых выделение вспомогательных алгоритмов является естественным.
Начиная изучение этой сложной и принципиально важной темы, повторите принципы структурного программирования, особенно принцип модульности. Учащиеся должны понять, что без введения процедур ни одной профессиональной программы в принципе не бывает.
Неочевидна поначалу разница между процедурой и программой. Основные различия необходимо понять сразу: процедура хоть и является самостоятельной программной единицей, но исполняется лишь тогда, когда к ней обращаются другие программные единицы (основная программа или другие процедуры и функции). Можно представить себе, что в разделе описания процедур присутствует некая процедура, но в процессе работы программы ни разу не исполняется, ибо обращений к ней нет. Итак, кроме процедуры должны быть команды обращения к процедуре.
Введите понятие «формальные переменные» — те, через которые внешняя программа «общается» с процедурой. На простейших примерах объясните механизм замещения формальных переменных на фактические, происходящего при обращении к процедуре. На первых порах можно не фиксировать внимания на том, что замещение возможно либо по значению, либо по имени.
Достаточно сложно на первом этапе изучения процедур достичь понимания различий между локальными и глобальными переменными. В методических целях следует в первых примерах отказаться от использования глобальных переменных (профессиональные программисты часто отказываются от них вообще). До тех пор, пока учащиеся не освоятся с данными понятиями, следует избегать использования одинаковых идентификаторов для локальной и глобальной переменных.
Нелегко также учащимся понять различия между формальными параметрами-значениями и параметрами-переменными. Многословные объяснения в ряде руководств иногда лишь затрудняют понимание этого важного вопроса. Для начала вполне достаточно, если в разбираемых примерах процедур параметры будут четко подразделяться на входные и выходные и будет соблюдаться простое правило: входные параметры есть параметры-значения, выходные — параметры-переменные. Это правило страхует от ошибок, связанных с непониманием механизмов замещения параметров при обращении к процедуре. Разумеется, впоследствии этот вопрос должен быть отработан глубже.
Приведем примеры заданий для начального этапа разработки программ с процедурами.
Задание 1.Вычислить периметр треугольника по координатам его вершин.
Процедура — вычисление длины отрезка (стороны треугольника) по координатам концевых точек. В ней совершенно отчетливо видны четыре параметра-значения (указанные координаты) и один параметр-переменная (результат, т.е. длина отрезка). Вызывающая программа три раза обратится к этой процедуре. Пример вполне элементарен.
Задание2. Найти наибольший общий делитель (НОД) 100 натуральных чисел по алгоритму Евклида.
Процедура — НОД двух чисел. В заголовке — три переменные. Две из них — параметры-значения, третья — переменная (результат).
После выполнения такого уровня заданий перейдите к более сложным ситуациям. Разберите какой-нибудь пример, специально сконструированный для иллюстрации различий между параметрами-значениями и параметрами-переменными. Один из них выглядит так:
program parametr;
var k: integer;
procedure plusl (n: integer);
begin n:=n+10
end;
procudure plas2 (var n: integer);
begin n:=n+20
end;
begin
k:=10; plusl(k); writeln(k);
k:=10; plus2(k); writeln(k)
end.
Объясните, почему в первой печати результат оказался равен 20, а во второй — 30.
В обучении использованию процедур можно пойти и по другому пути. Поскольку существуют и процедуры без параметров, то можно на одном примере показать все этапы: процедура без параметров, процедура с параметрами-значениями, процедура с параметрами-значениями и параметрами-переменными, отметить все плюсы и минусы каждого подхода. Тут же, по мере появления, можно ввести понятие о локальных и глобальных, формальных и фактических переменных.
После решения простейших задач можно переходить к более сложным, с точки зрения организации процедур. Разберите детальнее вопрос об области действия описаний. Сформулируйте простое правило: в Паскале любая переменная должна быть описана перед своим употреблением. Это правило относится и к процедурам. Полезно привести возможную схему взаимного расположения описаний процедур в некоторой условной программе и по ней разобрать вопрос об области действия описаний подпрограмм. Одна из таких схем изображена на рис. 15.4.
Рис. 15.4. Взаимное расположение описаний процедур
Объясните, почему из основной программы можно обратиться к подпрограммам А и В, из А1 — к А2, но не наоборот, из В1 можно обратиться к А, но нельзя к А1и т.д.
После разбора подобной схемы составляют программы с использованием глобальных переменных и отрабатывают понимание того, что если одно и то же имя описано во внешнем блоке (т.е. глобально) и во внутреннем блоке (локально), то локальное описание в пределах блока доминирует.
Если понимание вопросов, связанных с процедурами, достигнуто, то изучение функций как частного случая процедур, несколько иначе оформленных, не вызывает затруднений. Ответ на вопрос о том, когда целесообразно оформлять процедуру как функцию, очень прост: когда вспомогательный алгоритм Должен возвращать лишь одно скалярное (т.е. не структурированное) значение. Обращение к функции привычнее и удобнее, чем к процедуре. В списке аргументов функции можно практически всегда ограничиваться параметрами-значениями (хотя не запрещены и параметры-переменные). Естественно, первые примеры на программирование с использованием функций приведите те же, что использовались при отработке процедур (см. выше задания 1 и 2).
Рекурсивные процедуры — материал повышенной трудности. В теоретическом отношении организация рекурсий — принципиально важный прием программирования; на практике он по ряду причин не слишком популярен. Обычным примером при отработке понятия «рекурсивный алгоритм» является вычисление факториала натурального числа. Если учащиеся проявили понимание и заинтересованность, то после этого можно разобрать классическую задачу «Ханойская башня», приведенную во многих руководствах по Паскалю в разделах, посвященных рекурсиям.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|