si(true) - page 6

 
Georgiy Merts:

Je ne sais pas...

À mon avis, tant ces blocs "vides" que les "boucles infinies" (que ce soit pour ou pendant) constituent un mauvais style de programmation, dangereux pour les erreurs potentiellement difficiles à calculer.

L'opérateur de vérification de la condition de la boucle ne doit pas être dénué de sens, mais porter un certain poids. Si nous avons une "boucle infinie", cela signifie qu'il y a des sorties et des interruptions supplémentaires à l'intérieur de la boucle et qu'elles ne sont pas toujours évidentes. Au fait, je n'aime pas non plus l'opérateur break - j'utilise toujours l'opérateur continue dans une boucle.


Et comme il a été dit ici, l'obscurcissement du code est juste enfantin... Les grands programmeurs-copieurs réunis ici ont peur que quelqu'un vende leur code ou obtienne des millions de dollars d'une autre manière... L'orgueil est l'un des péchés capitaux !

ne sont pas d'accord.
Essayez de réécrire ce code sans la boucle infinie et le break

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:

ne sont pas d'accord.
Essayez de réécrire ce code sans la boucle infinie et le break

Une tâche intéressante.

À mon avis, le code présenté est plutôt "opaque" et difficile à comprendre, bien que la structure soit claire pour moi, et que la fonction soit utile.

A première vue, la boucle devrait être while (i<size) {....}, mais je n'ai pas encore bien compris.

Dès que je mettrai la main dessus, je m'y mettrai.

 
Georgiy Merts:

Une tâche intéressante.

À mon avis, le code présenté est plutôt "opaque" et difficile à comprendre, bien que la structure soit claire pour moi et que la fonction soit utile.

À première vue, la boucle devrait être while (i<size) {....}, mais je ne l'ai pas encore bien comprise.

Dès que j'en aurai le temps, je m'y mettrai.

La fonction supprime toutes les valeurs val du tableau a[] et le compacte, en supprimant les "trous" des éléments supprimés sans modifier la séquence de données.

 
Nikolai Semko:

La fonction supprime toutes les valeurs val du tableau a[] et le compacte, en supprimant les "trous" des éléments supprimés sans modifier la séquence de données.

Oui, oui, je vous l'ai dit - le but est clair, la fonction elle-même est utile. Maintenant, je ne peux pas encore, plus tard je vais comprendre comment il fonctionne, et je vais le réécrire sans boucle infinie. Bien, et ensuite - je vais écrire ma version de la fonction, comme je l'écrirais.

 
Georgiy Merts:

Oui, oui, je vous l'ai dit - le but est clair, la fonction elle-même est utile. Maintenant, je ne peux pas encore, plus tard je vais trier mon travail et le réécrire sans boucle infinie. Bien, et ensuite - je vais écrire ma version de la fonction, comme je l'écrirais.

le code a été pris d'ici. Il y a eu un concours spontané il y a un an et demi.

 
Nikolai Semko:

ne sont pas d'accord.
Essayez de réécrire ce code sans la boucle infinie et le break


/// навскидку, даже не проверял
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:


Oui, il est clair qu'il existe des variantes plus compactes, mais plus lentes.
Votre variante est 2-3 fois plus lente que la précédente et il y a une erreur quelque part, car elle donne une somme de contrôle erronée.
Nous parlons de l'option la plus rapide sans HashSet.


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 микросекунд
Dossiers :
 
Georgiy Merts:

Je ne sais pas...

À mon avis, tant ces blocs "vides" que les "boucles infinies" (que ce soit pour ou pendant) constituent un mauvais style de programmation, dangereux pour les erreurs potentiellement difficiles à calculer.

L'opérateur de vérification de la condition de la boucle ne doit pas être dénué de sens, mais porter un certain poids. Si nous avons une "boucle infinie", cela signifie qu'il y a des sorties et des interruptions supplémentaires à l'intérieur de la boucle et qu'elles ne sont pas toujours évidentes. Au fait, je n'aime pas non plus l'opérateur break - j'utilise toujours l'opérateur continue dans une boucle.


Et comme il a été dit ici, l'obscurcissement du code est juste enfantin... Les grands programmeurs-copieurs réunis ici ont peur que quelqu'un vende leur code ou obtienne des millions de dollars d'une autre manière... L'orgueil est l'un des péchés capitaux !

Ouais....
 
Maxim Kuznetsov:


Maxime, ça ne marche pas comme ça, il devrait y avoir 2 cycles, sinon c'est impossible. D'abord, vous supprimez les éléments inutiles, puis vous "rétrécissez" le tableau vers le haut (float). La deuxième boucle est à l'intérieur de la première.

 

Une construction for implique la vérification d'une condition et la sortie avant le début du cycle.

Une construction while implique la vérification d'une condition et la sortie avant la fin de la boucle.

Une boucle infinie implique la vérification de la condition et la sortie à tout moment de la boucle.