- •Синтаксис для выражений (логического | целого | …) типа данных.
- •Отличия операторов case и if
- •Рекурсия
- •Область видимости идентификаторов
- •Реализация абстрактных данных с помощью модуля счетчика
- •Рекурсивное уравнение
- •11 Лекция
- •Алиасинг
- •Спецификация программы
- •Корректность программы
- •Основной вопрос программирования
Сколько элементов может содержать множество типа SET OF BOOLEAN, SET OF CHAR?
2, 256(255?)
Пример перечислимого типа данных. Итерация по перечислимому типу.
Часто возникает ситуация когда необходим небольшой набор значений, где каждое значение имеет мнемоническое имя. Вместо использования символьных констант, Паскаль-программисты могут использовать произвольные идентификаторы для обозначения таких констант.
Любой список идентификаторов Паскаля может быть описан как тип данных с одним ограничением, что в данной области видимости каждый идентификатор появится не чаще одного раза. Например, объявления:
TYPE
DayOfWeek = (Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday);
VAR
Day : DayOfWeek;
описывают новый тип, называемый день недели, семь констант, входящих в него записаны как идентификаторы, именующие дни недели, и переменная Day может принимать любые из этих константных значений. Day может принимать значения только из списка заданного в DayOfWeek. Значения DayOfWeek упорядочены так, как они перечисляются в объявлении типа:
Monday < Tuesday < ... < Sunday
Таким образом, есть возможность записывать операторы следующим образом:
IF Day < Saturday
THEN {не weekend}
...
<перечислимый тип> ::= (<список идентификаторов>)
<список идентификаторов> ::= <список идентификаторов>, <идентификатор>
| <идентификатор>
Контекстное правило:
<идентификаторы> <перечислимого типа> не могут дублировать другие идентификаторы в данной области видимости
FOR Day := Tuesday TO Sunday
DO
WRITELN(‘OLOLO’);
Синтаксис для выражений (логического | целого | …) типа данных.
Синтаксис логических выражений
<выражение> ::= <простое выражение>
| <простое выражение> <оператор сравнения> <простое выражение>
<простое выражение> ::= <простое выражение> OR <терм> | <терм>
<терм> ::= <терм> AND <множитель> | <множитель>
<множитель> ::= <переменная> | <константа> | (<выражение>) | NOT <множитель>
Синтаксис перечислимого типа
<перечислимый тип> ::= (<список идентификаторов>)
<список идентификаторов> ::= <список идентификаторов>, <идентификатор>
| <идентификатор>
Синтаксис целого типа
<знаковое целое> ::= <знак><беззнаковое целое>| <беззнаковое целое>
<знак> ::= + | –
<беззнаковое целое> ::= <последовательность цифр>
<последовательность цифр> ::= <последовательность цифр><цифра> | <цифра>
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
Синтаксис целочисленных выражений
<выражение> ::= <простое выражение>
| <простое выражение><оператор сравнения><простое выражение>
<простое выражение> ::= <простое выражение> <аддитивный оператор> <терм>
| <терм> | <знак> <терм>
<терм> ::= <терм> <мультипликативный оператор> <множитель> | <множитель>
<множитель> ::= <переменная> | <беззнаковая константа> | (выражение) | NOT <множитель>
<оператор сравнения> ::= = | <> | < | <= | > | >=
<знак> ::= + | -
<аддитивный оператор> ::= + | - | OR
<мультипликативный оператор> ::= * | DIV | MOD | AND
<переменная> ::= <идентификатор переменной>
<беззнаковая константа> ::= <беззнаковое число> | <идентификатор константы>
| <строка символов>
<беззнаковое число> ::= <беззнаковое целое>
Для WRITE:
<список параметров WRITELN> ::= (<файловая переменная>)|<список параметров WRITE>|
<список параметров WRITE> ::= (<список элементов WRITE>)
<список элементов WRITE> ::= <файловая переменная> <параметры WRITE>
| <параметры WRITE>
<параметры WRITE> ::= <параметры WRITE> <параметр WRITE>
| <параметр WRITE>
<параметр WRITE> ::= <выражение>:<выражение> | <выражение>
Тип диапазон
<тип диапазон> ::= <константа> .. <константа>
<константа> ::= <знак> <беззнаковое число> | <беззнаковое число>
| <идентификатор константы> | <строка символов>
Отличия операторов case и if
Мы использовали вложенные IF для выбора одного оператора из нескольких. Оператор CASE может часто заменять вложенные IF с выигрышем в наглядности и эффективности.
Оператор CASE строится из выражения порядкового типа для выбора и списка операторов, каждый из которых отмечен одной или более константами того же порядкового типа. Например, в
CASE A > B OF
TRUE: Max := A;
FALSE: Max := B;
END
выражение для выбора будет A > B типа BOOLEAN, а метками будут константы того же типа TRUE и FALSE. Выражение для выбора вычисляется и оператор, помеченный соответствующей меткой, выбирается для выполнения. После того как выбранный оператор завершает выполнение, управление передается оператору, следующему за оператором CASE. Константные метки не могут повторяться, поэтому выполнено будет не более одного оператора. Если не существует оператора с меткой имеющей значение выражения для выбора, результат выполнения оператора CASE неопределен.
Оператор CASE может быть симулирован вложенными операторами IF. Рассмотрим оператор CASE:
CASE Exp OF
L1a, L1b: S1;
L2 : S2;
...;
LN: SN
END
оператор IF
IF (Exp = L1a) OR (Exp = L1b)
THEN
S1
ELSE
IF Exp = L2
THEN
S2
ELSE
...
ELSE
IF Exp = LN
THEN
SN
Выполняет те же действия, когда значение Exp является одним из L1a, L1b, L2, ..., LN. Однако когда значение Exp не входит в набор вариантов, оператор IF работает как пустой оператор, а оператор CASE неопределен. Большинство Паскаль-машин реализуют оператор CASE некорректно, и он в случае отсутствия варианта работает аналогично соответствующему оператору IF.
Использование оператора CASE сокращает глубину вложенности операторов и необходимость в логических операторах, повышая читаемость программы. Также оператор CASE более эффективен, чем IF, поскольку весь весь оператор CASE вычисляется один раз, а для вложенных IF выполняется множество сравнений.
Операторы CASE полезны при работе с перечислимыми типами данных и с типами данных, содержащими много значений, если обрабатываются небольшие наборы возможных вариантов.
Синтаксические правила для оператора CASE представлены ниже
<оператор CASE> ::= CASE <выражение> OF <список вариантов> END
<список вариантов>::= <список вариантов>, <вариант> | <вариант>
<вариант> ::= <список констант> : <выражение>
<список констант> ::= <список констант>, <константа> | <константа>
Для оператора CASE, как и для оператора IF может быть определено значение как объединение функций.