Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    результат должен быть только все числа с сотыми? Число типа 205.10 уже неверное?
     
    Тогда такой вариант. Кстати трюк с *100 увеличил скорость в 2 раза  

    Не-не, подходят целые, десятичные и сотые. А вот отрицательные иксы и 0 - не подходят.
    (в таком примере: 2 х 3 + 4 х 5 = 26)

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 19:20 16-04-2013 | Исправлено: embrace909, 19:29 16-04-2013
    Zloy_Gelud



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909 -- выводятся только положительные значения X и Y. Могут быть как десятичными, так  целыми.
     

    Код:
    #include "Array.au3"
     
    ; Диапазон Х и Y: от 0 до 10 с шагом 0.01
    Local $aYIn[3] = [1, 10, 0.01]
     
    Local $K1 = 2 ; коэффициент К1
    Local $K2 = 4 ; коэффициент К2
     
    Local $Sum = 26 ; Сумма
     
    Local $aRes[1][2], $aSplit
     
    $timer = TimerInit()
    For $Y = $aYIn[0] To $aYIn[1] Step $aYIn[2]
        $Y = Round($Y, 5)
        $X = ($Sum - $Y * $K2) / $K1
        $aSplit = StringSplit(String($X), '.', 2)
        If @error Or (StringLen($aSplit[1]) <= 2) And ($X > 0) Then
            ReDim $aRes[UBound($aRes) + 1][2]
            $aRes[UBound($aRes) - 1][0] = $X
            $aRes[UBound($aRes) - 1][1] = $Y
        EndIf
    Next
    $timer = TimerDiff($timer)
     
    $aRes[0][0] = "X"
    $aRes[0][1] = "Y"
     
    _ArrayDisplay($aRes, $timer)

    Всего записей: 3266 | Зарегистр. 30-05-2007 | Отправлено: 19:58 16-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    Спасибо большое, кажется теперь задача выполняется в оптимальном режиме. Там в заголовке - время в милисекундах? Ещё похоже правильнее в каментах написать вместо Диапазон Х и Y просто Диапазон Y.

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 20:35 16-04-2013
    Zloy_Gelud



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909

    Цитата:
    Там в заголовке - время в милисекундах?

    Да.

    Цитата:
    Ещё похоже правильнее в каментах написать вместо Диапазон Х и Y просто Диапазон Y.

    Да.

    Всего записей: 3266 | Зарегистр. 30-05-2007 | Отправлено: 23:40 16-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    Почему то мой скрипт выдаёт больше результатов 550 против 225, и все валидные, с проверкой. Срипт смотреть ниже, так как обновлён.

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 06:20 17-04-2013 | Исправлено: AZJIO, 09:55 17-04-2013
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я только учу AutoIT, и поэтому мне сложно понимать чужие скрипты, Zloy_Gelud зачем ты делаешь так $Y = Round($Y, 5) почему 5?
     
    AZJIO
    А зачем ты умножаешь на сто:
    $iMinY *= 100
    $iMaxY *= 100
    $Sum *= 100

    но при этом используешь формулу, в которой НЕ все перемножено на сто - $X = ($Sum - $Y * $ky) / $kx?

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 07:06 17-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Daniyar91

    Цитата:
    А зачем ты умножаешь на сто:  
    2*5 + 4*3 = 22
    (2*5 + 4*3)*100 = 22 * 100
    2*5*100 + 4*3*100 = 22 * 100
    так? это вроде обычная школьная математика, возможно 3 класс, когда обе части равенства можно умножить на одно и тоже число и равенство сохранится. Преймущество: не нужно цикл делать с шагом 0.01, так как 0.01*100 = 1 и соответственно манипулируем с целыми числами. Избавляемся от необходимости округлять числа, упрощается детеккт валидных чисел, теперь целое число валидное, а дробное - невалидное. Единственное приходится делить на 100 в результатах, чтобы привести к первоначальному формату. Если по условию число найденных очень мало, то скрипт отрабатывает в разы быстрее, так как проверка валидности самая оптимальная... А если результатов очень много то деление на 100 сглаживает разрыв выйгрыша по времени. Сейчас с текущими данными мой скрипт проигрывает по времени Zloy_Gelud на несколько процентов (214 мсек против 225 мсек), но надо учитывать что мой вариант в том же процентном отношении возвращает больше результатов. Думаю у Zloy_Gelud числа типа 0.02 округляются до 0, именно эти варианты пропадают из результата.
     
    embrace909

    Цитата:
    Zloy_Gelud  
    Вау, теперь время поиска сократилась с нескольких минут до нескольких секунд
    Исходя из ситуации я так понимаю что в реальности данных на много больше чем в тесте. Поэтому я сделал массив с запасом (обновлён скрипт выше), чтобы лишний раз не вызывать ReDim. Именно эта операция слабое место в цикле, и вообще при результатах больее 1000 смело можно задуматься над изменением ситуации с ReDim в каждом шаге цикла. Время выполнения упало с 225 мсек до 9 мсек

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 07:25 17-04-2013 | Исправлено: AZJIO, 07:58 17-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Спасибо огромное, твой скрипт действительно самый быстрый и точный!

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 09:30 17-04-2013
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909
    C учетом того, что сказал AZJIO постом выше, либо сегодня либо завтра сделаю еще быстрей.

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 09:35 17-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909
    Ну вот ещё чуть быстрее. Тут чтобы лишнее не проверять проверяется границы для отрицательных результатов.
     

    Код:
    #include "Array.au3"
     
    ; Входящие данные
    Local $iMinY = 100
    Local $iMaxY = 700
    Local $Sum = 753967.76 ; Сумма
     
    $iMinY *= 100
    $iMaxY *= 100
    $Sum *= 100
     
    Local $kx = 4507 ; коэффициент
    Local $ky = 109 ; коэффициент
     
    Local $aRes[1][3] = [[0]]
    ; Local $aRes[511][3] = [[510]] ; вариант изначально с запасом, реального выйгрыша нет
     
    ; Вычисление

    $timer = TimerInit()
    $Y = $Sum / $ky ; вычисляем $Y при $X=0
    If $Y <= $iMaxY Then $iMaxY = $Y - 1 ; ограничиваем верхнюю границу Y, после которой X становится отрицательный
    If $Y <= $iMinY Then Exit MsgBox(0, 'Сообщение', 'Завершаем работу скрипта, потому что X в указанном диапазоне принадлежит отрицательным числам')
     
    $j = 0
    For $Y = $iMinY To $iMaxY
        $X
    = ($Sum - $Y * $ky) / $kx
        If IsInt($X) Then ; проверяем что X целое число
            $j += 1
            If $j > $aRes[0][0] Then
                ReDim
    $aRes[$j * 2 + 1][3]
                $aRes[0][0] = $j * 2
            EndIf
            $aRes[$j][0] = $X / 100
            $aRes[$j][1] = $Y / 100
        EndIf
    Next
    ReDim
    $aRes[$j + 1][3]
    $aRes[0][0] = $j
    $timer
    = TimerDiff($timer)
     
    _ArrayDisplay($aRes, 'Время ' & Round($timer, 1), -1, 0, '', '|', '№|X|Y')
     
    ; проверка что результаты согласно формуле дают нужную сумму
    For $i = 1 To $j
        $aRes
    [$i][2] = $aRes[$i][0] * $kx + $aRes[$i][1] * $ky
    Next
    _ArrayDisplay($aRes, 'Проверка', -1, 0, '', '|', '№|X|Y|Сумма')

     

    Код:
    #include "Array.au3"
     
    ; Входящие данные
    ; Диапазон Y: от 0 до 10 с шагом 0.01

    Local $iMinY = 100
    Local $iMaxY = 700
    Local $nStep = 0.01
     
    Local $kx = 4507 ; коэффициент К1
    Local $ky = 109 ; коэффициент К2
     
    Local $Sum = 753967.76 ; Сумма
     
    Local $aRes[1][3] = [[0]]
     
    ; Вычисление
    $timer = TimerInit()
    $Y = $Sum / $ky ; вычисляем $Y при $X=0
    If $Y <= $iMaxY Then $iMaxY = $Y - $nStep ; ограничиваем верхнюю границу Y, после которой X становится отрицательный
    If $Y <= $iMinY Then Exit MsgBox(0, 'Сообщение', 'Завершаем работу скрипта, потому что X в указанном диапазоне принадлежит отрицательным числам')
    $j = 0
    For $Y = $iMinY To $iMaxY Step $nStep
        $Y
    = Round($Y, 2)
        $X = Round(($Sum - $Y * $ky) / $kx, 15)
        If StringRegExp($X, '^\d+(\.\d{1,2})?$') Then
            $j += 1
            If $j > $aRes[0][0] Then
                ReDim
    $aRes[$j * 2 + 1][3]
                $aRes[0][0] = $j * 2
            EndIf
            $aRes[$j][0] = $X
            $aRes
    [$j][1] = $Y
        EndIf
    Next
    ReDim
    $aRes[$j + 1][3]
    $aRes[0][0] = $j
    $timer
    = TimerDiff($timer)
     
    _ArrayDisplay($aRes, 'Результат ' & Round($timer, 2), -1, 0, '', '|', '№|X|Y')
     
    ; проверка что результаты согласно формуле дают нужную сумму
    For $i = 1 To $j
        $aRes
    [$i][2] = $aRes[$i][0] * $kx + $aRes[$i][1] * $ky
    Next
    _ArrayDisplay($aRes, 'Проверка', -1, 0, '', '|', '№|X|Y|Сумма')

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 09:47 17-04-2013 | Исправлено: AZJIO, 10:27 17-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2 вариант скрипта - валится с такими значениями:
    min   100
    max   700
    K1   4507
    K2   109
    Sum   753967.76
     
    а первый - гуд.

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 09:49 17-04-2013 | Исправлено: embrace909, 10:05 17-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909
    Обновил, сделав поправку в строке
    If $Y < $iMaxY
    If $Y <= $iMaxY
     
    Проверил, второй скрипт выдал 60001 результатов, процесс в памяти занимает 51 Мб. Но резёльтаты ошибочные потому что при изменяющемся Y = 100.01 до 100.19 при этом Х везде равен 164.87. Но ещё хуже что первый скрипт отработал намного быстрее и вернул 13 значений в которых Х = 164.87 вообще нет, возможно этот диапазон Y = 100.01 до 100.19  является результатом округления, хотя если убрать округление, то тоже ошибки будут.

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 10:23 17-04-2013
    77599073587



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите создать скрипт. Цель такова, ужен сценарий при котором бы открывался блокнот и в тексте было написано имя компьтера, знаю что это просто но не для меня) 1 день изучаю программу

    Всего записей: 31 | Зарегистр. 12-02-2013 | Отправлено: 10:24 17-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909
    Обновил ещё раз второй скрипт, округление поставил до 15-го знака, это округляет числа с периодом, типа 100.019999999999999 до 100.02, но не округляет числа типа таких 100.018723523256736 до сотых. Это исправило второй скрипт.
     
    77599073587
    Смотри в русской справки пример ControlSetText, только вместо вставки текста используй макрос @ComputerName

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 10:30 17-04-2013 | Исправлено: AZJIO, 10:32 17-04-2013
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    77599073587
    Наверно тебе никто не сможет помочь с таким сложным вопросом.

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 10:31 17-04-2013
    77599073587



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    спасибо за помощь !!!!!!

    Всего записей: 31 | Зарегистр. 12-02-2013 | Отправлено: 10:34 17-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    Но ещё хуже что первый скрипт отработал намного быстрее и вернул 13 значений в которых Х = 164.87 вообще нет

    почему же плохо, ведь там где они были - вообще не было правильных сумм при проверке.

    Цитата:
    Обновил ещё раз второй скрипт, округление поставил до 15-го знака

    а в чем фишка 2го скрипта, когда он заработал как 1й, но в 5 раз медленнее?

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 10:42 17-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909

    Цитата:
    а в чем фишка 2го скрипта, когда он заработал как 1й, но в 5 раз медленнее?
    Пока просто поддерживаю как вариант, иногда ситуация меняется. К примеру этот скрипт позволяет изменить шаг без особых переделываний скрипта. В данный момент он проигрывает только из-за Round и StringRegExp.

    Всего записей: 4412 | Зарегистр. 03-05-2006 | Отправлено: 10:50 17-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    Пока просто поддерживаю как вариант, иногда ситуация меняется.

    Теперь этот скрипт приобрел ту же проблему, что и у Zloy_Gelud - не хватает нескольких результатов для тех же 1, 10, 2, 4, 26: 528 против 550.
    В итоге пока первый скрипт является идеалом.

    Всего записей: 4490 | Зарегистр. 03-03-2006 | Отправлено: 11:30 17-04-2013
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909
    А в чем вообще заключается твоя задача, т.е. зачем это надо?

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 11:38 17-04-2013
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru