Каталог Индекс раздела
Назад Оглавление

Лабораторная работа N 11
МОДУЛИ В ТУРБО ПАСКАЛЕ

1. ЦЕЛЬ РАБОТЫ: Закрепление знаний о модулях; разработка модуля и программы с его использованием.

2. ОСНОВНЫЕ СВЕДЕНИЯ

В стандартном языке Паскаль модули отсутствуют. Этот недостаток долгое время служил препятствием для применения Паскаля в качестве языка профессионального программирования. Модули появились в Турбо Паскале начиная с версии 4.0. Это сразу же вывело Турбо Паскаль на передовые позиции профессионального программирования.

Модуль не представляет собой исполняемой программы, а только содержит набор средств для использования в исполняемой программе: типы данных, переменные, процедуры и функции. Исходный текст модуля имеет расширение .pas. Модуль компилируется отдельно от основной программы, откомпилированный модуль имеет расширение .tpu (Turbo Pascal Unit). Готовый откомпилированный модуль может быть использован в основной программе с помощью предложения uses, которое записывается сразуже после имени программы.

В Турбо Паскале имеются стандартные модули: DOS, CRT (Cathode Ray Tube, электронно-лучевая трубка), Printer, Graph, System и другие. Их не надо описывать, а можно сразу включать в программу предложением uses. Модуль System используется во всех программах, поэтому для него сделано исключение, его можно не включать в предложение uses, он будет подключен автоматически. Остальные модули требуют включения в предложение uses, если в программе используются ресурсы модуля, например, процедуры и функции.

Назначение стандартных модулей следующее. Модуль DOS использует системные ресурсы операционной системы MS-DOS . Возможно использование регистров, обслуживание прерываний, вызов других программ из программы на Паскале. Модуль CRT используется для обслуживания видеомонитора, клавиатуры, встроенного динамика. Процедуры очистки экрана clrscr и ожидание нажатия клавиши readkey содержатся именно в модуле CRT.

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

Кроме стандартных модулей, в Турбо Паскале возможны модули пользователя, Они требуют описания, которое начинается ключевым словом языка unit и содержат 3 раздела: раздел интерфейса (interface), раздел реализации (implementation), раздел инициализации (необязательный).

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

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

Рассмотрим пример модуля для работы с комплексными числами. Комплексное число состоит из двух вещественных чисел, действительной и мнимой частей соответственно. Пусть имеются два комплексных числа x и y: x=a+bi; y=c+di. Здесь i квадратный корень из минус единицы (мнимая единица), причем i2= - 1. Если комплексное число z=e+fi, и z есть результат операции над x и y, то

z=x+y; e=a+c: f=b+d;  (сложение)
z=x-y; e=a-c: f=b-d;  (вычитание)
z=x*y; e=a*c-b*d: f=a*d+b*c;  (умножение)
z=x/y; e=(a*c+b*d)/(c2+d2): f=(c*b-a*d)/(c2+d2):  (деление)

Легко видеть, что при сложении и вычитании складываются и вычитаются соответственно действительные и мнимые части комплексных чисел, умножение и деление более сложны.

Для организации операций над комплексными числами представим каждое комплексное число в виде записи из двух полей вещественного типа: Re -действительная часть, Im - мнимая часть. Создадим модуль complex, в котором опишем комплексный тип com с двумя полями. В этом же модуле в разделе интерфейса опишем процедуры ad (сложение), su (вычитание), mu (умножение), di (деление) комплексных чисел (только заголовки). Тела процедур поместим в раздел реализации модуля. Раздел инициализации имеет вид:

begin
  операторы
end.

Если раздел инициализации не содержит операторов, как в нашем примере, достаточно написать только end. Пример модуля complex.pas.

unit complex;{модуль арифметики комплексных чисел}
{$N+}
interface
uses dos,crt;
type com=record
  re,im:real;
end;
var a,b,c:com;
procedure ad(var a,b,c:com);{сложение,  c=a+b}
procedure su(var a,b,c:com);{вычитание, c=a-b}
procedure mu(var a,b,c:com);{умножение, c=a*b}
procedure di(var a,b,c:com);{деление,   c=a/b, случай  b =0 не предусмотрен }                   
procedure wr_com(var p:com); {печать комплексного числа}
implementation
procedure ad(var a,b,c:com);
 begin c.re:=a.re+b.re;
 c.im:=a.im+b.im;
