Форум программистов, компьютерный форум CyberForum.ru

Нужно из массива удалить нулевые элементы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.78
NeRRouZ
 Аватар для NeRRouZ
4 / 4 / 0
Регистрация: 19.12.2010
Сообщений: 54
03.11.2011, 11:55     Нужно из массива удалить нулевые элементы #1
Нужно из массива удалить нулевые элементы

на примере 1 0 2 0 3 0 4 0 5 0 -> выдает правильно 1 2 3 4 5
а если я ввожу 0 0 0 0 0 0 0 0 9 0 -> выдает 0 0 0 0 9
или 1 0 0 2 0 3 0 4 0 5 - > выдает 1 0 2 3 4 5

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
const int n = 10;
 
int main()
{
 
    int i, j;
 
    int a[n];
 
    int m = n;
 
    for (i=0; i<n; i++)
        cin>>a[i];
        
    for (i=0; i<m; i++)
        if (a[i] == 0)
        {
            for (j=i; j<n-1; j++)
            {
                a[j] = a[j+1];
                
            }
            m--;
        }
        
    
    cout<<"---------------------------------"<<endl;
    for (i=0; i<m; i++)
        cout<<a[i]<<" ";
 
return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2011, 11:55     Нужно из массива удалить нулевые элементы
Посмотрите здесь:

C++ Из заданного массива целых чисел, который представлен в виде связанного списка, удалить все нулевые элементы, если они существуют
одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец массива in c++ C++
C++ добавить в конец массива элементы, расположенные между минимальными и максимальными элементами исходного массива, исключая нулевые
Удалить из массива действительных чисел нулевые элементы C++
Создать два новых массива, в один из которых поместить положительные элементы массива, а в другой отрицательные и нулевые элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.11.2011, 12:09     Нужно из массива удалить нулевые элементы #2
C
1
2
3
4
5
6
7
8
9
10
11
        for (i=0; i<m; i++)
                if (a[i] == 0)
                {
                        for (j=i; j<n-1; j++)
                        {
                                a[j] = a[j+1];
                                
                        }
                        m--;
                        i--;   // Тута!
                }
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.11.2011, 12:10     Нужно из массива удалить нулевые элементы #3
Цитата Сообщение от NeRRouZ Посмотреть сообщение
Подскажите что не так ?
Цикл в строках 19-27 не так. Причём совсем не так.
Запусти под отладчиком и сразу увидишь.
Hi4ko
74 / 74 / 4
Регистрация: 21.10.2010
Сообщений: 376
03.11.2011, 12:12     Нужно из массива удалить нулевые элементы #4
Цитата Сообщение от NeRRouZ Посмотреть сообщение
Нужно из массива удалить нулевые элементы

на примере 1 0 2 0 3 0 4 0 5 0 -> выдает правильно 1 2 3 4 5
а если я ввожу 0 0 0 0 0 0 0 0 9 0 -> выдает 0 0 0 0 9
или 1 0 0 2 0 3 0 4 0 5 - > выдает 1 0 2 3 4 5

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
const int n = 10;
 
int main()
{
 
    int i, j;
 
    int a[n];
 
    int m = n;
 
    for (i=0; i<n; i++)
        cin>>a[i];
        
    for (i=0; i<m; i++)
        if (a[i] == 0)
        {
            for (j=i; j<n-1; j++)
            {
                a[j] = a[j+1];
                
            }
            m--;
        }
        
    
    cout<<"---------------------------------"<<endl;
    for (i=0; i<m; i++)
        cout<<a[i]<<" ";
 
return 0;
}
к --m добавь ещё --i

потому что если у тебя больше одного нуля подряд, то он удаляет один 0, а остальные не проверяет. Т.е. тебе нужно заново проверить перемещённый элемент.
По твоей проге
1 0 0 2 0 3 0 4 0 5 - он здесь первый 0 уберёт( 1 0 2 0 3 0 4 0 5), но i будет уже на элементе со значением 2, т.е второй 0 он не уберёт. Как-то так

Добавлено через 25 секунд
Цитата Сообщение от Байт Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
        for (i=0; i<m; i++)
                if (a[i] == 0)
                {
                        for (j=i; j<n-1; j++)
                        {
                                a[j] = a[j+1];
                                
                        }
                        m--;
                        i--;   // Тута!
                }

Не по теме:

раньше меня написал, ну ладно)

Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.11.2011, 12:14     Нужно из массива удалить нулевые элементы #5
А можно так
C
1
2
for(m=i=0; i<n; i++) 
  if (a[i]!='0')  a[m++] = a[i];
И короче, и эффективнее
kuroiryuu
 Аватар для kuroiryuu
311 / 295 / 23
Регистрация: 05.11.2009
Сообщений: 698
Завершенные тесты: 2
03.11.2011, 12:15     Нужно из массива удалить нулевые элементы #6
можно ещё и так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
using namespace std;
 
const int n = 10;
 
int main()
{
    vector<int> a;
 
    for (int i = 0; i < n; i++)
    {
        int input_value; 
        cin >> input_value;
        a.push_back(input_value);
    }
    vector<int>::iterator it = a.begin();
    while(it != a.end())
    {
        if ((*it) == 0)
        {
            a.erase(it);
            it = a.begin();
        }
        else
            it++;
    }       
 
    cout << "---------------------------------" << endl;
    for (vector<int>::iterator it = a.begin(); it != a.end(); it++)
        cout << (*it) << " ";
 
    return 0;
}
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.11.2011, 12:18     Нужно из массива удалить нулевые элементы #7
Цитата Сообщение от Hi4ko Посмотреть сообщение
раньше меня написал, ну ладно)
Значит, решено абсолютным большинством голосов!
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.11.2011, 12:35     Нужно из массива удалить нулевые элементы #8
Цитата Сообщение от Байт Посмотреть сообщение
А можно так
C
1
2
for(m=i=0; i<n; i++) 
  if (a[i]!='0')  a[m++] = a[i];
И короче, и эффективнее
Байт, разве что короче, но не всегда эффективнее. Если в массиве нет нулевых элементов, то в вашем алгоритме лишнее перезаписывание всего массива произойдет. Или в массиве один нулевой элемент, то тоже тот алгоритм эффективнее. Все от ситуации зависит.
Да, у вас очень хороший алгоритм, но его можно оптимизировать до ОПТИМАЛЬНОГО в любом случае алгоритма) То есть из него можно сделать алгоритм, улучшить который будет уже нельзя для произвольного массива.
NeRRouZ
 Аватар для NeRRouZ
4 / 4 / 0
Регистрация: 19.12.2010
Сообщений: 54
03.11.2011, 14:03  [ТС]     Нужно из массива удалить нулевые элементы #9
Спасибо, теперь понятно =)
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
03.11.2011, 14:44     Нужно из массива удалить нулевые элементы #10
Байт, разве что короче, но не всегда эффективнее. Если в массиве нет нулевых элементов, то в вашем алгоритме лишнее перезаписывание всего массива произойдет. Или в массиве один нулевой элемент, то тоже тот алгоритм эффективнее. Все от ситуации зависит.
Да, у вас очень хороший алгоритм, но его можно оптимизировать до ОПТИМАЛЬНОГО в любом случае алгоритма) То есть из него можно сделать алгоритм, улучшить который будет уже нельзя для произвольного массива.
Понял. Попробуем так
C
1
2
for(m=i=flag=0; i<n; i++) 
  if (a[i]!='0' && flag)  { a[m++] = a[i]; flag=1; }
Так пойдет? Или совершенству нет предела?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.11.2011, 18:33     Нужно из массива удалить нулевые элементы #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Байт Посмотреть сообщение
Понял. Попробуем так
C
1
2
for(m=i=flag=0; i<n; i++) 
  if (a[i]!='0' && flag)  { a[m++] = a[i]; flag=1; }
Так пойдет? Или совершенству нет предела?
Можно еще оптимизировать. Сначала пропускаем все элементы до первого встреченного нуля, а уже после (только после этого) начинаем перезаписывать массив, начиная с той позиции:

C++
1
2
3
4
for (m = 0; m < n && a[m] != 0; m++)
   ;
for(i = m+1;  i < n; i++) 
  if (a[i] != 0)  a[m++] = a[i];
