MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 143

 
fxsaber :
olduğu gibi başlatıldı
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));
}
saban

İşte çıktıları:

2017.03 . 07 14 : 42 : 44.141 1 1 1 2 2 2 2 3
2017.03 . 07 14 : 42 : 44.141 4

Üst satır sıralanmış girdi dizisidir, alt satır Strange() işlevinin sonucudur.

Sıralanan diziye ve renk eşleşmelerine dikkatlice bakarsak ve ardından aynı renkle birden fazla sayıyı sayarsak, şu sonucu alırız:

1 1 1 2 2 2 2 3 ‌ - toplam, 2 döndürmek gerekiyordu

Ve işlev 4 döndürdü. Yine de - ayrıca ilerleme - benim için her zaman 1 döndürdü - nasıl olduğunu anlamadım.

 
Artyom Trishkin :

1 1 1 2 2 2 2 3 ‌ - toplam, 2 döndürmek gerekiyordu

Ve işlev 4 döndürdü. Yine de - ayrıca ilerleme - benim için her zaman 1 döndürdü - nasıl olduğunu anlamadım.

Yani sayıyı mı yoksa en sık kullanılan öğeyi mi döndürmeniz gerekiyor? İkincisi ise, o zaman
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 :
Yani sayıyı mı yoksa en sık kullanılan öğeyi mi döndürmeniz gerekiyor?

Farklı kopyaların sayısı.

Ve işleviniz ne döndürür? Çoğu maç? Ayrıca kullanışlı...

 
Artyom Trishkin :

Farklı kopyaların sayısı.

Garip bir şekilde ifade ediyorsun. "0, 0, 1, 1, 2, 2" - 3?

Ve işleviniz ne döndürür? Çoğu maç?

Evet.
 
fxsaber :

Garip bir şekilde ifade ediyorsun. "0, 0, 1, 1, 2, 2" - 3?

Evet - üç farklı sayıdan üç eşleşme.
 
Artyom Trishkin :
Evet - üç farklı sayıdan üç eşleşme.
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 :
Yani sayıyı mı yoksa en sık kullanılan öğeyi mi döndürmeniz gerekiyor? İkincisi ise, o zaman
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));
}

Harika. Ama biraz farklı olarak - bu bir şablon işlevidir, yani:

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));
}

Bu ne döndürür?

Dizi farklı yapılırsa, bu doğru değildir:‌‌

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));
}

İadeler

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

‌Tam olarak dizideki eşleşen sayıların sayısını mı arıyor? Ya da belki başka bir şey yaptın ve ben bir hata arayacağım

 

zaten kafam karıştı)

Bir diziniz var:

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

‌İşlev sonunda ne döndürmeli ve neden? Her sayı için eşleşme sayısı veya belirli bir maksimum sayı veya ... Bir şey yazdım , ama muhtemelen öyle değil, öyle değil mi?

 
Artyom Trishkin :

‌Tam olarak dizideki eşleşen sayıların sayısını mı arıyor? Ya da belki başka bir şey yaptın ve ben bir hata arayacağım

Eski kodu kontrol ettiniz mi? Tekrar kontrol et .