Author Topic: А можно ли...  (Read 4000 times)

0 Members and 4 Guests are viewing this topic.

Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
А можно ли...
« on: May 30, 2017, 05:37:15 AM »
Всем доброго времени суток!
Суть проблемки примерно такая:  в начале программа находит несколько точек и записывает координаты Х в переменные  ($u1, $u2, $u3, $u4 ) (пока что неважно, что с Y).
В какой-то момент программа получает переменную $var, имеющую значение 1-4.
После чего, надо получить значение переменной ($u) под этой цифрой (например, при $var=1,  $u=$u1)

Интересно, как этого можно добиться и "склеить" переменную?
Попытка использовать STRCONCAT закономерно превращает переменную в текст, т.е.  $U= STRCONCAT("$u",$var)  => print("$u1 = ", $u)  дает не числовое значение указанной переменной, а лишь ее название "$u1 = $u1".
Поиграться с массивом и номером элемента почему-то не получилось - (видимо, какую-то тонкость с массивом не уловила)
Что еще может быть? Запись этих переменных в отдельный файл .txt  и вытаскивание по номеру строчки? :o

Понятно, что в моем случае их довольно мало, и можно через IF($var=1) $u=$u1 END_IF. Но хочется научиться пользоваться языком и уметь подобное делать попроще и красиво   ::)

P.S. вопрос возможно глупый, но я только начинаю пытаться изучать программирование, так что не кидайтесь помидорами.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #1 on: May 30, 2017, 09:45:01 AM »
Возможность есть в версии с 4.12
[spoiler]SETVAR ("$var", value) - присваивает значение переменной по ее имени
GETVAR ("$var") - функция; возвращает значение переменной по ее имени [/spoiler]

Но это ненормальный, точнее не нужный, метод. Т.к. такая возможность мало в каких языках есть.

Для этого давно придуманы массивы где хранятся множество данных в одной переменной.
Свои данные добавляешь в массив, допустим $u и они там хранятся в виде данных доступных по индексам (начиная с 0)
Code: (clickermann) [Select]
ARRPUSH($u, значение)
ARRPUSH($u, значение)
...

"Хранятся" они там примерно так:
(u1, u2, u3, u4)

Нужно тебе второе значение "u2"
Code: (clickermann) [Select]
$result = $u[1]   // значение массива $u по индексу 1
Так, как у тебя $var имеет значения 1-4, а индексы в этом массиве 0-3, то при доступе нужно отнять 1.
Code: (clickermann) [Select]
$result = $u[$var-1]
« Last Edit: May 30, 2017, 09:50:02 AM by Vint »


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #2 on: June 01, 2017, 02:57:49 AM »
Спасибо большое за подробный ответ :)  Поняла, почему не получалось до этого,
 всё работает.

А можно еще Вас помучать? А то вопросы всё появляются)

1. В логе для "3 в ряд" видела пример использования таймера (в мс). А если действие длится несколько минут и в мс смотреть совсем не вариант? Как лучше поступить?

2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #3 on: June 01, 2017, 08:11:59 AM »
Библиотеки пользовательских подпрограмм Libs for 4.11 v 1.2.7z
http://crapware.aidf.org/forum/index.php?topic=1147.0

Подключить файл logger.cms или вытащить оттуда две попрограммы
(вызов в комментариях)
Code: (clickermann) [Select]
//==============================================================================
//===  Вывод времени выполнения ms в формате час:мин:сек,мс ====================
SUB(timeprint, $tt_print)
   // Пример вызова:
   // timeprint(12345)
   IF($tt_print > 999)
      $timesec = $tt_print/1000
      $hours = int($timesec/3600)
      $minuts = int(($timesec - ($hours*3600))/60)
      $sec = ($tt_print - ($hours*3600*1000) - ($minuts*60*1000)) / 1000
      LOGWRITE ($hours,":" ,$minuts ,":" ,$sec )
   END_IF
END_SUB

//==============================================================================
//===  Вывод времени выполнения  ===============================================
SUB(print_timeaction, $actionnamet, $tt_search)
   // Пример вызова:
   // $timer1 = $_ms
   // ...
   // print_timeaction("тест 1", $_ms - $timer1)
   LOGWRITE ("===============  время выполнения  ===============")
   LOGWRITE ("время выполнения ", $actionnamet, " : ", $tt_search, " мс")
   timeprint($tt_search)
   LOGWRITE (" ")
END_SUB

//==============================================================================


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #4 on: June 01, 2017, 08:15:47 AM »
2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?

В справке. У меня даже скрин готов ещё год назад. Уже пару раз спрашивали  :)


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #5 on: June 01, 2017, 01:16:23 PM »
Quote from: Vint
В справке. У меня даже скрин готов ещё год назад. Уже пару раз спрашивали  :)
Ну "чукча не читатель", видимо) Не добралась еще до того раздела.

Ну хоть по таймеру - примерно так и пробовала сделать, через пару новых переменных, вычисления и int.
Библиотеки пользовательских подпрограмм Libs for 4.11 v 1.2.7z
http://crapware.aidf.org/forum/index.php?topic=1147.0
;D Ура, спасибище!!!  Утащила к себе)
 А ведь только хотела просить помощи по диалоговым окнам) Чтоб было с таймером, делала через INPUTBOX, а хотелось через 5 кнопочек. 
Побежала пробовать. А если в диалоговом окне я захочу сделать возможность управления не только мышью, но и с клавиатуры -  просто загоняю в код "IF(iskeydown(#1)=1)   $return=1  END_IF", правильно?

P.S.: в верхнем сообщении (Libs for 4.11 v 1.2.7z) лежит не последняя (Window_v2.5 исправленная.7z), а чуть более ранняя версия, которая при попытка глянуть 13 и 14 варианты окон ругается.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #6 on: June 01, 2017, 06:26:25 PM »
Ну да, Window обновлялась несколько раз позже и выложена ниже отдельно.


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #7 on: June 05, 2017, 09:35:40 AM »
Пробовала выполнить задание со скобками. И в самом начале скрипта не понимаю как поступить... Надо сравнить символ со скобками () [] {}. 
 
 
Code: (Clickermann) [Select]
$str=INPUTBOX("Введите сообщение для проверки правильности расстановки скобок...", , 10)
LOGWRITE ($str)
UNDEFINE($wrong)
FOR($a=0, $a < STRLEN($str))
   $b=STRCUT($str1, $a+1, 1)
   If($b="(")
       LOGWRITE ($b) 
   end_if
END_CYC


Попытка найти эту скобку ведет к ошибке.  Ошибка интерпретации строки If($b="(") .И без кавычек тоже пробовала :(

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #8 on: June 05, 2017, 10:44:49 AM »
Да, со скобками в строках в кликере беда. Я на кликере это задание не делал.
Ну значит отменяется минимум до финальной версии 4.13


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #9 on: June 05, 2017, 01:38:04 PM »
Только хотела порадоваться, что может в остальном написала все нормально - но не тут-то было ;D  Заменила скобки на цифры  - и почти час вылавливала ошибки из "почти готового" кода. Причем две из них  - со скобками (правда не последовательности, а наличия). Но вроде со switch разобралась - классно, что у Case значение может быть не числовым. Так что  итоговый вариант получился с парами A1, B2, C3.
Логика решения правильная?
[spoiler]
Code: (clickermann) [Select]
#name   "Checking Groups"
$count=0          //1 - find all the mistakes

$C=4
WHILE($C=4)
$Nwrong=0
UNDEFINE($arr)
 
$str=INPUTBOX(" Input the message to check it", , 10)   
  LOGWRITE ($str, "  --  ", STRLEN($str))
   FOR($a=1, $a < (STRLEN($str)+1))
      $wrong=0
      $b=STRCUT($str, $a, 1)
      SWITCH($b)
      CASE(a)
         Arrpush($arr, 1)
      CASE(b)
         Arrpush($arr, 2)
      CASE(c)
         Arrpush($arr, 3)
      CASE(1)
         $y=arrpop($arr)
         If($y-1=0)
         else
            $wrong=1
         end_if
      CASE(2)
         $y=arrpop($arr)
         If($y-2=0)
         else
            $wrong=1
         end_if
      CASE(3)
         $y=arrpop($arr)
         If($y-3=0)
         else
            $wrong=1
         end_if
      DEFAULT
$q=1     
      END_SWITCH
If($q=0)
 LOGWRITE ($a," - ", $b)    //only for searched elements
end_if   
$q=0   
      If($count=0)
         If($nwrong>0)
            $a=9999
         end_if
      end_if
      If($wrong=1)
         LOGWRITE ("incorrect")
         INC($Nwrong,1)
      end_if
   END_CYC
   
   LOGWRITE ("massive - ", ARRSIZE($arr))
   If(ARRSIZE($arr)>0)
      INC($nwrong, (ARRSIZE($arr)))
   end_if
   LOGWRITE ("mistakes - ",$Nwrong)
   if($Nwrong>0)
      $C= DIALOGBOX(STRCONCAT($str, " -- incorrect!"), 5, 3)
      If($count=1)
         HINTPOPUP (STRCONCAT( $nwrong, "  mistakes"))
      end_if
   else
      $C= DIALOGBOX("Correct", 5, 0)
   end_if
END_CYC
HALT
[/spoiler]

А почему у меня при попытке утащить код из программы вся кириллица превращается в... в упрощенную эльфийскую вязь? ну или во что-то, что приходится стирать и уже на месте печатать заново.

В INPUTBOX значение по умолчанию - пустая строка ""
« Last Edit: June 05, 2017, 02:11:54 PM by Vint »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #10 on: June 05, 2017, 02:08:20 PM »
[spoiler]
Code: (Clickermann) [Select]
$str=INPUTBOX("Введите сообщение для проверки правильности расстановки скобок...", , 10)
LOGWRITE ($str)
UNDEFINE($wrong)
FOR($a=0, $a < STRLEN($str))
   $b=STRCUT($str1, $a+1, 1)
   If($b="(")
       LOGWRITE ($b) 
   end_if
END_CYC
[/spoiler]
Попытка найти эту скобку ведет к ошибке.  Ошибка интерпретации строки If($b="(") .И без кавычек тоже пробовала :(

А так?
Code: (clickermann) [Select]
$str = INPUTBOX("Введите сообщение для проверки правильности расстановки скобок...", "", 10)
LOGWRITE($str)
UNDEFINE($wrong)
FOR($a=0, $a < STRLEN($str))
    $b = STRCUT($str, $a+1, 1)
    LOGWRITE($b)
    If(STRMD5($b) = STRMD5("("))  //  84C40473414CAF2ED4A7B1283E48BBF4
        LOGWRITE($b)
    end_if
END_CYC
HALT
Всё нормально выводит.

А почему у меня при попытке утащить код из программы вся кириллица превращается в... в упрощенную эльфийскую вязь? ну или во что-то, что приходится стирать и уже на месте печатать заново.
При копировании включай русскую раскладку.


строки должны быть в кавычках, всякие abc/ Только не пойму зачем они там?


С этой задачей всё намного проще. Я тоже сначала делал через стек. Перебирал все скобки подряд. Если открывающая заносим в стек, если закрывающая - смотрим что на вершине. Если там закрывающая - добавляем скобку в стек, если открывающая - убираем.
В итоге если стек пустой, то всё правильно. Но решение дико неправильное  ;D. Всё гораздо проще.
« Last Edit: June 05, 2017, 02:28:55 PM by Vint »


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #11 on: June 05, 2017, 02:19:43 PM »
А так?

Если бы я и додумалась искать сравнивать символ по хешу, то в лучшем случае через неделю ;D Спасибо! должно сработать ;)

Quote
С этой задачей всё намного проще. Я тоже сначала делал через стек. Перебирал все скобки подряд. Если открывающая заносим в стек, если закрывающая - смотрим что на вершине. Если там закрывающая - добавляем скобку в стек, если открывающая - убираем.
В итоге если стек пустой, то всё правильно. Но решение дико неправильное  ;D. Всё гораздо проще.

Но как это - проще?
Я и над стеками долго думала.  Правда логика чуть иная -  скобкам в стеке делать нечего. При любой открывающейся скобке в стек заносится лишь номер присущей этой паре скобок (1,2,3). При любой закрывающейся скобке - убираем элемент и вычитаем из него номер скобки. Если не ноль - значит ошибка. Если массив не пустой - тоже.
« Last Edit: June 05, 2017, 03:09:46 PM by Qwerry »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #12 on: June 05, 2017, 02:58:06 PM »
Выкладывать? Там значащих 30 строк с оформлением. Можно и меньше, но не нужно.

Проверочные данные:
Code: (clickermann) [Select]
check_brackets("[[]()]")
check_brackets("()")
check_brackets("({")

check_brackets("({})")
check_brackets("[[]()]")
check_brackets("[{()}]")

check_brackets("{(})")
check_brackets("([]")
check_brackets("[])")
check_brackets("еха[ли [медведи] (на ) велоси]педе")


Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: А можно ли...
« Reply #13 on: June 05, 2017, 03:13:24 PM »
Выкладывать? Там значащих 30 строк с оформлением. Можно и меньше, но не нужно.

Конечно выкладывать :)

Ну в нашем случае наверное будет  аж целых 37 строчек ;D добавится поиск хеша для 6 видов скобок и сравниваемого символа.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: А можно ли...
« Reply #14 on: June 05, 2017, 03:13:42 PM »
Со стеками на питоне было так:
Code: (php) [Select]
def group_check(s):
    pair = {'(': ')', '[': ']', '{': '}'}
    stack = []
    for ss in s:   // перебираем символы
        if ss in pair.keys():  // если это один из ключей т.е. открывающая ([{
            stack.append(ss)  // добавляем в стек (массив)
        else:   // если закрывающая
            if not stack: return False   // если стек пустой - то вывод "ошибка". Конец
            st = stack.pop()    // берём со стека последний элемент
            if pair[st] != ss:    // если он НЕ ответная пара нашей закрывающей
                return False      // вывод "ошибка". Конец
    return not stack  // вывод "ошибка" если стек не пустой. И "всё Ok если пустой. Конец

Но можно проще. Повторю ещё раз.
« Last Edit: June 05, 2017, 03:15:40 PM by Vint »