После двух циклов переменная m содержит "новый" размер массива.
Думаю, что это самый оптимальный вариант. У кого есть возражения готов выслушать, но сначала проанализируйте его.

Добавлено через 3 часа 42 минуты
Ну, раз нет желающих высказать свое мнение, то остаюсь при своем мнении, что мною написан самый оптимальный вариант удаления элементов из произвольного массива. Пошел патентовать свой алгоритм
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.11.2011, 18:57     Нужно из массива удалить нулевые элементы #12
Цитата Сообщение от Байт Посмотреть сообщение
Или совершенству нет предела?
Замени flag на (m != i)
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,949
04.11.2011, 10:28     Нужно из массива удалить нулевые элементы #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
Замени flag на (m != i)
Самом пришло в голову, но ты меня опередил
Все равно это дела не меняет, патент-то уже у Thinker
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.11.2011, 00:03     Нужно из массива удалить нулевые элементы #14

Не по теме:

Thinker, Супер



Добавлено через 2 минуты
Байт, может я ошибаюсь, но вы уверены, что условие в иф-е выполнится хотя бы один раз (flag всегда = 0)
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
27.11.2011, 09:50     Нужно из массива удалить нулевые элементы #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;
 
// 1-вариант
int array_remove(int val, int* arr, int size) {
  for(int i = 0; i < size; i++) {
       if(arr[i] == val) {
            for(int p = i; p < size - 1; arr[p] = arr[p + 1], p++);
            --size;
            i--;
       }
  }
  return size;
}
 
//2 - вариант
int array_remove_p(int val, int* arr, int* end) {
  int* ia, *ib, *iter = arr;
  while(iter != end) {
     if(*iter == val) {
         for(ia = iter, ib = iter + 1; ia < end; *ia++ = *ib++);
         --end;
         continue;
     }
     *iter++;
  }
  return (end - arr);
}
 
 
int main(void)
{
   int arr[]  = { 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 7 };
 
   int size  = array_remove(0, arr, sizeof(arr)/sizeof(arr[0]));
   for(int i = 0; i < size; i++)
       cout << arr[i] << ' ';
   cout << endl;
 
   int arr1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 777 };
 
   size = array_remove_p(0, arr1, arr1 + sizeof(arr1)/sizeof(arr1[0]));
   for(int j = 0; j < size; j++)
       cout << arr1[j] << ' ';
   cout << endl;
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2016, 15:48     Нужно из массива удалить нулевые элементы
Еще ссылки по теме:

Списки двунаправленные. Удалить все нулевые элементы C++
В одномерном массиве удалить нулевые элементы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vicbuk
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 1
23.11.2016, 15:48     Нужно из массива удалить нулевые элементы #16
С одномерным массивом, состоящим из n вещественных элементов, выполнить следующее :
- Сжать массив, удалив из него одинаковые элементы.
- Получившийся массив сохранить отдельно.Старый массив – удалить.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <conio.h>
#include <algorithm>  
using namespace std;
 
int main()
{
    printf("Please write size of array: ");
    int size;
 
    scanf_s("%d", &size);
 
    int *array = new int[size];
    for (int i = 0; i < size; i++) //Заполняем массив
    {
        printf("[%d]: ", i);
        scanf_s("%d", &array[i]);
    }
 
    int value = 0;
 
    for (int i = 0; i < size; i++) //Перебор только до последнего элемента который останется
    {
        int twice_int = array[i]; //Переменная для сравнения одного элемента с другими
 
        for (int k = i + 1; k < size; k++)
        {
            if (twice_int == array[k]) //Сравнение элементов
            {
                for (int j = k; j < size - 1; j++)
                {
                    swap(array[k], array[k + 1]); //Смещение элементов
                }
                k--;
                size--;
            }
        }
    }
    
    int *new_array = new int[size];
 
    for (int i = 0; i < size; i++)
    {
        new_array[i] = array[i];
        printf("%d\n", new_array[i]);
    }
    
    delete[] array;
    delete[] new_array;
 
    _getch();
}
Ввожу [1,2,2,3,4,2,2,5,6]
Выдает ответ 1,2,3,4
Yandex
Объявления
23.11.2016, 15:48     Нужно из массива удалить нулевые элементы
Ответ Создать тему
Опции темы

Текущее время: 23:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru