Перечислимые и ограниченные типы. Константы ::= const ; { ;} ::= = ::= ::= + - ::= program square(input, output); const N=20; pi= ; var R, fi, S: real; begin write(радиус=); read(R); fi:=2*pi/N; {угол} S:=N*(0.5*sqr(R)*sin(fi)); writeln(площадь=, S:15:4) end.
Описание типов ::= type ; { ;} ::= = ::= Перечислимые типы Пример: type месяц=(янв,фев,мар,апр,май,июньь,июльь, авг,сен,окт,ноя,дек); масть=(пики,трефы,бубны,червы);
Описание перечислимого типа type = ; где ::= ( {, }) Описание переменных перечислимого типа Пример: Первый вариант описания переменных type пол=(муж, жен); var некто,кто-то: пол; Второй вариант описания переменных var некто, кто-то: (муж,жен);
Переменные нестандартного типа можно описывать двояко: 1) type T= ; var x,y: T; 2) var x,y: ; Операции над объектами перечислимого типа 1. Функция ord(x). Значением этой функции является порядковый номер константы х в перечне всех констант, указанном при описании его типа. Причем нумерация начинается с 0. Примеры: ord(янв)=0, ord(фев)=1, ord(трефы)=2, ord(false)=0 2. Функция succ(x). Значением этой функции является константа, следующая за х в описании его типа. Примеры: succ(янв)=фев, succ(трефы)=бубны Если х - последняя константа в перечне его типа, то к ней функция succ неприменима: succ(дек) – ошибка
3. Функция pred(x). Значением этой функции является константа, предшествующая х в описании его типа. Примеры: pred(май)=апр, pred(трефы)=пики Если x – первое имя в перечне типа, то pred(x) - не определено: pred(янв) – ошибка. 4. Операции сравнения. К константам одного и того же перечислимого типа можно применять операции сравнения:, >, =, <>. 5. Присваивание. Присваивание новых значений переменным перечислимого типа осуществляется с помощью обычного оператора присваивания v:=е, где v – переменная перечислимого типа, а значение выражения е должно быть того же типа.
Оператор варианта Синтаксис: ::= case of {; } end | case of {; } else ; end if m=янв then k:=31 else if m=фев then k:=28 else... if m=дек then k:=31; case m of янв: k:=31; фев: k:=28; мар: k:=31;... дек: k:=31 end case m of янв,мар,май,июльь,авг,окт,дек: k:=31; апр,июньь,сен,ноя: k:=30; фев: k:=28 end
::= {, } : ::= | ;
Замечания: 1. Выражение между case и of называется селектором и может быть любого простого типа, кроме real. (Дело в том, что для real нельзя перечислить все возможные значения.) 2. Варианты отделяются друг от друга точкой с запятой. За последним вариантом точка с запятой, вообще говоря, не нужна, но ее можно и указать. 3. Оператор варианта обязательно завершается словом end. 4. Константы, перечисленные в вариантах, должны быть того же типа, что и селектор, и должны различаться. Это очевидные требования, т.к. иных значений селектор не может принимать, а если какое-то значение выписать дважды, то будет двусмысленность - будет неясно, какой вариант выбирать при этом значении. Запомните: константы - это явно заданные значения какого-то типа (числа, символы и т.п.) или имена констант. Указывать в вариантах переменные и более сложные выражения нельзя. 5. В варианте указывается только один оператор. Если их надо несколько, следует объединить их в составной оператор. 6. Порядок вариантов и констант в них в операторе варианта произволен 7. Второй вид оператора case используется только в языке Турбо Паскаль!!!
Семантика: вычисляется выражение-селектор и отыскивается вариант, одна из констант которого совпадает со значением селектора. Если такой вариант нашелся, то выполняется оператор этого варианта и на этом завершается выполнение всего оператора варианта. Если же ни в одном из вариантов нет нужной константы, то выполняется оператор следующий после служебного слова else. Если служебное слово else отсутствует, то выполняется следующий оператор за case. Отметим, что это семантика оператора case для языка Турбо Паскаль. В стандартном Паскале используется только первый вариант оператора case, а в случае отсутствия нужной константы фиксируется ошибка !!!
Пример. Пусть значением символьной переменной c является один из знаков '+', ' - ', '*' или '/' и надо вычислить z=x#y, где x, y и z – вещественные переменные, а # - операция, соответствующая этому знаку. Если значение с не совпадает ни с одним из этих символов выдать сообщение об ошибке. С помощью оператора варианта эта задача решается так: case c of '+': z:=x+y; '-': z:=x-y; '*': z:=x*y; '/': z:=x/y; else writeln (Ошибка в операции); end
Ограниченные типы type день=1..31; var d: день; Описание ограниченного типа type = ; где ::=.. Примеры: type цифра = '0'..'9'; натур = 1..maxint; лето = июнььь..август; ложь = false..false;
Описание переменных ограниченного типа var : ; или var : ; Примеры: var digit: цифра; k,m: натур; m:лето; малое:-9..9; буква:'A'..'Z'; Операции для ограниченных типов К объектам ограниченного типа применимы любые операции базового типа. Единственное отличие - в присваивании: присваивать переменным ограниченного типа можно только те объекты базового типа, которые принадлежат диапазону, указанному в описании ограниченного типа. Причем за этим следит сам компьютер: прежде чем присвоить значение такой переменной, он проверяет, попадает ли это значение в диапазон или нет; если нет - фиксируется ошибка.