Журнал «Мир ПК», #06/2001
Вернуться к статье

Листинг 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; 

Вернуться к статье
475