Автор Тема: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Прочитано 237963 раз)

0 Пользователей и 1 Гость просматривают эту тему.

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Сообщений: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #30 : Ноябрь 10, 2012, 01:22:22 pm »
В теме "Предложения по применению от новичков."  Сергей  написал интересный  скрипт,  который  позволяет ставить дату и время  в удобочитаемом формате.   http://clickermann.tk/forum/index.php?topic=36.msg373#msg373
 Нельзя ли его перенести сюда , в шапку примеров?
На этом примере новичкам можно показать, как работает функция  инклуд.
Бабочки полёт будит тихую поляну в солнечном свету...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #31 : Ноябрь 10, 2012, 03:26:23 pm »
Скрипт включает действия в определенное время.
IF_TIME("*:*:*"). Звездочка означает любой час, любую минуту и секунду.

IF_TIME("12:00:00") // сработает в 12:00:00
END_IF

Пример:
IF_TIME("12:10:*") // Включаем в 12.10
$t1 = 1
END_IF

IF_TIME("16:10:*") // Отключаем в 16.10
$t1 = 0
END_IF


IF_TIME("16:10:*") // Включаем в 16.10
$t2 = 1
END_IF

IF_TIME("12:10:*") // Отключаем в 12.10
$t2 = 0
END_IF


IF($t1 = 1) // 12.10
// здесь Действие 
// Будет выполняться с 12.10 по 16.10
LOGWRITE("Задание в 12.10")
END_IF

IF($t2 = 1) // 16.10
// здесь Действие
// Будет выполняться с 16.10 по 12.10
LOGWRITE("Задание в 16.10")
END_IF

WAITMS (500)
« Последнее редактирование: Ноябрь 10, 2012, 03:30:31 pm от Oraven »

Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 593
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #32 : Ноябрь 11, 2012, 07:32:24 am »
Написание подпрограммы для вычисления даты
Пример создания пользовательских подпрограмм и их подключения через директиву include
Оригинальный пост пользователя Сергей: http://clickermann.tk/forum/index.php?topic=36.msg373#msg373

Данный пример раскрывает возможность "прятать от глаз" большой громоздкий код в программные библиотеки.
Имеется задача: вычислить текущую дату на основании системной переменной $_time_t
Для этого была написана следующая подпрограмма, для удобства вынесенная в отдельный файл date.cms

date.cms
Код: Clickermann
  1. // Day, Month, Year from $_time_t
  2. // Author: Sergey
  3. // Version: 1.0 (30.10.2012)
  4.  
  5. SUB(UPDATE_DATE)
  6.   $_date_y = 1970
  7.   $_date_m = 1
  8.   $_date_d = ROUND(($_time_t / (3600 * 24)) - $voi, 0) + 1//floor
  9.   $voi = 0.499999999999
  10.   $break = 0
  11.  
  12.   WHILE($break = 0)
  13.      $arg1 = $_date_y-1968
  14.      $arg2 = 4
  15.      IF($arg1-(ROUND(($arg1/$arg2)-$voi,0)*$arg2) = 0)//mod($_date_y-1968, 4) = 0
  16.         $nd = 366
  17.      ELSE
  18.         $nd = 365
  19.      END_IF
  20.  
  21.      if($_date_d > $nd)
  22.         INC($_date_d, 0-$nd)
  23.         INC($_date_y, 1)
  24.      ELSE
  25.         $break = 1
  26.      END_IF
  27.   END_CYC
  28.   $break = 0
  29.  
  30.   WHILE($break = 0)
  31.      $arg1 = $_date_y-1968
  32.      $arg2 = 4
  33.      IF( ($arg1-(ROUND(($arg1/$arg2)-$voi,0)*$arg2) = 0) & ($_date_m = 2) )//(mod($_date_y-1968, 4) = 0) & ($_date_m = 2)
  34.         $nd = 29
  35.      ELSE
  36.         $nd = STRCUT("31,28,31,30,31,30,31,31,30,31,30,31", (($_date_m-1) * 3) + 1, 2)
  37.      END_IF
  38.      IF($_date_d > $nd)
  39.         INC($_date_d, 0-$nd)
  40.         INC($_date_m, 1)
  41.      ELSE
  42.         $break = 1
  43.      END_IF
  44.   END_CYC
  45. END_SUB
  46.  
  47. GOSUB(UPDATE_DATE)

После вызова эта подпрограмма создает следующие переменные, которые могут использоваться в вашей программе
  • $_date_d - День
  • $_date_m - Месяц
  • $_date_y - Год


Пример использования подпрограммы
Код: Clickermann
  1. // Подключаем файл, содержащий подпрограмму UPDATE_DATE, это работает так же, как если бы вы просто скопировали все содержимое файла date.cms за место этой строчки
  2. #include "date.cms"  
  3.  
  4. print($_date_d,".",$_date_m,".",$_date_y) // Выводим "старую" дату
  5.  
  6. GOSUB(UPDATE_DATE) // Вызов подпрограммы (напоминаю что ее "тело" находится в подключенном файле date.cms), обновление переменных
  7. print($_date_d,".",$_date_m,".",$_date_y) // Выводим актуальную дату
  8.  
  9. HALT

