Модульное программирование. Процедуры и функции. Модули. Открытые массивы и строки
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Модульное программирование
Содержание
Введение
1. Теоретическая часть
1.1 Модульное программирование
1.1.1 Процедуры и функции
1.1.2 Модули
1.1.3 Открытые массивы и строки
1.1.4 Нетипизированные параметры
1.2 Объектно-ориентированное программирование
Заключение
Список литературы
Введение
На заре развития программирования (в историческом смысле это было совсем недавно) компьютерная программа рассматривалась как результат научного творчества и искусства. Программистов было совсем немного, а их труд считался сродни волшебству. В настоящее время ситуация изменилась: к программе подходят к результату сложного технологического процесса, а программисты - это прежде всего настоящие профессионалы своего дела, искусные, т.е. квалифицированные, мастера.
В курсовой работе поставлена задача рассмотреть в теоретической части разработку программных средств для решения экономических задач, а именно рассмотреть модульное и объектно-ориентированное программирование, рассмотреть функции и назначения каждого из типа программирования. В практической части поставлены следующие задачи:
1. Построить таблицы по приведенным данным.
2. Выполнить расчет отклонения фактических показателей от плановых в абсолютной и относительной форме, подвести итоги.
3. Результаты представить в виде консолидированной таблицы.
4. Сформировать и заполнить форму сводной ведомости.
5. Результаты представить в графическом виде.
Объектом изучения является модульное и объектно-ориентированное программирование.
1. Теоретическая часть
1.1 Модульное программирование
Большие программы обычно разрабатывают и отлаживают по частям. Целесообразно при этом, каждая такая часть, называемая подпрограммой, была оформлена так, чтобы ее можно было использовать при решении аналогичной подзадачи в той же программе или даже при решении других задач. В Borland Pascal реализованы два типа подпрограмм: процедуры и функции.
1.1.1 Процедуры и функции
Процедуры и функции представляют собой относительно самостоятельные фрагменты программ, соответствующим образом оформленные и снабженные именем (программные блоки). По правилам Borland Pascal программные блоки - такие же ресурсы, как типы и переменные. Соответственно, они также должны быть описаны перед использованием в разделе описаний программного блока, который их использует (основной программы или вызывающей подпрограммы). Каждый блок имеет такую же структуру, как основная программа, т.е. включает заголовок, раздел описаний и раздел операторов, но заканчивается не точкой, а точкой с запятой.
Заголовок блока определяет форму вызова программы. В разделе описаний блока объявляют внутренние локальные ресурсы блока (переменные, типы, внутренние подпрограммы). Раздел операторов содержит инструкции подпрограммы в операторных скобках begin … end.
Заголовки процедур и функций описываются по-разному. В отличие от процедуры функция всегда возвращает в точку вызова скалярное значение, адрес или строку. Тип возвращаемого результата описывается в заголовке функции.
Данные для разработки процедуры и функции получают из вызвавшей их основной программы. Для размещения рабочих полей подпрограммы могут объявлять новые типы и переменные в собственном разделе описаний. Результаты же они обычно должны возвращать вызвавшей программе или подпрограмме.
Из основной программы данные могут быть получены:
· Неявно - с использованием глобальных констант и переменных;
· Явно - через параметры.
Неявная передача данных в подпрограммы. Каждой подпрограмме доступны все ресурсы программного блока, в разделе описаний которого эта подпрограмма объявлена. Ресурсы же основной программы доступны в любой подпрограмме. Они получили название глобальных.
В свою очередь локальные ресурсы, объявлены в разделе описания подпрограммы, из программного блока, в разделе описания которого она определена, не доступны. В том случае, если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, соответствующий глобальный ресурс в подпрограмме становится не доступным, «перекрывается».
Передача данных через параметры. Список параметров описывается в заголовке подпрограммы. Параметры, перечисленные в этом списке, получили название формальных, так как для их размещения не отводится память. При обращении к подпрограмме для каждого параметра должно быть указано фактическое значение - литерал, константа или переменная того же типа, что и формальный параметр. Несоответствие типов и количества формальных и фактических параметров выявляется компилятором (или компоновщиком, если вызов подпрограммы происходит из другого модуля). Нарушение порядка следования фактических параметров, если это нарушение не связано с несовпадением количества параметров или их типов, приводит к нарушению логики работы программы и часто может быть обнаружено только при тестировании программы.
В Borland Pascal параметры в подпрограмму могут передаваться тремя способами:
· Как значения - в подпрограмму передаются копии значений параметров, и никакие изменения этих копий не возвращаются в вызывающую программу;
· Как переменные - в программу передаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме на самом деле происходят с переменными, переданными в качестве фактических параметров; такие параметры при описании помечаются служебным словом var; в качестве фактических значений параметров - переменных нельзя использовать литералы;
· Как изменяемые переменные (именованные константы) - в подпрограмму, так же как и в предыдущем случае, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании помечаются служебным словом const.
Вызов процедур и функций. И процедура, и функция, используя параметры - переменные, могут изменять значения переменных основной программы. Но как отмечалось выше, функция отличается от процедуры тем, что кроме изменения значений параметров-переменных всегда возвращает в точку вызова скалярное значение, строку или указатель. Поэтому в теле функции обязательно наличие специальной переменной с именем функции, которой должно присваиваться значение. Именно это значение и будет возвращено в место вызова функции в качестве его результата. Вызов функции, таким образом, можно осуществлять в составе выражений везде, где возможно использование выражений ( в операторе присваивания, в операторе вывода и т.д.), например:
<переменная>:=<имя функции>(<фактические параметры>).
Процедура же должна вызываться отдельным оператором, состоящим из имени процедуры и списка фактических параметров.
Вызов процедуры и функции по-разному изображается на схеме алгоритма: вызов функции - в блоке «процесс» или блоке вывода, а для вызова процедуры используется специальный блок «предопределенный процесс». Схемы алгоритмов же самих подпрограмм в обоих случаях оформляются отдельно, причем вместо слова «начало» указывают имя подпрограммы, а вместо слова «конец» - указывают слово «возврат» или «return».
1.1.2 Модули
При разработке больших программ целесообразно часть подпрограмм и других ресурсов, таких, как переменные, константы, описания типов, собирать вместе и компилировать отдельно от основной программы в виде библиотек ресурсов или модулей.
Модуль - это автономно компилируемая коллекция программных ресурсов, предназначенная для использования другими модулями и программами.
Все ресурсы модуля делятся на две группы: внешние - предназначенные для использования другими программными единицами, и внутренние - рабочие ресурсы данного модуля.
Структура модуля выглядит следующим образом:
Unit <имя модуля>
Interface
<интерфейсная секция>
[Begin
<секция инициализации>]
End.
Имя модуля должно совпадать с именем файла, в котором он содержится. Результат компиляции модуля помещается в файл с тем же именем и расширением .tpu.
Примечание. Среда языка Borland Pascal предусматривает три режима компиляции программы, использующей модули:
· Compile - компилируется только основная программа, все модули должны быть предварительно откомпилированы в файлы <имя модуля> .tpu и размещены либо в текущем каталоге, либо в одном из каталогов, указанных как источники файлов .tpu в настройках среды;
· Make - модули, для которых не обнаружены файлы .tpu, компилируются из соответствующих файлов .pas, которые должны находиться в текущем каталоге или в каталогах, указанных в настройках среды в качестве источников исходных файлов модулей;
· Build - все ранее откомпилированные модули .tpu игнорируются и все модули компилируются из своих исходных файлов заново.
В процессе отладки модулей целесообразно использовать режим Build, а при отладке программы - режим Compile
Интерфейсная секция содержит объявление ресурсов (в том числе заголовки подпрограмм), к которым возможны обращения извне.
Секция реализации содержит описание подпрограмм, объявленных в интерфейсной секции, и описание внутренних ресурсов модуля (локальных переменных, типов, подпрограмм). Обращение к этим ресурсам возможно только из подпрограмм, описанных в том же модуле.
Секция инициализации содержит операторы, которые выполняют следующие действия, необходимые для нормальной работы процедур модуля (например, открываются файлы, инициализируют некоторые переменные и т.п.). Операторы секции инициализации выполняются один раз (при подключении модуля) до начала выполнения основной программы. Эта секция в модуле может отсутствовать.
Программа, которая использует ресурсы нескольких модулей, должна в области описаний содержать спецификацию используемых модулей:
Uses <имя модуля 1>, <имя модуля 2>,
В спецификации Uses необходимо указывать только те модули, ресурсы которых данная программная единица (программа или модуль) использует непосредственно. Если подключаемый модуль использует другие модули, то их подключение уже описано в нем. Секции инициализации подсоединяемых модулей выполняются в порядке их подключения.
В виде модулей в Borland Pascal реализованы библиотеки подпрограмм, использование которых существенно упрощает разработку программ.
Вместе с системой программирования на Borland Pascal поставляются следующие библиотеки:
System - 18
основная библиотека - содержит описание всех стандартных процедур и функций, таких, как математические функции, функции преобразований, процедуры и функции обработки строки и т.п. Ресурсы данной библиотеки доступны любой программе без специального указания.
Crt - 18
библиотека управления экраном в текстовом режиме - содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном, клавиатурой и динамиком.
Graph - 18
библиотека управления экраном в графическом режиме - содержит описание переменных, констант и процедур и функций, обеспечивающих управление экраном в графическом режиме.
Dos - 18
библиотека организации взаимодействия с операционной системой MS DOS - содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы.
Поставляемые вместе с описанными модули Turbo3, Printer, Graph3, Overlay устарели и практически не используются.
При разработке собственных библиотек программисты стремятся создавать подпрограммы, имеющие широкую область применения, для чего используют специальные средства объявления параметров: открытые массивы и строки, нетипизированные параметры и параметры процедурного типа.
1.1.3 Открытые массивы и строки
По правилам Borland Pascal размерность любого массива, передаваемого в качестве параметра, должна быть определена. Следовательно, без использования специальных средств применимость процедур и функций, имеющих параметры-массивы, существенно ограничивается. Чтобы снять ограничение размерности для параметров - одновременных массивов, можно использовать открытые массивы.
Открытый массив - это конструкция описания типа массива без указания типа индексов.
Такое определение возможно только при описании формальных параметров подпрограммы. Применяя открытые массивы, следует помнить, что индексы параметров, описанных как открытые массивы, всегда начинаются с нуля. Реальное количество элементов фактического параметра массива можно определить двумя способами. Во-первых - передать через дополнительные параметры, во-вторых - использовать специальные функции.
High (<идентификатор массива>) - для обычного массива возвращает верхнюю границу индекса массива, для открытого - максимальное значение индекса.
Low (<идентификатор массива>) - для обычного массива возвращает нижнюю границу индекса массива, для открытого - ноль.
1.1.4 Нетипизированные параметры
В Borland Pascal допускается использовать параметры, тип которых не указан. Такие параметры могут передаваться в подпрограмму только по ссылке, так как в этом случае в подпрограмму реально передается адрес параметра.
Безусловно, для того чтобы подпрограмма могла выполнять какие-либо действия с этим параметром, она должна как-то назначить ему тип.
Для приведения нетипизированного параметра к определенному типу можно использовать:
Ш Автоопределенное преобразование типов;
Ш Наложенное описание переменной определенного типа.
При автоопределенном преобразовании типов тип выражения указывают явно, например:
Procedure Proc (Var: а);
b: = Integer (a) + 10;
Для наложения переменной определенного типа используют описание с absolute, например:
Procedure Proc (Var: а);
Var r : real absolute a;
При этом переменная r оказывается в памяти размещенной в том же месте, что и нетипизированный параметр а, и, соответственно, любое изменение r приведет к изменению а.
1.2. Объективно-ориентированное программирование
Современная технология разработки программных продуктов, в том числе и операционной системы Windows, базируется на концепции объектно-ориентированного программирования, в которой выдерживается единый подход к данным и программам. В основе всего лежит понятие объекта, который объединяет в себе как алгоритмы, так и данные, обрабатываемые этими алгоритмами. В результате упрощается не только разработка программ, но и технология работы пользователя, которому представляется возможность при работе в интерактивном (диалоговом) режиме применять наглядные графические инструменты и различные подсказки.
Объектно-ориентированное программирование стало необычайно популярным в последние годы. Оно определяет новое понимание процесса вычисления, а также то, как можно структурировать информацию внутри компьютера.
Формализованной основой ООП является модель с рядом базовых категорий:
· Абстрагирование - процесс выделения наиболее существенных характеристик некоторого объекта, которые отличают его особенности при дальнейшем анализе и использовании. При этом абстрагирование концентрирует внимание на внешних особенностях объекта, позволяя в значительной степени игнорировать детали реализации этих особенностей. Именно выбор эффективного набора абстракций для конкретной предметной области и представляет собой главную задачу ООП.
· Инкапсуляция - процесс разделения всех, составляющих объект элементов, на две категории, определяющие его внутреннюю организацию и внешнее поведение. Инкапсуляция позволяет изолировать внешний интерфейс объекта (доступный для взаимодействия с другими объектами) от внутренней реализации объекта. При этом инкапсуляция позволяет связать структуры данных с функциями (методами), предназначенными для манипулирования этими данными, и скрыть их от внешней среды.
· Модульность - свойство системы, определяющее возможность ее декомпозиции на ряд слабо связанных между собой модулей. Совместно с инкапсуляцией модульность создает барьеры между абстракциями.
· Иерархия - расположение (упорядочивание) абстракций по ряду уровней. В рамках сложных систем основными видами иерархических структур являются
· структура классов (иерархия по номенклатуре введенных классов) и структура объектов (иерархия по составу).
Абстрагирование и инкапсуляция являются взаимодополняющими операциями: абстрагирование акцентирует влияние на внешних особенностях объекта, а инкапсуляция (или, иначе, ограничение доступа) не позволяют объектам-пользователям различать внутреннее устройство объекта. Такой подход позволяет программисту не знать частных деталей реализации программной системы и программировать, используя объекты с закрытой внутренней организацией. Инкапсуляция предполагает введение нового механизма структурирования и оптимизации данных - класса.
Помимо описанных основных обязательных категорий объектной модели, в ряде случаев, важное значение имеют три дополнительных категорий:
· Типизация - ограничение, накладываемое на класс объектов и препятствующее взаимозаменяемости различных классов (использованию объектов одного класса вместо другого);
· Параллелизм - свойство объектов находиться в активном или пассивном состоянии и, соответственно, возможность отличать друг от друга активные и пассивные объекты;
· Устойчивость - свойство объектов существовать во времени (вне зависимости от породившего данный объект процесса) и/или в пространстве (при перемещении объекта из области, в которой он был создан, в другую область).
К концептуальным понятиям в ООП относятся объекты и классы.
Объект определяется как осязаемая реальность (предмет или явление), характеризующаяся определенным поведением. Объект описывается состоянием, поведением и индивидуальностью. Объекты со схожей структурой и поведением входят в общий для них класс. Состояние объекта определяется перечнем всех возможных свойств этого объекта и текущими значениями каждого из этих свойств. Поведение объекта характеризуется его воздействием на другие объекты и изменением собственного состояния в результате воздействий со стороны других объектов. В ООП операции, выполняемые над объектом, называют методами; они являются составной частью определения класса. В общем случае объектом может быть и константа, и переменная, и процедура, и процесс.
Класс определяется как множество объектов, обладающих внутренними свойствами, присущими любому объекта класса и проявляющимися в общности структуры и поведения. При этом спецификация (определение) класса проводится путем определения его внутренних свойств, играющих роль классообразующих признаков. Определение классов и объектов является одной из наиболее сложных задач в объектно-ориентированном проектировании.
Важное значение для классов имеют свойства наследования и полиморфизма.
Наследование означает создание новых, производных классов посредством использования данных и функций от одного или нескольких ранее определенных классов. Наследование позволяет разрабатывать сложные классы, продвигаясь от общего к частному.
Полиморфизм (многоформенность) означает возможность принадлежности класса одновременно более чем одному типу. Однако при этом предполагается, что в рамках различных типов иерархической структуры класс имеет возможность несколько различным образом проявлять себя.
Объектно-ориентированная система в наибольшей мере отражает возможность ее последующей эволюции. Наследование и полиморфизм позволяют создавать новые производные классы на основе базовых классов. При этом потомки наследуют характеристики родительских классов и добавляют необходимые собственные структуры данных и методы. Подобный подход, при котором заново описываются только различия и уточнения, позволяет в значительной степени сократить время и усилия, требующиеся на разработку новых программ.
Объектно-ориентированный подход, как и другие концептуальные решения в процессе развития технологии программирования, явился ответом на поиск путей снижения стоимости разработки ПО. Практика программирования последних лет показывает, что удачное применение механизмов ООП позволяет построить множество объектов различных классов, которые многократно могут быть использованы без какой-либо доработки при выполнении многих проектов различной сложности, что снижает затраты на их реализацию.
В целом объектно-ориентированный подход к разработке программ интегрирует в себе как методы структуризации управления, так и структуризации данных.
Объектно-ориентированные языки программирования характеризуются наличием механизма, реализующего отношение класс-подкласс, связанного с использованием возможности наследования свойств.
В качестве преимуществ ОПП отмечают:
· Повышение уровня унификации разработки и возможность повторного использования не только программ, но и проектов, что ведет к созданию среды разработки и переходу к сборочному созданию ПО (переход от непосредственного программирования к проектированию);
· Естественность объектной модели, ориентированной на человеческое восприятие мира, а не на компьютерную реализацию;
· Уменьшение риска создания чрезмерно сложных систем ПО, поскольку изначально подход предполагает эволюционный путь развития системы во времени на базе исходных, относительно несложных подсистем.
К основным недостаткам ООП относят значительные начальные затраты и некоторое снижение производительности функционирования ПО. Эффект от применения ООП начинает сказываться после разработки нескольких проектов и накопления повторно используемых компонентов. При этом следует иметь в виду и значительные психологические трудности, связанные с переходом к ООП.
Фактически, основное различие между объектно-ориентированным и «обычным» программированием состоит в том, что при обычном программировании программисты ограничены встроенными абстракциями, в то время как при использовании объектно-ориентированного программирования они могут определять свои собственные абстракции. Объектно-ориентированное проектирование - дело чрезвычайно сложное. Необходим большой опыт и здравый смысл, чтобы решить, что же заслуживает того, чтобы стать объектом. В целом ООП использует в качестве основной конструкции не только абстрактный тип данных, оно является более общим в целом и простирается до абстрагирования внешних устройств, моделей реального мира и т.д.
Следует отметить, что интегрированный пакет программ MS Office также построен на основе объектно-ориентированного программирования, и его можно рассматривать как семейство классов и объектов.
Заключение
Большие программы обычно разрабатывают и отлаживают по частям. Целесообразно при этом, каждая такая часть, называемая подпрограммой, была оформлена так, чтобы ее можно было использовать при решении аналогичной подзадачи в той же программе или даже при решении других задач. В Borland Pascal реализованы два типа подпрограмм: процедуры и функции.
Модуль - это автономно компилируемая коллекция программных ресурсов, предназначенная для использования другими модулями и программами.
Все ресурсы модуля делятся на две группы: внешние - предназначенные для использования другими программными единицами, и внутренние - рабочие ресурсы данного модуля.
Современная технология разработки программных продуктов, в том числе и операционной системы Windows, базируется на концепции объектно-ориентированного программирования, в которой выдерживается единый подход к данным и программам. В основе всего лежит понятие объекта, который объединяет в себе как алгоритмы, так и данные, обрабатываемые этими алгоритмами. В результате упрощается не только разработка программ, но и технология работы пользователя, которому представляется возможность при работе в интерактивном (диалоговом) режиме применять наглядные графические инструменты и различные подсказки.
Объектно-ориентированное программирование стало необычайно популярным в последние годы. Оно определяет новое понимание процесса вычисления, а также то, как можно структурировать информацию внутри компьютера.
Назначение модулей
Стандартный Паскаль не предусматривает механизмов раздельной компиляции частей программы с последующей их сборкой перед выполнением. Вполне понятно стремление разработчиков коммерческих компиляторов Паскаля включать в язык средства, повышающие его модульность.
Модуль Паскаля – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции) и, возможно, некоторые исполняемые операторы инициирующей части.
Основным принципом модульного программирования является принцип «разделяй и властвуй». Модульное программирование – это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определенным правилам.
Использование модульного программирования позволяет упростить тестирование программы и обнаружение ошибок. Аппаратно-зависимые подзадачи могут быть строго отделены от других подзадач, что улучшает мобильность создаваемых программ.
Термин «модуль» в программировании начал использоваться в связи с внедрением модульных принципов при создании программ. В 70-х годах под модулем понимали какую-либо процедуру или функцию, написанную в соответствии с определенными правилами. Например: «Модуль должен быть простым, замкнутым (независимым), обозримым (от 50 до 100 строк), реализующим только одну функцию задачи, имеющим одну входную и одну выходную точку».
Первым основные свойства программного модуля более-менее четко сформулировал Парнас (Parnas): «Для написания одного модуля должно быть достаточно минимальных знаний о тексте другого». Таким образом, в соответствии с определением, модулем могла быть любая отдельная процедура (функция) как самого нижнего уровня иерархии (уровня реализации), так и самого верхнего уровня, на котором происходят только вызовы других процедур-модулей.
Таким образом, Парнас первым выдвинул концепцию скрытия информации (information hiding) в программировании. Однако существовавшие в языках 70-х годов только такие синтаксические конструкции, как процедура и функция, не могли обеспечить надежного скрытия информации, поскольку подвержены влиянию глобальных переменных, поведение которых в сложных программах бывает трудно предсказуемым.
Решить эту проблему можно было только разработав новую синтаксическую конструкцию, которая не подвержена влиянию глобальных переменных.
Такая конструкция была создана и названа модулем. Изначально предполагалось, что при реализации сложных программных комплексов модуль должен использоваться наравне с процедурами и функциями как конструкция, объединяющая и надежно скрывающая детали реализации определенной подзадачи.
Таким образом, количество модулей в комплексе должно определяться декомпозицией поставленной задачи на независимые подзадачи. В предельном случае модуль может использоваться даже для заключения в него всего лишь одной процедуры, если необходимо, чтобы выполняемое ею локальное действие было гарантировано независимым от влияния других частей программы при любых изменениях.
Впервые специализированная синтаксическая конструкция модуля была предложена Н. Виртом в 1975 г. и включена в его новый язык Modula . Насколько сильно изменяются свойства языка, при введении механизма модулей, свидетельствует следующее замечание Н.Вирта, сделанное им по поводу более позднего языка Модула-2: «Модули – самая важная черта, отличающая язык Модула-2 от его предшественника Паскаля».
По своей организации и характеру использования в программе модули Паскаля близки к модулям-пакетам (PACKAGE) языка программирования Ада. В них так же, как и в пакетах Ады, явным образом выделяется некоторая «видимая» интерфейсная часть, в которой сконцентрированы описания глобальных типов, констант, переменных, а также приводятся заголовки процедур и функций. Появление объектов в интерфейсной части делает их доступными для других модулей и основной программы. Тела процедур и функций располагаются в исполняемой части модуля, которая может быть скрыта от пользователя.
Значение модулей для технологии разработки программного проекта может быть продемонстрировано диаграммой на рис. 2.
Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модульного программирования. Важная особенность модулей заключается в том, что компилятор размещает их программный код в отдельном сегменте памяти. Длина сегмента не может превышать 64 Кбайт, однако количество одновременно используемых модулей ограничивается лишь доступной памятью, что позволяет создавать большие программы.
Структура модулей Паскаля
Всякий модуль Паскаля имеет следующую структуру:
Unit <имя_модуля>;
interface <интерфейсная часть>;
implementation < исполняемая часть >;
begin
<инициирующая часть>;
end .
Здесь UNIT – зарезервированное слово (единица); начинает заголовок модуля;
• <имя_модуля> - имя модуля (правильный идентификатор);
• INTERFACE – зарезервированное слово (интерфейс); начинает интерфейсную часть модуля;
• IMPLEMENTATION – зарезервированное слово (выполнение); начинает исполняемую часть модуля;
• BEGIN – зарезервированное слово; начинает инициирующую часть модуля; причем конструкция begin <инициирующая часть> необязательна;
• END – зарезервированное слово – признак конца модуля.
Таким образом, модуль Паскаля состоит из заголовка и трех составных частей, любая из которых может быть пустой.
Заголовок модуля Паскаля и связь модулей друг с другом
Заголовок модуля Паскаля состоит из зарезервированного слова unit и следующего за ним имени модуля. Для правильной работы среды Турбо Паскаля и возможности подключения средств, облегчающих разработку больших программ, имя модуля Паскаля должно совпадать с именем дискового файла, в который помещается исходный текст модуля. Если, например, имеем заголовок модуля Паскаля
Unit primer ;
то исходный текст этого модуля должен размещаться на диске в файле primer .pas .
Имя модуля Паскаля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением:
uses<список модулей>
Здесь USES – зарезервированное слово (использует);
<список модулей> - список модулей, с которыми устанавливается связь; элементы списка – имена модулей через запятую.
Если в Паскале модули используются, то предложение uses <список модулей> должно стоять сразу после заголовка программы , т.е. должно открывать раздел описаний основной программы. В модулях Паскаля могут использоваться другие модули. В модулях предложение uses <список модулей> может стоять сразу после слова interface или сразу после слова implementation . Допускается и два предложения uses , т.е. оно может стоять и там, и там.
Интерфейсная часть
Интерфейсная часть открывается зарезервированным словом INTERFACE . В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны быть доступны основной программе и (или) другим модулям Паскаля. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:
Пример фрагмента программы
Unit complexn;
Interface Type Complex= record
Re, im: real;
End;
Procedure AddC(x,y: complex, var z: complex);
Procedure MulC (x,y: complex, var z: complex);
Если теперь в основной программе написать предложение
Uses complexn ;
то в программе станут доступными тип cmplex и две процедуры – AddC и MulC из модуля complexn .
Отметим, что объявление подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти. Таким образом, обеспечивается доступ к подпрограммам из основной программы и других модулей Паскаля.
Следует учесть, что все константы и переменные, объявленные в интерфейсной части модуля Паскаля, равно как и глобальные константы и переменные основной программы, помещаются компилятором Турбо Паскаля в общий сегмент данных (максимальная длина сегмента 65536 байт).
Порядок появления различных разделов объявлений и их количество может быть произвольным. Если в интерфейсной части объявляются внешние подпрограммы или подпрограммы в машинных кодах, их тела (т.е. зарезервированное слово EXTERNAL , в первом случае, и машинные коды вместе со словом INLINE – во втором) должны следовать сразу за их заголовками в исполняемой части модуля (не в интерфейсной!). В интерфейсной части модулей Паскаля нельзя использовать опережающее описание.
Исполняемая часть модуля Паскаля
Исполняемая часть модуля Паскаля начинается зарезервированным словом IMPLEMENTATION и содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты – вспомогательные типы, константы, переменные и блоки, а также метки.
Описанию подпрограммы, объявленной в интерфейсной части модуля Паскаля, в исполняемой части должен предшествовать заголовок, в котором можно опустить список формальных параметров и тип результата для функции, так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком параметров и объявлением типа результата для функции, то он должен полностью совпадать с заголовком подпрограммы в интерфейсной части, например:
Пример модуля Паскаля
Unit complexn;
{--------------------------------}
Interface
Type
Complex= record
Re, im: real;
End;
Procedure AddC(x,y: complex, var z: complex);
{---------------------------------}
Implementation
Procedure AddC;
z.re:= x.re + y.re;
z.im:= x.im + y.im;
end ;
end .
Инициирующая часть модуля Паскаля
Инициирующая часть завершает модуль Паскаля. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой – тогда вслед за BEGIN сразу следует признак конца модуля.
В инициирующей части размещаются исполняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Например, в инициирующей части могут инициироваться переменные, открываться файлы, устанавливаться связи с другими компьютерами и т.п.:
Пример модуля Паскаля
Unit fileText;
{-------------------------------}
Interface
Procedure print(s: string);
{-------------------------------}
implementation
var f: text;
const
name= ‘output.txt’;
procedure print;
begin
writeln(f, s)
end ;
{---------------------------------}
{начало инициирующей части}
begin
assign(f, name);
rewrite ( f );
{конец инициирующей части}
end .
Не рекомендуется делать инициирующую часть пустой, лучше ее опустить.
Компиляция модулей Паскаля
В среде Турбо Паскаль имеются средства, управляющие способом компиляции модулей и облегчающие разработку больших программ. Определены три режима компиляции: COMPILE , MAKE , BUILD. Режимы отличаются способом связи компилируемого модуля или основной программы с другими модулями, объявленными в предложении USES .
При компиляции модуля или основной программы в режиме COMPILE все, упоминаемые в предложении USES модули, должны быть предварительно откомпилированы, и результаты компиляции должны быть помещены в одноименные файлы с расширением TPU (от англ. Turbo Pascal Unit). Файл с расширением TPU создается автоматически при компиляции модуля Паскаля.
В режиме MAKE компилятор проверяет наличие TPU -файлов для каждого объявленного модуля. Если какой-либо файл не найден, система ищет одноименный файл с расширением PAS , т.е. файл с исходным текстом модуля Паскаля. Если таковой файл найден, система приступает к его компиляции. Кроме того, в этом режиме система следит за возможными изменениями исходного текста любого используемого модуля. Если в PAS -файл внесены изменения, то независимо от того, есть ли в каталоге соответствующий TPU -файл или нет, система откомпилирует его перед компиляцией основной программы. Более того, если изменения внесены в интерфейсную часть, то будут откомпилированы все другие модули, обращающиеся к нему. Режим MAKE существенно облегчает процесс разработки крупных программ с множеством модулей Паскаля: программист избавляется от необходимости следить за соответствием TPU -файлов их исходному тексту, т.к. система делает это автоматически.
В режиме BUILD существующие TPU -файлы игнорируются, система пытается отыскать и откомпилировать соответствующие PAS - файлы для каждого модуля Паскаля. После компиляции можно быть уверенным, что учтены все сделанные в текстах модулей Паскаля исправления и изменения.
Подключение модулей Паскаля к основной программе и их компиляция происходит в порядке их объявления в предложении USES . При переходе к очередному модулю Паскаля система предварительно ищет все модули, на которые он ссылается. Ссылки модулей Паскаля друг на друга могут образовывать древовидную структуру любой сложности, однако запрещается явное или косвенное обращение модуля к самому себе. Например, недопустимы следующие объявления:
Пример ошибок модуля Паскаля
Unit A; Unit B;
interface interface
uses B;Uses A;
……. ……
implementation implementation
…….. ……
end. end.
Это ограничение можно обойти, если «спрятать» предложение USES в исполняемые части зависимых модулей:
Пример исправленных ошибок модуля Паскаля
Unit A; Unit B;
interface interface
……. ……
implementation implementation
uses B;Uses A;
…….. ……
end. end.
Дело в том, что Турбо Паскаль разрешает ссылки на частично откомпилированные модули, что приблизительно соответствует опережающему описанию подпрограммы. Если интерфейсные части независимы (это обязательное условие!), Турбо Паскаль сможет идентифицировать все глобальные объекты в каждом модуле, после чего откомпилирует тела модулей обычным способом.
Доступ к объявленным в модуле Паскаля объектам
Пусть, например, мы создаем модуль Паскаля, реализующий сложение и вычитание комплексных чисел с помощью процедур:
Пример модуля реализующий сложение и вычитание комплексных чисел
Unit complexn;
Interface
type
complex= record
re, im: real;
end;
procedure AddC (x, y: complex; var z: complex);
procedure SubC (x, y: complex; var z: complex);
const c: complex= (re: 0.1; im: -1);
implementation
procedure AddC;
begin
z.re:= x.re + y.re;
z.im:= x.im + y.im;
end; {AddC}
procedure SubC;
begin
z.re:= x.re - y.re;
z.im:= x.im - y.im;
end; {SubC}
end .
Текст этого модуля следует поместить в файл complexn . pas . Вы можете его откомпилировать, создав TPU -файл.
В следующей программе осуществляются арифметические операции над комплексными числами:
Арифметические операции над комплексными числами
Program primer ;
Uses complexn;
Var
a,b,c: coplex;
begin
a.re:= 1; a.im:= 1;
b.re:= 1; b.im:= 2;
AddC(a, b, c);
Writeln (‘ сложение :’, c.re: 5:1, c.im: 5:1, ‘i’);
SubC (a, b, c);
Writeln (‘ вычитание :’, c.re: 5:1, c.im: 5:1, ‘i’);
End.
После объявления Uses complexn программе стали доступны все объекты, объявленные в интерфейсной части модуля complexn . При необходимости можно переопределить любой из этих объектов, как произошло, например, с типизированной константой c , объявленной в модуле Паскаля. Переопределение объекта означает, что вновь объявленный объект «закрывает» ранее определенный в модуле одноименный объект. Чтобы получить доступ к «закрытому» объекту, нужно воспользоваться составным именем: перед именем объекта поставить имя модуля и точку. Например :
Writeln (complexn.c.re: 5: 1, complexn.c.im: 5: 1);
Этот оператор выведет на экран содержимое «закрытой» типизированной константы, объявленной в модуле Паскаля из предыдущего примера.
Стандартные модули Паскаля
В Турбо Паскале имеется 8 стандартных модулей, в которых содержится множество различных типов, констант, процедур и функций. Этими модулями являются SYSTEM, DOS, CRT, GRAPH, OVERLAY, TURBO3, GRAPH3. Модули Паскаля GRAPH , TURBO 3, GRAPH 3 выделены в отдельные TPU -файлы, а остальные входят в состав библиотечного файла TURBO . TPL . Лишь один модуль Паскаля SYSTEM подключается к любой программе автоматически, все остальные становятся доступны только после указания их имен в списке подключаемых модулей.
Модуль Паскаля SYSTEM. В него входят все процедуры и функции стандартного Паскаля, а также встроенные процедуры и функции, которые не вошли в другие стандартные модули (например, INC , DEC , GETDIR и т.п.). Модуль Паскаля SYSTEM подключается к любой программе независимо от того, объявлен ли он в предложении USES или нет, поэтому его глобальные константы, переменные, процедуры и функции считаются встроенными в Турбо Паскаль.
Модуль Паскаля PRINTER делает доступным вывод текстов на матричный принтер. В нем определяется файловая переменная LST типа TEXT , которая связывается с логическим устройством PRN. После подключения данного модуля Паскаля можно выполнить, например, такое действие:
Пример стандартного модуля Паскаля
Uses printer;
Begin
Writeln(lst, ‘ Турбо Паскаль ’);
End.
Модуль Паскаля CRT. В нем сосредоточены процедуры и функции, обеспечивающие управление текстовым режимом работы экрана. С его помощью можно перемещать курсор в любую точку экрана, менять цвет выводимых символов и фона, создавать окна. Кроме того, в данный модуль включены также процедуры «слепого» чтения клавиатуры и управления звуком.
Модуль Паскаля GRAPH . Содержит набор типов, констант, процедур и функций для управления графическим режимом работы экрана. Этот модуль позволяет создавать различные графические изображения и выводить на экран надписи стандартными или созданными программистом шрифтами.
Модуль Паскаля DOS . В модуле собраны процедуры и функции, открывающие доступ к средствам дисковой операционной системы MS - DOS .
Модуль Паскаля OVERLAY . Данный модуль необходим при разработке громоздких программ с перекрытиями. Турбо Паскаль обеспечивает создание программ, длина которых ограничивается лишь основной оперативной памятью. Операционная система MS - DOS оставляет программе около 580 Кбайт основной памяти. Память такого размера достаточна для большинства исполняемых программ, тем не менее, использование программ с перекрытиями снимает это ограничение.
Модули Паскаля TURBO 3 и GRAPH 3 введены для обеспечения совместимости с ранней версией системы Турбо Паскаль.
Список литературы
1. Бадд Тимоти Объектно-ориентированное программирование в действии/ [Пер. с англ. А Берднокова; Гл. ред. В. Усманов]. - СПб: Питер, 1997. - 460 с.: ил.
2. Басс Лен Архитектура программного обеспечения на практике [пер. с англ.] / Л. Басс 2-е - изд. - СПб: Питер, 2006. - 574 с.
3. Боровцов Е.Г. Введение в объектно-ориентированное программирование.: Учеб. пособие по курсу «Технология программирования для студентов специальностей 2204» - «Программное обеспечение вычислительной техники»/ Гос. ком. Рос. Федерации по высшему образованию, Алт. гос. техн. ун-т им. И.И. Ползунова. - Барнаул: Изд-во АлтГТУ, 1996. - 79 с.
4. Бутаков С.В. Высокоуровневые методы информатики и программирования. Учеб. пособие. : Министерство образования и науки Российской Федерации, Федеральное агентство по образованию, Алт. академия экономики и права - Барнаул: изд-во ААЭП, 2005. - 72с.
5. Иванова Г.С. Основы программирования [Учеб. для вузов] 2-е - изд. перераб. и дополнено. - М.: изд - во МГТУ им. Н.Э. Баумана, 2002. - 415 с. ил.
6. Непейвода Н.Н. Стили и методы программирования курс лекций: учеб. пособие: М.: 2005. - 316 с.: ил.
7. Окулов С.М. Основы программирования. М.: Лаборатория базовых значений 2002. - 424 с.
8. Пол Айра Объектно-ориентированное программирование на С++/ Пер. с англ. Д. Ковальчука. - 2-е - изд. - М; СПб: БИНОМ; Невский диалект 1999. - 461 с.
9. Солодкий О.Г. Основы программирования: сборник задач; М-во образования и науки Рос. Федерации по образованию, Алт. акад. экономики и права. - Барнаул: Изд. ААЭП, 2005. - 83 с.
10. Хореев П.Б. Технологии объектно-ориентированного программирования; учеб. пособие; - М.: Academia, 2004. - 447 с.