Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Иванова Г.С. - Основы программирования

.pdf
Скачиваний:
2769
Добавлен:
02.04.2015
Размер:
13.53 Mб
Скачать

5. Модульное программирование

Профамма исследования функций:

Список операций:

1 - sin X

1 - получение таблицы значений;

2 - cos X

2 - определение корней;

3 - Inx

3 - определение экстремумов;

4-е'^х

4 - выход.

5 - выход

Определите операцию: _

Введите номер функции: _

 

а

1

Введите интервал: _

Введите интервал: _

 

Введите шаг: _

Введите погрешность: _

 

Таблица значений функции.

Корень х=...

1

х=...

у=...

 

х=...

у=...

значение функции в корне у=

 

х=...

у=...

Нажмите любую клавишу.

к.

Нажмите любую клавишу.

 

 

J

Введите интервал: _ Введите погрешность: _

Минимум у=... при х=...

Максимум у=... при х=...

Нажмите любую клавишу.

Рис. 5.6. Состояния интерфейса профаммы исследования функций:

а - меню функций; б - меню операций; в-д - оформление операций

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

Далее пользователь может выбрать другую операцию, а может вернуть­ ся в меню функций, если выберет операцию 4 (выход). Вернувшись в меню функций, пользователь может выбрать другую функцию или выйти из про­ граммы.

На рис. 5.7 представлена диаграмма переходов состояний интерфейса пользователя, из которого видно, в какой последовательности и по нажатию каких клавиш осуществляется переключение форм (экранов) интерфейса.

151

Часть 1. Основы алгоритмизации и процедурное программирование

х- нажатие любой клавиши

Рис. 5.7. Диаграмма переходов состояний интерфейса программы исследования функции

При разработке алгоритма методом пошаговой детализации будем ис­ пользовать псевдокод. Начинаем разработку алгоритма «сверху», т.е. с реали­ зации меню функций.

Меню функций работает следующим образом. При запуске программы выводим меню на экран. Затем вводим номер функции и, если номер функ­ ции не равен 5, передаем управление меню операций, сообщая ему номер выбранной функции. Когда меню операций завершит свою работу, то на эк­ ран вновь необходимо вывести меню функций и опять ввести номер функ­ ции:

Программа исследования элементарных функций:

ВЫВЕСТИ_МЕНЮ_ФУНКЦИЙ. Ввести Номер_функции. Цикл-пока Номер_функции о 5

Вызвать МЕНЮ_,ОПЕРАЦИЙ (Номер_функции) ВЫВЕСТИ_МЕНЮ__ФУНКЦИЙ.

Ввести Номер_функции.

Все-цикл. Конец.

На этом шаге определились две подпрограммы: ВЫВЕСТИ_МЕНЮ_ФУНКЦИЙ и МЕНЮ__ОПЕРАЦИЙ (Номер__функции). Подпрограмма ВЫВЕСТИ_МЕНЮ_ФУНКЦИЙ будет иметь линейную структуру:

152

J. Модульное программирование

Подпрограмма ВЫВЕСТИ^МЕНЮ^ФУНКЦИИ:

ОЧИСТИТЬ_^ЭКРАН.

Вывести «Программа исследования функций.» Вывести «1 - sin х;».

Вывести «2 - cos х;». Вывести «3 - In х;». Вывести «4 - е'^х;». Вывести «5 - Выход.».

Конец подпрограммы.

Подпрограмма МЕНЮ_ОПЕРАЦИЙ (Номер_функции) также должна реализовать меню:

Подпрограмма МЕНЮ_ОПЕРАЦИЙ (Номерфункции): ВЫВЕСТИ^МЕНЮ_ОПЕРАЦИЙ.

Ввести Номер_операции. Цикл-пока Номер_ операции о 4

Выбор Номер__ операции:

1:Вызвать ТАБЛИЦА (Номер_функции);

2:Вызвать КОРЕНЬ (Номер_функции);

3:Вызвать МАКСМИН (Номер_функции);

Все-выбор.

ВЫВЕСТИ_МЕНЮ_ОПЕРАЦИЙ. . Ввести Номер_ операции.

