Структура построения модульной программы

Для того чтобы подключить к программе какой-либо модуль , необходимо сразу после заголовка программы поместить следующую строку:

uses ;

Если подключаемых модулей несколько, эта строка примет вид:

uses . ;

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

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

Например, вы можете пользоваться функцией abs () , не объявляя и не описывая ее, поскольку эта функция включена в состав стандартного модуля System , автоматически подключаемого к любой программе на языке Pascal. Если же вы захотите очистить экран монитора перед выдачей результатов, вам придется подключить к вашей программе модуль crt и воспользоваться содержащейся в нем процедурой clrscr (см. лекцию 14).

Реализация технологии модульного обучения в школе | Видеолекции | Инфоурок

Создание модульной программы

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

Структура модуля

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

unit ; interface implementation begin end.

Разберем каждую из этих секций отдельно.

Название

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

Кроме того, очень полезно давать модулям и содержащим их файлам одинаковые имена. Иначе говоря, модуль с именем modul_1 желательно разместить в файле с именем modul_1.pas , и т.п.

Секция внешних связей

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

Если для объявления какого-либо объекта нужны сведения об объекте, объявленном в другом модуле , то имя этого модуля необходимо указать в этой же секции:

interface [uses ;] [const ;] [type ;] [var ;] [procedure ;] [function ;]

Например, пусть у нас есть два модуля : mod_const , содержащий описания базовых констант и типов данных, и mod1 , использующий эти описания (мы приводим только секции внешних связей ):

unit mod_const; interface const sto = 100; type one_to_sto = 1..sto; . unit mod1; interface uses mod_const; const dvesti = 2*sto; type massiv = array[1..dvesti] of byte; var a: massiv; b: one_to_sto; function min(x,y:one_to_sto):one_to_sto; .

Рис. 13.1. Пример структуры модульной программы

Теперь, если в каком-либо третьем модуле встретится строка

uses mod1;

то внутри этого третьего модуля можно будет использовать (без дополнительных объявлений) тип massiv , переменные a и b , а также функцию min . Необходимо отметить, что использовать константу sto третий модуль не сможет, поскольку в нем не было указано

#Архитектура приложения и кода


uses mod_const;

Если в секциях связей нескольких модулей были определены константы или переменные с одинаковыми именами, но с разными значениями, то путаницы позволит избежать уже знакомый нам прием: указание имени модуля перед идентификатором:

Если имя модуля не указано, то идентификатор считается принадлежащим текущему модулю . И только если в текущем модуле этот идентификатор не был объявлен, то начинается поиск в подключенных модулях .

Например, если модульная программа имеет структуру, изображенную на рис. 13.1, то таблица доступности переменных будет выглядеть так:

Связи Способ обращения к одноименным переменным
program prg; uses A,B,C; p a.p b.p c.p не видна не видна
unit A; uses C,D,F; не видна p не видна c.p d.p f.p
unit B; uses F; не видна не видна p не видна не видна f.p
unit C; не видна не видна не видна p не видна не видна
unit D; не видна не видна не видна не видна p не видна
unit F; не видна не видна не видна не видна не видна p

Замечание: В секциях связей не допускается рекурсивное использование модулями друг друга. Иными словами, нельзя одновременно написать

Читайте также:
Программы для того чтобы не тормозили игры

unit mod_1; interface uses mod_2; . unit mod_2; interface uses mod_1; .

Источник: intuit.ru

Создание модульной программы

4. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. – Учебное пособие. – М.: Издательство «ОМД Групп», 2003 г. -616 с.

5. Фаронов В.В. Turbo Pascal 7.0. Практика программирования

6. Фаронов В.В. Turbo Pascal 7.0. Учебный курс

7. Н.Вирт. Алгоритмы + структуры данных = программы. Москва, Мир, 1985 г. 406 с.

8. Н.Вирт. Алгоритмы и структуры данных. Москва, Мир, 1989 г. 420 с.

Модуль — это кусок программы, компилируемый отдельно от остальных ее частей. Именно возможность раздельной компиляции и является основным преимуществом модулей.

Простейшая модульность программы может достигаться за счет применения процедур и функций, однако этого не всегда достаточно. Если все подпрограммы содержатся в одном файле, то исправление единственной ошибки в какой-либо подпрограмме приведет к неизбежной перекомпиляции всего кода. А при современных размерах программ компиляция может длиться даже не минуты, а часы.

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

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

Стандартные модули языка Pascal

Перечислим самые распространенные модули, входящие в состав стандартных библиотек языка Pascal. Подробное описание этих библиотек можно найти в любом справочном издании 1) .

System

Модуль System является основным: в нем содержатся все изученные нами стандартные процедуры и функции обработки арифметических выражений, множеств, строк и т.п. Специального подключения этот модуль не требует: его содержимым можно пользоваться по умолчанию.