Этот пример вы можете скачать из вложения

Ах да, скрипт не будет работать если вы изобрели машину времени и переместились раньше 1970 года.
Отдельное спасибо Ляпису за идею с обходом отсутствия массивов.

Сергей

  • Активный участник
  • ***
  • Сообщений: 159
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #33 : Ноябрь 11, 2012, 08:00:45 am »
Хм, а почему в справке о условии IF_TIME нигде не написано?
Отсутствую.

Johnny

  • Создатель
  • Герой форума
  • *
  • Сообщений: 593
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #34 : Ноябрь 11, 2012, 08:28:45 am »
Хм, а почему в справке о условии IF_TIME нигде не написано?
потому что я думал что удалил его уже давно. очередной костыль из серии if_что-то. неправильно все это.
пользуйтесь переменными

кто спойлеры просил.
[spoiler=вот есть пока такие]
потом может доработаю
сейчас надо другие дела поделать
[/spoiler]
« Последнее редактирование: Ноябрь 11, 2012, 08:30:31 am от Johnny »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #35 : Ноябрь 15, 2012, 09:00:03 pm »
Скрипт выполняет действия в разные промежутки времени

1 действие 1 раз в 30 секунд
2 действие 1 раз в 1 минуту
3 действие 1 раз в 2 минуты

$_time_t - это системная переменная. При каждом обращении к ней возвращает текущее время в формате Unix-систем
Отсчет времени идет в секундах. А если нужно использовать миллисекунды то в место $_time_t пишем $_ms - Системный таймер Windows.
Имя переменных $time1, $time2 и тд. может быть любым.

Код: Clickermann
  1. // ПЕРВОЕ ДЕЙСТВИЕ РАЗ В 30 СЕКУНД
  2. IF($time1 < $_time_t) // условие сработает если переменная $time1 меньше $_time_t
  3. $time1 = $_time_t + 30 // записываем в переменную $time1 текущее время + 30 секунд
  4.  
  5. // Здесь пишутся необходимые действия
  6.  
  7. END_IF // конец первого условия
  8.  
  9. // ВТОРОЕ ДЕЙСТВИЕ РАЗ В 1 МИНУТУ
  10. IF($time2 < $_time_t)
  11. $time2 = $_time_t + 60
  12.  
  13. // Здесь пишутся необходимые действия
  14.  
  15. END_IF // конец второго условия
  16.  
  17. // ТРЕТЬЕ ДЕЙСТВИЕ РАЗ В 2 МИНУТЫ
  18. IF($time3 < $_time_t)
  19. $time3 = $_time_t + 120
  20.  
  21. // Здесь пишутся необходимые действия
  22.  
  23. END_IF // конец третьего условия
  24.  
  25. // вне условий можно написать действия которые должны выполняться постоянно
  26.  
  27. WAITMS (500) // задержка скрипта 500 мс для разгрузки процессора
  28.  

Также, время следующего срабатывания может записываться в файл ini.
Это важно если действия выполняются, например, раз в час или еще дольше, можно остановить кликер, и таймеры не собьются.
INT и STRCONCAT я использовал чтобы кликер при отсутствии файла time.ini не выдавал ошибок (вернет 0 если строки или файла не существует)

Код: Clickermann
  1. // Эти строки выполняются при запуске 1 раз
  2. $time1 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time1", "TIME")))
  3. $time2 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time2", "TIME")))
  4. $time3 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time3", "TIME")))
  5.  
  6. go: // далее произойдет зацикливание до метки GO
  7.  
  8. IF($time1 < $_time_t)
  9. $time1 = $_time_t + 30
  10. INIWRITE ("time.ini", "Time1", $time1, "TIME") // запись в файл time.ini времени следующего срабатывания условия
  11.  
  12. // Здесь пишутся необходимые действия
  13.  
  14. END_IF
  15.  
  16. IF($time2 < $_time_t)
  17. $time2 = $_time_t + 60
  18. INIWRITE ("time.ini", "Time2", $time2, "TIME")
  19.  
  20. // Здесь пишутся необходимые действия
  21.  
  22. END_IF
  23.  
  24. IF($time3 < $_time_t)
  25. $time3 = $_time_t + 120
  26. INIWRITE ("time.ini", "Time3", $time3, "TIME")
  27.  
  28. // Здесь пишутся необходимые действия
  29.  
  30. END_IF
  31.  
  32. WAITMS (500)
  33.  
  34. goto(go) // переход к метке GO
  35.  
« Последнее редактирование: Ноябрь 17, 2012, 12:13:26 am от Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #36 : Ноябрь 15, 2012, 09:39:16 pm »
Перезагрузить или выключить компьютер.

Для этого пишем такие строки

Отключение компьютера
Код: Clickermann
  1. EXECUTE ("shutdown.exe", "/s /t 00")
  2. HALT

Отключение компьютера с принудительным завершением приложений без предварительного предупреждения
Код: Clickermann
  1. EXECUTE ("shutdown.exe", "/s /f /t 00")
  2. HALT

