if(true) - Seite 6

 
Georgiy Merts:

Ich weiß es nicht...

Meiner Meinung nach sind sowohl solche "leeren" Blöcke als auch "Endlosschleifen" (ob for oder while) ein schlechter Programmierstil, gefährlich für potentiell schwer zu berechnende Fehler.

Der Bedingungsprüfungsoperator der Schleife sollte nicht bedeutungslos sein, sondern eine gewisse Last tragen. Wenn wir eine "Endlosschleife" haben, bedeutet das, dass es innerhalb der Schleife einige zusätzliche Ausgaben und Unterbrechungen gibt, die nicht immer offensichtlich sind. Übrigens mag ich den Break-Operator auch nicht - ich verwende immer den Continue-Operator in einer Schleife.


Und wie hier schon gesagt wurde, ist Code-Verschleierung einfach nur kindisch... Hier sind großartige Programmierer und Kopisten versammelt, die Angst haben, dass jemand ihren Code verkauft oder auf andere Weise Millionen von Dollar bekommt... Stolz ist eine der Todsünden!

sind nicht einverstanden.
Versuchen Sie, diesen Code ohne die Endlosschleife und die Unterbrechung neu zu schreiben

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:

nicht zustimmen.
Versuchen Sie, diesen Code ohne die Endlosschleife und die Unterbrechung neu zu schreiben

Eine interessante Aufgabe.

Meiner Meinung nach ist der vorgestellte Code eher "undurchsichtig" und schwer zu verstehen, obwohl die Struktur für mich klar ist und die Funktion nützlich ist.

Auf den ersten Blick sollte die Schleife while (i<size) {....} lauten, aber ich habe sie noch nicht ganz verstanden.

Sobald ich es in die Hände bekomme, werde ich es in Angriff nehmen.

 
Georgiy Merts:

Eine interessante Aufgabe.

Meiner Meinung nach ist der vorgestellte Code eher "undurchsichtig" und schwer zu verstehen, obwohl die Struktur für mich klar ist und die Funktion nützlich ist.

Auf den ersten Blick sollte die Schleife while (i<size) {....} lauten, aber ich habe sie noch nicht ganz verstanden.

Sobald ich dazu komme, kümmere ich mich darum.

Die Funktion entfernt alle val-Werte aus dem Array a[] und komprimiert es, wobei die "Löcher" der gelöschten Elemente entfernt werden, ohne die Datenreihenfolge zu verändern.

 
Nikolai Semko:

Die Funktion löscht alle val-Werte aus dem Array a[] und komprimiert es, indem sie "Löcher" in den gelöschten Elementen entfernt, ohne die Datenreihenfolge zu verändern.

Ja, ja, ich habe es dir gesagt - der Zweck ist klar, die Funktion selbst ist nützlich. Jetzt kann ich noch nicht, später werde ich herausfinden, wie sie funktioniert, und ich werde sie ohne Endlosschleife umschreiben. Nun, und dann - ich werde meine Variante der Funktion schreiben, wie ich schreiben würde.

 
Georgiy Merts:

Ja, ja, ich habe es Ihnen gesagt - der Zweck ist klar, die Funktion selbst ist nützlich. Jetzt kann ich noch nicht, später werde ich meine Arbeit sortieren und sie ohne Endlosschleife neu schreiben. Tja, und dann - schreibe ich meine Version der Funktion, so wie ich sie schreiben würde.

Der Code wurde von hier übernommen. Vor eineinhalb Jahren gab es einen spontanen Wettbewerb.

 
Nikolai Semko:

sind nicht einverstanden.
Versuchen Sie, diesen Code ohne die Endlosschleife und die Unterbrechung neu zu schreiben


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


Ja, es ist klar, dass es kompaktere Varianten gibt, die aber langsamer sind.
Ihre Variante ist 2-3 mal langsamer als die obige und es liegt irgendwo ein Fehler vor, weil sie eine falsche Prüfsumme angibt.
Wir sprechen hier von der schnellsten Option ohne 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 микросекунд
Dateien:
 
Georgiy Merts:

Ich weiß es nicht...

Meiner Meinung nach sind sowohl solche "leeren" Blöcke als auch "Endlosschleifen" (ob for oder while) ein schlechter Programmierstil, gefährlich für potentiell schwer zu berechnende Fehler.

Der Bedingungsprüfungsoperator der Schleife sollte nicht bedeutungslos sein, sondern eine gewisse Last tragen. Wenn wir eine "Endlosschleife" haben, bedeutet das, dass es innerhalb der Schleife einige zusätzliche Ausgaben und Unterbrechungen gibt, die nicht immer offensichtlich sind. Übrigens mag ich den Break-Operator auch nicht - ich verwende immer den Continue-Operator in einer Schleife.


Und wie hier schon gesagt wurde, ist Code-Verschleierung einfach nur kindisch... Hier sind großartige Programmierer und Kopisten versammelt, die Angst haben, dass jemand ihren Code verkauft oder auf andere Weise Millionen von Dollar bekommt... Stolz ist eine der Todsünden!

Ja....
 
Maxim Kuznetsov:


Maxim, so funktioniert das nicht, es sollten 2 Zyklen sein, sonst geht es nicht. Zuerst werden überflüssige Elemente entfernt, dann wird das Array nach oben "geschrumpft" (float). Die zweite Schleife befindet sich innerhalb der ersten Schleife.

 

Bei einem for-Konstrukt wird eine Bedingung geprüft und vor Beginn des Zyklus beendet.

Bei einer while-Konstruktion wird eine Bedingung geprüft und die Schleife vor ihrem Ende beendet.

Eine Endlosschleife bedeutet, dass die Bedingung geprüft und an einem beliebigen Punkt der Schleife beendet wird.

Grund der Beschwerde: