Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр1.doc
Скачиваний:
9
Добавлен:
19.09.2019
Размер:
1.03 Mб
Скачать

Лекция 5

5.1 Простые типы данных

Элементы любого простого типа данных представляют собой упорядоченное множество. Следовательно, элементы простого типа могут быть связаны отношениями

=, <>, >, >=, <=, <.

Отношение между элементами простого типа является булевской величиной (относится к типу BOOLEAN).

Все простые типы данных, кроме вещественных, относятся к ординальным типам данных.

Для ординальных типов данных в языке TP определены операции, которые реализованы в функциях и процедурах:

PRED (predecessor -предшествующий),

SUCC (succeedent – последующий),

ORD (ordinal – порядковое числительное),

Dec (decrease – уменьшать),

Inc (increase – увеличивать),

SIZEOF (size of … - размер чего-либо)

Функции PRED и SUCC получают в качестве аргумента значение ординального типа и возвращают предыдущий или последующий элементы этого типа. Считается ошибкой применение функции PRED к первому элементу, а функции SUCC к последнему элементу множества значений данного ординального типа. Функция ORD возвращает порядковый номеp элемента данного ординального типа, пеpвый элемент имеет номер 0, втоpой - 1 и т.д. Исключение представляют данные целого типа, поскольку ORD с целочисленным аргументом возвращает сам аргумент. Функцию ORD можно считать функцией пpеобpазования типа, поскольку для любого ординального аргумента результат будет целочисленный.

Процедуры Dec (или Inc) позволяют увеличить (или уменьшить) аргумент на заданную величину. Например функция Dec(x,n) (или Inc (x,n)) увеличивает (или уменьшает) значение ординальной переменной x на n значений. Если параметр n опущен, то увеличение (уменьшение) происходит на 1.

Для любого типа данных (в том числе и для простого) определена функция SIZEOF(X), которая возвращает размер памяти под аргумент X в байтах. В этой функции в качестве аргумента можно использовать имя константы, имя переменной или типа данных.

5.1.1 Перечислимый тип

Перечислимый ординальный тип описывается прямым перечислением константных значений этого типа в скобках через запятую. В качестве константных значений используются идентификаторы. Например:

type week_day=(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday);

На множестве значений перечислимого типа определен естественный порядок Monday<Tuesday<Wednesday<…<Sunday. Если х и у – переменные var x,y:week_day; то можно переменным х и у присвоить значения, например: х:=Wednesday; y:=SUCC(x); применение функции ORD(Monday) – дает значение 0 целого типа, ORD(x) – 2 , ORD(y) – 3 ;

5.1.2 Интервальный тип

Интервальный ординальный тип (или тип – диапазон) является подмножеством последовательных величин ранее определенного (или предопределенного) перечислимого или стандартного ординального типа (базового типа).

Если тип 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.