Перезагрузка компьютера
Код: Clickermann
  1. EXECUTE ("shutdown.exe", "/r /t 00")
  2. HALT

Обозначения:
/l                      Выход (Log off)
/s                     Завершение работы компьютера
/r                     Перезагрузка компьютера
/a                    Прекращение завершения работы системы
/t xx                Таймаут завершения работы - xx сек.
/f                     Принудительное завершение приложений без предварительного предупреждения
« Последнее редактирование: Октябрь 11, 2016, 09:33:29 pm от Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3685
  • Котэ
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #37 : Ноябрь 25, 2012, 07:05:51 pm »
Как нажать Ctrl+V в оконном режиме?

Вариант 1
Код: Clickermann
  1. TOCLIP ("Тест") // отправляем текст в буфер
  2. SENDMESSAGE ($_hwnd, 0x0302, 0, 0) //Посылаем окну команду "Вставить из буфера"
  3. halt // стоп

Если не работает используем другой способ.
Вариант 2
Код: Clickermann
  1. TOCLIP ("Тест") // отправляем текст в буфер
  2. WAITMS (50)
  3.  
  4. $hwnd = $_hwnd // записываем в переменную $hwnd текущий HWND окна
  5. HSET ($hwnd,0) // отключаем оконный режим
  6. KEYDOWN (#CTRL) // зажимаем Ctrl
  7. HSET ($hwnd,1) // снова включаем оконный режим
  8. WAITMS (20)
  9. KEYPRESS (#V) // отправляем окну нажатие клавиши V
  10. HSET ($hwnd,0) // отключаем оконный режим
  11. KEYUP (#CTRL) // отпускаем Ctrl
  12. HSET ($hwnd,1) // снова включаем оконный режим
  13. halt // стоп

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3802
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #38 : Ноябрь 26, 2012, 11:22:02 am »
Люди, товарищи, граждане, господа...
Есть ли у кого решение известного языкового бага/особенности. Надоело следить за раскладкой в самом Кликермэне. Да и не всегда это возможно, если кровь из носа, а нужно использовать оба языка в одном скрипте.
Ситуацию бы спасло исправление работы программы или хотя бы костыли для этого + (как здесь предлагали) функция (переменная?) для определения раскладки в целевом окне.

Если кто-то решил проблему, поделитесь пожалуйста.


Сергей

  • Активный участник
  • ***
  • Сообщений: 159
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #39 : Ноябрь 29, 2012, 06:42:23 pm »
Да проблему сейчас твердо никак не решить, только если при включении скрипта следить за раскладкой. Нужно конечно переменную в которой находится текущая раскладка, по другому никак.
Отсутствую.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3802
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #40 : Ноябрь 30, 2012, 09:16:48 am »
Джонни, а нельзя по аналогии POSTMESSAGE на WinAPI ввести функцию
LoadKeyboardLayout - загрузить новую раскладку
достаточно будет её одной, ну для полной нирваны можно ещё
GetKeyboardLayout - определить текущую раскладку

Заранее извиняюсь если сморозил чушь, в WinAPI ничего не понимаю, просто искал информацию по POSTMESSAGE и обратил внимание.


Сергей

  • Активный участник
  • ***
  • Сообщений: 159
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #41 : Декабрь 01, 2012, 11:32:01 am »
Да надо просто ввести системную переменную $_kblayout и помещать в нее раскладку текущего окна при обращении к ней.
Отсутствую.

СлавьЯнИнъ

  • Активный участник
  • ***
  • Сообщений: 179
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #42 : Декабрь 06, 2012, 07:45:22 pm »
Друзья, всем привет ))

Возникает вопрос по посту - Написание подпрограммы для вычисления даты
У меня в данный момент вычисляет 7.12.2012.
Как вылечить, где править, может корректировку GMT поставить?
Но не в одной корректировке пояса дело.
добрый смех равняет всех

Сергей

  • Активный участник
  • ***
  • Сообщений: 159
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #43 : Декабрь 06, 2012, 11:58:14 pm »
СлавьЯнИнъ, а какое у тебя время?
Он по идее должен выдавать дату которая стоит у тебя на компьютере. В $_time_t кладется время прошедшее с 1 января 1970 года без поправок на часовой пояс, т.е. время когда этот момент настал именно в твоем часовом поясе.
Так выдает виндовс, и так выдает и кликерман.
Хотя велика вероятность что проблема в алгоритме, мог где-нибудь ошибиться.
Отсутствую.

СлавьЯнИнъ

  • Активный участник
  • ***
  • Сообщений: 179
    • Просмотр профиля
Re: Типовые алгоритмы, вводные статьи
« Ответ #44 : Декабрь 07, 2012, 11:54:31 pm »
Применено:
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)
GOSUB(UPDATE_DATE)
print($_date_d,".",$_date_m,".",$_date_y)

получено:
1. Если время с 00:00 до 12:59 то
оба принта с правильным числом
2. Если время с 13:00 до 23:59 то
первый принт показывает число на 1 больше, а второй нормальное.

Вот и гадать теперь где там эта ошибка ?? ((
добрый смех равняет всех