Интервальный ординальный тип (или тип – диапазон) является подмножеством последовательных величин ранее определенного (или предопределенного) перечислимого или стандартного ординального типа (базового типа).
Если тип week_day ранее определен, мы можем создать новый тип, например:
TYPE work_day=Monday..Friday;
На интервальном типе данных определены те же операции, что и на базовом. Однако программист должен гарантировать корректность операций на шаге выполнения. Если var D:work_day, то на шаге выполнения программы фрагмент D:=Friday; D:=SUCC(D) приведет к ошибке, поскольку для интервального типа work_day значение Friday является последним и не имеет последующего.
program datas;
type
week_day=(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday);
dat=1..31;
month=(January,Fabruary,March,April,May,June,July,
August,September,October,November,December);
year=1900..2100;
attr_of_day=record
w_d:week_day;
d:dat;
m:month;
y:year
end;
var
today:attr_of_day;
kol:integer;
function pred_week_day(w:week_day):week_day;
begin
if w=Monday then pred_week_day:=Sunday else pred_week_day:=pred(w)
end;
function pred_month(m:month):month;
begin
if m=January then pred_month:=December else pred_month:=pred(m)
end;
procedure pred_dat(var t:attr_of_day);
begin
if t.d=1 then
begin
t.m:=pred_month(t.m);
if t.m=December then t.y:=t.y-1;
case t.m of
January,March,May,July,August,October,December:t.d:=31;
Fabruary:if (t.y mod 4)=0 then t.d:=29 else t.d:=28;
April,June,September,November:t.d:=30
end
end else t.d:=t.d-1;
t.w_d:=pred_week_day(today.w_d);
end;
begin
today.w_d:=Monday;
today.d:=2;
today.m:=October;
today.y:=2006;
repeat
pred_dat(today);
if (today.y<=2000) and (today.w_d=Monday) and (today.d=13)
then kol:=kol+1;
until (today.y=1901) and (today.m=January) and (today.d=1);
writeln('Kol= ',kol:4)
end.