Что нового

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

zip-per

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

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

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

Если, это все будет в такой последовательности как я написал, то на 4 пункте меня перекидывает в первый и все по новому до 4. А мне нужно из первого попасть в 5. Подскажите как вы решаете подобные задачи.
Заранее благодарен за ваши подсказки!
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Прочитал, вдумчиво прочитал, вопроса не понял. Тебе нужно из первого пункта попасть в 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,608
Репутация
941
Используй 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
Спасибо за ваши ответы! Мне нужно некоторое время, что бы все это переварить.
 
Верх