Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bb:redbook:213 [2016/09/08 09:54] prospero78 [1. Оператор выбора CASE] |
bb:redbook:213 [2016/09/08 10:08] prospero78 [2. Ключевые слова модуля] |
| |
==== 1. Оператор выбора CASE ==== | ==== 1. Оператор выбора CASE ==== |
Компонентный Паскаль предлагает инструкции выбора ''IF ELSIF ELSE'. Их можно комбинировать в произвольной последовательности и глубине. Но довольно часто случается, что выбор происходит больше, чем из одной-двух альтернатив. Бородатые компьютерщики помнят, что в начальных меню ДОСа довольно часто, для выбора пункта меню приходилось выбирать номер пункта и вводить его через клавиатуру. Так происходило интерактивное взаимодействие в эпоху чёрных экранов. Если посмотреть на исходники многих современных программ, выбор //что надо сделать// до сих пор построен именно так (хотя эта логика скрыта //плюшками//, //приблудами// и //контролами// интерфейса графического пользователя). | Компонентный Паскаль предлагает инструкции выбора ''IF ELSIF ELSE''. Их можно комбинировать в произвольной последовательности и глубине. Но довольно часто случается, что выбор происходит больше, чем из одной-двух альтернатив. Бородатые компьютерщики помнят, что в начальных меню ДОСа довольно часто, для выбора пункта меню приходилось выбирать номер пункта и вводить его через клавиатуру. Так происходило интерактивное взаимодействие в эпоху чёрных экранов. Если посмотреть на исходники многих современных программ, выбор //что надо сделать// до сих пор построен именно так (хотя эта логика скрыта //плюшками//, //приблудами// и //контролами// интерфейса графического пользователя). |
| |
Так когда же нужно применять оператор выбора ''CASE''? Должно быть выполнено два условия: | Так когда же нужно применять оператор выбора ''CASE''? Должно быть выполнено два условия: |
| |
Как использовать оператор ''CASE'' представлено ниже: | Как использовать оператор ''CASE'' представлено ниже: |
| <code oberon2> |
| MODULE Test_case; |
| |
| IMPORT |
| Log; |
| |
| PROCEDURE SelectV (v: INTEGER); |
| BEGIN |
| Log.String("v:="); Log.Int(v); Log.Ln; |
| CASE v OF |
| 1..10: Log.String("Малое число"); Log.Ln; |
| | 11..100: Log.String("Среднее число"); Log.Ln; |
| | 101..1000: Log.String("Ого! Большое число!"); Log.Ln; |
| ELSE |
| Log.String("Нет. Это что-то не то..."); Log.Ln; |
| 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. |
| </code> |
| Вывод: |
| <code> |
| компилируется "Test_case" 252 0 |
| старый модуль Test_case выгружен |
| v := 6 |
| Малое число |
| v := 12 |
| Среднее число |
| v := 102 |
| Ого! Большое число! |
| v := - 1 |
| Нет. Это что - то не то... |
| </code> |
| |
Как видно из текста модуля, количество веток с ''ELSE'' было бы драматически большим, пришлось бы написать больше кода, а значит риск совершения ошибки увеличивается. Кроме того, более компактная форма записи, позволяет сократить занимаемое место на экране, что положительно сказывается на понимании текста программы. | Как видно из текста модуля, количество веток с ''ELSE'' было бы драматически большим, пришлось бы написать больше кода, а значит риск совершения ошибки увеличивается. Кроме того, более компактная форма записи, позволяет сократить занимаемое место на экране, что положительно сказывается на понимании текста программы. |
==== 2. Ключевые слова модуля ==== | ==== 2. Ключевые слова модуля ==== |
Таких слов на данный момент рассмотрено три: | Таких слов на данный момент рассмотрено три: |
- MODULE [NameModule]; -- обязательное ключевое слово с именем модуля. По другому компилятор никак не сможет определить к чему относится программный текст. | - ''MODULE'' [NameModule]; -- обязательное ключевое слово с именем модуля. По другому компилятор никак не сможет определить к чему относится программный текст. |
- END [NameModule]. -- обязательное ключевое слово с именем модуля. По другому компилятор никак не сможет определить, где заканчивается программный код. Нельзя забывать, что за концом программного текста ещё могут быть различные элементы, как-то: коммандер (а то и не один), данные для ввода, данные для компиляции, заметки типа TODO или краткие примеры правильного использования. Кроме того, можно вставить ссылки на документацию по модулю или смежные темы. | - ''END'' [NameModule]. -- обязательное ключевое слово с именем модуля. По другому компилятор никак не сможет определить, где заканчивается программный код. Нельзя забывать, что за концом программного текста ещё могут быть различные элементы, как-то: коммандер (а то и не один), данные для ввода, данные для компиляции, заметки типа **TODO** или краткие примеры правильного использования. Кроме того, можно вставить ссылки на документацию по модулю или смежные темы. |
- BEGIN -- необязательное ключевое слово уровня модуля. Обычно, код размещённый после него -- исполняется для служебных целей во время загрузки самого модуля. По возможности, не стоит использовать это логическое пространство для кода. С высокой вероятностью, это будет плохим решением. | - ''BEGIN'' -- необязательное ключевое слово уровня модуля. Обычно, код размещённый после него -- исполняется для служебных целей во время загрузки самого модуля. По возможности, не стоит использовать это логическое пространство для кода. С высокой вероятностью, это будет плохим решением. |
- CLOSE -- необязательное ключевое слово уровня модуля. Обычно, код размещённый после него -- исполняется для служебных целей во время выгрузки самого модуля. Эта возможность используется ещё реже, чем BEGIN, так что с ещё большей вероятностью использование этой секции будет ещё более плохим решением. | - ''CLOSE'' -- необязательное ключевое слово уровня модуля. Обычно, код размещённый после него -- исполняется для служебных целей во время выгрузки самого модуля. Эта возможность используется ещё реже, чем ''BEGIN'', так что с ещё большей вероятностью использование этой секции будет ещё более плохим решением. |
| |
Читатели знакомые, например, с python, обратят своё внимание, что это очень похоже на специальные методы классов __init__ и __del__. И такое сходство будет не случайно. Вспоминаем, что основная единица компиляции в КП -- модуль! И понятие модуля органически совмещается с понятием класса. [↑] | Читатели знакомые, например, с **python**, обратят своё внимание, что это очень похоже на специальные методы классов ''__init__'' и ''__del__''. И такое сходство будет не случайно. Вспоминаем, что основная единица компиляции в КП -- //модуль//! И понятие //модуля// органически совмещается с понятием //класса//. И всё же, надо помнить, что ''BEGIN'' и ''CLOSE'' относятся к модулю, а не классу (которых в **python** в одном модуле может быть несколько, хотя сами же питонёры к такой практике относятся не очень хорошо). |
| |
| |