2.7. Раздел описания типов Помимо вышеперечисленных стандартных типов, в Паскале могут быть применены типы, определенные пользователем, т.е. перечисляемые и интервальные типы. Перечисляемые типы задаются непосредственным перечислением всех значений, которые может принимать переменная данного типа. Описать типы, определенные пользователем, можно в разделе Var или предварительно в разделе Туре, а затем - в Var. рассмотрим оба варианта. Пусть нам нужна переменная с именем season (сезон года). она может принимать значения winter (зима), spring (весна), summer (лето), autumn (осень), другие значения она принимать не может. Тогда нужно сделать следующее описание: Var season: (winter, spring, summer, autumn). Здесь тип season задан перечислением всех констант, которые могут быть занесены в ячейку памяти season. Попытка занести в ячейку season любое другое значение приведет к ошибке - "несоответствие типа". Если переменных данного типа будет несколько, удобнее и нагляднее вначале определить тип в разделе Туре (описание типа), а затем в разделе Var сослаться на этот тип, и машина в Var выделит конкретные ячейки памяти для хранения данных указанного типа. Например, необходимо определить, что Gi, G2, G3, G4 будут ячейками памяти, в которых могут храниться наименования газов Со, О, N, F, а в ячейках памяти Metall1, Metall2, Metall3 - наименования металлов Fе, Со, Na, Cu, Zn, тогда можно применить описание: VAR GI, G2, G3, G4: (CO,O,N,F); Metall1, Metall2, Metall3: (Fe,Co,Na,Cu,Zn). Можно использовать и другое, более наглядное описание. вначале определить тип Gaz, Met, а затем на них сослаться: Туре Gaz=(Co, О, N, F); Met = (Fе, Со, Na, Cu, Zn); Var GI, G2, G3, G4 : GAZ; Metall1, Metall2, Metall3, Met; Особенно удобно применение раздела Туре, если он находится во внешнем блоке, а ссылки на него идут во внутренних блоках. Тогда значительно экономится память, поскольку она может быть практически одной и той же в разных блоках. При описании переменных перечисляемого типа данные внутри скобок являются константами, которые может принимать описываемая переменная. Над данными такого типа допустимо выполнять операции отношения и логические операции (см. далее). Например, для приведенного выше описания данного season будет истинным высказывание: "winter < spring". При работе с данными перечисляемого типа можно применять стандартные функции Succ, Рred, Ord. Succ (аргумент) возвращает значение, следующее за элементом, указанным как аргумент. Если следующего элемента нет (закончились), то это приводит к программному прерыванию (ошибке). Рred (аргумент) возвращает предыдущее значение из перечня констант, из которых состоит данный тип. Ord (аргумент) возвращает порядковый номер аргумента в списке констант, перечисленных в описании в виде целого числа. Элементы пронумерованы в порядке 0,1,2,..., т.е. первый элемент имеет номер 0. Пример: Туре month = (jan,fab,mar,apr,may,jun,jul,aug,sep,ocf,nov,dec); Var a,b,c,d,c,mes: month; f,h,g: integer; Begin mes: =jul; a: = Pred (mes); {в a находится 'jun'} b: = Succ (mes); {в b находится 'aug'} с: = Pred (pred(mes)); {в с находится 'mау'} d: = Succ(succ(mes)); {в d находится 'sep'} e: = Succ (pred(mes)); {в е находится 'jul'} f: =Ord (mes); {в f находится 6} h: = Ord (pred(mes)); {в h находится 5} g: = Ord (succ(mes)); {в g находится 7} END Интервальный тип задается диапазоном изменения констант внутри какого-либо уже имеющегося перечисляемого или стандартного типа, кроме вещественного (integer, byte, boolean, char). Значение первой константы должно быть меньше значения второй константы диапазона. Туре Dni = 1...31; Litera = 'a',...,'z', Var Rabdni,bolndni, vuhod: dni; {могут принимать значения 1-31} im,ident: litera; {могут принимать значения 'A'-'Z'} Выход за пределы диапазона вызывает программное прерывание. Допускается задание диапазона именами констант: Const min = 1; max = 31; Туре Dni = min…max; Var rabdni,boldni,vuhoddni:dni; Для интервального типа также возможно применять функции Succ, Pred, Ord. |