Eğer doğruysa) - sayfa 6

 
Georgiy Merts :

bilmiyorum...

Benim düşünceme göre, hem bu tür "boş" bloklar hem de "sonsuz döngüler" (en azından bir süre için, en azından bir süre için) kötü programlama tarzıdır ve potansiyel olarak hesaplanması zor hatalarla tehlikelidir.

Döngü koşulu test operatörü anlamsız olmamalı, ancak bir tür yük taşımalıdır. Eğer bir "sonsuz döngümüz" varsa - bu, içeride bazı ek çıkışlar, kesintiler olduğu anlamına gelir - ve bunlar her zaman açık olmaktan uzaktır. Bu arada, break deyimini de sevmiyorum - sürekli deyimi bir döngü içinde kullanırım.


Ve burada söylendiği gibi, kod şaşırtma sadece çocukça... Kahretsin, birilerinin kodlarını satacağından veya başka bir şekilde milyonlarca doları çıkaracağından korkan büyük kopyacı programcılar toplandılar... Gurur ölümcül günahlardan biridir!

aynı fikirde olmamak.
Bu kodu sonsuz döngü olmadan yeniden yazmayı ve kesmeyi deneyin

 int ArrayDeleteVal( int &a[], const int val) 
  {
   int size= ArraySize (a);
   int i= 0 ,start,s,count;
   while (i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   if (i==size) return size;
   start=i; i++;
   while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   if (i==size) { ArrayResize (a,start); return start;}
   s=i; i++;
   for (;;)
     {
       while (i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
       if (count> 6 ) { ArrayCopy (a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
       else for (; s<i; start++,s++) a[start]=a[s];                 // иначе простой цикл
       if (i==size) break ;
      i++;
       while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
       if (i<size) s=i; else break ;
      i++;
     }
   if (start<size) ArrayResize (a,start); else start=size;
   return (start);
  }
 
Nikolai Semko :

aynı fikirde olmamak.
Bu kodu sonsuz döngü olmadan yeniden yazmayı ve kesmeyi deneyin

İlginç bir görev.

Benim düşünceme göre, sunulan kod oldukça "opak" ve anlaşılması zor, ancak yapı benim için açık ve işlev kullanışlı.

İlk bakışta, döngü while (i<size) {....} olmalıdır, ancak henüz tam olarak anlamadım.

Eller ulaşır ulaşmaz - yapacağım.

 
Georgiy Merts :

İlginç bir görev.

Benim düşünceme göre, sunulan kod oldukça "opak" ve anlaşılması zor, ancak yapı benim için açık ve işlev kullanışlı.

İlk bakışta, döngü while (i<size) {....} olmalıdır, ancak henüz tam olarak anlamadım.

Eller ulaşır ulaşmaz - yapacağım.

İşlev, tüm val değerlerini a[] dizisinden kaldırır ve sıkıştırır, veri sırasını değiştirmeden kaldırılan öğelerden "delikleri" kaldırır.

 
Nikolai Semko :

İşlev, tüm val değerlerini a[] dizisinden kaldırır ve sıkıştırır, veri sırasını değiştirmeden kaldırılan öğelerden "delikleri" kaldırır.

Evet, evet, diyorum - amaç açık, işlevin kendisi yararlıdır. Şimdi henüz yapamam, daha sonra işi çözeceğim ve sonsuz bir döngü olmadan yeniden yazacağım. Peki, ve sonra - Yazacağım gibi, fonksiyonun kendi versiyonunu yazacağım.

 
Georgiy Merts :

Evet, evet, diyorum - amaç açık, işlevin kendisi yararlıdır. Şimdi henüz yapamam, daha sonra işi çözeceğim ve sonsuz bir döngü olmadan yeniden yazacağım. Peki, ve sonra - Yazacağım gibi, fonksiyonun kendi versiyonunu yazacağım.

kodu buradan aldım. Bir buçuk yıl önce spontane bir rekabet vardı.

 
Nikolai Semko :

aynı fikirde olmamak.
Bu kodu sonsuz döngü olmadan yeniden yazmayı ve kesmeyi deneyin


 /// навскидку, даже не проверял
void ArrayDeleteVal( int &arr[], int val)
{
   int size= ArraySize (arr);
   int count= 0 ;   // кол-во удалённых
   for ( int i= 0 ;i<size;i++) {
       if (arr[i]==val) count++;
       else if (count) {
         arr[i-count]=arr[count];
      }
   }
   ArrayResize (arr,size-count);
}
 
Maxim Kuznetsov :


evet, daha kompakt seçeneklerin olduğu açıktır, ancak daha yavaştır.
Varyantınız yukarıdakinden 2-3 kat daha yavaş ve aynı zamanda bir yerde bir hata var. yanlış bir sağlama toplamı üretir.
Bu, HashSet kullanmadan en hızlı seçenektir.


 2020.04 . 08 14 : 15 : 35.829 ArrayDeleteValue1 (EURUSD,D1)   === Тест с сохранением порядка ===
2020.04 . 08 14 : 15 : 35.829 ArrayDeleteValue1 (EURUSD,D1)   
2020.04 . 08 14 : 15 : 35.977 ArrayDeleteValue1 (EURUSD,D1)   вариант Pastushak   : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения - 144668 микросекунд
2020.04 . 08 14 : 15 : 35.981 ArrayDeleteValue1 (EURUSD,D1)   вариант Korotky     : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   2416 микросекунд
2020.04 . 08 14 : 15 : 35.985 ArrayDeleteValue1 (EURUSD,D1)   вариант Fedoseev    : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1675 микросекунд
2020.04 . 08 14 : 15 : 35.988 ArrayDeleteValue1 (EURUSD,D1)   вариант Semko       : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -     797 микросекунд
2020.04 . 08 14 : 15 : 35.991 ArrayDeleteValue1 (EURUSD,D1)   вариант Nikitin     : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1866 микросекунд
2020.04 . 08 14 : 15 : 35.997 ArrayDeleteValue1 (EURUSD,D1)   вариант Vladimir    : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   3453 микросекунд
2020.04 . 08 14 : 15 : 36.006 ArrayDeleteValue1 (EURUSD,D1)   вариант Peter       : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   7633 микросекунд
2020.04 . 08 14 : 15 : 36.009 ArrayDeleteValue1 (EURUSD,D1)   вариант fann95      : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   1135 микросекунд
2020.04 . 08 14 : 15 : 36.013 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov   : Контрольная сумма = 7156.067670 ; элементов - 998994 ; время выполнения -   2368 микросекунд
2020.04 . 08 14 : 15 : 36.017 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov1  : Контрольная сумма = 7219.503559 ; элементов - 1000000 ; время выполнения -   1874 микросекунд
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov2  : Контрольная сумма = 7225.757267 ; элементов - 998994 ; время выполнения -   2554 микросекунд
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   
2020.04 . 08 14 : 15 : 36.021 ArrayDeleteValue1 (EURUSD,D1)   === Порядок в массиве не сохраняется ===
2020.04 . 08 14 : 15 : 36.024 ArrayDeleteValue1 (EURUSD,D1)   вариант Kuznetsov3  : Контрольная сумма = 7224.813498 ; элементов - 998994 ; время выполнения -     735 микросекунд
2020.04 . 08 14 : 15 : 36.027 ArrayDeleteValue1 (EURUSD,D1)   вариант Semko2      : Контрольная сумма = 7224.813498 ; элементов - 998994 ; время выполнения -   1408 микросекунд
Dosyalar:
 
Georgiy Merts :

bilmiyorum...

Benim düşünceme göre, hem bu tür "boş" bloklar hem de "sonsuz döngüler" (en azından bir süre için, en azından bir süre için) kötü programlama tarzıdır ve potansiyel olarak hesaplanması zor hatalarla tehlikelidir.

Döngü koşulu test operatörü anlamsız olmamalı, ancak bir tür yük taşımalıdır. Eğer bir "sonsuz döngümüz" varsa - bu, içeride bazı ek çıkışlar, kesintiler olduğu anlamına gelir - ve bunlar her zaman açık olmaktan uzaktır. Bu arada, break deyimini de sevmiyorum - sürekli deyimi bir döngü içinde kullanırım.


Ve burada söylendiği gibi, kod şaşırtma sadece çocukça... Kahretsin, birilerinin kodlarını satacağından veya başka bir şekilde milyonlarca doları çıkaracağından korkan büyük kopyacı programcılar toplandılar... Gurur ölümcül günahlardan biridir!

Ndaaaa ....
 
Maxim Kuznetsov :


Maxim, bu işe yaramayacak, 2 döngü olmalı, aksi halde hiçbir şey yok. İlk başta, bir diziyi yukarı doğru "sıkıştırdıktan" (float) sonra gereksiz öğeleri silersiniz. İkinci döngü birincinin içinde.

 

for yapısı, döngünün başlangıcından önce koşulu kontrol etmek ve koşuldan çıkmak anlamına gelir.

while yapısı, koşulu kontrol etmek ve döngü bitmeden bu koşuldan çıkmak anlamına gelir.

Sonsuz bir döngü, koşulu kontrol etmek ve döngüde herhangi bir yerde koşuldan çıkmak anlamına gelir.