select case или выбор одного из множества действий
Участников: 5
Страница 1 из 1
select case или выбор одного из множества действий
Случаеться так, что простого условного выполнения if ... then не хватает. Он не удобен и менее нагляден, когда нужно сравнивать выражение с несколькими вариантами.
Можно воспользоваться другой конструкцией. select case ... именно ей посвящена эта статья.
выражение для сравнения, это, то с чем будут сравниваться другие выражения.
И если, выражения совпали, то инструкция будет выполнена.
Если ни одно выражение не совпало, то будет выполнена инструкция по умолчанию.
Для тех кто знаком с c, и подобными, могу провести аналогию с конструкцией "switch", но есть и большие различия.
Выполняеться только инструкция, одного блока case с верным выражением.
Следующий блок будет пропущен.
Даже если выражение верно.
Выполняеться только первый корректный блок.
Заканчивать блок оператором "break" как в c, не нужно. Концом блока инструкций считается другое case, case else или end select.
выражение для сравнения, может быть любым, константа, результат математических действий или функций. Это может быть число или строка.
Указывайте его после select case", скобки не обязательны.
Выражение, после ключевого слова case, должно быть того же типа, что и выражение для сравнения. Оно может быть константой или переменной.
Для одного блока case, можно указать несколько выражений для сравнения, перечислив их через запятую.
будет выполнена только та инструкция, которая находится, после слова case с верным выражением и до конца блока.
Примерчик излишествует конечно всякими другими конструкциями. Но с принципом множественного выбора должен вас познакомить. (Более простой есть в руководстве.)
Пример можно сократить. Убрать из него всякие излишнии коментарии.
В этом примере можно наблюдать, как для одного блока case задаются сразу несколько вариантов. Блок будет выполнен если совпал один из них.
А ещё обратите внимание, что мы потеряли блок case else, в котором была инструкция по умолчанию. Она совершенно не обязательна.
выражение может быть и условным. Чего в c, в помине нет.
Ключевое слово "is" не обязательно, но оно предполагается. is означает выражение для сравнения.
Можно задать интервал значений. например от "a" до "z".
принцип
Немного раскажу о принципе обработки этой конструкции.
Вычисляем выражение expr1 и запоминаем его значение. Далее назовём его t_expr.
Останавливаясь на ключевых словах case, сравниваем t_expr с условием. Если условие совпало, то выполняем инструкцию. А потом идём к закрывающему end select.
Если дошли до case else, а наше условие так ни с чем и не совпало, то выполняем инструкцию по умолчанию, и переходим в конец, на end select.
По этому, после case else нет смысла писать уже другие case ... они всё равно не будут работать.
Конечно конструкция select case ... end select не единственная, но она облегчит написание и понимание кода. Используйте её в нужных местах.
Когда же всё-таки использовать множественный выбор?
Давайте рассмотрим вот такой код:
Да, тут тоже производиться множественный выбор. Но начнём копать глубже. И не будем обращать внимание на эстетичность, а только на функционал.
Если expr1 это простая переменная, то разницы по сути нет. Разве что вам придёться несколько раз писать это имя. А представим ситуацию, когда expr1 это результат некоторых вычислений!? Например:
Не ужто мы будем несколько раз дублировать это? Конечно мы можем создать ещё одну переменную, в которую и запишем результат. Но ведь select case именно это и делает избавляя вас от лишних морок!
А вот в случае, когда сравниваемое выражение разное, то вам останеться вариант с конструкцией i]if ... then[/i]
Подобное select case ... end select уже заменить не может. (Конечно если не извращаться.)
ещё немного об условных вариантах
if ... then позволяет задавать очень различные и гибкие условия. Но в case подобного не требуеться. Ниже я просто приведу аналогии.
Табличка очень наглядно показывает разницу. А выбирать вам, какой конструкцией пользоваться.
Можно воспользоваться другой конструкцией. select case ... именно ей посвящена эта статья.
- Код:
select case (выражение для сравнения)
case (выражение 1)
(инструкция 1)
case (выражение 2)
(инструкция 2)
case else
(инструкция по умолчанию)
end select
выражение для сравнения, это, то с чем будут сравниваться другие выражения.
И если, выражения совпали, то инструкция будет выполнена.
Если ни одно выражение не совпало, то будет выполнена инструкция по умолчанию.
Для тех кто знаком с c, и подобными, могу провести аналогию с конструкцией "switch", но есть и большие различия.
Выполняеться только инструкция, одного блока case с верным выражением.
Следующий блок будет пропущен.
Даже если выражение верно.
Выполняеться только первый корректный блок.
Заканчивать блок оператором "break" как в c, не нужно. Концом блока инструкций считается другое case, case else или end select.
выражение для сравнения, может быть любым, константа, результат математических действий или функций. Это может быть число или строка.
Указывайте его после select case", скобки не обязательны.
Выражение, после ключевого слова case, должно быть того же типа, что и выражение для сравнения. Оно может быть константой или переменной.
Для одного блока case, можно указать несколько выражений для сравнения, перечислив их через запятую.
будет выполнена только та инструкция, которая находится, после слова case с верным выражением и до конца блока.
- Код:
' выводим на экран задание
print "отгадайте загадку!"
print "зимой и летом одним цветом"
print "1 снег"
print "2 попугай"
print "3 нос учителя"
print "4 ёлка"
print "Если вы не знаете, нажмите кнопку esc"
' строковая переменная, для символа с клавиатуры
dim k as string
do ' большая петля, в которой мы будем находиться пока загадка не будет решена
' петля, где мы ждём нажатия какой-нибудь кнопки
do
sleep
k = inkey$
loop while k = ""
' в зависимости от того, какая клавиша была нажата, выводим различные сообщения
select case k
case "1" ' поскольку k у нас строковая, то и сравнивать нужно со строками
print "снега летом не бывает"
case "2" ' второй вариант
print "автор загадки предполагал, что о таких зверюшках вы никогда не слышали"
case "3" ' вариант 3
print "нужно быть вежливыми, и не тыкать пальцем в недостатки других"
case "4" ' правильный вариант
print "Правильно! Возьми с полки пирожок и скинь его мне на эл. почту"
exit do ' выходим из большой петли
case chr$(27) ' клавиша эскейп имеет код 27, который мы не можем просто так написать
print "Ну что так? А вобщем твоё дело, игра закончена"
exit do
case else
print "ну что ты не можеш попасть по нужным кнопкам?"
end select
loop ' конец большой петли
print "спасибо за игру!"
sleep
Примерчик излишествует конечно всякими другими конструкциями. Но с принципом множественного выбора должен вас познакомить. (Более простой есть в руководстве.)
Пример можно сократить. Убрать из него всякие излишнии коментарии.
- Код:
select case k
case "1", "2", "3" ' неправильные варианты перечисляем через запятую
print "неправильно"
case "4" ' правильный вариант
print "Правильно!"
exit do
case chr$(27) ' выход
print "Ну что так? А вобщем твоё дело, игра закончена"
end select
В этом примере можно наблюдать, как для одного блока case задаются сразу несколько вариантов. Блок будет выполнен если совпал один из них.
А ещё обратите внимание, что мы потеряли блок case else, в котором была инструкция по умолчанию. Она совершенно не обязательна.
выражение может быть и условным. Чего в c, в помине нет.
- Код:
case is > "4"
print "вариантов всего 4, а не больше."
Ключевое слово "is" не обязательно, но оно предполагается. is означает выражение для сравнения.
Можно задать интервал значений. например от "a" до "z".
- Код:
case "a" to "z"
print "Буква это тоже хорошо, но я прошу цифры!"
принцип
Немного раскажу о принципе обработки этой конструкции.
- Код:
select case expr1
Вычисляем выражение expr1 и запоминаем его значение. Далее назовём его t_expr.
Останавливаясь на ключевых словах case, сравниваем t_expr с условием. Если условие совпало, то выполняем инструкцию. А потом идём к закрывающему end select.
Если дошли до case else, а наше условие так ни с чем и не совпало, то выполняем инструкцию по умолчанию, и переходим в конец, на end select.
По этому, после case else нет смысла писать уже другие case ... они всё равно не будут работать.
Конечно конструкция select case ... end select не единственная, но она облегчит написание и понимание кода. Используйте её в нужных местах.
Когда же всё-таки использовать множественный выбор?
Давайте рассмотрим вот такой код:
- Код:
if expr1 = v1 then
(инструкция)
elseif expr1 = v2 then
(инструкция)
elseif expr1 = v3 then
(инструкция)
...
else
(инструкция)
end if
Да, тут тоже производиться множественный выбор. Но начнём копать глубже. И не будем обращать внимание на эстетичность, а только на функционал.
Если expr1 это простая переменная, то разницы по сути нет. Разве что вам придёться несколько раз писать это имя. А представим ситуацию, когда expr1 это результат некоторых вычислений!? Например:
- Код:
expr1 = val( trim$( "&h" + mid$(str1, 10, 4) )) - 1
Не ужто мы будем несколько раз дублировать это? Конечно мы можем создать ещё одну переменную, в которую и запишем результат. Но ведь select case именно это и делает избавляя вас от лишних морок!
А вот в случае, когда сравниваемое выражение разное, то вам останеться вариант с конструкцией i]if ... then[/i]
- Код:
if expr1 = v1 then
(инструкция)
elseif expr2 = v2 then
(инструкция)
elseif expr3 = v3 then
(инструкция)
...
else
(инструкция)
end if
Подобное select case ... end select уже заменить не может. (Конечно если не извращаться.)
ещё немного об условных вариантах
if ... then позволяет задавать очень различные и гибкие условия. Но в case подобного не требуеться. Ниже я просто приведу аналогии.
if | case |
expr1 = expr 2 | expr2 |
expr1 < expr2 | is < expr2 |
(expr1 = expr 2) or (expr1 = expr 3) | expr2, expr3 |
(expr2 < expr1) and (expr1 < expr3) | expr2 to expr3 |
Табличка очень наглядно показывает разницу. А выбирать вам, какой конструкцией пользоваться.
Последний раз редактировалось: Eric-S (Вт Янв 06, 2009 5:42 pm), всего редактировалось 5 раз(а)
Re: select case или выбор одного из множества действий
А мы же книгу для того и задумывали, чтобы делиться крупицами знания.
Кстати про select это ещё не всё. Но там с перечислениями. А в них я не очень хорошо разбираюсь.
Кстати про select это ещё не всё. Но там с перечислениями. А в них я не очень хорошо разбираюсь.
Re: select case или выбор одного из множества действий
А с перечислениями я както особо и не колупался, тк не придумал им реального практического применения, возможно просто подобные конструкии используются в интрепретируемых языка, с которыми я мало знаком
Re: select case или выбор одного из множества действий
помоему это немного неправильно, ткСлучаеться так, что простого условного выполнения "if ... then" не хватает.
- Код:
if (выражение) then
(инструкция)
elseif (выражение) then
(инструкция)
elseif (выражение) then
(инструкция)
...
else
(инструкция)
end if
Просто через select получается более наглядно, и проще понимается принцим работы.
(я долго пользовался только if-ом, просто вломы было запоминать синтаксис select-а).
Re: select case или выбор одного из множества действий
Привет. Вот решил программистом стать. немного позновато конечно, но.. Значит программу запускаю, а она не реагирует на нажатие кнопок. Не подскажите где искать проблему?
Ron- Сообщения : 11
Дата регистрации : 2009-01-05
Re: select case или выбор одного из множества действий
- Код:
elseif ... then
Ron, a вы выложите текст программы в теме "для начинающих", тогда всё понятно будет
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва
Re: select case или выбор одного из множества действий
Простите и спасибо за бдительность!
Исправил ошибки в коде.
Я просто не думал, что кому-то захочеться компилить эту прогу, хе-хе.
Сейчас всё работает.
Исправил ошибки в коде.
Я просто не думал, что кому-то захочеться компилить эту прогу, хе-хе.
Сейчас всё работает.
Re: select case или выбор одного из множества действий
Вот это классно!:
Во многом можно обходиться без If-ENDIF
- Код:
Case Is
Во многом можно обходиться без If-ENDIF
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения