Что нового

[Автоматизация] boolean operators в циклах

Irlandec

Новичок
Сообщения
21
Репутация
0
здравствуйте, насколько я понял операторы нельзя использовать в условиях цикла то есть конструкция типа:

Код:
while $i <=4 or $i <=-4


Не работает.

Но почему то у меня не работает так же и такая схема:

Код:
if $c_station <=4 OR $c_station <=-4 Then ExitLoop


знаки < и > вертел всяко разно.

общая кострукция такая:

Код:
Func c_station()
  While 1
  Sleep(50)

$c_station_pcs = PixelChecksum(1803, 36,1810, 46)
$c_station_pcs_ini = 3136334335

   Select
      Case $c_station_pcs = $c_station_pcs_ini
         $c_station = $c_station + 1
			ToolTip("Проверка пройдена, мы на станции" & @CRLF & "Ok" & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case $c_station_pcs <> $c_station_pcs_ini
		 $c_station =  $c_station -1
			ToolTip("Проверка НЕ пройдена, мы НЕ на станции" & @CRLF & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case Else
		 $c_station = $c_station -1
			ToolTip("Стыковочный режим неисправен" & @CRLF  & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
			EndSelect
			if $c_station <=4 OR $c_station <=-4 Then ExitLoop

 sleep(2000)
 WEnd
EndFunc

Когда убираю оператор OR всё работает как в отрицательную сторону, так и в положительную, видимо дело в самом операторе.

Общий смысл скрипта в том, что если после 4 проверок число достигло -4 и более, делаем вывод что мы на не станции и переходим к следующему датчику, ну и соответственно если мы получаем число 4 и больше, то мы на станции и опять же переходим к другой функции. То есть моя цель завершить цикл(чтобы он не висел), и продолжить дальше опрашивать датчики, имея в кармане завершенную переменную $c_station = -4 или $c_station = 4

пробовал циклы For, но видимо он тоже не любит операторы or,and и т.д. ,по крайней мере, в хелпе одобрено использование операторов только в If..endif
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
if $c_station <=4 OR $c_station <=-4 Then ExitLoop

не знаю кто о чем, но это конструкция читается так
Если "что-то" ИЛИ "другое что-то" Тогда Выход с продолжением
в данной конструкции $c_station <=4 включает себя все числа от положительной четверки до максимального минуса. то есть туда входит и -4
логична конструкция такая
Код:
if $c_station =4 OR $c_station =-4 Then ExitLoop

если подсчет начался с трех, то выход при достижении минус четыре, или если подсчет начался с , к примеру, шести, то выход по достижении четыре
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Очень часто люди путают, что следует писать Or или And.
0 Or 0 = 0; 0 Or 1 = 1; 1 Or 0 = 1; 1 Or 1 = 1
0 And 0 = 0; 0 And 1 = 0; 1 And 0 = 0; 1 And 1 = 1
(Правильнее вместо 0 - False, 1 - True)
Пока человек плохо разбирается, чтоже подставить, лучше в уме или на бумажке привести каждое сравнение к Истина-Ложь. Соответственно While будет выполнятся когда общее выражение Истина.
Полагаю вам требуется нечто подобное:
Код:
$c = 0
While -4 <= $c And $c <= 4
	$c += Random(-1, 1, 1)
ConsoleWrite($c &@LF)
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec
Код:
If c_station() Then
  ToolTip("Проверка пройдена, мы на станции")
Else
  ToolTip("Проверка пройдена, мы НЕ на станции")
EndIf
Sleep(2000)

Func c_station()
  For $i = 1 To 4
    If PixelChecksum(1803, 36, 1810, 46) = 3136334335 Then Return 1
    Sleep(500)
  Next
  Return 0
EndFunc
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
joiner сказал(а):
Код:
if $c_station <=4 OR $c_station <=-4 Then ExitLoop

не знаю кто о чем, но это конструкция читается так
Если "что-то" ИЛИ "другое что-то" Тогда Выход с продолжением
в данной конструкции $c_station <=4 включает себя все числа от положительной четверки до максимального минуса. то есть туда входит и -4
логична конструкция такая
Код:
if $c_station =4 OR $c_station =-4 Then ExitLoop

если подсчет начался с трех, то выход при достижении минус четыре, или если подсчет начался с , к примеру, шести, то выход по достижении четыре

Вы совершенно правы, но как я и скзал ранее знаки я ставил в обе стороны и результат был один и тот же, без знаков <> делать кострукцию нельзя, так как счетчик выходя за рамки -4, то есть например если он стал -5, счетчик продолжает считать дальше и не остановиться, меня интересует конкретно <=4 or <=-4. Насколько я знаю математику, больше числа -4 лишь число -5 ?)) или я не прав?)) а значит я должен писать <= -4.

может конечно я сошел с ума, но вы не совсем правы, знак < подрузамевает, что - переменная больше 4.. то есть фраза "в данной конструкции $c_station <=4 включает себя все числа от положительной четверки до максимального минуса. то есть туда входит и -4" мне не ясна. т.к. знак < говорит нам, что нас интересуют все числа от 4 до бесконечности int чисел.


edyapd сказал(а):
Очень часто люди путают, что следует писать Or или And.
0 Or 0 = 0; 0 Or 1 = 1; 1 Or 0 = 1; 1 Or 1 = 1
0 And 0 = 0; 0 And 1 = 0; 1 And 0 = 0; 1 And 1 = 1
(Правильнее вместо 0 - False, 1 - True)
Пока человек плохо разбирается, чтоже подставить, лучше в уме или на бумажке привести каждое сравнение к Истина-Ложь. Соответственно While будет выполнятся когда общее выражение Истина.
Полагаю вам требуется нечто подобное:
Код:
$c = 0
While -4 <= $c And $c <= 4
	$c += Random(-1, 1, 1)
ConsoleWrite($c &@LF)
WEnd

Такс)) во первых я знаю, что or это ИЛИ, а значит логично предположить, что меня интересуют оба результата, то есть мне надо, чтобы цикл кончился ИЛИ при -4 значении перемененной ИЛИ при +4 значении переменной. то есть and тут никак не прокатит даже чисто математически, переменная не может быть одновременно +4 и -4.. может быть я что-то не понял?)))

InnI сказал(а):
Irlandec
Код:
If c_station() Then
  ToolTip("Проверка пройдена, мы на станции")
Else
  ToolTip("Проверка пройдена, мы НЕ на станции")
EndIf
Sleep(2000)

Func c_station()
  For $i = 1 To 4
    If PixelChecksum(1803, 36, 1810, 46) = 3136334335 Then Return 1
    Sleep(500)
  Next
  Return 0
EndFunc

to Inni, сейчас попытаюсь ещё раз объяснить - Я включаю датчик, если я НЕ на станции то датчик капает в число -4 и на этом цикл кончается, мне же возвращается значение переменной -4. Если же я на станции то датчик капает в положительную величину до +4, и цикл тоже закрывается, ну а мне конечно же возвращается переменная +4. соответственно.
:stars: :laugh: :-[
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec [?]
больше числа -4 лишь число -5
-5 меньше, чем -4

знак < подрузамевает, что - переменная больше 4
Этот знак называется "меньше"

возвращается переменная +4
Во-первых, не возвращается, а значение присваивается переменной $c_station.
Во-вторых, зачем? С какой целью?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Irlandec [?]
знаю математику, больше числа -4 лишь число -5
разве? это отрицательные числа
Код:
If - 4 < -5 Then
	ConsoleWrite('минус четрые меньше минус пяти' & @LF)
ElseIf - 4 > -5 Then
	ConsoleWrite('минус четыре больше минус пяти' & @LF)
EndIf
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
4 < 5 = 5 > 4 , неправильно выразился просто когда сказал, что -4 меньше -5, просто жёстко запутался честно говоря, и не знаю как выразить мысль, речь шла в общем и целом конкретно о знаках, а не о числах...)), ну мой косяк, виноват , плохо с математикой очень значит))

"знак < подрузамевает, что - переменная больше 4"

Ну на счет знаков сравнения как бы я вас понял, то есть получается -4 больше чем -5, то есть это означает что надо ставить знак "меньше <"
Код:
$c <= -4


Слушайте я совсем запутался
Вот вы пишите про знак < и он как бы называется знаком меньше "в данной конструкции $c_station <=4 включает себя все числа от положительной четверки до максимального минуса. то есть туда входит и -4"


Код:
Func c_cosmos()
While $c_cosmos <= 4
  Sleep(50)

$c_cosmos_pcs = PixelChecksum(864, 866,867, 869)
$c_cosmos_pcs_ini = 1619987945
$c_cosmos_pcs_ini1 = 2386759613

   Select
      Case $c_cosmos_pcs = $c_cosmos_pcs_ini or $c_cosmos_pcs = $c_cosmos_pcs_ini1
		 $c_cosmos = $c_cosmos + 0
			ToolTip("Проверка пройдена, мы в космосе" & @CRLF & "Ok" & @CRLF & "$c_cosmos = " & $c_cosmos,25,35,"Датчик Космоса",1,4)
			   sleep(500)
	  Case $c_cosmos_pcs <> $c_cosmos_pcs_ini
		 $c_cosmos = $c_cosmos + 1
			ToolTip("Проверка НЕ пройдена, мы НЕ в космосе" & @CRLF & @CRLF & "$c_cosmos = " & $c_cosmos,25,35,"Датчик Космоса",1,4)
			   sleep(500)
	  Case Else
		 $c_cosmos = $c_cosmos -1
			ToolTip("Датчик ваакума в космосе не работает" & @CRLF  & @CRLF & "$c_cosmos = " & $c_cosmos,25,35,"Датчик Космоса",1,4)
			   sleep(500)
   EndSelect
 sleep(2000)
 WEnd
EndFunc

Если не сложно, запустите функцию у себя, она будет крутить цикл до числа 5. Но ведь вы мне сказали, что знак <=4 несет в себе все знаки от +4 до -254545454, я ведь прав? а значит цикл никак не может работать до +4, он выключится сразу же на числе 0 при старте ))))

вообще сама конструкция
Код:
While $c_cosmos <= 4
несет в себе смысл о том,, что цикл будет крутится пока наша переменная не станет меньше 4.. я прав?!?!, но почему она тогда работает. ведь она изначально равна 0, а значит цикл сразу же умрет.

P.S. зачем это надо??? сложно объяснить, но мне надо чтобы прошло несколько проверок, лучше где то 3-4 цикла, и только после этого сказала своё окончательное ДА, ну или окночательное НЕТ
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
While $c_cosmos <= 4 - означает "пока ИСТИНА" то работаем. Ноль меньше четырех это ИСТИНА - значит цикл работает. Irlandec
чего не понятного то?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec [?]
знак < подрузамевает, что - переменная больше 4
Неверно. Это зависит от того, с какой стороны стоит переменная. Чтобы не ошибаться, читайте условия слева направо:
$var < 4 : переменная меньше четырёх
$var > 4 : переменная больше четырёх
4 < $var : четыре меньше переменной
4 > $var : четыре больше переменной
Теперь отрицательные числа: -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5. Те, что левее меньше тех, что правее. Для числа -4 число -5 будет меньше, а для числа 4 число 5 будет больше:
$var < -4 : переменная меньше -4 (т.е. -5)
$var > 4 : переменная больше 4 (т.е. 5)


Добавлено:
Сообщение автоматически объединено:

Irlandec [?]
несколько проверок, лучше где то 3-4 цикла
Я вам написал функцию, которая именно это и делает: в течение двух секунд делает четыре проверки. Если все четыре не увенчались успехом, то вариант "НЕТ". Однозначно. Третьего не дано.
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
inververs сказал(а):
While $c_cosmos <= 4 - означает "пока ИСТИНА" то работаем. Ноль меньше четырех это ИСТИНА - значит цикл работает. Irlandec
чего не понятного то?
ладно, я понял, спрошу так

Код:
if $c_station >=4 OR $c_station <=-4 Then ExitLoop


Это выражение означает, что: если переменная $c_station больше 4 ... выходим из цикла ; если переменная $c_station меньше -4 ... выходим из цикла

я прав? то есть если числа +4,+5,+6 и т.д. выход, и если числа -4,-5,-6 и т.д. то тоже выход. правильно ведь? почему же он играет до -20 спокойно



Добавлено:
Сообщение автоматически объединено:

так ладно я понял, дело было не в бабине, такой вопрос

почему не происходит выхода из цикла
Код:
if $c_station >=4 OR $c_station <=-4 Then exitloop


может я с exitloop ошибся?




Добавлено:
Сообщение автоматически объединено:

Счетчик в тултипе крутится до бесконечного минуса, но из цикла не хочет выходить, если пишу вместо exitloop просто exit, выходит из скрипта, значит я напутал с exitloop, а всё остальное хорошо))
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Irlandec прошу прощения, вы сам с собой разговариваете. Других то послушайте и попытайтесь понять, что они говорят. По поводу "Or" я вам уже писал. Я более чем уверен, что вы его просто не правильно применяете. Найдите мой ответ и попробуйте перечитать.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Irlandec [?]
здравствуйте, насколько я понял операторы нельзя использовать в условиях цикла то есть конструкция типа:
Эквивалентные конструкции:
Так понятнее?

Код:
Local $c_station
; ---
While 1
	If $c_station > 3 Or $c_station < -3 Then _
		ExitLoop

	$c_station += Random( -1, 1, 1 )
WEnd
ConsoleWrite( "Exit_1..." & @CRLF)

$c_station = 0
While $c_station < 4 And $c_station > -4
	$c_station += Random( -1, 1, 1 )
WEnd
ConsoleWrite( "Exit_2..." & @CRLF)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Irlandec
Проверки ваших "датчиков" сводятся к одной функции. Вот всё, что вам нужно. По аналогии добавьте других "датчиков"
Код:
For $i = 1 To 4
  If WhereAmI(1803, 36, 1810, 46, 3136334335) Then
    ToolTip("На станции")
    ExitLoop
  EndIf
  If WhereAmI(864, 866,867, 869, 1619987945) Or WhereAmI(864, 866,867, 869, 2386759613) Then
    ToolTip("В космосе")
    ExitLoop
  EndIf
  Sleep(500)
Next
If $i = 5 Then ToolTip("Не удалось определить место нахождения")
Sleep(3000)

Func WhereAmI($X1, $Y1, $X2, $Y2, $CheckSum)
  If PixelChecksum($X1, $Y1, $X2, $Y2) = $CheckSum Then Return 1
  Return 0
EndFunc
 
Автор
I

Irlandec

Новичок
Сообщения
21
Репутация
0
Извините все за тупость. ((

edyapd сказал(а):
Irlandec прошу прощения, вы сам с собой разговариваете. Других то послушайте и попытайтесь понять, что они говорят. По поводу "Or" я вам уже писал. Я более чем уверен, что вы его просто не правильно применяете. Найдите мой ответ и попробуйте перечитать.
Спасибо большое, просто как дурак прочитал первые 2 строчки текста, подумал, что вы не поняли чего я хочу и дальше читать не стал, проверил работает.

--

To Inni, последний подходит классно, просто датчиков очень много, и пришлось бы переделывать порядка 37 штук)), хотел отделаться малой кровью вставив 1 или 2 строчки)) Спасибо!

--

А теперь для будущих поколений, мало ли вдруг, вот где был изначальный косяк касательно моего личного кода (хотя в результате этой беседы я нашел вариант получше):

Код:
Func c_station()


  While 1
  Sleep(50)

$c_station_pcs = PixelChecksum(1803, 36,1810, 46)
$c_station_pcs_ini = 3136334335

   Select
      Case $c_station_pcs = $c_station_pcs_ini
         $c_station = $c_station + 1
			ToolTip("Проверка пройдена, мы на станции" & @CRLF & "Ok" & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case $c_station_pcs <> $c_station_pcs_ini
		 $c_station =  $c_station - 1
			ToolTip("Проверка НЕ пройдена, мы НЕ на станции" & @CRLF & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case Else
		 $c_station = $c_station -1
			ToolTip("Стыковачный режим неисправен" & @CRLF  & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
			EndSelect
			if $c_station >4 OR $c_station < -4 Then ExitLoop ; Нельзя вставлять exitloop СЮДАА!!!!!


 sleep(2000)
 WEnd
EndFunc


А вот мой же код который я переделал , и он О чудо заработал:

Код:
Func c_station()

While 1
  Sleep(50)

$c_station_pcs = PixelChecksum(1803, 36,1810, 46)
$c_station_pcs_ini = 3136334335
if $c_station >4 OR $c_station < -4 Then ExitLoop ;Видмо exitloop ДОЛЖЕН БЫТЬ ДО основной МЫСЛИ скрипта
   Select
      Case $c_station_pcs = $c_station_pcs_ini
         $c_station = $c_station + 1
			ToolTip("Проверка пройдена, мы на станции" & @CRLF & "Ok" & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case $c_station_pcs <> $c_station_pcs_ini
		 $c_station =  $c_station - 1
			ToolTip("Проверка НЕ пройдена, мы НЕ на станции" & @CRLF & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
	  Case Else
		 $c_station = $c_station -1
			ToolTip("Стыковачный режим неисправен" & @CRLF  & @CRLF & "$c_station = " & $c_station,25,35,"Датчик Станции",1,4)
			   sleep(500)
			EndSelect
			 sleep(2000)
 WEnd
EndFunc

спасибо Firex и остальным кто помог, долго и упорно сравнивал его примерчик и свой, и наконец понял где косяк)), видимо неправильное место выхода из цикла..

Спасибо всем что не сдались, извините, что затупил, надо было послать сразу на...
 
Верх