Напомним, что этот модуль содержит следующие типы подпрограмм:

1. подпрограммы для обработки величин порядковых типов данных (dec, inc, odd, pred, succ);

2. арифметические функции;

3. функции преобразования типов данных (chr, ord, round, trunc);

4. процедуры управления процессом выполнения программы (break, continue, exit, halt);

5. подпрограммы обработки строк (concat, copy, delete, insert, length, pos, str, val);

6. подпрограммы файлового ввода и вывода;

7. подпрограммы динамического распределения памяти (dispose, freemem, getmem, new);

8. функции для работы с указателями и адресами (addr);

9. а также некоторые другие подпрограммы (например, exclude, include, random, randomize, upcase).

Crt

Модуль Crt служит для организации «хорошего» вывода на экран. Подробнее о содержимом этого модуля мы расскажем в следующей лекции.

Wincrt

Модуль WinCrt предназначен для создания программ, поддерживающих простейший оконный интерфейс.

Printer

Модуль Printer позволяет производить вывод информации не на консоль, а на принтер (под операционной системой DOS).

Winprn

Модуль WinPrn является аналогом модуля Printer для операционной системы Windows.

Dos

Модуль Dos позволяет обмениваться информацией с операционной системой. Системное время, прерывания, состояния параметров окружения, процедуры обработки процессов, работа с дисковым пространством — всем этим занимается модуль Dos.

Windos

Модуль WinDos является аналогом модуля Dos для операционной системы Windows.

Strings

Модуль Strings позволяет перейти от стандартных строк языка Pascal к строкам, ограниченным нулем. В отличие от обычных строк, чья длина не может превышать 255 символов, эти строки могут состоять из 65 535 символов, причем конец каждой такой строки помечен символом #0.

Graph

Модуль Graph содержит разнообразнейшие подпрограммы, которые позволяют создавать на экране различные рисунки из многоцветных геометрических фигур. Модуль управляет также палитрами, фактурами фона и шрифтами.

Overlay

Модуль Overlay предоставляет возможность делать большие программы оверлейными (многократно использующими одну и ту же область памяти).

Winapi

Модуль WinApi отвечает за создание динамических библиотек. Этот модуль свойственен лишь поздним версиям языка Pascal (например, Turbo Pascal 7.0).

Читайте также:
Кто может написать программу для микроконтроллера

Подключение модулей

Для того чтобы подключить к программе какой-либо модуль, необходимо сразу после заголовка программы поместить следующую строку:

Если подключаемых модулей несколько, эта строка примет вид:

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

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

Например, вы можете пользоваться функцией abs(), не объявляя и не описывая ее, поскольку эта функция включена в состав стандартного модуля System, автоматически подключаемого к любой программе на языке Pascal. Если же вы захотите очистить экран монитора перед выдачей результатов, вам придется подключить к вашей программе модуль crt и воспользоваться содержащейся в нем процедурой clrscr (см. лекцию 14).

Создание модульной программы

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

Структура модуля

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

Разберем каждую из этих секций отдельно.

Название

