Что нового

[Автоматизация] Сложный цикл

zip-per

Новичок
Сообщения
30
Репутация
0
Господа гуру, прошу вашей помощи в построении сложного цикла. Мне что-то никак не приходит решение в голову :-X

Я пишу 5 больших циклов автобота. Причем в каждом из них, должны присутствовать еще по паре циклов. Вот с одним из них не могу разобраться.

Код:
Суть идеи цикла - торговля товаром:
1. Проверяем наличие товара у чара.
2. Выдергиваем из HTML страницы ссылки куда можно его продать (их может быть от 0 до 20).
3. Переходим по первой ссылке и продаем товар.
4. = первому циклу.
5. Переходим по следующей ссылке и продаем товар.
И так до тех пор, пока не закончатся ссылки, либо товар.
Если, это все будет в такой последовательности как я написал, то на 4 пункте меня перекидывает в первый и все по новому до 4. А мне нужно из первого попасть в 5. Подскажите как вы решаете подобные задачи.
Заранее благодарен за ваши подсказки!
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Прочитал, вдумчиво прочитал, вопроса не понял. Тебе нужно из первого пункта попасть в 5-й при каком условии то?
 
Автор
Z

zip-per

Новичок
Сообщения
30
Репутация
0
Тебе нужно из первого пункта попасть в 5-й при каком условии то?
При условии если товар еще есть, то в 5 пункт. В противном случае выйти из цикла.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Re: [Автоматизация] [Автоматизация] Сложный цикл

zip-per [?]
Подскажите как вы решаете подобные задачи
C помощью оператора If.
Т.е. при проверке, если результат соответвует условию для перехода в пункт 5, то переходить в пункт 5.
Советую выложить исходный код отдельно по блокам, отвечающим за пункты.
 
Автор
Z

zip-per

Новичок
Сообщения
30
Репутация
0
Советую выложить исходный код отдельно по блокам, отвечающим за пункты.
Из всех блоков готов только один. Хотелось бы сразу иметь понимание в построение цикла что бы как раз потом блоки не переписывать :(
Или я подошел не с той стороны? Сперва пишут блоки, а потом цикл строят?

Вот все что есть пока: (выдернул со всеми ошибками и косяками) :-[
Код:
#include <IE.au3>
#include <Inet.au3>

HotKeySet ( "{ESC}" ,"_Exit")
WinActivate("Windows Internet Explorer")
$oIE = _IEAttach ("Windows Internet Explorer", "title")
;_IENavigate ($oIE,"http://www.ххх.ru/info.php?id=1")


While 1 
   Cycle1()
   Cycle2()  
  
   Sleep(250)
WEnd
Func _Exit()
    Exit
EndFunc



Func Cycle1()
;Проверяем наличие товара
$sHTML = _INetGetSource('http://www.ххх.ru/info.php?id=1')
$aUran  = StringRegExp($sHTML, "<tr><td style='font-size:8pt' align=right><a href=/statlist\.php\?r=uran>Уран</a>:</td><td style='font-size:8pt'><b>(\d*?)</b></td></tr>", 3)

If IsArray($aUran) Then
    If UBound($aUran) = 1 Then
        MsgBox(0, '', $aUran[0])
    Else
    MsgBox(0, '', 'Урана нет.', 2)
	EndIf
EndIf
;Вот тут должны следовать следующие пункты 2-5

EndFunc

;Дальше другой большой цикл по закупке товара, еще не приступал
Func Cycle2()
	_IENavigate ($oIE,"http://www.ххх.ru/map.php")
	EndFunc
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Алгоритм, например, такой:
Код:
While 1 
   _Step1()
WEnd

Func _Step1()
	; если, результат этой функции успешный (необходимый), то вызвать функцию _Step2(), в противном случае повторить функцию _Step1()
EndFunc

Func _Step2()
	; если, результат этой функции успешный (необходимый), то вызвать функцию _Step3(), в противном случае повторить функцию _Step2()
EndFunc

Func _Step3()
	; если, результат этой функции успешный (необходимый), то вызвать функцию _Step4(), в противном случае повторить функцию _Step3()
EndFunc

Func _Step4()
	; если, результат этой функции успешный (необходимый), то вызвать функцию _Step5(), в противном случае повторить функцию _Step4()
EndFunc

Func _Step5()
	; если, результат этой функции НЕ успешный (необходимый), то вызвать функцию _Step5()
EndFunc
 
Автор
Z

zip-per

Новичок
Сообщения
30
Репутация
0
`p r o x y
Но это последовательный цикл. Выполняется по порядку.
А мне надо:
Код:
While 1 
   _Step1()
WEnd

Func _Step1()
    ; если, результат этой функции успешный (необходимый), то вызвать функцию _Step2(), в противном случае вызвать функцию _Step5()
EndFunc

Func _Step2()
    ; Записать все ссылки со страницы и например присвоить их переменным $ssilka1, $ssilka2, $ssilka3.
EndFunc

Func _Step3()
    ; переход по ссылке $ssilka1 и выполнение определенных действий, в не зависимости от результата перейти к функции _Step4()
EndFunc

Func _Step4()
    ; копия функции _Step1(), если результат этой функции успешный (необходимый), то вызвать функцию _Step3() !!!но перейти уже по $ssilka2!!! В противном случае перейти к функции _Step5()
EndFunc

Func _Step5()
    ; Выход из цикла
EndFunc
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Код:
While 1 
   _Start()
WEnd

Func _Start($fStep=0)
	; код функции
	If Not $iStep Then
		; если, результат этой функции успешный (необходимый), то вызвать функцию _getLinks(), потом _openLink(), в противном случае вызвать функцию _ProExit()
	Else
		; если результат этой функции успешный (необходимый), то вызвать функцию _openLink(1), в противном случае вызвать функцию _ProExit()
	EndIf
EndFunc

Func _getLinks()
    ; записать все ссылки со страницы и присвоить их переменным $ssilka1, $ssilka2, $ssilka3.
EndFunc

Func _openLink($fOpenLink2=0)
	If Not $fOpenLink2 Then 
		; переход по ссылке $ssilka1 и выполнение определенных действий
	Else
		; переход по ссылке $ssilka2 и выполнение определенных действий
	EndIf
	_Start(1)
EndFunc

Func _ProExit()
    ; Выход из цикла
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Используй Return. Я бы построил скрипт как-то так:
Код:
While 1
    If _Step1(1, 1) Then
        Local $var = _Step2()
        If Not @error Then
            For $i = 0 To UBound($var, 1) -1 Step 1
                _Step3($var[$i])
                If Not _Step4() Then _Step5()
            Next
        Else
            ;
        EndIf
    Else
        ;
    EndIf
WEnd

Func _Step1($a, $b)
    ; если, результат этой функции успешный (необходимый), то вызвать функцию _Step2(), в противном случае вызвать функцию _Step5()
    If $a+$b = 2 Then
        Return True
    ElseIf $a+$b <> 2 Then
        Return False
    EndIf
EndFunc

Func _Step2()
    ; Записать все ссылки со страницы и например присвоить их переменным $ssilka1, $ssilka2, $ssilka3.
    Local $var[20]
    If полчить доступ к ссыкам = успешно Then
        For $i To UBound($var, 1) -1 Step 1
            $var[$i] = ;Записываем в текущую ячейку текущую ссылку
        Next
        Return Массив со ссылками
    Else
        SetError(1)
        Return
    EndIf
EndFunc

Func _Step3()
    ; переход по ссылке $ssilka1 и выполнение определенных действий, в не зависимости от результата перейти к функции _Step4()
EndFunc

Func _Step4()
    ; копия функции _Step1(), если результат этой функции успешный (необходимый), то вызвать функцию _Step3() !!!но перейти уже по $ssilka2!!! В противном случае перейти к функции _Step5()
EndFunc

Правда с HTTP работал всего пару раз и можно сказать что о нем не знаю ничего, поэтому мб моя структура и не подойдет тебе. Как по мне дык рекурсии нужно бояться как огня. Ну во всяком случае при попытке возвести на ее основе большие логические цепи.
 
Автор
Z

zip-per

Новичок
Сообщения
30
Репутация
0
Спасибо за ваши ответы! Мне нужно некоторое время, что бы все это переварить.
 
Верх