Verilen eleman(lar)ın bir dizisini temizleme - sayfa 18

 
Vladimir Pastushak :
Alanın tüm yapıda değil yapıda kaydırıldığını anladım ...

Fikir üzerine basit tipteki yapılar işe yaramalıysa.

 

Başka bir nüans. Algoritmamın doğruluğunu kanıtladım. İşlev yürütüldükten sonra ortaya çıkan değerleri yazdırdı. Diğer algoritmaların ne kadar iyi çalıştığı bir sır olarak kalıyor.

Her ne kadar sağlama toplamı doğruluğunu kanıtlıyor gibi.

 
Реter Konow :

not. Yine de kararıma göre fonksiyon yazarken bir hata yaptınız:

yapmamalıyım

a

Yinede teşekkürler.

Hayır, ben bir hata yapmadım, seninkini düzelttim. Peki hattınızın ne yaptığını bir düşünün? Sadece dene ve değiştir ve göreceksin. Yanlış sağlama toplamı ve yanlış boyut olacaktır.
 
Реter Konow :


not. Yine de kararıma göre fonksiyon yazarken bir hata yaptınız:

yapmamalıyım

a


kodunuzda eşdeğerdir

 
Nikolai Semko :
Hayır, ben bir hata yapmadım, seninkini düzelttim. Peki hattınızın ne yaptığını bir düşünün? O hiçbir şey yapmıyor. Sadece dene ve değiştir ve göreceksin. Yanlış sağlama toplamı ve yanlış boyut olacaktır.

Sonuç tamamen aynı. Hata yok.

Evet, hiçbir şey yapmaz. Ama onunla daha net. ))

 
Stanislav Dray :

kodunuzda eşdeğerdir

Evet.

 
Реter Konow :

Evet.

Ve evet, üzgünüm.

Hatırladım.
Kodunuzu buradan aldım.

Hattınız orada değildi ve doğru çalışması için bu satırı eklemem gerektiğini hatırlıyorum.

Peter Konow'un fotoğrafı.

Ama onunla daha net. ))

Fazladan bir matematiksel işlemi vardır.))

 

Soru. Neden bu kodda, dizinin boyutunu değiştirdikten sonra hala değişiklikten öncekiyle aynı şekilde yazdırıyor?


 //+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int Arr[ 20 ] = { 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 };
   ulong q1 = GetMicrosecondCount (); 
   //--------------------------------
   PeterArray(Arr, 3 );
   //--------------------------------
   ulong q2 = GetMicrosecondCount ();
   //--------------------------------
   Print ( "Array new size  " , ArraySize (Arr), "  Тime of operation  " ,q2-q1);
   ArrayPrint (Arr); 
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int PeterArray( int &Arr[], int val) // вариант Peter Konow
  {
   int deleted= 0 ,q= 0 ;
   for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q]=Arr[q+deleted];
       if (Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize (Arr, ArraySize (Arr) - deleted);
   return (q);
  }
//+------------------------------------------------------------------+

Bu, algoritmaları bir sağlama toplamı ile kontrol etmenin doğruluğunu sorgular. Yani, sağlama toplamını hesaplarken, önceki öğeleri kaydetmeye devam eden dizi boyunca döngü mü yapacağız?

Algoritmaları kendi yöntemimle kontrol etmeyi öneriyorum. 20 değerden bir dizi çıkarmış olmak.

Bu, hız için değil, doğruluk için bir test olacaktır.
 
Реter Konow :

Soru. Neden bu kodda, dizinin boyutunu değiştirdikten sonra hala değişiklikten öncekiyle aynı şekilde yazdırıyor?


Bu, algoritmaları bir sağlama toplamı ile kontrol etmenin doğruluğunu sorgular. Yani, sağlama toplamını hesaplarken, önceki öğeleri kaydetmeye devam eden dizide dolaşacağız?

Algoritmaları kendi yöntemimle kontrol etmeyi öneriyorum. 20 değerden bir dizi çıkarmış olmak.

Bu, hız için değil, doğruluk için bir test olacaktır.
Bir milyon teklif ediyorum, çünkü testte bir milyon. Herkes otursun ve karşılaştırsın.)))
 
Nikolai Semko :
Bir milyon teklif ediyorum, çünkü testte bir milyon. Herkes otursun ve karşılaştırsın.)))

Sağlama toplamı yanlış hesaplanmıştır.

Kendiniz kontrol edin. Dizinin kaldırılan kısmında kalan elemanları sayar.

 //+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int Arr[ 20 ] = { 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 };
   ulong q1 = GetMicrosecondCount (); 
   //--------------------------------
   PeterArray(Arr, 3 );
   //--------------------------------
   ulong q2 = GetMicrosecondCount ();
   //--------------------------------
   Print ( "Array new size  " , ArraySize (Arr), "  Тime of operation  " ,q2-q1, "  Контрольная сумма: " ,ControlSumm(Arr));
   
   ArrayPrint (Arr); 
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int PeterArray( int &Arr[], int val) // вариант Peter Konow
  {
   int deleted= 0 ,q= 0 ;
   for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q]=Arr[q+deleted];
       if (Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize (Arr, ArraySize (Arr) - deleted);
   return (q);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
long ControlSumm( int &a[]) // суммирование всех элементов массива (контрольная сумма)
  {
   long sum= 0 ;
   for ( int i= 0 ; i< ArraySize (a); i++) sum+=a[i];
   return sum;
  }
//+------------------------------------------------------------------+

Tabii bu henüz doğrulamanın yanlış olduğunun kanıtı değil ama şimdiden bir şüphe var.


Sağlama toplamı, bu serinin öğelerinden hesaplanır:

 2018.11 . 16 14 : 36 : 28.456 Erase and Resize (USDJPY,H1)     1 2 1 2 1 2 1 2 1 2 1 2 1 2 3 1 2 3 1 2

Ayrıca, son 6 öğe daha önce ArrayResize tarafından kaldırılmıştı.

Ancak işlev hala onları sayar.