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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    AZJIO



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

    Цитата:
    17 - это коэффициент К2, исходя из условия.
    а (мин= 200, мах = 210) тогда что?

    Всего записей: 4408 | Зарегистр. 03-05-2006 | Отправлено: 12:38 16-04-2013 | Исправлено: AZJIO, 12:50 16-04-2013
    Zloy_Gelud



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

    Цитата:
    а (мин= 200, мах = 210) тогда что?

    Это диапазон значений X и Y.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    Запутался уже с этими константами-коэфициентами и меняющимися значениями. Пробовал сейчас на Си но не пойму как результаты возвращать, надо наверно структурой возвращать. лучше здесь спросить, спецы быстрее сделают.

    Всего записей: 4408 | Зарегистр. 03-05-2006 | Отправлено: 12:50 16-04-2013 | Исправлено: AZJIO, 12:51 16-04-2013
    Daniyar91

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я нашел все решения:
     

    Код:
    X = 205.19,    Y = 209.88
    X = 205.36,    Y = 207.8
    X = 205.53,    Y = 205.72
    X = 205.7,     Y = 203.64
    X = 205.87,    Y = 201.56
     

     
    Но AutoIt не хочет нормально обрабатывать условие:
     

    Код:
    ;~ $X * $K1 + $Y * $K2 = $Z
    $nMin = 200 ;минимальное значение X и Y
    $nMax = 210;максимальное значение X и Y
    $nStep = 0.01 ;длина шага в диапозоне ОТ минемального ДО максимального значений X и Y
     
    $nPlace = 2 ;кол-во знаков после запятой, для X и Y
     
    $K1 = 208 ;коэффициент К1
    $K2 = 17 ;коэффициент К2
    $Z =  46247.48 ;сумма
     
     
     
    Local $X, $Y
    Func Check()
        If (($Y >= $nMin And $Y <= $nMax) And (Round($Y, $nPlace) = $Y)) Then
            Return True
        Else
            Return False
        EndIf
    EndFunc

     
    For $X = $nMin To $nMax Step $nStep
        $Y = ($Z - Round($X,$nPlace) * $K1) / $K2
        ConsoleWrite(Round($X,$nPlace) & ' ' & $Y & @CRLF)
        If Check() Then ExitLoop
    Next
     
    If Check() Then
        MsgBox(0, '', 'X = ' & $X & ', Y = ' & $Y)
    Else
        MsgBox(0, '', 'Решений нет.')
    EndIf

     
    P.S. Кто-нибудь знает, какая разница в выражениях:

    Код:
    $Y >= $nMin And $Y <= $nMax

    и

    Код:
    $nMin <= $Y <= $nMax

    Я думал что нет разницы, но они возвращают разные значения (False, True), при одинаковых переменных.

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 13:18 16-04-2013
    Zloy_Gelud



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

    Цитата:
    Я думал что нет разницы, но они возвращают разные значения (False, True), при одинаковых переменных.

    А где вы вообще увидели такой способ написания условий? Если логически рассуждать, то сначала проверяется условие ($nMin <= $Y) и возвращается результат 1 (True), а затем проверяетсяусловие 1 <= $nMax и возв-ся, соотвественно, опять 1 (True).  
     
     
    Добавлено:

    Цитата:
    Но AutoIt не хочет нормально обрабатывать условие:  

    А как вообще может выполниться условие Round($Y, $nPlace) = $Y ?
     
    Добавлено:
    embrace909 -- попробуй еще такое. Может прокатит..

    Код:
    #include "Array.au3"
     
    ; Диапазон Х и Y: от 0 до 10 с шагом 0.01
    Local $aXIn[3] = [200, 210, 0.01]
    Local $aYIn[3] = [200, 210, 0.01]
     
    Local $K1 = 208 ; коэффициент К1
    Local $K2 = 17 ; коэффициент К2
     
    Local $Sum = 46247.48 ; Сумма
     
    Local $aRes[1][2]
    For $X = $aXIn[0] To $aXIn[1] Step $aXIn[2]
        $X = Round($X, 5) ; говнохак
        For $Y = $aYIn[0] To $aYIn[1] Step $aYIn[2]
            $Y = Round($Y, 5)
            If (Round($X * $K1 + $Y * $K2, 5) = $Sum) Then
                ReDim $aRes[UBound($aRes) + 1][2]
                $aRes[UBound($aRes) - 1][0] = $X
                $aRes[UBound($aRes) - 1][1] = $Y
                ;ExitLoop
            EndIf
        Next
    Next
    $aRes[0][0] = "X"
    $aRes[0][1] = "Y"
     
    _ArrayDisplay($aRes)

    Всего записей: 3265 | Зарегистр. 30-05-2007 | Отправлено: 13:33 16-04-2013 | Исправлено: Zloy_Gelud, 16:05 16-04-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Зачем здесь вообще метод подстановки? Формула вполне позволяет вынести в правую часть выражения все константы и Y, оставив в левой только X. В итоге просто подставляй значения в Y и получай значение X. Получится кривая зависимости X от Y, алгебра 8 класс вроде.

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

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

    Цитата:
    А как вообще может выполниться условие Round($Y, $nPlace) = $Y ?

    Нам надо чтобы у Y было максимум два знака после запятой, но формула $Y = ($Z - Round($X,$nPlace) * $K1) / $K2 этого не учитывает и возвращает все истинные варианты, например: $Y = 205.204105882353 и $Y = 205.96, а этим условием мы отсеиваем все лишнее т.е. из этих 2 значений верное будет 205.96, так как, (Round($Y, $nPlace) = $Y) = (Round(205.204105882353, 2) = 205.2) = False.
     

    Цитата:
    Получится кривая зависимости X от Y, алгебра 8 класс вроде

    Я примерно так и делал.

    Всего записей: 425 | Зарегистр. 30-08-2011 | Отправлено: 14:24 16-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    То что доктор прописал!
     
    Добавлено:
    AZJIO

    Цитата:
    Зачем здесь вообще метод подстановки? Формула вполне позволяет вынести в правую часть выражения все константы и Y, оставив в левой только X. В итоге просто подставляй значения в Y и получай значение X. Получится кривая зависимости X от Y, алгебра 8 класс вроде.
    Интересная идея - она бы сократила количество вычислений процессором в квадратный корень, из миллиона получилась бы тысяча вычислений.

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



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

    Цитата:
    алгебра 8 класс вроде.

     
    embrace909

    Цитата:
    Интересная идея - она бы сократила количество вычислений процессором в квадратный корень, из миллиона получилась бы тысяча вычислений.  

    Возможны вы правы. Но я написал тот вариант кода, который первый пришел мне в голову.
    PS. Исправил предыдущий свой код - закомментил "exitloop".

    Всего записей: 3265 | Зарегистр. 30-05-2007 | Отправлено: 15:00 16-04-2013 | Исправлено: Zloy_Gelud, 15:22 16-04-2013
    Risovod



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Astra55
    Спасибо, попробую с программой Scanitto. Сейчас для быстрого сканирования с минимальными ресурсами использую WinScan2PDF.

    Всего записей: 939 | Зарегистр. 12-11-2006 | Отправлено: 15:47 16-04-2013
    Astra55



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Risovod
    Я не предлагал Scanitto, хотя сам им пользуюсь, можете переделать скрипт для своего софта.

    ----------
    Per warez ad scientiam

    Всего записей: 11717 | Зарегистр. 16-05-2003 | Отправлено: 16:07 16-04-2013
    Zloy_Gelud



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

    Цитата:
    алгебра 8 класс вроде.

    http://www.dl.bsu.by/mod/book/view.php?id=4493
    Как я понял из вышеприаеденной ссылки, линейное уравнение с двумя неизвестными решается именно методом подстановки.

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



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

    Цитата:
    http://www.dl.bsu.by/mod/book/view.php?id=4493
    Как я понял из вышеприаеденной ссылки, линейное уравнение с двумя неизвестными решается именно методом подстановки.

    Всё правильно. Методом подстановки обоих неизвестных - мы получаем как равенства, так и неравенства во всех вариантах. А в случае подстановки только одного неизвестного - мы всегда получаем только равенства и 2й неизвестный остаётся проверить на наличие сотых долей. При этом КПД повышается в квадратный корень.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909 -- сложно что-то мне это понять. На что мозгов хватило, то и накодил.
     
    Добавлено:
    А вообще есть http://www.wolframalpha.com. Разберешься - и AutoIt не нужен будет.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Наглядно это можно показать так:
    Вычисляем X = ( S - (Y * K2)) / K1
    где Y от сих до псих,
    и если X получился с более 2 знаками после запятой - значит не заносится в базу нужных решений.

    Всего записей: 4473 | Зарегистр. 03-03-2006 | Отправлено: 17:07 16-04-2013 | Исправлено: embrace909, 17:10 16-04-2013
    Zloy_Gelud



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

    Цитата:
    Вычисляем X = ( Z - (Y * K1)) / Y  

    Может Х = (Z - Y * K2) / K1

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    Ну вот, а говорил мозгов не хватает.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    embrace909 -- вот. Не знаю каким чудом, но работает на том примере, что ты приводил.

    Код:
    #include "Array.au3"
     
    ; Диапазон Х и Y: от 0 до 10 с шагом 0.01
    Local $aXIn[2] = [200, 210]
    Local $aYIn[3] = [200, 210, 0.01]
     
    Local $K1 = 208 ; коэффициент К1
    Local $K2 = 17 ; коэффициент К2
     
    Local $Sum = 46247.48 ; Сумма
     
    Local $aRes[1][2], $aSplit
     
    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 (StringLen($aSplit[1]) <= 2) Then
            ReDim $aRes[UBound($aRes) + 1][2]
            $aRes[UBound($aRes) - 1][0] = $X
            $aRes[UBound($aRes) - 1][1] = $Y
        EndIf
    Next
     
    $aRes[0][0] = "X"
    $aRes[0][1] = "Y"
     
    _ArrayDisplay($aRes)

    PS. Скрипт работает, если X и Y - десятичные числа. С целыми не работает.

    Всего записей: 3265 | Зарегистр. 30-05-2007 | Отправлено: 17:25 16-04-2013 | Исправлено: Zloy_Gelud, 17:31 16-04-2013
    embrace909



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Zloy_Gelud
    Вау, теперь время поиска сократилась с нескольких минут до нескольких секунд, будем тестить, при X с сотыми выдал Y целое.

    Всего записей: 4473 | Зарегистр. 03-03-2006 | Отправлено: 18:05 16-04-2013
    AZJIO



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

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

    Local $iMinX = 200
    Local $iMaxX = 210
    Local $nStep = 0.01
     
    Local $kx = 208 ; коэффициент К1
    Local $ky = 17 ; коэффициент К2
     
    Local $Sum = 46247.48 ; Сумма
     
    Local $aRes[1][2]
     
    $timer = TimerInit()
    ; Вычисление
    $j = 0
    For $Y = $iMinX To $iMaxX Step $nStep
        $Y
    = Round($Y, 2)
        $X = ($Sum - $Y * $ky) / $kx
        If Not StringRegExp($X, '\.\d{3,}') Then
            $j += 1
            ReDim $aRes[$j][2]
            $aRes[$j - 1][0] = $X
            $aRes
    [$j - 1][1] = $Y
        EndIf
    Next

    $timer = TimerDiff($timer)
     
    _ArrayDisplay($aRes, 'Результат ' & Round($timer, 2), -1, 0, '', '|', '№|X|Y')

     

    Цитата:
    при X с сотыми выдал Y целое.

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

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

    Local $iMinX = 200
    Local $iMaxX = 210
    Local $Sum = 46247.48 ; Сумма
     
    $iMinX *= 100
    $iMaxX *= 100
    $Sum *= 100 ; Сумма
     
    Local $kx = 208 ; коэффициент К1
    Local $ky = 17 ; коэффициент К2
     
     
    Local $aRes[1][2]
     
    $timer = TimerInit()
    ; Вычисление
    $j = 0
    For $Y = $iMinX To $iMaxX
        $X
    = ($Sum - $Y * $ky) / $kx
        If Not StringInStr($X, '.') And StringRight($X, 1)<>'0' And StringRight($Y, 1)<>'0' Then
            $j += 1
            ReDim $aRes[$j][2]
            $aRes[$j - 1][0] = $X/100
            $aRes[$j - 1][1] = $Y/100
        EndIf
    Next

    $timer = TimerDiff($timer)
     
    _ArrayDisplay($aRes, 'Результат ' & Round($timer, 2), -1, 0, '', '|', '№|X|Y')

    Всего записей: 4408 | Зарегистр. 03-05-2006 | Отправлено: 18:07 16-04-2013 | Исправлено: AZJIO, 18:24 16-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