Инструменты пользователя

Инструменты сайта


help:conditional

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
help:conditional [2015/04/13 06:42]
admin старая ревизия восстановлена (2015/04/04 15:50)
help:conditional [2024/12/01 10:35] (текущий)
aleks_versus
Строка 1: Строка 1:
-[[help:regexp|Назад: ​Регулярные выражения]]+[[help:tuples|Назад: ​Кортежи]]
  
-=====Условия=====+====== Условия ​======
  
-  * **IIF(**//​[#​выр]//**,**//[выр_да]//**,**//[выр_нет]//**)** - возвращает ​значение выражения //[выра]//, если ​//[#выр]// ​верноиначе значение выражения //[вырет]//При ​работе функции вычисляются все три выражения+Условия — это такие особые конструкции в **QSP**, которые позволят сделать вашу игру по настоящему интерактивной. Они позволяют ​разветвлять события, происходящие ​в игре в зависимости от уже сложившихся условий, и таким образом вносить разнообразие в игровой процессОператоры, ​которые используются в конструкциях условий, в программировании называются **операторами ветвления**.
-    ​//Примеры://<​sxh qsp> +
-одуль числа +
-abs_x = IIF(x > 0, x, -x)+
  
-!А следующая конструкция вызовет ошибку деления на ноль: +===== Операторы условий ===== 
-x = 0 + 
-y = IIF(x = 0, 0, 1/x) +  * ''​%%IF%%''​ — основной оператор для записи ​конструкций условий. Конструкции,​ записываемые с помощью этого оператора (назовём их "​простыми условиями"​),​ имеют две формы: однострочную ​и многострочную, — и в общем виде выглядят так: <​sxh ​qsp
-</sxh> +! однострочная форма записи 
-  * **IF** //[#условие]//**:** //[операторы]// **ELSE** //[операторы]// - если ​//[#условие]// верно ​(не равно 0), то выполнятся операторы до ключевого слова ​"​ELSE",​ иначе выполнятся операторы ​после ​"​ELSE"​+IF [#выражение]: ​оманда 1} & {команда 2} & … 
-    * Ключевое слово ​"​ELSE" ​можно опуститьесли ​не требуется ​выполнение операторов при ложном условии. +! многострочная форма записи 
-    * Однострочная форма ​записи:<​sxh qsp>+IF [#выражение]
 +  {команда 1} 
 +  {команда 2} 
 +  … 
 +END 
 +</sxh> В данном случае, ​если ​верно ​условие ​''​[#​выражение]'',​ выполняются команды ''​{команда 1}''​''​{команда 2}''​ и т.д. Для ​однострочной формы записи это будут только те команды, которые идут в той же строке, что и оператор ​''​IF''​ до конца строки;​ а для многострочной формы записи это будут те команды,​ которые идут в последующих строках после двоеточия и до специального ключевого слова ​''​END''​. 
 +    * В качестве условия могут выступать ​операции сравнения,​ логические операции и иные выражения,​ возвращающие числовые значения
 +    * Ключевое слово ​''​%%END%%''​ при ​многострочной форме записи должно стоять отдельной строкой. 
 +    * Если ​условие ''​%%[#​выражение]%%''​ не верно, команды ​выполнены не будут. 
 +    * Примеры однострочной формы записи условий:​ <sxh qsp> 
 +если сумма a и b равна двум, 
 +! переменной c присваивается значение 30 
 +if a+b=2: c=30 
 +! Если в инвентаре нет апельсина,​ выводится текст 
 +if no obj "​Апельсин": pl "У Вас нет апельсина." 
 +! это тоже простая однострочная форма
 if ((a+b)/​c)=45+54 or (b<5 or c>45) and no obj '​лопата'​ and $f=$vvv+'​RRRRR':​ p '​OK'​ & goto '​Next'​ if ((a+b)/​c)=45+54 or (b<5 or c>45) and no obj '​лопата'​ and $f=$vvv+'​RRRRR':​ p '​OK'​ & goto '​Next'​
-if был_здесь[$curloc]:​ exit 
-if a<3: jump '​sss'​ 
-if $имя = '':​ msg '​Введите имя!'​ & jump '​ввод'​ 
-if a+b=2:c=30 & gt '​next'​ else c=10 
 </​sxh>​ </​sxh>​
-    * Многострочная форма записи:​ +    * Примеры многострочной формы записи условий:​ <sxh qsp> 
-      После символа ​":" ​ставится перенос строки +if библиотека = 0: 
-      * ELSE пишется с новой строки +  узнал_о_тусовке = 0 
-      * Заканчивается IF строкой ​"END" (можно ​"END IF").  +  библиотека_вернулся = 1 
-      * Допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой ​"END"+  gt '​библиотека'​ 
-      * //Примеры:​//<sxh qsp>+end 
 +if a+b=2: 
 +  c=30 
 +end 
 +</​sxh>​  
 +    * **Обратите внимание!!!** При многострочной ​форме записи после двоеточия в той же строке,​ в какой находится оператор ''​%%IF%%'',​ не должны идти никакие команды,​ иначе плеер посчитает такой оператор условия однострочным,​ и команды в последующих строках будут выполняться в любом случае,​ независимо от того, верным окажется условие или нет. Пример такой ошибочной ​записи: ​<sxh qsp> 
 +if библиотека = 0: узнал_о_тусовке = 0 
 +  библиотека_вернулся = 1 &! эта строчка будет выполняться в независимости от верности условия 
 +  gt '​библиотека'​ &! и эта 
 +end &! ключевое слово end - просто игнорируется 
 +</​sxh>​ 
 +  ​''​%%ELSE%%''​ — ключевое слово, использующееся совместно с оператором ''​%%IF%%'',​ и которое служит для предоставления альтернативы,​ если условие не выполнено. Ключевое слово ''​%%ELSE%%''​ так же имеет две формы записи:​ однострочную и многострочную. Многострочную форму записи ''​%%ELSE%%''​ можно использовать только в многострочной конструкции оператора ''​%%IF%%'',​ тогда как однострочную форму записи можно использовать как в однострочной,​ так и в многострочной,​ конструкции оператора ''​%%IF%%''​. Общая форма записи<sxh qsp> 
 +! однострочная форма записи 
 +IF [#выражение]: {команда д1} & {команда д2} & … ELSE {команда н1} & {команда н2} & … 
 + 
 +! в многострочном IF 
 +! многострочная форма ELSE 
 +IF [#​выражение]:​ 
 +    {команда д1} 
 +    {команда д2} 
 +    ... 
 +ELSE 
 +    {команда н1} 
 +    {команда н2} 
 +    ... 
 +END 
 +! однострочная форма ELSE 
 +IF [#​выражение]:​ 
 +    {команда д1} 
 +    {команда д2} 
 +    ... 
 +ELSE {команда н1} & {команда н2} & ... 
 +    ! команды в следующих строках 
 +    ! до END игнорируются 
 +END 
 +</​sxh>​ Здесь, если условие''​[#​выражение]''​ верно, выполняются команды от двоеточия до ключевого слова ''​ELSE'',​ а если условие ''​[#​выражение]''​ не верно, выполняются команды от ключевого слова ''​ELSE''​ и до конца конструкции условия. 
 +    * После ''​%%ELSE%%''​ можно ставить,​ а можно не ставить двоеточие. 
 +    * При однострочной форме записи:​ 
 +      * и команды ​и ключевое слово ''​%%ELSE%%''​ должны быть записаны в одной строке 
 +      * окончанием альтернативного списка команд является конец строки. 
 +      * если однострочная форма записи ''​%%ELSE%%''​ используется в многострочной форме записи ''​%%IF%%'',​ все команды,​ которые идут в последующих строках после ''​%%ELSE%%''​ до ''​%%END%%''​ игнорируются
 +      * Примеры однострочной записи:​ <sxh qsp> 
 +! если сумма a и b равна двум, переменной c присваивается значение 30 
 +! в противном случае (то есть если сумма a и b не равна двум) 
 +! переменной c присваивается значение 10 
 +if a+b=2: c=30 else c=10 
 +! в зависимости от того есть ли в инвентаре апельсин 
 +! выводится соответствующий текст 
 +if obj "​Апельсин": pl "У Вас есть апельсин."​ else pl "У Вас нет апельсина."​ 
 +! однострочная форма else внутри многострочной if 
 +if $левая_рука = '​Великий меч':​ 
 +    gosub '​atack',​ 300 
 +    gosub '​health.prove'​ 
 +    gosub '​win.prove'​ 
 +else gosub '​atack',​ atack_power 
 +end 
 +</​sxh>​ 
 +    * При многострочной форме записи:​ 
 +      * все команды должны идти в последующих строках после ''​%%ELSE%%'';​ 
 +      * Примеры многострочной записи: <sxh qsp> 
 +if a+b=2: 
 +  c=30 
 +else 
 +  c=10 
 +end 
 +if obj "​Апельсин":​ 
 +  pl "У Вас есть апельсин."​ 
 +else 
 +  pl "У Вас нет апельсина."​ 
 +end 
 +if len($curtoken) > 0: 
 +  $tokens[curtoken_num] = $curtoken tokens_count = curtoken_num + 1 
 +else 
 +    tokens_count = curtoken_num 
 +end 
 +</​sxh>​ 
 +  * ''​%%ELSEIF%%''​ — ключевое слово, которое используется совместно с оператором ''​%%IF%%''​ и позволяет определять на одном уровне вложенности последовательно-исключающие условия. Ключевое слово ''​%%ELSEIF%%''​ имеет однострочную и многострочную формы записи. Многострочную форму записи можно использовать только в многострочных конструкциях с оператором ''​%%IF%%'',​ а однострочную — как в многострочных,​ так и в однострочных конструкциях с оператором ''​%%IF%%''​. Общие формы записи:​ <sxh qsp> 
 +! однострочная в однострочном условии 
 +IF [#​выражение 1]: {набор команд 1} ELSEIF [#​выражение 2]: {набор команд 2} ELSE {последний набор команд} 
 +! многострочная в многострочном условии 
 +IF [#​выражение 1]: 
 +  {набор команд 1} 
 +  … 
 +ELSEIF [#​выражение 2]: 
 +  {набор команд 2} 
 +  … 
 +ELSEIF … : 
 +  … 
 +ELSE 
 +  {последний набор команд} 
 +  … 
 +END 
 + 
 +! однострочная в многострочном условии  
 +IF [#выражение 1]: 
 +  {набор команд 1} 
 +  … 
 +ELSEIF [#​выражение 2]: {набор команд 2} & … 
 +ELSEIF … : … 
 +ELSE {последний набор команд} 
 +END 
 +</​sxh>​ Работает это следующим образом. Если ''​[#​выражение 1]''​ верно, выполняются команды ''​{набор команд 1}''​. Если ''​[#​выражение 1]''​ неверно,​ но верно ''​[#​выражение 2]'',​ выполняются команды ''​{набор команд 2}'',​ и т.д. И только если неверны все выражения в текущей конструкции условия,​ выполнятся команды после ''​ELSE''​. Верность выражения ''​[#​выражение 1]''​ не исключает верности выражения ''​[#​выражение 2]'',​ однако верность выражения ''​[#​выражение 2]''​ исключает верность выражения ''​[#​выражение 1]''​.\\ Особенности записи ''​ELSEIF'':​ 
 +    * Может использоваться вариант написания ''​%%ELSE ​IF%%''​. Работает точно так же. 
 +    * Если в многострочной конструкции ''​%%IF%%''​ после ''​%%ELSEIF%%''​ операторы идут в той же самой строке (однострочная форма),​ то все последующие строки игнорируются до следующего ''​%%ELSEIF%%'',​ либо до ''​%%ELSE%%''​ или ''​%%END%%''​. 
 +    * В конструкции ''​%%IF%%''​ c ''​%%ELSEIF%%''​ может как присутствовать,​ так и отсутствовать часть с ''​%%ELSE%%''​. 
 +    * Примеры:​ <sxh qsp> 
 +IF ОЧКИ>​124:​ 
 +  GOTO '​КОН3'​ 
 +ELSEIF ОЧКИ>​99:​ 
 +  GOTO '​КОН4'​ 
 +ELSE 
 +  GOTO '​КОН5'​ 
 +END 
 + 
 +if money mod 10=1 and money mod 100<>​11:​ 
 +  *pl "У вас <<​money>>​ монета."​ 
 +elseif money mod 10>1 and money mod 10<5 and (money mod 100<5 or money mod 100>20)
 +  *pl "У вас <<​money>>​ монеты." 
 +elseif money mod 10=0 or money mod 10>4 or (money mod 100>10 and money mod 100<​21):​ 
 +  ​*pl "У вас <<​money>>​ монет."​ 
 +end 
 +</​sxh>​ Пример записи ''​ELSEIF''​ с операторами в той же строке:​ <sxh qsp> 
 +if r = 0: 
 +  '​Вариант 0' 
 +  elseif r = 1: '​Вариант 1' 
 +  elseif r = 2: '​Вариант 2' 
 +  elseif r = 3: '​Вариант 3' 
 +  else: '​Без вариантов'​ 
 +end 
 +</​sxh>​ 
 +  * ''​%%END%%''​ — ключевое слово, которое указывает на конец многострочной конструкции условия. ​Допускается запись ''​%%END IF%%''​. Не используется для однострочных форм записи. 
 + 
 +Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой ​''​%%END%%''​
 + 
 +Некоторые примеры:​ 
 + 
 +<sxh qsp>
 if a+b<3 or y=8: if a+b<3 or y=8:
   p '​A+B<​3 или Y=8'   p '​A+B<​3 или Y=8'
-  nl   +  nl  
-  if j=88: nl & p '​NEXT' ​ +  if j=88: nl & p '​NEXT' ​
   if $h='​ooo':​   if $h='​ooo':​
     p '​loo'​ & jump '​lll'​     p '​loo'​ & jump '​lll'​
   end   end
 end end
 +</​sxh>​
  
-if a=0:+<sxh qsp> 
 +if a = 0:
   '​abc1234'​   '​abc1234'​
-  if b=0: '​0'​ else '​1'​ +  if b = 0: '​0'​ else '​1'​ 
-  if j=88:nl & p '​NEXT'​+  if j = 88: nl & p '​NEXT'​
   if $h='​ooo':​   if $h='​ooo':​
     p '​loo'​ & jump '​lll'​     p '​loo'​ & jump '​lll'​
   else   else
     p '​sample text'     p '​sample text'
-    v=8+    v = 8
   end   end
   1234   1234
-else+else:
   '​01234'​   '​01234'​
-  g=78+  g = 78
 end end
 </​sxh>​ </​sxh>​
-  * **ELSEIF** - позволяет создавать вложенные IF на одном уровне вложенности и используется вместо ELSE.  
-    * Правильно работает только в многострочной записи. (Исправлено в более новых версиях) 
-    * //​Пример://<​sxh qsp> 
-IF a=1: 
-  !операторы 
-ELSEIF a=2: 
-  !операторы 
-ELSEIF a=3: 
-  !операторы 
-END 
-</​sxh> ​ 
  
-----+<sxh qsp> 
 +if ((a+b)/​c)=45+54 or (b<5 or c>45) and no obj '​лопата'​ and $f=$vvv+'​RRRRR':​ p '​OK'​ & goto '​Next'​ 
 +if был_здесь[$curloc]:​ exit 
 +if a<3: jump '​sss'​ 
 +if $имя = '':​ msg '​Введите имя!'​ & jump '​ввод'​ 
 +if a+b=2:c=30 & gt '​next'​ else c=10 
 +</​sxh>​ 
 + 
 +Пример реализации однострочного варианта ''​%%ELSEIF%%'':​ 
 + 
 +<sxh qsp> 
 +if n=0: *pl "​Ноль"​ elseif n=1: *pl "​Один"​ elseif n=2: *pl "​Два"​ 
 +</​sxh>​ 
 + 
 +Несколько примеров неверной записи:​ 
 + 
 +<sxh qsp> 
 +! в этом случае,​ если условие не будет выполнено,​ 
 +! плеер проигнорирует только команду k1=34 
 +! поскольку посчитает,​ что это однострочное условие 
 +if abcd=3: k1=34 
 +    k2=35 & ! эта команда будет выполняться всегда 
 +    k3=36 & ! эта комнада будет выполняться всегда 
 +end & ! этот end будет проигнорирован 
 +</​sxh>​ 
 + 
 +<sxh qsp> 
 +! данная строка выведет ошибку "​неизвестное действие"​ 
 +! так как однострочные формы записи не должны оканчиваться end`ом 
 +if abcd=3: k1=34 else k1=25 end 
 +</​sxh>​ 
 + 
 +Пример использования однострочных ''​%%ELSEIF%%''​ и ''​%%ELSE%%''​ (аналог ''​%%CASE%%''​ на **QSP**): 
 + 
 +<sxh qsp> 
 +if 0: 
 +    elseif z = 0: y = x * 100 
 +    elseif z = 1: y = x * 99 
 +    elseif z = 2: y = x * 88 
 +    elseif z = 3: y = x * 77 
 +    else: y = x * 11 
 +end 
 +</​sxh>​ 
 + 
 +===== Функции обработки условий ===== 
 + 
 +  * ''​%%IIF([#​выр],​[выр_да],​[выр_нет])%%'' ​возвращает значение выражения ''​%%[выр_да]%%'',​ если ''​%%[#​выр]%%''​ верно, иначе возвращает значение выражения ''​%%[выр_нет]%%''​. 
 +    * Эта функция в **QSP** является аналогом **тернарного оператора** в других языках программирования. 
 +    * Из выражений ''​%%[выр_да]%%''​ и ''​%%[выр_нет]%%''​ будет вычислено только одно, в зависимости от того, будет ли выполнено условие. 
 +    * Примеры:​ <sxh qsp> 
 +!Модуль числа 
 +abs_x=iif(x>​0,​x,​-x) 
 +!А следующая конструкция НЕ вызовет ошибку деления на ноль: 
 +set x=0 y=iif(x=0,​0,​1/​x) 
 +! типичное решение для вывода времени,​ чтобы не терять ноль на часах:​ 
 +$iif(hour>​9,​$str(hour),"​0"​+$str(hour))+":"​+$iif(minute>​9,​$str(minute),"​0"​+$str(minute)) 
 +</​sxh>​  
 +    * Эквивалентность конструкций условия c оператором ''​%%IF%%''​ и функции ''​%%IIF%%'':​ <sxh qsp> 
 +if number mod 2 = 0: 
 +  *pl "​Число чётное"​ 
 +else 
 +  *pl "​Число нечётное"​ 
 +end 
 +! эквивалентно 
 +*pl $iif(number mod 2 = 0,"​Число чётное","​Число не чётное"​) 
 +</​sxh>​
  
 [[help:​organizing|Вперёд:​ Пользовательские функции и процедуры]] [[help:​organizing|Вперёд:​ Пользовательские функции и процедуры]]
 +
help/conditional.1428907321.txt.gz · Последние изменения: 2015/04/13 09:42 (внешнее изменение)