Все-цикл.

Конец подпрограммы.

Подпрограмма ВЫВЕСТИ_МЕНЮ__ОПЕРАЦИЙ похожа на ВЫВЕСТИ__МЕНЮ_ФУНКЦИЙ:

Подпрограмма ВЫВЕСТИ^МЕНЮ__ОПЕРАЦИЙ:

ОЧИСТИТЬ_ЭКРАН. Вывести «Список операций:».

Вывести «1 - получение таблицы значений;». Вывести «2 - определение корней;». Вывести «3 - определение экстремумов;».

. Вывести «4 - выход.».

Вывести «Определите операцию: ».

Конец подпрограммы.

Подпрограмма ТАБЛИЦА(Номер_функции) должна вводить дополни­ тельные данные о границах интервала и значении шага:

153

Часть I. Основы алгоритмизации и процедурное программирование

Подпрограмма ТАБЛИЦА(Номер__функции):

ОЧИСТИТЬ__ЭКРАН.

Вывести «Введите границы интервала» Ввести А, В.

Вывести «Введите шаг». Ввести h.

х=А

Цикл-пока X < В

Если ФУНКЦИЯ(Номер_функции, х, у) то Вывести «х=», х, « у=», у

иначе «х=», х, «значение функции не определено»

Все-если x=x+h

Все-цикл.

ОЖИДАТЬ_НАЖАНИЯ__КЛАВИШИ.

Конец подпрограммы.

Подпрограммы КОРЕНЬ(Номер_функции) и МАКСМИН(Номер_функции) определяются аналогично. Естественно, они также обращаются к под­ программе ФУНКЦИЯ для получения конкретного значения функции в точ­ ке.

Подпрограмма ФУНКЦИЯ будет возвращать логическое значение: true - если значение функции определено, и false - в противном случае. Значение исследуемой функции в точке х подпрограмма будет возвращать через пара­ метр-переменную у:

Подпрограмма ФУНКЦИЯ(Номер_функции, х, у): ФУНКЦИЯ=1гие Выбор Номерфункции:

1:y=sin(x);

2:y=cos(x);

3:Если х>0

то у=1п(х)

иначе ФУНКЦИЯ=Га18е Все-если

4: у=ехр(х)

Все-выбор Конец подпрограммы.

Таким образом, выполняя пошаговую детализацию программы, мы осу­ ществили ее декомпозицию на основную программу и семь подпрограмм (подпрограммы ОЧИСТИТЬ__ЭКРАН и ОЖИДАТЬ^НАЖАНИЯ^КЛАВИШИ являются стандартными процедурами библиотеки управления экраном в т(^кстовом режиме и их можно не учитывать).

154

 

5. Модульное программирование

 

 

Основная

 

 

 

программа

 

 

Вывести меню

 

 

Меню

 

функций

 

 

операций

 

Вывести меню

Таблица

Корень

Максмин

операций

 

 

 

 

 

Функция

Рис. 5.8. Иерархия вызовов подпрограмм программы исследования функций

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

В соответствии с рекомендациями структурного программирования реа­ лизация и отладка программы также должны выполняться поэтапно. Снача­ ла реализуют основную программу, используя вместо подпрограмм следую­ щего уровня «заглушки» (подпрограммы, у которых отсутствуют операторы между begin и end). Затем реализуют эти подпрограммы, используя заглуш­ ки вместо подпрограмм следующего уровня и т.д.

Задания для самопроверки

Задание 1. Дана матрица B(n,m), п, m < 20, m > п. Разработайте программу, ко­ торая приведет матрицу к квадратному виду В(п,п) путем последовательного вычер­ кивания из каждой строки матрицы ее m-n неположительных элементов. Если тако­ вых нет или их не хватает для выравнивания матрицы, то вычеркнуть из начала стро­ ки столько элементов, сколько необходимо для завершения процесса. Вывести на пе­ чать исходную и сформированную матрицы.

Задание 2. Дана символьная матрица SIM(n,m), n,m£20). Разработайте програм­ му, которая вводит значения элементов матрицы с клавиатуры и упорядочивает мат­ рицу, разместив строки в алфавитном порядке в соответствии с символами первого столбца. Для каждой строки матрицы SIM определить, каких букв в ней больше: гласных или согласных. Вывести на печать исходную и отсортированную матрицы, а также информацию о соотношении букв в каждой строке.

155

Часть I. Основы алгоритмизации и процедурное программирование

5.3. Модули

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

Модуль - это автономно компилируемая коллекция программных ресур­ сов, предназначенная для использования другими модулями и программами.

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

Структура модуля выглядит следующим образом:

Unit <имя модуля>;

Interface

<интерфейсная секция>

Implementation

<секция реализации>

[Begin

<секция инициализации>7

End,

Имя модуля долэюно совпадать с именем фагта, в котором он содержит­ ся. Результат компиляции модуля помещается в файл с тем же именем и рас­ ширением .tpu.

Примечание. Среда языка Borland Pascal предусматривает три режима компиляции про­ граммы, использующей модули:

Compile - компилируется только основная программа, все модули должны быть пред­ варительно откомпилированы в файлы <имя модуля>.1ри и размещены либо в текущем ката­ логе, либо в одном из каталогов, указанных как источники файлов .tpu в настройках среды (Options/Directories);

Маке - модули, для которых не обнаружены файлы .tpu, компилируются из соответ­ ствующих файлов .pas, которые должны находиться в текущем каталоге или в каталогах, ука­ занных в настройках среды в качестве источников исходных файлов модулей;

Build - все ранее откомпилированные модули .tpu игнорируются и все модули ком­ пилируются из своих исходных файлов заново.

В процессе отладки модулей целесообразно использовать режим Build, а при отладке профаммы - режим Compile.

Интерфейсная сещия содержит объявление ресурсов (в том числе заго­ ловки подпрограмм), к которым возможны обращения извне.

Секция реализации содержит описание подпрограмм, объявленных в ин­ терфейсной секции, и описание внутренних ресурсов модуля (локальных пе-

156

5. Модульное программирование

ременных, типов, подпрограмм). Обращение к этим ресурсам возможно только из подпрограмм, описанных в том же модуле.

CeKifUH UHuifuanwaifuu содержит операторы, которые выполняют некото­ рые действия, необходимые для нормальной работы процедур модуля (на­ пример, открывают файлы, инициализируют некоторые переменные и т.п.). Операторы секции инициализации выполняются один раз (при подключении модуля) до начала выполнения основной программы. Эта секция в модуле может отсутствовать.

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

Uses <имя модуля!>, <имя модуля2>, ...;

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

Пример 5.4. Разработать модуль, содержащий подпрограмму суммиро­ вания элементов массива.

Разбиваем текст программы примера 5.2 на две части: подпрограмму размещаем в модуле, а тестирующую программу оставляем в качестве основ­ ной программы. Так как все структурные типы параметров должны быть предварительно объявлены, описываем тип массива в модуле.

{Модуль должен размещаться в файле Summa.pas}

Unit Summa;

Interface

{объявление внешних ресурсов}

Туре mas=array[L.]OJ of integer;

Function sunt(b:mas;n:integer).'integer;

Implementation .

Function sum; {описание функции}

Var

s:integer;i:integer;

begin 8:^=0;

for

i:=J to n do s:^s+b[i];

sum:=s;

end;

End.

Программа использует из модуля два ресурса: описание типа mas для объявления массива А и функцию Sum.

Program ex;

Uses Summa; {указание используемого модуля} Var a:mas; {используем ресурс mas}

i,n:integer;

157

Часть L Основы алгоритмизации и процедурное программирование

Begin readln(n);

for i:=l to n do read(a[i]); ReadLn;

WriteLn('CyMMa= \sum(a,n)); {используем ресурс sum}

End

Bee ресурсы, объявленные в интерфейсноЯ части модуля, доступны в основной программе. В случаях перекрытия имен, когда основная програм­ ма и подключенный модуль содержат ресурсы с одинаковыми именами, при обращении к ресурсам модуля используют составные имена

<имя модуля>.<имя ресурса>.

Например, в модуле описана переменная X:

Unit А;

Interface

VarX:real; ...

End

А в основной программе, которая использует этот модуль, объявлена собст­ венная переменная X:

Program ex;

Uses А;

Var X:integer;

Begin

X:=10; {переменная программы}

A.X:=0.45; ... {переменная модуля A}

В виде модулей в Borland Pascal реализованы библиотеки подпрограмм, использование которых существенно упрощает разработку программ.

Вместе с системой программирования на Borland Pascal поставляются следующие библиотеки.

System ~ основная библиотека - содержит описания всех стандартных процедур и функций, таких, как математические функции, функции преобра­ зований, процедуры и функции обработки строк и т.п. Ресурсы данной биб­ лиотеки доступны любой программе без специального указания.

Crt - библиотека управления экраном в текстовом режиме - содержит описание переменных, констант и процедур и функций, обеспечивающих уп­ равление экраном, клавиатурой и динамиком.

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

158

5. Модульное программирование

Dos - библиотека организации взаимодействия с операционной систе­ мой MS DOS - содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы.

Поставляемые вместе с описанными модули ТигЬоЗ, Printer, Graph3, Overlay устарели и практически не используются.

Примечание. Следует иметь в виду, что модули System, Crt, Dos, Printer объединены в файл Turbo.tpl, а модуль Graph поставляется отдельно в виде файла Graph.tpu.

При разработке собственных библиотек программисты стремятся созда­ вать подпрограммы, имеющие широкую область применения, для чего ис­ пользуют специальные средства объявления параметров: открытые массивы и строки, нетипизированные параметры и параметры процедурного типа.

5.4. Открытые массивы и строки

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

Открытый массив - это конструкция описания типа массива без указа­ ния типа индексов, например:

array of real; array of integer;

Такое определение возможно только при описании формальных пара­ метров подпрограммы. Применяя открытые массивы, следует помнить, что индексы параметров, описанных как открытые массивы, всегда начинаются с нуля. Реальное количество элементов фактического параметра массива можно определить двумя способами. Во-первых - передать через дополни­ тельные параметры, во-вторых- использовать специальные функции.

^У/^Л('<идентификатор массива>) - для обычного массив, возвращает верхнюю границу индекса массива, для открытого - максимальное значение индекса.

/,(?н'('<идентификатор массива>) - для обычного массива возвращает нижнюю границу индекса массива, для открытого - ноль.

Проиллюстрируем оба способа.

Пример 5.5. Вернемся к примеру 5.4. Пусть по-прежнему т ебуется раз­ работать модуль, содержащий подпрограмму суммирования элементов мас­ сива, но при условии отсутствия ограничения размерности массива.

159

Часть I. Основы алгоритмизации и процедурное программирование

В решении, предложенном в примере 5.4, размерность массива ограни­ чена: функция может работать только с массивами типа mas. Описание пара­ метра как открытого массива позволит разработать функцию, которую мож­ но использовать для любого массива целых чисел. Реальное количество эле­ ментов массива в этом случае следует передавать через дополнительный па­ раметр п.

Unit Summa2; Interface

Function sum(b:array of integer; n:integer):integer; Implementation function sum;

Var s:integer; i: integer; begin s:=0;

{при вычислении суммы учитываем, что индексы изменяются от О до п-1, всего п элементов}

for i:=0 to П'1 do s:=s+bfij; sum:=s;

end;

End.

Теперь основная программа уже может описывать массив любой размер­ ности и использовать из модуля только функцию определения суммы.

Program ex; Uses Summa2;

Var a:array[l.. 10] of integer; i,n:integer;

Begin ReadLn(n);

for i:=I to n do Read(a[i]); ReadLn; WriteLnCCyMMa=\sum(a,n));

End.

Пример 5.6. Разработать программу суммирования элементов матрицы по строкам, считая, что матрица заполнена целиком.

Функцию суммирования элементов строки матрицы поместим в модуль. Поскольку она суммирует все элементы строки, для получения верхнего зна­ чения индекса будем использовать функцию High.

Unit ЗиттаЗ;

Interface

Function sum(b:array of integer):integer;

160