end;{ad}
procedure su(var a,b,c:com);
begin c.re:=a.re-b.re;
c.im:=a.im-b.im;
end;{su}
procedure mu(var a,b,c:com);
begin c.re:=a.re*b.re-a.im*b.im;
c.im:=a.re*b.im+a.im*b.re;
end;{mu}
procedure di(var a,b,c:com);
var d:real;
begin  d:=b.re*b.re+b.im*b.im;
c.re:=(a.re*b.re+a.im*b.im)/d;
c.im:=(b.re*a.im-a.re*b.im)/d;
end;{di}
procedure wr_com(var p:com);
  begin
    if p.im<0 then writeln(p.re:9:5,'-',-p.im:9:5,'i') else
    writeln(p.re:9:5,'+',p.im:9:5,'i');
  end;{wr_com}
begin
end.{unit}

Как уже было указано, модуль не может непосредственно выполняться. Нужно разработать основную программу, которая использует ресурсы модуля. В данном случае это программа com_arif.pas (комплексная арифметика). В программе вводятся 2 комплексных числа, затем с ними выполняются действия сложения, вычитания, умножения и деления, результаты выводятся на экран.

program com_arif;
 uses complex;
 var x,y,z:com; {тип com определен в модуле complex}
 begin
   writeln('Введите дейст. и мн. части первого числа');
   read(x.re,x.im);
   writeln('Введите дейст. и мн. части второго числа');
   read(y.re,y.im);
   write('x='); wr_com(x);
   write('y='); wr_com(y);
   ad(x,y,z); {z=x+y}
   write('x+y=');wr_com(z);
   su(x,y,z); {z=x-y}
   write('x-y=');wr_com(z);
   mu(x,y,z); {z=x*y}
   write('x*y=');wr_com(z);
   di(x,y,z); {z=x/y}
   write('x/y=');wr_com(z);
 end.

3. ВЫПОЛНЕНИЕ РАБОТЫ

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

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

Варианты заданий.

  1. В основной программе вводятся начальная скорость снаряда v и угол , под которым вылетает снаряд. В модуле рассчитываются координаты снаряда в момент времени t (до падения на землю): x = vt cos ; y = vt sin - gt2/2. Напечатать координаты начальной точки, верхней точки, конечной точки траектории.
  2. В основной программе вводятся стороны треугольника a, b, c. В модуле проверяются неравенства треугольника (a<b+c; b<a+c; c<a+b) и вычисляется площадь треугольника. Ввести данные двух треугольников и вывести результаты.
  3. В основной программе вводятся внешний R и внутренний r радиусы кольца. В модуле рассчитывается площадь кольца. Ввести данные двух колец и вывести результаты.
  4. Башня представляет сочетание цилиндра с известными радиусом и высотой и полушара с радиусом, равным радиусу цилиндра. Разработать модуль, в котором вычисляется объем башни, и основную программу с вводом данных для двух башен и выводом результатов.
  5. В модуле по сопротивлениям трех резисторов, соединенных последовательно, определяется общее сопротивление. В основной программе вводятся данные двух троек резисторов и выводятся результаты.
  6. В модуле по емкостям трех конденсаторов, соединенных последовательно, определяется общая емкость. В основной программе вводятся данные двух троек конденсаторов и выводятся результаты.
  7. В модуле по сопротивлениям трех резисторов, соединенных параллельно, определяется общее сопротивление. В основной программе вводятся данные двух троек резисторов и выводятся результаты.
  8. В модуле по емкостям трех конденсаторов, соединенных параллельно, определяется общая емкость. В основной программе вводятся данные двух троек конденсаторов и выводятся результаты.

4. ФОРМА ОТЧЕТА

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

5. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Какое расширение имеет исходный файл модуля? Откомпилированный файл?
  2. Какие разделы имеются в модуле? Какой раздел модуля доступен для программ и других модулей? Какой недоступен?
  3. Какие ресурсы модуля могут использоваться в программах?
  4. Каковы преимущества использования модулей?
  5. Имеется ли в разработанном вами модуле раздел инициализации?
  6. Назначение раздела инициализации модуля.
  7. В каком разделе модуля помещаются тела процедур и функций?

Каталог Индекс раздела
Назад Оглавление