Цели урока:
- Образовательная: познакомить учащихся с технологией нисходящего и восходящего программирования, ее реализацией с помощью модулей.
- Развивающая: развивать алгоритмическое мышление, умение анализировать результаты, развивать творческие способности, память, внимательность, развивать информационную культуру.
- Воспитательная: воспитание аккуратности и точности при составлении алгоритмов; воспитание чувства ответственности, уважения к личности, навыков самообразования.
ХОД УРОКА
1. Проверка качества усвоения материала, изученного на предыдущих занятиях.
1.1. Устный опрос:
- Какой вид имеет структура описания процедуры и функции в Turbo Pascal?
- В чем состоит отличие описания процедуры и функции?
- Что такое область действия идентификаторов?
- Какие параметры называются формальными и какие фактическими?
- Какие способы передачи параметров реализованы в Turbo Pascal?
- Почему при работе с графикой в Turbo Pascal необходимо предложение uses Graph?
- Какие процедуры и функции модуля Graph вам известны?
2. Изложение нового материала.
2.1. Содержание и последовательность излагаемых учебных вопросов.
2.1.1. Технология модульного программирования.
Языки высокого уровня появились в 60-е годы. Ресурсы ЭВМ (объем ОЗУ 8 Кбайт, быстродействие 20 тыс. операций в сек.) были недостаточны, поэтому программисты вынуждены были писать программы весьма “хитроумно” с использованием оператора безусловного перехода. Программа получалась запутанной, имела структуру “блюдо спагетти”. Так как область применения ЭВМ расширялась, программное обеспечение усложнялось. Программисты, решающие сложные задачи, столкнулись с проблемой разрастания количества и размера программ до такой степени, что дальнейший процесс разработки становился практически неуправляемым, и никто из разработчиков не мог с уверенностью сказать, что созданный программный продукт всегда выполняет то, что требуется, и что он не выполняет ничего такого, что не требуется. Поэтому возникла необходимость в новой методологии разработки программных проектов. В 1968–1969 гг. состоялись конференции по программированию. На второй из них Эдсгер Дийкстра предложил принципиально новый способ создания прграмм – структурное программирование. Главное – разбиение программного комплекса (при его создании) на программные модули, которые соединяются иерархически.
Цели модульного программирования:
1. Улучшать читабельность программ.
2. Повышать эффективность и надежность программ (легко находить и корректировать ошибки).
3. Уменьшать время и стоимость программной разработки (уменьшается время отладки).
Разбиение программного комплекса на модули выполняется в соответствии со следующими принципами:
- Модуль – это независимый блок, код которого физически и логически отделен от кода других модулей.
- Размер модуля не больше 100 операторов.
- Имеет одну входную и одну выходную точку.
- Модули связаны иерархически.
- Разбиение должно обеспечивать надежное скрытие
информации в модуле.
Парнас: “Для написания одного модуля должно быть достаточно минимальных знаний о тексте другого”. - Каждый модуль должен начинаться с комментария (его назначение – входные и выходные переменные).
- Не использовать метки и оператор GOTO.
- Использовать только стандартные управляющие конструкции (условие, выбор, цикл, блок).
2.1.2. Нисходящее и восходящее программирование.
При разработке модульных программ применяются два метода проектирования – нисходящее и восходящее. При нисходящем проектировании разработка программного комплекса идет сверху вниз.
На первом этапе разработки кодируется, тестируется и отлаживается головной модуль, который отвечает за логику работы всего программного комплекса. Остальные модули заменяются заглушками, имитирующими работу этих модулей. Применение заглушек необходимо для того, чтобы на самом раннем этапе проектирования можно было проверить работоспособность головного модуля. На последних этапах проектирования все заглушки постепенно заменяются рабочими модулями.
При восходящем проектировании разработка идет снизу вверх. На первом этапе разрабатываются модули самого низкого уровня. На следующем этапе к ним подключаются модули более высокого уровня и проверяется их работоспособность. На завершающем этапе проектирования разрабатывается головной модуль, отвечающий за логику работы всего программного комплекса. Методы нисходящего и восходящего программирования имеют свои преимущества и недостатки.
Недостатки нисходящего проектирования:
- Необходимость заглушек.
- До самого последнего этапа проектирования неясен размер программного комплекса и его эксплутационные характеристики, за которые, как правило, отвечают модули самого низкого уровня.
Преимущество нисходящего проектирования – на самом начальном этапе проектирования отлаживается головной модуль (логика программы).
Преимущество восходящего программирования – не нужно писать заглушки.
Недостаток восходящего программирования – головной модуль разрабатывается на завершающем этапе проектирования, что порой приводит к необходимости дорабатывать модули более низких уровней.
На практике применяются оба метода. Метод нисходящего проектирования чаще всего применяется при разработке нового программного комплекса, а метод восходящего проектирования – при модификации уже существующего комплекса.
2.1.3. Оформление программы в виде модуля.
При подключении стандартных модулей достаточно корректно записать их идентификаторы в предложении uses. При разработке собственных модулей необходимо помнить некоторые особенности:
- Не допускается одновременное использование модулей с одинаковыми именами.
- Идентификатор модуля, указанный в заголовке (unit), должен совпадать с именами файлов, содержащих исходный (.pas) (.tpu, . tpp, .tpw) код.
- Если идентификатор модуля длиннее восьми символов, то он должен совпадать с именами файлов по первым восьми символам.
Общая структура модуля
unit идентификатор модуля;
{Интерфейсный раздел}
interface
в этом разделе описывается взаимодействие данного модуля с другими пользовательскими и стандартными модулями, а также с главной программой. Другими словами – взаимодействие модуля с “внешним миром”.
Список импорта интерфейсного раздела
uses
в этом списке через запятые перечисляются идентификаторы модулей, информация интерфейсных частей которых должна быть доступна в данном модуле. Здесь целесообразно описывать идентификаторы только тех модулей, информация из которых используется в описаниях раздела interface данного модуля.
Список экспорта интерфейсного раздела
Список экспорта состоит из подразделов описания констант, типов переменных, заголовков процедур и функций, которые определены в данном модуле, но использовать которые разрешено во всех других модулях и программах, включающих имя данного модуля в своей строке uses. Для процедур и функций здесь описываются только заголовки, но с обязательным полным описанием формальных параметров. |
const
type
var
procedure
function
Раздел реализации
Implementation
в этом разделе указывается реализационная (личная) часть описаний данного модуля, которая недоступна для других модулей и программ. Другими словами – “внутренняя кухня модуля”.
Список импорта раздела реализации
uses
В этом списке через запятые перечисляются идентификаторы модулей, информация интерфейсных частей которых должна быть доступна в данном модуле. Здесь целесообразно описывать идентификаторы всех необходимых модулей, информация из которых не используется в описаниях раздела interface данного модуля и об использовании которых не должен знать ни один другой модуль.
Подразделы внутренних для модуля описаний
В этих подразделах описываются метки, константы, типы, переменные, процедуры и функции, которые описывают алгоритмические действия, выполняемые данным модулем, и которые являются “личной собственностью” только данного модуля. Эти описания недоступны ни одному другому модулю. Заголовки процедур и функций в этом подразделе допускается указывать без списка формальных параметров. Если заголовки указаны все же с параметрами, то список формальных параметров должен быть идентичен такому же списку для соответствующей процедуры (функции) в разделе interface. |
label
const
type
var
procedure
function
Раздел инициализации
begin
В этом разделе указываются операторы начальных установок, необходимых для запуска корректной работы модуля. Операторы разделов инициализации модулей, используемых в программе, выполняются при начальном запуске программы в том же порядке, в каком идентификаторы модулей описаны в предложения uses. Если операторы инициализации не требуются, то ключевое слово begin может быть опущено.
end.
2.2. Примеры.
Пример модуля a1
unit a1;
interface
uses graph;
procedure init;
procedure pr1;
implementation
procedure init;
{инициализация графического режима}
procedure pr1;
begin
{команды построения фрагмента изображения}
end;
begin
init;
pr1;
readln;
end.
Головной модуль
program a;
uses a1, a2, a3, a4;
begin
pr1;
pr2;
pr3;
pr4;
readln;
end.
3. Проверка качества усвоения нового материала.
3.1. Устный опрос.
- Назовите принципы модульного программирования.
- Когда применяется технология нисходящего программирования? А восходящего?
- В чем различие между технологией восходящего и технологией нисходящего программирования?
- Какие существуют особенности при разработке собственных модулей?
- Из каких разделов состоит модуль?
- Что описывается в разделе interface?
- Что описывается в разделе implementation?
- Что описывается в разделе инициализации?
3.2. Самостоятельная работа учащихся на уроке.
Учащиеся разбиты на две группы. Работой каждой группы руководит “начальник”. Получив задание, учащиеся начинают коллективную работу. Каждый ученик разрабатывает свою программу, оформляет ее в виде модуля UNIT и отдает “начальнику”, который пишет головную программу, объединяя модули своих “подчиненных”.
Литература:
- Марченко А. И., Марченко Л. М. “Программирование в среде Turbo Pascal 7.0”, М.: “Бином Универсал”, 1998.
- Информатика. № 2. /Приложение к газете “Первое сентября”, 1996.