Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции(ЯВУ)-Паскаль.doc
Скачиваний:
65
Добавлен:
31.03.2015
Размер:
1.08 Mб
Скачать

True False Рис. 9.12

Блок-схема процедуры findnod.

True

False

Рис. 9.13

Программа на языке Паскаль, использующая процедуру.

Program Exam7;

Var

A, B, Nod: integer;

procedure findnod (A, B: integer; Var Nod: integer);

Var R: integer;

Begin

If A mod B <>0 do

Begin

R:= A mod B;

A:=B; B:=R;

Findnod(A,B,Nod);

End

Else

Nod:=B;

End;

Begin A:=0; B:=0;

While (A<=0) or (B<=0) do begin

Writeln('Input A,B <>0 :');

Readln(A,B);

End;

findnod(A,B,Nod);

Writeln('Nod(A,B) = ',Nod);

Readln;

End.

Результаты тестирования.

1. Исходные данные:

A=84

B=36

Результат: Nod(A,B)=12

  1. Тестовый пример 2:

A=84

B=56

Результат: Nod(A,B)=28

Результаты, выданные программой.

  1. Тестовый пример1

InputA,B<>0 :

84

36

Nod(A,B) = 12

  1. Тестовый пример 2

InputA,B<>0 :

84

56

Nod(A,B) = 28

Программа на языке Паскаль, использующая функцию.

Program Exam11;

Var

A, B, Nod: integer;

Function findnod (A, B: integer): integer;

Var R: integer;

Begin

R:=1;

While R<>0 do

Begin

R:=A mod B;

A:=B; B:=R;

End;

findnod :=A;

End;

Begin A:=0; B:=0;

While (A<=0) or (B<=0) do begin

Writeln('Input A,B <>0 :');

Readln(A,B);

End;

Nod := findnod(A,B);

Writeln('Nod(A,B) = ',Nod);

Readln;

End.

Результаты тестирования.

  1. Тестовый пример 1

Исходные данные:

A=84

B=36

Результат: Nod(A,B)=12

  1. Тестовый пример 2

Исходные данные:

A=84

B=56

Результат: Nod(A,B)=28

Результаты, выданные программой.

Тестовый пример1

InputA,B<>0 :

84

36

Nod(A,B) = 12

Тестовый пример 2

InputA,B<>0 :

84

56

Nod(A,B) = 28

9.7. Модули

Одним из слабых мест механизма подпрограмм в BorlandPascal7.0 является то, что они встроены в тело программы. Подпрограммы нельзя отдельно компилировать, отлаживать и использовать другими программами. Для того, чтобы можно было подпрограммы отдельно компилировать и вызывать многими программами, необходимо использовать модули.

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

Модуль имеет свой заголовок:

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

и два раздела: интерфейсную часть (interface) и исполняемую часть (implementation).

Общая структура модуля имеет следующий вид:

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

Interface

<объявления видимых объектов модуля: типов, констант, переменных, заголовков подпрограмм >

implementation

<описания скрытых объектов: процедур и функций>

begin

<операторы инициализации модуля6>

end.

Интерфейсная часть может включать следующие компоненты:

Interface

Uses<список используемых модулей >;

<раздел объявления констант (Const)>

<раздел объявления типов (Type) >

<раздел объявления переменных (Var)>

<раздел заголовков процедур и функций>.

Список используемых модулей содержит имена стандартных модулей, кроме модуля System, такие как Crt, Graph, Overlay, Dos, и имена модулей, созданных пользователем. Имена в списке разделяются запятыми.

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

Традиционные правила области действия глобальных и локальных переменных для модулей не выполняются. Языковая конструкция Unit (модуль) была специально включена в систему Borland Pascal для того, чтобы исключить влияние глобальных переменных, объявленных в главной программе, на описания подпрограмм, входящих в модули, которые эта программа использует.

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

Unit globals;

Interface

Const L=100;

Type Tvector = array[1..L] of integer;

Implementation

End.

В этом случае исполнительная часть implementationявляется пустой.

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

  • function Vect_Max(Vect:TVector; N:byte): byte; - возвращает индекс максимального элемента массива из N элементов;

  • function Vect_Min(Vect:TVector; N:byte): byte; - возвращает индекс минимального элемента массива;

  • procedure Print_Vect(Vect:TVector; N:byte); - выдает все элементы массива на экран;

  • procedure Vect_Inverse(Var Vect:TVector; i1,i2:byte); - меняет местами максимальный и минимальный элементы одномерного массива.

Кроме того, модуль Vector использует модуль глобальных описаний globals.

Текст модуля Vector.

unit Vector;

interface

Uses globals;

function Vect_Max(Vect:TVector; N:byte): byte;

function Vect_Min(Vect:TVector; N:byte): byte;

procedure Print_Vect(Vect:TVector; N:byte);

procedure Vect_Inverse(Var Vect:TVector; i1,i2:byte);

implementation

function Vect_Max(Vect:TVector; N:byte): byte;

Var Max:integer;

im,i: integer;

begin

Max:=Vect[1]; im:=1;

for i:=1 to N do

if Max<Vect[i] then begin

Max:=Vect[i]; im:=i;

end;

Vect_Max:=im;

end;

function Vect_Min(Vect:TVector; N:byte): byte;

Var Min:integer;

im,i: integer;

begin

Min:=Vect[1]; im:=1;

for i:=1 to N do

if Min>Vect[i] then begin

Min:=Vect[i]; im:=i;

end;

Vect_Min:=im;

end;

procedure Print_Vect(Vect:TVector; N:byte);

Var i: integer;

begin

writeln;

for i:=1 to N do write(Vect[i],' ');

end;

procedure Vect_Inverse(Var Vect:TVector; i1,i2:byte);

Var t: integer;

begin

t:=Vect[i1]; Vect[i1]:=Vect[i2]; Vect[i2]:=t;

end;

end.

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

Program Main;

Uses globals,vector;

Var A: TVector;

i,N:byte;

n1,n2:byte;

begin

writeln;

writeln(' Input N<=100');

readln(N);

writeln(' Input array A of N elements :');

for i:=1 to N do read(A[i]);

n1:=Vect_Max(A,N);

n2:=Vect_Min(A,N);

Vect_Inverse(A,n1,n2);

Print_Vect(A,N);

Readln;

end.

Тестовый пример. Результаты, выданные программой Main.

Input N<=100

10

Input array A of N elements :

1 2 3 4 5 64 7 8 9 19

64 2 3 4 5 1 7 8 9 19