Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started 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. вопрос возможно глупый, но я только начинаю пытаться изучать программирование, так что не кидайтесь помидорами.
-
Возможность есть в версии с 4.12
[spoiler]SETVAR ("$var", value) - присваивает значение переменной по ее имени
GETVAR ("$var") - функция; возвращает значение переменной по ее имени [/spoiler]
Но это ненормальный, точнее не нужный, метод. Т.к. такая возможность мало в каких языках есть.
Для этого давно придуманы массивы где хранятся множество данных в одной переменной.
Свои данные добавляешь в массив, допустим $u и они там хранятся в виде данных доступных по индексам (начиная с 0)
ARRPUSH($u, значение)
ARRPUSH($u, значение)
...
"Хранятся" они там примерно так:
(u1, u2, u3, u4)
Нужно тебе второе значение "u2"
$result = $u[1] // значение массива $u по индексу 1
Так, как у тебя $var имеет значения 1-4, а индексы в этом массиве 0-3, то при доступе нужно отнять 1.
$result = $u[$var-1]
-
Спасибо большое за подробный ответ :) Поняла, почему не получалось до этого,
всё работает.
А можно еще Вас помучать? А то вопросы всё появляются)
1. В логе для "3 в ряд" видела пример использования таймера (в мс). А если действие длится несколько минут и в мс смотреть совсем не вариант? Как лучше поступить?
2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?
-
Библиотеки пользовательских подпрограмм Libs for 4.11 v 1.2.7z
http://crapware.aidf.org/forum/index.php?topic=1147.0
Подключить файл logger.cms или вытащить оттуда две попрограммы
(вызов в комментариях)
//==============================================================================
//=== Вывод времени выполнения 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
//==============================================================================
-
2. Где-то на форуме видела сложное условие - IF()& IF(). Ну тут понятно 1 и 2 (выполняться должны оба). А варианты "1 или 2", и "1 и/или 2" как обозначить? Закрывать его надо одним END_IF?
В справке. У меня даже скрин готов ещё год назад. Уже пару раз спрашивали :)
-
В справке. У меня даже скрин готов ещё год назад. Уже пару раз спрашивали :)
Ну "чукча не читатель", видимо) Не добралась еще до того раздела.
Ну хоть по таймеру - примерно так и пробовала сделать, через пару новых переменных, вычисления и 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 варианты окон ругается.
-
Ну да, Window обновлялась несколько раз позже и выложена ниже отдельно.
-
Пробовала выполнить задание со скобками. И в самом начале скрипта не понимаю как поступить... Надо сравнить символ со скобками () [] {}.
$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="(") .И без кавычек тоже пробовала :(
-
Да, со скобками в строках в кликере беда. Я на кликере это задание не делал.
Ну значит отменяется минимум до финальной версии 4.13
-
Только хотела порадоваться, что может в остальном написала все нормально - но не тут-то было ;D Заменила скобки на цифры - и почти час вылавливала ошибки из "почти готового" кода. Причем две из них - со скобками (правда не последовательности, а наличия). Но вроде со switch разобралась - классно, что у Case значение может быть не числовым. Так что итоговый вариант получился с парами A1, B2, C3.
Логика решения правильная?
[spoiler]#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 значение по умолчанию - пустая строка ""
-
[spoiler] $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="(") .И без кавычек тоже пробовала :(
А так?
$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. Всё гораздо проще.
-
А так?
Если бы я и додумалась искать сравнивать символ по хешу, то в лучшем случае через неделю ;D Спасибо! должно сработать ;)
С этой задачей всё намного проще. Я тоже сначала делал через стек. Перебирал все скобки подряд. Если открывающая заносим в стек, если закрывающая - смотрим что на вершине. Если там закрывающая - добавляем скобку в стек, если открывающая - убираем.
В итоге если стек пустой, то всё правильно. Но решение дико неправильное ;D. Всё гораздо проще.
Но как это - проще?
Я и над стеками долго думала. Правда логика чуть иная - скобкам в стеке делать нечего. При любой открывающейся скобке в стек заносится лишь номер присущей этой паре скобок (1,2,3). При любой закрывающейся скобке - убираем элемент и вычитаем из него номер скобки. Если не ноль - значит ошибка. Если массив не пустой - тоже.
-
Выкладывать? Там значащих 30 строк с оформлением. Можно и меньше, но не нужно.
Проверочные данные:
check_brackets("[[]()]")
check_brackets("()")
check_brackets("({")
check_brackets("({})")
check_brackets("[[]()]")
check_brackets("[{()}]")
check_brackets("{(})")
check_brackets("([]")
check_brackets("[])")
check_brackets("еха[ли [медведи] (на ) велоси]педе")
-
Выкладывать? Там значащих 30 строк с оформлением. Можно и меньше, но не нужно.
Конечно выкладывать :)
Ну в нашем случае наверное будет аж целых 37 строчек ;D добавится поиск хеша для 6 видов скобок и сравниваемого символа.
-
Со стеками на питоне было так:
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 если пустой. Конец
Но можно проще. Повторю ещё раз.
-
На кликере, с обычным поиском.
[spoiler]#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]
-
На кликере, с обычным поиском.
И правда так лучше и проще)
Но "мы не ищем легких путей!" Ну или не находим :D
Даже не подумала о подобном варианте. А ведь вроде уже знаю, какие для строк команды есть, почти всеми пользовалась.