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

С++ для начинающих

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

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

03.11.2011, 11:55. Просмотров 3928. Ответов 15
Метки нет (Все метки)

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

на примере 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++ Удалить из массива все нулевые элементы
Удалить из массива действительных чисел нулевые элементы C++
C++ Из заданного массива целых чисел, который представлен в виде связанного списка, удалить все нулевые элементы, если они существуют
Создать два новых массива, в один из которых поместить положительные элементы массива, а в другой отрицательные и нулевые элементы C++
одномерный массив. Все его элементы, не равные нулю, переписать, сохраняя их порядок в начало массива, а нулевые элементы в конец массива in c++ C++
Нужно из массива удалить элементы с номером, введенным с клавиатуры C++
В одномерном массиве удалить нулевые элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
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++
1286 / 1220 / 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--;   // Тута!
                }

Не по теме:

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

Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
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
315 / 299 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 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;
}
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
03.11.2011, 12:18     Нужно из массива удалить нулевые элементы #7
Цитата Сообщение от Hi4ko Посмотреть сообщение
раньше меня написал, ну ладно)
Значит, решено абсолютным большинством голосов!
Thinker
Эксперт C++
4221 / 2195 / 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
4 / 4 / 0
Регистрация: 19.12.2010
Сообщений: 54
03.11.2011, 14:03  [ТС]     Нужно из массива удалить нулевые элементы #9
Спасибо, теперь понятно =)
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
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++
4221 / 2195 / 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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.11.2011, 18:57     Нужно из массива удалить нулевые элементы #12
Цитата Сообщение от Байт Посмотреть сообщение
Или совершенству нет предела?
Замени flag на (m != i)
Байт
Эксперт C
15635 / 9977 / 1499
Регистрация: 24.12.2010
Сообщений: 18,735
04.11.2011, 10:28     Нужно из массива удалить нулевые элементы #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
Замени flag на (m != i)
Самом пришло в голову, но ты меня опередил
Все равно это дела не меняет, патент-то уже у Thinker
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.11.2011, 00:03     Нужно из массива удалить нулевые элементы #14

Не по теме:

Thinker, Супер



Добавлено через 2 минуты
Байт, может я ошибаюсь, но вы уверены, что условие в иф-е выполнится хотя бы один раз (flag всегда = 0)
xAtom
914 / 739 / 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++
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     Нужно из массива удалить нулевые элементы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru