Author Topic: Типовые алгоритмы, вводные статьи (Новички, читайте!)  (Read 328201 times)

0 Members and 8 Guests are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
попробуйте выполнить эти цыклы, и вы поймете где здесь "и" а где "или"  :)
Code: (clickermann) [Select]
WHILE(($_time_h ! 11) | ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
/////////
WHILE(($_time_h ! 11) & ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
А разве их значение меняется?  :o
Как в справке написано, так и есть, неужели ты думаешь что логические операторы никто не использует и их нужно проверять?

В первом цикле ИЛИ, во тором И.
Только большинство попадают впросак, когда они используются в сложном условии когда проверяются операнды НЕ
« Last Edit: August 31, 2015, 10:13:17 AM by Vint »


SASHKA))

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
 в этом случае я точно знаю что подпрограмма старт запустится ровно в 11:50 допустим это будет или :)
Code: (clickermann) [Select]
WHILE(($_time_h ! 11) | ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )
В этом случае подпрограмма старт запустится в 08:50, а может быть в 11:00 тогда это будет И :)
Code: (clickermann) [Select]
WHILE(($_time_h ! 11) & ($_time_m ! 50))
WAIT(1)
END_CYC
Start ( )


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Зачем ты путаешь людей?
| - это ИЛИ, & - это И
Как тебе лучше представлять это другое дело.
Условие у тебя сложное, там не один логический операнд и поэтому конечный итог это не то что даёт одиночный операнд хоть И, хоть ИЛИ.

А такими заявлениям ты сбиваешь с толку читающих тебя вновь прибывших. Которые будут уже В СВОЁМ условии отличном от твоего пытаться применить & как ИЛИ или наоборот.

И вообще называют выполнением условия то что находится в теле условия, а не то что произойдёт если это условие не выполнится.
Как ты будешь называть это? Когда выполнится твоя подпрограмма Start?
Code: (clickermann) [Select]
WHILE(($_time_h = 11) & ($_time_m = 50))
   Start ( )
END_CYC
« Last Edit: August 31, 2015, 10:51:59 AM by Vint »


SASHKA))

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Извиняюсь если кого то попутал :) но я сам запутался в этом условии после прочтения справки.
Сейчас понял что в справке все норм написано:
Логическое И: (a & b) = 1 если и a = 1 и b = 1
Логическое ИЛИ: (a | b) = 1 если a = 1 или b = 1, или оба

SASHKA))

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Зачем ты путаешь людей?
| - это ИЛИ, & - это И
Как тебе лучше представлять это другое дело.
Условие у тебя сложное, там не один логический операнд и поэтому конечный итог это не то что даёт одиночный операнд хоть И, хоть ИЛИ.

А такими заявлениям ты сбиваешь с толку читающих тебя вновь прибывших. Которые будут уже В СВОЁМ условии отличном от твоего пытаться применить & как ИЛИ или наоборот.

И вообще называют выполнением условия то что находится в теле условия, а не то что произойдёт если это условие не выполнится.
Как ты будешь называть это? Когда выполнится твоя подпрограмма Start?
Code: (clickermann) [Select]
WHILE(($_time_h = 11) & ($_time_m = 50))
   Start ( )
END_CYC
Vint спасибо тебе :) начинаю понимать что я вообще нуб по сравнению с вами :)

ZET

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Можно ли использовать IF_PICTURE_IN с несколькими условиями? Представляется следующее:
Code: [Select]
IF_PICTURE_IN(IF_PICTURE_IN (0, 0, 600, 600, "1.bmp")) | (IF_PICTURE_IN (0, 0, 600, 600, "2.bmp"))
Методом проб и ошибок думается что нельзя, тогда как организовать конструкцию?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Можно ли использовать IF_PICTURE_IN с несколькими условиями?

Только так
Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
ELSE
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
   END_IF
END_IF

ZET

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile

Только так
Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
ELSE
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
   END_IF
END_IF

Здесь уже нарушена логика,
Code: [Select]
Если
Тогда
Иначе
Тогда
Конец

Я же вижу результат таким образом:
Code: [Select]
Если (условие1) или (условие2)
Тогда
Конец

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Здесь уже нарушена логика,

Где там че нарушено?

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
   // если нашли 1.bmp выполняем код
ELSE // если не нашли 1.bmp
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "2.bmp", -1, 100) // ищем 2.bmp
      // если нашли 2.bmp выполняем код
   END_IF
END_IF

Это и есть или 1 или 2

ZET

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Хотя да, надо было кофе выпить) Спасибо за подсказку

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Сортировка массива

Эти алгоритмы выстраивают числа в массиве от меньших к большему.

Простая сортировка
Code: (clickermann) [Select]
SUB(sort)
   
   $siz = ARRSIZE($arr)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-1,($a>0)&($srt=0),-1)
      FOR($b=0,$b<$a)
         IF($arr[$b] > $arr[$b+1])
            $srtcheck = 1
            $tmp = $arr[$b]
            $arr[$b] = $arr[$b+1]
            $arr[$b+1] = $tmp
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   
END_SUB

arrpush ($arr, 454)
arrpush ($arr, 66)
arrpush ($arr, 43)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 1)

LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr))
   LOGWRITE ($arr[$i])
END_CYC

LOGWRITE ("")
sort()

LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr))
   LOGWRITE ($arr[$i])
END_CYC

HALT

Парная сортировка (например сортировка координат) по первому числу
Code: (clickermann) [Select]
SUB(sort)
   
   $siz = ARRSIZE($arr)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($arr[$b] > $arr[$b+2])
            $srtcheck = 1
            $tmp = $arr[$b]
            $tmp2 = $arr[$b+1]
            $arr[$b] = $arr[$b+2]
            $arr[$b+1] = $arr[$b+3]
            $arr[$b+2] = $tmp
            $arr[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   
END_SUB

arrpush ($arr, 22)
arrpush ($arr, 66)
arrpush ($arr, 22)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 88)

arrpush ($arr, 201)
arrpush ($arr, 66)
arrpush ($arr, 201)
arrpush ($arr, 77)
arrpush ($arr, 201)
arrpush ($arr, 88)

arrpush ($arr, 10)
arrpush ($arr, 66)
arrpush ($arr, 10)
arrpush ($arr, 77)
arrpush ($arr, 10)
arrpush ($arr, 88)

LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr), 2)
   LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC

LOGWRITE ("")
sort()

LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr), 2)
   LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC

HALT

Парная сортировка по первому затем по второму числу
Code: (clickermann) [Select]
SUB(sort)
   
   $siz = ARRSIZE($arr)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($arr[$b] > $arr[$b+2])
            $srtcheck = 1
            $tmp = $arr[$b]
            $tmp2 = $arr[$b+1]
            $arr[$b] = $arr[$b+2]
            $arr[$b+1] = $arr[$b+3]
            $arr[$b+2] = $tmp
            $arr[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($arr[$b] = $arr[$b+2])
            IF($arr[$b+1] > $arr[$b+3])
               $srtcheck = 1
               $tmp = $arr[$b+1]
               $tmp2 = $arr[$b+3]
               $arr[$b+1] = $tmp2
               $arr[$b+3] = $tmp
            END_IF
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   
END_SUB

arrpush ($arr, 22)
arrpush ($arr, 60)
arrpush ($arr, 22)
arrpush ($arr, 77)
arrpush ($arr, 22)
arrpush ($arr, 88)

arrpush ($arr, 201)
arrpush ($arr, 66)
arrpush ($arr, 201)
arrpush ($arr, 30)
arrpush ($arr, 201)
arrpush ($arr, 88)

arrpush ($arr, 10)
arrpush ($arr, 66)
arrpush ($arr, 10)
arrpush ($arr, 77)
arrpush ($arr, 10)
arrpush ($arr, 28)

LOGCLEAR
LOGWRITE ("Было")
FOR($i = 0, $i < ARRSIZE($arr), 2)
   LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC

LOGWRITE ("")
sort()

LOGWRITE ("Стало")
FOR($i = 0, $i < ARRSIZE($arr), 2)
   LOGWRITE ($arr[$i]," : ",$arr[$i+1])
END_CYC

HALT
« Last Edit: September 16, 2015, 06:53:56 PM by Oraven »

vasya1987

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Может кому пригодится.
Создание .bmp при клике mouse1
Клик в центр изображения и сохранится область выделенная желтым цветом
http://prntscr.com/98d965
Code: [Select]
if ( iskeydown(1)=1 )
   GETSCREEN
   //COLORMODE(6)  // Стереть "//" чтоб включить
   screenshotex($_xmouse,$_ymouse, $_xmouse+10,$_ymouse+10)   //вывод скриншота в файл (текущее положение курсора +10 пикселей по x и y)
   HINTPOPUP("Готово")
   halt
END_IF
« Last Edit: November 29, 2015, 08:56:17 PM by vasya1987 »

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
выстраивают числа в массиве от меньших к большему.
Простая сортировка
Не могу понять как отсортировать не числа, а именно те  переменные , которые в  момент очередного цикла опроса оказались в максимуме.
Например , я опросил ряд значений, присвоенных разным  линиям графика. На  "красное" выбрана переменная $a1  , "белое " выбрана переменная $a2 , "зеленое" выбрана переменная $a3 итп . 9 линий графика.
Вот графики https://cldmine.com/speedlog
 В какой-то цикл опроса , максимальное значение принимает переменная у "красного" , в другом цикле максимальным становится  "белое" итп
Как   это отсортировать?  Для того , чтобы вовремя переключать майнинг.
Бабочки полёт будит тихую поляну в солнечном свету...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Для версии 4.11
Code: (clickermann) [Select]
SUB(max,$res, $n)
   IF($res > $resMax)
      $resMax = $res
      $resMaxVar = $n
   END_IF
END_SUB

$a1 = 10
$a2 = 100
$a3 = 300
$a4 = 20
$a5 = 10
$a6 = 34
$a7 = 56
$a8 = 25
$a9 = 1

max($a1,1)
max($a2,2)
max($a3,3)
max($a4,4)
max($a5,5)
max($a6,6)
max($a7,7)
max($a8,8)
max($a9,9)

LOGWRITE ($resMaxVar, "=",$resMax)

HALT

Code: [Select]
9:03:27 3=300
Для версии 4.12 уже проще
Code: (clickermann) [Select]
$a1 = 10
$a2 = 100
$a3 = 300
$a4 = 20
$a5 = 10
$a6 = 34
$a7 = 56
$a8 = 25
$a9 = 1

FOR($count=1,$count<10)
   $res = GETVAR (STRCONCAT("$a", $count))
   IF($res > $resMax)
      $resMax = $res
      $resMaxVar = STRCONCAT("$a", $count)
   END_IF
END_CYC

LOGWRITE ($resMaxVar, "=",$resMax)

HALT

Code: [Select]
9:01:44 $a3=300
Если что вот полная сборка 4.12 версии
https://yadi.sk/d/rQnhKmxYprJcP

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А ещё проще увидев что нужно создавать серию переменных $a1....$a9, взять и создать один массив $a и работать с ним. На то они и массивы.