Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 143

 
fxsaber:
Запустил, как есть
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 1;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Tmp = 1;
    
    ArrayPrint(Array);
    
    for (int i = 1; i < Size; i++)
    {
      if (Array[i - 1] != Array[i])
      {
        if (Tmp > Res)
          Res = Tmp;
        
        Tmp = 0;
      }
        
      Tmp++;
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2};
  
  Print(Strange(Array));
}
Пашет.

Вот что он выдаёт:

2017.03.07 14:42:44.141 1 1 1 2 2 2 2 3
2017.03.07 14:42:44.141 4

Верхняя строка - отсортированный входной массив, нижняя строка - результат работы функции Strange().

Если посмотреть внимательно на отсортированный массив, и пометить цветом совпадения, а потом подсчитать количество чисел больше одного‌ с одинаковым цветом, то получим результат:

1 1 1 2 2 2 2 3‌ - итого, вернуть нужно было 2

‌А ф-ция вернула 4. Хотя - тоже прогресс - у меня она всегда 1 возвращала - как так - не разбирался.

 
Artyom Trishkin:

1 1 1 2 2 2 2 3‌ - итого, вернуть нужно было 2

‌А ф-ция вернула 4. Хотя - тоже прогресс - у меня она всегда 1 возвращала - как так - не разбирался.

Так вернуть нужно количество или самый частый элемент? Если второе, то
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 0;
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Max = 0;
    int Tmp = 0;
    
    ArrayPrint(Array);
    
    for (int i = 0; i < Size - 1; i++)
    {
      Tmp++;
      
      if ((Array[i] != Array[i + 1]) || (i == Size - 2))
      {
        if (Tmp > Max)
        {
          Max = Tmp;
          
          Res = Array[i];
        }
        
        Tmp = 0;
      }        
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
  
  Print(Strange(Array));
}
 
fxsaber:
Так вернуть нужно количество или самый частый элемент?

Количество разных дублей.

А ваша ф-ция что возвращает? Наибольшее число совпадений? Тоже полезная вещчь...

 
Artyom Trishkin:

Количество разных дублей.

С‌транно формулируете. "0, 0, 1, 1, 2, 2" - 3?

А ваша ф-ция что возвращает? Наибольшее число совпадений?

Да.
 
fxsaber:

С‌транно формулируете. "0, 0, 1, 1, 2, 2" - 3?

Да - три совпадения трёх разных цифр.
 
Artyom Trishkin:
Да - три совпадения трёх разных цифр.
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 0;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Tmp = 1;
    
    ArrayPrint(Array);
    
    for (int i = 1; i < Size; i++, Tmp++)
      if (Array[i - 1] != Array[i])
      {
        if (Tmp > 1)
          Res++;
        
        Tmp = 0;
      }
      
    if (Tmp > 1)    
      Res++;
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 3, 4, 4};
  
  Print(Strange(Array));
}
 
fxsaber:
Так вернуть нужно количество или самый частый элемент? Если второе, то
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 0;
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Max = 0;
    int Tmp = 0;
    
    ArrayPrint(Array);
    
    for (int i = 0; i < Size - 1; i++)
    {
      Tmp++;
      
      if ((Array[i] != Array[i + 1]) || (i == Size - 2))
      {
        if (Tmp > Max)
        {
          Max = Tmp;
          
          Res = Array[i];
        }
        
        Tmp = 0;
      }        
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
  
  Print(Strange(Array));
}

Классно. Но немного иначе - это же шаблонная ф-ция, так:

template <typename T>
T Strange( const T &InArray[] )
{
  T Res = 0;
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Max = 0;
    int Tmp = 0;
    
    ArrayPrint(Array);
    
    for (int i = 0; i < Size - 1; i++)
    {
      Tmp++;
      
      if ((Array[i] != Array[i + 1]) || (i == Size - 2))
      {
        if (Tmp > Max)
        {
          Max = Tmp;
          
          Res = Array[i];
        }
        
        Tmp = 0;
      }        
    }
  }

  return(Res);
}

void OnStart()
{
  double Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
  
  Print(Strange(Array));
}

 
fxsaber:
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 0;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Tmp = 1;
    
    ArrayPrint(Array);
    
    for (int i = 1; i < Size; i++)
    {
      if (Array[i - 1] != Array[i])
      {
        if (Tmp > 1)
          Res++;
        
        Tmp = 0;
      }
        
      Tmp++;
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2};
  
  Print(Strange(Array));
}

А этот что возвращает?

Если массив сделать иным, то не верно:‌‌

template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 0;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Tmp = 1;
    
    ArrayPrint(Array);
    
    for (int i = 1; i < Size; i++)
    {
      if (Array[i - 1] != Array[i])
      {
        if (Tmp > 1)
          Res++;
        
        Tmp = 0;
      }
        
      Tmp++;
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
  
  Print(Strange(Array));
}

‌Возвращает:‌

2017.03.07 15:48:26.985 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3
2017.03.07 15:48:26.985 2

‌Он точно ищет количество совпадающих чисел в массиве? А то может вы что-то иное сделали, а я искать ошибку буду

 

Вот Я уже запутался)

У‌ Вас есть массив:

Array[] = {1, 2, 3, 1, 2, 1, 2, 2, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};

‌Что в итоге должна вернуть функция и почему? Количество совпадений каждого числа, или конкретное максимальное число, или ... Я что-то написал, но наверное не то, и не так?

 
Artyom Trishkin:

‌Он точно ищет количество совпадающих чисел в массиве? А то может вы что-то иное сделали, а я искать ошибку буду

Вы старый код проверили. Перепроверьте.
Причина обращения: