select case или выбор одного из множества действий

Предыдущая тема Следующая тема Перейти вниз

select case или выбор одного из множества действий

Сообщение  Eric-S в Чт Авг 21, 2008 6:51 am

Случаеться так, что простого условного выполнения if ... then не хватает. Он не удобен и менее нагляден, когда нужно сравнивать выражение с несколькими вариантами.
Можно воспользоваться другой конструкцией. 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 подобного не требуеться. Ниже я просто приведу аналогии.

ifcase

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 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  tux в Чт Авг 21, 2008 7:06 am

Во блин, а про условия я и незнал...
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  Eric-S в Чт Авг 21, 2008 7:22 am

А мы же книгу для того и задумывали, чтобы делиться крупицами знания.

Кстати про select это ещё не всё. Но там с перечислениями. А в них я не очень хорошо разбираюсь.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  tux в Чт Авг 21, 2008 7:27 am

А с перечислениями я както особо и не колупался, тк не придумал им реального практического применения, возможно просто подобные конструкии используются в интрепретируемых языка, с которыми я мало знаком
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  tux в Чт Авг 21, 2008 9:16 am

Случаеться так, что простого условного выполнения "if ... then" не хватает.
помоему это немного неправильно, тк
Код:
if (выражение) then
  (инструкция)
elseif (выражение) then
  (инструкция)
elseif (выражение) then
  (инструкция)
...
else
  (инструкция)
end if
помоему является полным аналогом селекта.
Просто через select получается более наглядно, и проще понимается принцим работы.
(я долго пользовался только if-ом, просто вломы было запоминать синтаксис select-а).
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  Ron в Вт Янв 06, 2009 2:46 pm

Привет. Вот решил программистом стать. немного позновато конечно, но.. Значит программу запускаю, а она не реагирует на нажатие кнопок. Не подскажите где искать проблему?

Ron

Сообщения : 11
Дата регистрации : 2009-01-05

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  Gena в Вт Янв 06, 2009 3:31 pm

Код:
elseif ... then
Спасибо большое! Я о такой конструкции вообще не знал. =)
Ron, a вы выложите текст программы в теме "для начинающих", тогда всё понятно будет

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  Eric-S в Вт Янв 06, 2009 5:45 pm

Простите и спасибо за бдительность!
Исправил ошибки в коде.

Я просто не думал, что кому-то захочеться компилить эту прогу, хе-хе.

Сейчас всё работает.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  trew в Пт Окт 15, 2010 6:11 pm

Вот это классно!:

Код:
Case  Is

Во многом можно обходиться без If-ENDIF

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: select case или выбор одного из множества действий

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения