Author Topic: Рандомный вызов подпрограмм без повторов  (Read 1509 times)

0 Members and 1 Guest are viewing this topic.

iggi

  • Освоившийся
  • **
  • Posts: 22
    • View Profile
Здравствуйте.
Подскажите, как вызвать 21 подпрограмму в случайном порядке и при этом без повторов?
Поиском нашел похожий вопрос с вот таким скриптом:
Code: (clickermann) [Select]
$r = "ABCDEFGHIJKLMNOPQWVXYZ"
$a = STRLEN($r)
 
FOR($c, $c < $a)
$f = STRCUT($r, RND(1, STRLEN($r)), 1)
   IF(STRLEN($r) > 1)
      $r = STRFILTER($r, $f, 0)
   END_IF
     LOGWRITE($f)
   WAITMS(50)
END_CYC
Но не могу сообразить как его использовать чтобы вместо LOGWRITE($f) вызывать подпрограммы.
Попробовал вот такой вариант, но он не работает:
Code: (clickermann) [Select]
SUB(A)
//подпрограмма A
END_SUB
...
//и т.д. подпрограммы B-X
...
SUB(Y)
//подпрограмма Y
END_SUB

$r = "ABCDEFGHIJKLMNOPQWVXY"
$a = STRLEN($r)

FOR($c, $c < $a)
$f = STRCUT($r, RND(1, STRLEN($r)), 1)
   IF(STRLEN($r) > 1)
      $r = STRFILTER($r, $f, 0)
   END_IF
     STRCONCAT( $f,() )   // не работает - подпрограммы не вызываются
   WAITMS(50)
END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Имя вызова подпрограммы нельзя сформировать по ходу скрипта

Напиши за место LOGWRITE ("Подпрограмма 1")... вызовы твоих подпрограмм

Code: (clickermann) [Select]
IF(ARRSIZE($ARR_R) = 0)
   LOGWRITE ("Новый цикл")
   FOR($ii=1,$ii<22)
      ARRPUSH($ARR_R,$ii)
   END_CYC
   FOR($ii=ARRSIZE($ARR_R)-1,$ii>0,-1)
      $jj = RND(0,$ii)
      IF($ii ! $jj)
         $tmp = $ARR_R[$jj]
         $ARR_R[$jj] = $ARR_R[$ii]
         $ARR_R[$ii] = $tmp
      END_IF
   END_CYC
END_IF

$r = ARRPOP($ARR_R)
SWITCH($r)
   CASE(1)
      LOGWRITE ("Подпрограмма 1")
   CASE(2)
      LOGWRITE ("Подпрограмма 2")
   CASE(3)
      LOGWRITE ("Подпрограмма 3")
   CASE(4)
      LOGWRITE ("Подпрограмма 4")
   CASE(5)
      LOGWRITE ("Подпрограмма 5")
   CASE(6)
      LOGWRITE ("Подпрограмма 6")
   CASE(7)
      LOGWRITE ("Подпрограмма 7")
   CASE(8)
      LOGWRITE ("Подпрограмма 8")
   CASE(9)
      LOGWRITE ("Подпрограмма 9")
   CASE(10)
      LOGWRITE ("Подпрограмма 10")
   CASE(11)
      LOGWRITE ("Подпрограмма 11")
   CASE(12)
      LOGWRITE ("Подпрограмма 12")
   CASE(13)
      LOGWRITE ("Подпрограмма 13")
   CASE(14)
      LOGWRITE ("Подпрограмма 14")
   CASE(15)
      LOGWRITE ("Подпрограмма 15")
   CASE(16)
      LOGWRITE ("Подпрограмма 16")
   CASE(17)
      LOGWRITE ("Подпрограмма 17")
   CASE(18)
      LOGWRITE ("Подпрограмма 18")
   CASE(19)
      LOGWRITE ("Подпрограмма 19")
   CASE(20)
      LOGWRITE ("Подпрограмма 20")
   CASE(21)
      LOGWRITE ("Подпрограмма 21")
END_SWITCH

iggi

  • Освоившийся
  • **
  • Posts: 22
    • View Profile
Андрей, спасибо!