В отличие от заголовка программы (program ;), который может и отсутствовать, заголовок модуля (unit 😉 обязан присутствовать всегда.

Кроме того, очень полезно давать модулям и содержащим их файлам одинаковые имена. Иначе говоря, модуль с именем modul_1 желательно разместить в файле с именем modul_1.pas, и т.п.

Секция внешних связей

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

Если для объявления какого-либо объекта нужны сведения об объекте, объявленном в другом модуле, то имя этого модуля необходимо указать в этой же секции:

Например, пусть у нас есть два модуля: mod_const, содержащий описания базовых констант и типов данных, и mod1, использующий эти описания (мы приводим только секции внешних связей):

unit mod_const; interface const sto = 100; type one_to_sto = 1..sto;. unit mod1; interface uses mod_const; const dvesti = 2*sto; type massiv = array[1..dvesti] of byte; var a: massiv; b: one_to_sto; function min(x,y:one_to_sto):one_to_sto;.

Рис. 13.1. Пример структуры модульной программы

Теперь, если в каком-либо третьем модуле встретится строка

то внутри этого третьего модуля можно будет использовать (без дополнительных объявлений) тип massiv, переменные a и b, а также функцию min. Необходимо отметить, что использовать константу sto третий модуль не сможет, поскольку в нем не было указано

Если в секциях связей нескольких модулей были определены константы или переменные с одинаковыми именами, но с разными значениями, то путаницы позволит избежать уже знакомый нам прием: указание имени модуля перед идентификатором:

Если имя модуля не указано, то идентификатор считается принадлежащим текущему модулю. И только если в текущем модуле этот идентификатор не был объявлен, то начинается поиск в подключенных модулях.

Например, если модульная программа имеет структуру, изображенную на рис. 13.1, то таблица доступности переменных будет выглядеть так:

Связи Способ обращения к одноименным переменным
program prg; uses A,B,C; p a.p b.p c.p не видна не видна
unit A; uses C,D,F; не видна p не видна c.p d.p f.p
unit B; uses F; не видна не видна p не видна не видна f.p
unit C; не видна не видна не видна p не видна не видна
unit D; не видна не видна не видна не видна p не видна
unit F; не видна не видна не видна не видна не видна p

Замечание: В секциях связей не допускается рекурсивное использование модулями друг друга. Иными словами, нельзя одновременно написать

unit mod_1; interface uses mod_2;. unit mod_2; interface uses mod_1;.

Секция реализации

Этот раздел модуля содержит реализации всех подпрограмм, которые были объявлены в секции внешних связей. Как и в случае косвенной рекурсии (см. лекцию 9), здесь объявление подпрограммы оторвано от ее описания. Однако ключевое слово forward здесь является излишним.

Читайте также:
Топ 10 книг школьной программы

Кроме того, в этой же секции объявляются и описываются внутренние (невидимые вне модуля) метки, константы, типы данных, переменные и подпрограммы.

В отличие от секции внешних связей, секции реализации из различных модулей могут использовать друг друга рекурсивно. Иными словами, совершенно законной будет запись, например, такого вида:

Хороший пример реальной рекурсии при обращениях к модулям (позаимствованный, правда, из оригинальной документации) дается в книге М.В. Сергиевского и А.В. Шалашова «Турбо Паскаль 7.0. Язык. Среда программирования».

Позволим себе привести (с небольшими изменениями) этот пример.

Смысл рекурсии здесь состоит в том, что вывод некоторого сообщения на заданную позицию экрана при помощи процедуры message, содержащейся в модуле mod_1, может сгенерировать ошибку, сообщение о которой (процедура _error из модуля mod_2) снова задействует процедуру message — но уже с другими параметрами.

procedure message(x,y: byte; msg: string);

begin if(x in [1..80-length(msg)]and(y in [1..25])

then begin gotoxy(x,y);

else _error(‘Сообщение не входит в экран’)

Секция инициализации

Секции инициализации всех подключенных к программе модулей исполняются один раз, перед началом работы основной программы:

Если сразу несколько модулей содержат секции инициализации, то порядок выполнения этих секций будет следующим:

  • Если модуль А подключает модуль В (не важно, в какой именно секции), то секция инициализации модуля В будет выполнена раньше, чем секция инициализации, содержащаяся в модуле А.
  • Если два модуля В и С подключаются на одном уровне (считаются равноправными), то их секции инициализации будут выполнены в том порядке, в каком имена этих модулей указаны в разделе uses.

Замечание: Последовательность подключения модулей соответствует обратному обходу орграфа связей.

Если каждый модуль из тех, что составляют программу на рис. 13.1, имеет непустую секцию инициализации, то эти секции будут выполнены в следующей последовательности: C, D, F, A, B. Если же к головной программе модули будут подключены в другом порядке, например:

то секции инициализации будут выполняться в другой последовательности: F, B, C, D, A.

Замечание: Если секция инициализации в модуле отсутствует (а так чаще всего и бывает), то ключевое слово begin указывать не обязательно. Однако end. обязан закрывать текст модуля в любом случае.

Источник: megaobuchalka.ru

Структура построения модульной программы

Структурное «разбиение» программ на отдельные составляющие служит основой и для выбора инструментальных средств их создания, хотя имеет место и обратное влияние — выбор инструментальных средств разработчика программного обеспечения определяет типы программных модулей. При создании программных продуктов выделяются многократно используемые модули, проводится их типизация и унификация, за счет чего сокращаются сроки и трудозатраты на разработку программного продукта в целом.

Некоторые программные продукты используют модули из готовых библиотек стандартных подпрограмм, процедур, функций, объектов, методов обработки данных.

На рис. 1.4 приведена типовая структура программного продукта, состоящего из отдельных программных модулей и библиотек процедур, встроенных функций, объектов и т.п.

Рис 1.4. Структура программного продукта

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

В работе программного продукта активизируются необходимые программные модули. Управляющие модули задают последовательность вызова на выполнение очередною модуля. Информационная связь модулей обеспечивается за счет использования общей базы данных либо межмодульной передачи данных через переменные обмена.

Каждый модуль может оформляться как самостоятельно хранимый файл; для функционирования программного продукта необходимо наличие программных модулей в полном составе.

Структурно-сложные программные продукты разрабатываются как пакеты программ, и чаще всего они имеют прикладной характер — пакеты прикладных программ, или ППП.

ППП (application program package) — это система программ, предназначенных для решения задач определенного класса.

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

Alex Otwagin 2002-12-16

Источник: www.opennet.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru