Листинг 1. Модуль Time. Секундомер. Расширение типа. Связанные процедуры
TYPE
T* = RECORD
hour* : INTEGER; (* [0..23] *)
min* : INTEGER; (* [0..59] *)
sec* : INTEGER; (* [0..59] *)
msec* : INTEGER; (* [0..TactSEC-1] *)
END;
Stopwatch* = RECORD (T)
start : LONGINT; (* начальное время
в упакованном виде *)
on- : BOOLEAN; (* контроль
состояния: включен ли? *)
END;
PROCEDURE (VAR t: T) Pack* (): LONGINT;
VAR p: LONGINT; (* процедура связана с типом T; это
реализация метода класса *)
BEGIN
ASSERT((t.hour >= 0) & (t.hour <= 23)); (* контрольные
вставки *)
ASSERT((t.min >= 0) & (t.min <= 59));
ASSERT((t.sec >= 0) & (t.sec <= 59));
ASSERT((t.msec >= 0) & (t.msec <= 999));
p := t.hour * 60; (* упаковываем время, переводим
в бинарный вид *)
p := p + t.min; p := p * 60;
p := p + t.sec; p := p * TactSEC;
p := p + t.msec;
RETURN p
END Pack;
PROCEDURE (VAR sw: Stopwatch) Start* ;
VAR t: T;
BEGIN
ASSERT(~sw.on);
sw.on := TRUE; t.Get; sw.start := t.Pack();
END Start;
PROCEDURE (VAR sw: Stopwatch) Stop* ;
VAR t,t2: T; dlt: LONGINT;
BEGIN
ASSERT(sw.on);
sw.on := FALSE; t.Unpack(sw.start); t2.Get;
dlt := t.Delta(t2);
sw.Inc(dlt); sw.start := 0;
END Stop;
Вернуться к статье
Листинг 2. Модуль TypeWriter. Простейшая «печатная машинка»
MODULE TypeWriter;
IMPORT Out;
VAR sOn- : BOOLEAN;
TYPE Register* = RECORD
ch* : CHAR;
str* : ARRAY 128 OF CHAR;
END;
VAR r* : Register;
(* —- основные процедуры *)
PROCEDURE Char*;
BEGIN Out.Char(r.ch);
END Char;
PROCEDURE NewLine*;
BEGIN Out.Ln;
END NewLine;
PROCEDURE String*;
BEGIN Out.String(r.str);
END String;
(* —- процедуры изменения состояний и регистров *)
PROCEDURE StateOn;
BEGIN sOn := TRUE;
END StateOn;
PROCEDURE StateOff;
BEGIN sOn := FALSE;
END StateOff;
PROCEDURE ResetRegister;
BEGIN r.ch := 0X; r.str[0] := 0X;
END ResetRegister;
(* —- процедуры включения и выключения машины *)
PROCEDURE On*;
BEGIN StateOn; ResetRegister;
END On;
PROCEDURE Off*;
BEGIN StateOff; ResetRegister;
END Off;
BEGIN
On;
END TypeWriter.
Вернуться к статье
Листинг 3. Уровень внешнего представления (View). Модуль Triangle
MODULE Triangle; (* головной модуль проекта *)
IMPORT
In, (* RTS *)
TT := TriangleTF; (* спец.преобразователь *)
PROCEDURE Main;
VAR s: ARRAY 256 OF CHAR;
BEGIN
TT.Print(?—- Золотой треугольник?);
In.Open; In.Echo(FALSE);
REPEAT
In.String(s);
TT.Print(s);
TT.ExecCommand(s);
UNTIL TT.Stop();
TT.Print(?—- Работа окончена?);
END Main;
BEGIN
Main;
END Triangle.
Вернуться к статье
Листинг 4. Интерфейс модуля Pascaline
DEFINITION Pascaline;
TYPE
Register = RECORD (* регистры машины *)
ind1* : SHORTINT;
ind2* : SHORTINT;
int* : LONGINT;
result* : LONGINT;
END;
VAR
r* : Register;
sOn- : BOOLEAN;
sBadIndex- : BOOLEAN;
sPrimeIsEmpty- : BOOLEAN;
(* —- команды машины *)
PROCEDURE On;
PROCEDURE Off;
PROCEDURE C; (* C(i,j) - вычисление бин. коэфф. *)
PROCEDURE F; (* F(i) - i-e число Фибоначчи *)
PROCEDURE InitPrime;
PROCEDURE FirstPrime;
PROCEDURE NextPrime;
PROCEDURE CountPrime;
(* —- настройка машины *)
TYPE
ProcType1 = PROCEDURE (i: SHORTINT; j: SHORTINT):
LONGINT;
ProcType2 = PROCEDURE (i: SHORTINT): LONGINT;
VAR
PascalTriangle* : ProcType1;
Fibonacci* : ProcType2;
PROCEDURE PascalTriangle0 (i: SHORTINT; j: SHORTINT):
LONGINT;
PROCEDURE PascalTriangle1 (i: SHORTINT; j: SHORTINT):
LONGINT;
PROCEDURE PascalTriangle2 (i: SHORTINT; j: SHORTINT):
LONGINT;
PROCEDURE Fibonacci0 (i: SHORTINT): LONGINT;
PROCEDURE Fibonacci1 (i: SHORTINT): LONGINT;
PROCEDURE Fibonacci2 (i: SHORTINT): LONGINT;
PROCEDURE Fibonacci3 (i: SHORTINT): LONGINT;
PROCEDURE Fibonacci4 (i: SHORTINT): LONGINT;
END Pascaline.
Вернуться к статье
Листинг 5. Уровень модели (Model). Модуль Pascaline. Структуры данных
TYPE (* регистры машины *)
Register* = RECORD
ind1* : SHORTINT;
ind2* : SHORTINT;
int* : LONGINT;
result* : LONGINT;
END;
TYPE (* процедурные типы для переключателей процедур *)
ProcType1* = PROCEDURE (i: SHORTINT; j: SHORTINT):
LONGINT;
ProcType2* = PROCEDURE (i: SHORTINT): LONGINT;
VAR (* абстрактные процедуры для разных вариантов *)
PascalTriangle* : ProcType1;
Fibonacci* : ProcType2;
CONST
MaxPasINDEX = 31; (* 0..31 *)
MaxFibINDEX = 45; (* 0..45 *)
MaxFactINDEX = 12; (* 0..12 *)
PasCOUNT = ((MaxPasINDEX DIV 2)-1) * ((MaxPasINDEX-1)
DIV 2); (* 210 *)
FibCOUNT = 32;
VAR
r* : Register;
primeDesc: PrimeDesc;
isPrime : POINTER TO ARRAY OF SET;
pas : ARRAY PasCOUNT OF LONGINT;
fib : ARRAY FibCOUNT OF LONGINT;
|