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;