Уважаемые знатоки Mql4 и Mql5, есть вопросик насчет реализации алгоритма...

 
Сам я пишу программу на mql5, но тут не столь важна разница в языках, так как задача алгоритма такая:
Есть некий 1мерный массив данных, например (0,0,0,0,0,0) мы имеем 6 элементов, мне нужно перебрать все возможные варианты изменения каждого элемента массива с 0 на 1. Нужно перебрать все уникальные значения массива, но не надо брать 1й и последний элементы, перебираем всегда от 2го до пред последнего, должны получиться вроде таких вариантов:

1. (0,0,0,0,0,0)
2. (0,1,0,0,0,0)
3. (0,1,1,0,0,0)
4. (0,1,0,1,0,0)
.......... .......... .
5. (0,1,1,1,1,0)

Вот что то сидел, думал и никак не додумался, сам я не прогреммер, а так… самоучка, поэтому не судите строго, если алгоритм простой, просто прошу помощи у тех кто знает как это решить.
Реализовать алгоритм, желательно используя циклы: while, do while, for. И чтобы была совместимость с mql5 но если что, я сам подредактирую.

* Дело еще в том, что количество элементов массива изменяется, и может достигать до 10-15 элементов, поэтому даже не знаю как все это реализовать.
** первый и последний элементы всегда равны 0, и их изменения не просчитываем.
 
В цикле при нулевой и последней итерации используй оператор "continue" (https://book.mql4.com/ru/operators/continue, https://www.mql5.com/ru/docs/basis/operators/continue).
 
rensbit >>:
В цикле при нулевой и последней итерации используй оператор "continue" (https://book.mql4.com/ru/operators/continue).


Да дело не в том, чтобы исключить варианты изменения 1го и последнего элементов, а как перебрать все допустимые различные значения элементов массива от 0 до 1... ну никак в голову не приходит! кто знает как перебрать все варианты по этому алгоритму помогите пожалуйста! :)
 
Fast >>:


Да дело не в том, чтобы исключить варианты изменения 1го и последнего элементов, а как перебрать все допустимые различные значения элементов массива от 0 до 1... ну никак в голову не приходит! кто знает как перебрать все варианты по этому алгоритму помогите пожалуйста! :)
   for(i=0; i<=6; i++){
      if(i==0 || i==6){continue;}
      if(array[i]==1){Alert("Элемент массива "+i+" равен 1");}
   }
 
Fast писал(а) >>
Сам я пишу программу на mql5, но тут не столь важна разница в языках, так как задача алгоритма такая:
Есть некий 1мерный массив данных, например (0,0,0,0,0,0) мы имеем 6 элементов, мне нужно перебрать все возможные варианты изменения каждого элемента массива с 0 на 1. Нужно перебрать все уникальные значения массива, но не надо брать 1й и последний элементы, перебираем всегда от 2го до пред последнего, должны получиться вроде таких вариантов:

1. (0,0,0,0,0,0)
2. (0,1,0,0,0,0)
3. (0,1,1,0,0,0)
4. (0,1,0,1,0,0)
.......... .......... .
5. (0,1,1,1,1,0)

Вот что то сидел, думал и никак не додумался, сам я не прогреммер, а так… самоучка, поэтому не судите строго, если алгоритм простой, просто прошу помощи у тех кто знает как это решить.
Реализовать алгоритм, желательно используя циклы: while, do while, for. И чтобы была совместимость с mql5 но если что, я сам подредактирую.

* Дело еще в том, что количество элементов массива изменяется, и может достигать до 10-15 элементов, поэтому даже не знаю как все это реализовать.
** первый и последний элементы всегда равны 0, и их изменения не просчитываем.


Если я правильно понял Вашу проблему, попробуйте такой код:

   int i,i1;
   int arr[6];
   
   for( i=1; i<63; i++ )
   {
      for( i1=0; i1<6; i1++ )
      {
         arr[i1] = ( i >> i1 ) & 1;
      }
      
      // массив заполнен, проверим это
      Print("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
   }
 
rensbit >>:


Вы немного не поняли что я именно хочу, или же я не правильно написал. Нужно изменять поочередно элементы а не проверять их знаечение...
тоесть в начале у нас массив равен:
(0,0,0,0,0)
Нужно поочередно менять элементы с 0 на 1, но не пропуская всех возможных вариаций.
ну например:
(0,0,0,1,0)
(0,0,1,1,0)
(0,0,1,0,0)
(0,1,0,1,0)
(0,1,1,1,0)
(0,1,0,0,0)
Это все допустимые варианты для массива в 5 элементов, помним что 1й и последний мы не меняем. Вот нужен код именно изменения поочередно всех элементов массива, перебирая все возможные варианты, но без повторений.
*Для массива в 5 элементов все просто, но если массив состоит из 15?..... всю голову себе уже поломал.... ну как это сделать....
 
Нужно найти все варианты значений из заданного диапазона в массиве произвольного размера?
 
Fast писал(а) >>


Вы немного не поняли что я именно хочу, или же я не правильно написал. Нужно изменять поочередно элементы а не проверять их знаечение...
тоесть в начале у нас массив равен:
(0,0,0,0,0)
Нужно поочередно менять элементы с 0 на 1, но не пропуская всех возможных вариаций.
ну например:
(0,0,0,1,0)
(0,0,1,1,0)
(0,0,1,0,0)
(0,1,0,1,0)
(0,1,1,1,0)
(0,1,0,0,0)
Это все допустимые варианты для массива в 5 элементов, помним что 1й и последний мы не меняем. Вот нужен код именно изменения поочередно всех элементов массива, перебирая все возможные варианты, но без повторений.
*Для массива в 5 элементов все просто, но если массив состоит из 15?..... всю голову себе уже поломал.... ну как это сделать....

   int i,i1;
   int arr[6];
   
   for( i=1; i<16; i++ )
   {
      for( i1=0; i1<4; i1++ )
      {
         arr[i1+1] = ( i >> i1 ) & 1;
      }
      arr[0] = 0;
      arr[5] = 0;
      
      // массив заполнен, проверим это
      Print("arr: ",arr[5],arr[4],arr[3],arr[2],arr[1],arr[0]);
   }
 
PapaYozh >>:


Если я правильно понял Вашу проблему, попробуйте такой код:

Можно упростить вот эту строку:

 arr[i1] = ( i >> i1 ) & 1;


просто я не совсем понял что вы тут делаете....
 
Fast писал(а) >>
Можно упростить вот эту строку:

arr[i1] = ( i >> i1 ) & 1;
просто я не совсем понял что вы тут делаете....

Нет, эту строку упростить нельзя.

 

просто я не совсем понял что вы тут делаете....

тут i сдвигается вправо на i1 двоичных разрядов (битов) и из результата извлекается младший бит.

Причина обращения: