Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
bb:redbook:213 [2016/09/08 09:37] prospero78 [5. Заключение] |
bb:redbook:213 [2016/09/08 10:05] prospero78 [1. Оператор выбора CASE] |
||
---|---|---|---|
Строка 2: | Строка 2: | ||
==== 1. Оператор выбора CASE ==== | ==== 1. Оператор выбора CASE ==== | ||
- | Компонетный Паскаль предлагает инструкции выбора IF ELSIF ELSE. Их можно комбинировать в произволной последовательности и глубине. Но довольно часто случается, | + | Компонентный Паскаль предлагает инструкции выбора |
- | Так когда же нужно применять оператор выбора CASE? Должно быть выполнено два условия: | + | Так когда же нужно применять оператор выбора |
- Выбор надлежит сделать из более чем двух величин. | - Выбор надлежит сделать из более чем двух величин. | ||
- Выбираемые величины должны быть однотипными -- целыми или литерными. | - Выбираемые величины должны быть однотипными -- целыми или литерными. | ||
- | Как использовать оператор CASE представлено ниже: | + | Как использовать оператор |
+ | <code oberon2> | ||
+ | MODULE Test_case; | ||
+ | |||
+ | IMPORT | ||
+ | Log; | ||
+ | |||
+ | PROCEDURE SelectV (v: INTEGER); | ||
+ | BEGIN | ||
+ | Log.String(" | ||
+ | CASE v OF | ||
+ | 1..10: Log.String(" | ||
+ | | 11..100: Log.String(" | ||
+ | | 101..1000: Log.String(" | ||
+ | ELSE | ||
+ | Log.String(" | ||
+ | END; | ||
+ | |||
+ | END SelectV; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | VAR | ||
+ | v: INTEGER; | ||
+ | BEGIN | ||
+ | v := 6; | ||
+ | SelectV(v); | ||
+ | v := 12; | ||
+ | SelectV(v); | ||
+ | v := 102; | ||
+ | SelectV(v); | ||
+ | v := - 1; | ||
+ | SelectV(v); | ||
+ | END Start; | ||
+ | |||
+ | END Test_case. | ||
+ | </ | ||
+ | Вывод: | ||
+ | < | ||
+ | компилируется " | ||
+ | старый модуль Test_case выгружен | ||
+ | v := 6 | ||
+ | Малое число | ||
+ | v := 12 | ||
+ | Среднее число | ||
+ | v := 102 | ||
+ | Ого! Большое число! | ||
+ | v := - 1 | ||
+ | Нет. Это что - то не то... | ||
+ | </ | ||
- | Как видно из текста модуля, | + | Как видно из текста модуля, |
Строка 24: | Строка 72: | ||
- | === 3. Арифмитические и логические операции === | + | ==== 3. Арифметические и логические операции |
Здесь будут рассмотрены только обойдённые внимание операции. | Здесь будут рассмотрены только обойдённые внимание операции. | ||
- MOD -- бывает весьма полезная операция для поиска остатка при целочисленном делении. Можно вычислить остаток и через программное решение, | - MOD -- бывает весьма полезная операция для поиска остатка при целочисленном делении. Можно вычислить остаток и через программное решение, | ||
Строка 32: | Строка 80: | ||
- & -- логическое умножение (читается " | - & -- логическое умножение (читается " | ||
- IN -- принадлежность к множеству. Не путать с параметрами на вход в процедурах! Пример: | - IN -- принадлежность к множеству. Не путать с параметрами на вход в процедурах! Пример: | ||
- | - IS -- принадлежность к типу. Бывает полезным узнать во время выполнения программы к какому типу относится переменная | + | - IS -- принадлежность к типу. Бывает полезным узнать во время выполнения программы к какому типу относится переменная. Используется |
+ | - ASSERT -- оператор охраны. Вызывает системное исключение, | ||
- | === 4. Оператор WITH === | + | ==== 4. Оператор WITH ==== |
Этот оператор занимает промежуточное положение между оператором контекста, | Этот оператор занимает промежуточное положение между оператором контекста, | ||
Например: | Например: | ||
+ | <code oberon2> | ||
+ | MODULE Test_case; | ||
+ | |||
+ | IMPORT | ||
+ | Log; | ||
+ | |||
+ | TYPE | ||
+ | tRecord = EXTENSIBLE RECORD | ||
+ | x: INTEGER; | ||
+ | y: INTEGER; | ||
+ | END; | ||
+ | |||
+ | tRecord1 = RECORD (tRecord) | ||
+ | z: INTEGER; | ||
+ | END; | ||
+ | |||
+ | PROCEDURE SelectV (VAR v: tRecord); | ||
+ | BEGIN | ||
+ | WITH | ||
+ | v: tRecord1 DO | ||
+ | Log.String(" | ||
+ | Log.Ln; | ||
+ | | v: tRecord DO | ||
+ | Log.String(" | ||
+ | Log.Ln; | ||
+ | ELSE | ||
+ | Log.String(" | ||
+ | END; | ||
+ | |||
+ | END SelectV; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | VAR | ||
+ | v: POINTER TO tRecord; | ||
+ | v1: POINTER TO tRecord1; | ||
+ | |||
+ | BEGIN | ||
+ | NEW(v); | ||
+ | NEW(v1); | ||
+ | v.x := 6; | ||
+ | SelectV(v); | ||
+ | v1.z := 3; | ||
+ | SelectV(v1); | ||
+ | END Start; | ||
+ | |||
+ | END Test_case. | ||
+ | </ | ||
+ | Вывод: | ||
+ | < | ||
+ | компилируется " | ||
+ | старый модуль Test_case выгружен | ||
+ | Это тип tRecord | ||
+ | Это тип tRecord1 | ||
+ | </ | ||
- | В приведённом примере создаётся тип tRecord и наследующий его tRecord1. Процедура SelectV принимает только тип tRecord, и, теоретически, | + | В приведённом примере создаётся тип tRecord и наследующий его tRecord1. Процедура SelectV принимает только тип tRecord, и, теоретически, |
После этого в процедуре SelectV использована небольшая хитрость. Так как одна из переменных имеет тип tRecord1, то при первом вызове эта ветка будет пропущена (и это правильно, | После этого в процедуре SelectV использована небольшая хитрость. Так как одна из переменных имеет тип tRecord1, то при первом вызове эта ветка будет пропущена (и это правильно, | ||
- | В тоже время, необходимо обратить внимание, | + | В тоже время, необходимо обратить внимание, |
==== 5. Заключение ==== | ==== 5. Заключение ==== | ||
- | Приведённые особенности Компонетного Паскаля надо знать. Можно посоприть с тем, что, например CASE может и излишняя семантическая контсрукция в языке, но опытные программисты на практическом примере покажут вам преимущества того или иного способа. Важно иметь практику, | + | Приведённые особенности Компонентного Паскаля надо знать. Можно поспорить с тем, что, например CASE может и излишняя семантическая конструкция в языке, но опытные программисты на практическом примере покажут вам преимущества того или иного способа. Важно иметь практику, |
В качестве самостоятельного задания, | В качестве самостоятельного задания, | ||