Убрать из Массива нулевые значения - страница 2

 
Nikolai Semko:


но если все же требуется с созданием нового массива, то самый быстрый и оптимальный вариант на мой взгляд:


void OnStart()
  {
   int src[]={1,4,2,0,2,0,2,0};  // исходный массив
   int size=ArraySize(src);
   int src2[];
   ArrayResize(src2,size);
   int i=0,j;
   while(i<size && src[i]!=0) i++;
   ArrayCopy(src2,src,0,0,i);
   if(i==size) 
     {
      Print(" Массив не содержит нулей");
      return;
     }
   j=i;
   for(;i<size;i++)
     {
      if(src[i]!=0) {src2[j]=src[i]; j++;}
     }
   ArrayResize(src2,j);
// Печатаем новый массив
   string s="";
   for(i=0;i<j;i++) s+=IntegerToString(src2[i])+"  ";
   Print(s);
  }



Это "произведение" искусства, используя 3 цикла.

Кто больше ?

 
Petros Shatakhtsyan:


Это "произведение" искусства, используя 3 цикла.

Кто больше ?

Не 3 цикла, а 2.

Третий для вывода информации для проверки.

 
Nikolai Semko:

Можно обойтись без создания нового массива.

Вряд ли можно придумать что-то быстрее.
 Я извиняюсь, но такая запись 
   int src[];  // исходный динамический массив
   ArrayResize(src,8);  // задаем размерность
   src[0]=1; src[1]=4; src[2]=2; src[3]=0; src[4]=2; src[5]=0; src[6]=2; src[7]=0; // инициализируем исходный массив

вместо такой

double src[]={1,4,2,0,0,5,0,3,0};

говорит о грамотности программиста. С такими знаниями надо учиться, а не учить.

 
Vitaly Muzichenko:

Не 3 цикла, а 2.

Третий для вывода информации для проверки.


А что, два цикла мало и надо было и еще 3 -й цикл ?

И еще автор темы не ответил, для чего второй массив ?

И еще никто не спрашивает, откуда он получает эти цифры ?   Можно во время заполнения исходного массива просто пропускать эти нули.

 
Petros Shatakhtsyan:

А что, два цикла мало и надо было и еще 3 -й цикл ?

И еще автор темы не ответил, для чего второй массив ?

И еще никто не спрашивает, откуда он получает эти цифры ?   Можно во время заполнения исходного массива просто пропускать эти нули.

Можно много чего, но нет ясности, поэтому кодов приложили не один, а несколько. Я уже как-то показывал, и такое сплошь и рядом

 
Vitaly Muzichenko:

Можно много чего, но нет ясности, поэтому кодов приложили не один, а несколько. Я уже как-то показывал, и такое сплошь и рядом


Да, но дело в том, что тот, кто становится профессиональным программистом, то часто забывает что он тоже начал так, и не родился готовым программистом.

 
Petros Shatakhtsyan:

Да, но дело в том, что тот, кто становится профессиональным программистом, то часто забывает что он тоже начал так, и не родился готовым программистом.

Вопрос не в профессионализме. Любой участник форума, так-же является участником других форумов, и опыт общения должен иметься.

"Хочешь получить умный ответ - задавай умный вопрос"

 
STARIJ:

   внизу исходный массив, выше промежуточный, вверху результат

Старый, а если один раз изменять размер массива?

void OnStart()
  {
   double src[]={1,4,2,0,0,5,0,3,0};
   int i, n = 0, size = ArraySize(src);
    for(i = size; i-- > 0;)
     {
      if(src[i] == 0)
       {
        ArrayCopy(src, src, i, i+1);
        n++;
       }
     }
    int newSize = ArrayResize(src, size-n);
  }
 
Alexey Viktorov:  Старый, а если один раз изменять размер массива?

Качество кода зависит еще от величины затраченного времени. Почему на каждом шаге уменьшал массив - для наглядности. И для этого же вывод на каждом шаге

А уменьшать программу и у меня любимое дело. Так и в Вашей программе можно ArrayResize(src, size-n);   вместо  int newSize = ArrayResize(src, size-n);

Мне на днях 76 будет, а Вам?

 

Этож в учебниках должно быть разобрано уже много раз.... 

Свой вариант - не претендую на хорошесть

но вроде норм, один цикл и одно условие

void OnStart()
  {
   double src[]={1,4,2,0,0,5,0,3,0};
   int n = 0, size = ArraySize(src);
    for(int i = 0; i<size; i++)
      if (src[i]==0) n++;
      else src[i-n]=src[i];  
    int newSize = ArrayResize(src, size-n);
  }