- •Лекции 17-19: Модули и их использование.
- •1. Концепция модуля.
- •2. Структура описания модуля.
- •Interface
- •3. Разработка модулей.
- •4. Примеры модулей.
- •Interface
- •Implementation
- •Interface
- •Implementation
- •5. Использование модулей в программах.
- •6. Стандартный модуль сrt.
- •7. Стандартный модуль graph.
3. Разработка модулей.
Разработка модуля включает создание текста модуля, компиляцию модуля и его отладку на примерах использования в тестовых программах.
А) Создание текста модуля. Текст модуля подобен тексту программы, поэтому к его разработке применима в целом та же методика, что и для разработки программ с подпрограммами.
Б) Компиляция и отладка модуля. Для использования разработанного модуля (в том числе и для его отладки на программах-примерах) необходимо получить откомпилированный код модуля. Эта операция легко выполняется с помощью интегрированной среды Турбо Паскаля. Результатом компиляции модуля является одноименный с модулем файл с расширением tpu (сокращение от TURBO PASCAL Unit). Этот файл следует поместить в папку, доступную при компиляции.
Отладка модуля обычно предполагает выполнение тестовой программы, в которой имеются, по меньшей мере, обращения ко всем компонентам, описанным в спроектированном модуле. Более качественное тестирование должно следовать соответствующим критериям тестирования.
4. Примеры модулей.
Приведем примеры разработанных модулей на Турбо Паскале.
Примером простого модуля является модуль points, содержащий некоторые подпрограммы работы с точками на плоскости, константу null - начало координат, а также тип point, представляющий координаты точки. Инициализирующая часть модуля содержит оператор randomize. Тестом этого модуля является программа test_points.
UNIT points;{Точки на плоскости}
Interface
type point = array[1..2] of real;{координаты точки}
const null:point =(0,0);{начало координат}
procedure rpoint(var x:point); {случайная точка}
procedure r(x:point;var d:real);{расстояние точки х от null}
function dist(x,y:point):real;{расстояние между точками x и y}
function line(x,y,z:point):Boolean;{точки x,y,z на одной прямой}
Implementation
procedure rpoint;
begin x[1]:=random(100)/10;x[2]:=random(90)/10 end{rpoint};
procedure r;
begin d:=sqrt(sqr(x[1])+sqr(x[2])) end {r};
function dist;
begin dist:=sqrt(sqr(x[1]-y[1]) + sqr(x[2]-y[2])) end {dist};
function line;
begin line:=false;if (dist(x,y)=dist(x,z)+dist(y,z)) then line:=true;
if (dist(x,z)=dist(x,y)+dist(y,z)) then line:=true;
if (dist(z,y)=dist(x,z)+dist(x,z)) then line:=true;
end {line};
begin randomize;
END {points}.
program test_points; {Тест модуля points}
uses points;
var a,b,c:point;s:string[1];ra,rb,rc:real;
begin repeat writeln('Генерация точек a,b,c:');
rpoint(a);rpoint(b);rpoint(c);
writeln('a[1] a[2] b[1] b[2] c[1] c[2] ');
writeln(a[1]:2:2,' ',a[2]:2:2,' ',b[1]:2:2,' ',b[2]:2:2,' ',c[1]:2:2,' ',c[2]:2:2);
writeln('Расстояния от начала координат:');r(a,ra);r(b,rb);r(c,rc);
writeln('ra=',ra:2:2,' rb=',rb:2:2, ' rc=',rc:2:2);
writeln('Расстояния между точками:');
writeln('dist(a,b)=',dist(a,b):2:2);
writeln('dist(b,c)=',dist(b,c):2:2);
writeln('dist(a,c)=',dist(a,c):2:2);
if line(a,b,c) then
writeln('line(a,b,c)=true {Точки а,в,с -лежат на одной прямой}')
else
writeln('line(a,b,c)=false {Точки а,в,с -не лежат на одной прямой}');
a:=b; writeln('a:=b; dist(a,b)=',dist(a,b):2:2);
if line(a,b,c) then writeln(' line(a,b,c)=true');readln(s);
until s=' ';
end {test_points}.
Представленный ниже модуль convert содержит два компонента: тип - массив из 5 строк и процедуру преобразования целого числа в название числа. Для тестирования этого модуля использована программа demo_conv_int, позволяющая в цикле вводить исходные числа и выводить их названия на экран.
UNIT convert; {Преобразование целого числа в строку - название числа}