Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 143

 
fxsaber:
Ich habe es so gemacht, wie es ist.
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));
}
Es funktioniert.

Das gibt er heraus:

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

Die obere Zeile ist das sortierte Eingabefeld, die untere Zeile ist das Ergebnis von Strange().

Wenn wir uns die sortierte Reihe genau ansehen und die Übereinstimmungen farblich markieren und dann die Anzahl der Zahlen mit mehr als einer gleichen Farbe zählen, erhalten wir das Ergebnis:

1 1 1 2 2 2 2 3- insgesamt , Sie hätten 2 zurückgeben müssen

Und die Funktion ergab 4. Obwohl - auch Fortschritt - bei mir kam immer 1 zurück - wie das - habe ich nicht verstanden.

 
Artyom Trishkin:

1 1 1 2 2 22 3 - insgesamt hätte es 2 ergeben müssen

Und die Funktion ergab 4. Obwohl - auch Fortschritt - bei mir kam immer 1 zurück - wie das - habe ich nicht verstanden.

Müssen Sie die Zahl oder das häufigste Element zurückgeben? Wenn das zweite, dann
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:
Möchten Sie die Nummer oder die häufigste Position zurückgeben?

Die Anzahl der verschiedenen Takes.

Was gibt Ihre Funktion zurück? Die höchste Anzahl von Übereinstimmungen? Auch das ist eine nützliche Sache...

 
Artyom Trishkin:

Die Anzahl der verschiedenen Takes.

Du formulierst es seltsam. "0, 0, 1, 1, 2, 2" - 3?

Was gibt Ihre Funktion zurück? Die höchste Anzahl von Übereinstimmungen?

Ja.
 
fxsaber:

Du formulierst es seltsam. "0, 0, 1, 1, 2, 2" - 3?

Ja - drei Spiele mit drei verschiedenen Zahlen.
 
Artyom Trishkin:
Ja - drei Spiele mit drei verschiedenen Zahlen.
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:
Möchten Sie also die Nummer oder die häufigste Position zurückgeben? Wenn letzteres, dann
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));
}

Cool. Aber ein bisschen anders - es ist eine Vorlagenfunktion, richtig:

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

Was bringt dieser?

Wenn Sie die Anordnung anders gestalten, ist sie nicht korrekt.

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

Sie kehrt zurück.

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

Wird genau nach der Anzahl der übereinstimmenden Zahlen im Array gesucht? Oder vielleicht haben Sie etwas anderes gemacht, und ich suche nach einem Fehler

 

Ich bin schon verwirrt)

Sie haben ein Array:

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

Was sollte die Funktion letztendlich zurückgeben und warum? Die Anzahl der Übereinstimmungen für jede Zahl, oder eine bestimmte Höchstzahl, oder ... Habe ich etwas geschrieben, aber es muss falsch sein, und falsch?

 
Artyom Trishkin:

Wird genau nach der Anzahl der übereinstimmenden Zahlen im Array gesucht? Vielleicht haben Sie aber auch etwas anderes gemacht, und ich werde nach einem Fehler suchen.

Sie haben den alten Code überprüft. Überprüfen Sie es doppelt.
Grund der Beschwerde: