if(true) - страница 6

 
Georgiy Merts:

Не знаю...

На мой взгляд, и подобные "пустые" блоки, и "бесконечные циклы" (хоть на for, хоть на while) - это плохой стиль программирования, опасный потенциально тяжело вычисляемыми ошибками.

Оператор проверки условия цикла должен быть не бессмысленен, а нести какую-то нагрузку.  Если у нас "бесконечный цикл" - значит, внутри есть какие-то дополнительные выходы, break'и - и они далеко не всегда с очевидны. Оператор break, кстати, мне тоже не нравится - в цикле всегда использую оператор continue.


А уж как тут говорилось обфускация кода - это вобще ребячество... Собрались, блин, великие программисты-копирасты, боящиеся, что их код кто-то будет продавать или извлекать миллионные суммы другим способом...  Гордыня - один из смертных грехов !

не согласен. 
Попробуйте перепишите этот код без бесконечного цикла и 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:

не согласен. 
Попробуйте перепишите этот код без бесконечного цикла и break

Интересная задача. 

На мой взгляд, представленный код довольно "непрозрачный" и трудный для понимания, хотя, структура мне ясна, и функция полезная.

На первый взгляд, цикл должен быть while (i<size) {....}, но досконально пока не разбирался. 

Как руки дойдут - займусь. 

 
Georgiy Merts:

Интересная задача. 

На мой взгляд, представленный код довольно "непрозрачный" и трудный для понимания, хотя, структура мне ясна, и функция полезная.

На первый взгляд, цикл должен быть while (i<size) {....}, но досконально пока не разбирался. 

Как руки дойдут - займусь. 

Функция удаляет из массива а[] все значения val и уплотняет его, убирая "дырки" от удаленных элементов, не меняя последовательность данных.

 
Nikolai Semko:

Функция удаляет из массива а[] все значения val и уплотняет его, убирая "дырки" от удаленных элементов, не меняя последовательность данных.

Да-да, говорю ж - назначение понятно, сама функция полезная.  Сейчас пока не могу, позже разберусь с работой, и перепешу без бесконечного цикла. Ну, а потом - напишу свой вариант функции, как я бы написал.

 
Georgiy Merts:

Да-да, говорю ж - назначение понятно, сама функция полезная.  Сейчас пока не могу, позже разберусь с работой, и перепешу без бесконечного цикла. Ну, а потом - напишу свой вариант функции, как я бы написал.

код брал отсюда. Полтора года назад было спонтанное соревнование.

 
Nikolai Semko:

не согласен. 
Попробуйте перепишите этот код без бесконечного цикла и 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:


да это понятно, что существуют более компактные варианты, но более медленные.
Ваш вариант в 2-3 раза медлеенее вышеприведенного и при этом где-то ошибка, т.к. выдает неправильную контрольную сумму.
Речь идет о самом быстром варианте без применения 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 микросекунд
Файлы:
 
Georgiy Merts:

Не знаю...

На мой взгляд, и подобные "пустые" блоки, и "бесконечные циклы" (хоть на for, хоть на while) - это плохой стиль программирования, опасный потенциально тяжело вычисляемыми ошибками.

Оператор проверки условия цикла должен быть не бессмысленен, а нести какую-то нагрузку.  Если у нас "бесконечный цикл" - значит, внутри есть какие-то дополнительные выходы, break'и - и они далеко не всегда с очевидны. Оператор break, кстати, мне тоже не нравится - в цикле всегда использую оператор continue.


А уж как тут говорилось обфускация кода - это вобще ребячество... Собрались, блин, великие программисты-копирасты, боящиеся, что их код кто-то будет продавать или извлекать миллионные суммы другим способом...  Гордыня - один из смертных грехов !

Ндааа....
 
Maxim Kuznetsov:


Максим, так не получится, должно быть 2 цикла, иначе никак. Сначала удаляешь ненужные элементы, после "сжимаешь" массив вверх (поплавок). Второй цикл внутри первого. 

 

Конструкция for подразумевает проверку условия и выход по нему перед началом цикла. 

Конструкция while подразумевает проверку условия и выход по нему перед окончанием цикла. 

Бесконечный цикл подразумевает проверку условия и выход по нему в любом месте цикла.