Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Qwerry on May 30, 2017, 05:37:15 AM

Title: А можно ли...
Post by: Qwerry 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. вопрос возможно глупый, но я только начинаю пытаться изучать программирование, так что не кидайтесь помидорами.
Title: Re: А можно ли...
Post by: Vint 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]
Title: Re: А можно ли...
Post by: Qwerry on June 01, 2017, 02:57:49 AM
Спасибо большое за подробный ответ :)  Поняла, почему не получалось до этого,
 всё работает.

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

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

2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?
Title: Re: А можно ли...
Post by: Vint 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

//==============================================================================
Title: Re: А можно ли...
Post by: Vint on June 01, 2017, 08:15:47 AM
2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?

В справке. У меня даже скрин готов ещё год назад. Уже пару раз спрашивали  :)
Title: Re: А можно ли...
Post by: Qwerry 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 варианты окон ругается.
Title: Re: А можно ли...
Post by: Vint on June 01, 2017, 06:26:25 PM
Ну да, Window обновлялась несколько раз позже и выложена ниже отдельно.
Title: Re: А можно ли...
Post by: Qwerry 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="(") .И без кавычек тоже пробовала :(
Title: Re: А можно ли...
Post by: Vint on June 05, 2017, 10:44:49 AM
Да, со скобками в строках в кликере беда. Я на кликере это задание не делал.
Ну значит отменяется минимум до финальной версии 4.13
Title: Re: А можно ли...
Post by: Qwerry 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 значение по умолчанию - пустая строка ""
Title: Re: А можно ли...
Post by: Vint 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. Всё гораздо проще.
Title: Re: А можно ли...
Post by: Qwerry on June 05, 2017, 02:19:43 PM
А так?

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

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

Но как это - проще?
Я и над стеками долго думала.  Правда логика чуть иная -  скобкам в стеке делать нечего. При любой открывающейся скобке в стек заносится лишь номер присущей этой паре скобок (1,2,3). При любой закрывающейся скобке - убираем элемент и вычитаем из него номер скобки. Если не ноль - значит ошибка. Если массив не пустой - тоже.
Title: Re: А можно ли...
Post by: Vint 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("еха[ли [медведи] (на ) велоси]педе")
Title: Re: А можно ли...
Post by: Qwerry on June 05, 2017, 03:13:24 PM
Выкладывать? Там значащих 30 строк с оформлением. Можно и меньше, но не нужно.

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

Ну в нашем случае наверное будет  аж целых 37 строчек ;D добавится поиск хеша для 6 видов скобок и сравниваемого символа.
Title: Re: А можно ли...
Post by: Vint 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 если пустой. Конец

Но можно проще. Повторю ещё раз.
Title: Re: А можно ли...
Post by: Vint on June 05, 2017, 03:14:46 PM
На кликере, с обычным поиском.
[spoiler]
Code: (clickermann) [Select]
#name   "Checking groups brackets"

SUB(check_brackets, $st)
    $st = STRFILTER($st, "()[]{}", 1)
    LOGWRITE("$st = ", $st)
   
    $lmax = STRLEN($st)
    $rep = 1
    WHILE($rep = 1)
        IF(STRLEN($st) = 0)
            LOGWRITE("Всё правильно!")
            $rep = 0
        ELSE
            FOR($i=0, $i < 3)
                $pos = STRPOS($st, $brackets[$i])
                IF($pos > 0)
                    $st1 = STRCUT2($st, 1, $pos-1)
                    $st2 = STRCUT2($st, $pos+2, $lmax)
                    $st = STRCONCAT($st1, $st2)
                    $i = 10
                END_IF
            END_CYC
            IF($i < 10)
                LOGWRITE("Проблемы!")
                $rep = 0
            END_IF
        END_IF
    END_CYC
    LOGWRITE("**********************")
END_SUB

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


STRSEPARATE("():[]:{}", ":", $brackets)

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

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

check_brackets("{(})")
check_brackets("([]")
check_brackets("[])")
check_brackets("еха[ли [медведи] (на ) велоси]педе")
HALT
[/spoiler]
Title: Re: А можно ли...
Post by: Qwerry on June 05, 2017, 04:23:52 PM
На кликере, с обычным поиском.
И правда так лучше и проще)
Но "мы не ищем легких путей!" Ну или не находим :D
Даже не подумала о подобном варианте. А ведь вроде уже знаю, какие для строк команды есть, почти всеми пользовалась.