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

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

Восстановить пароль Регистрация
 
Курб
 Аватар для Курб
0 / 0 / 1
Регистрация: 28.12.2011
Сообщений: 31
05.03.2012, 00:28     Сжать массив, удалив из него все нулевые элементы #1
Программа должна сжать массив, удалив из него все нулевые элементы.но типичная проблема, она не заработала. на С++ впервые пишу, поэтому не ругайтесь сильно
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;
void init (int*a,int n );
void rinit(int a[],int n);
void del (int a[], int& n);
int a[n];
int main()
{     rinit(int a, int n);
  init(int a,int n);
  del(int a, int n);
  init(int a, int n);
 
system("PAUSE");
return 0;
}
void del (int a[], int& n){
    int k=-1;
    for(int i=0;i<n;i++)
        if(a[i]!=0){ 
            k++;
            a[k]=a[i];
            n=k;
        }
}
void init ( int*a,int n ) {
    cout<<"Vvod massiva\n ";
    for (int i=0;i<n;i++ )
        cin>> a[i];
}
void rinit(int a[],int n){
    cout<<"Vivod massiva";
    for (int i=0;i<n;i++ )
        cout<<a[i] ;
}
 Комментарий модератора 
Код выделяем тегами! Темы называем информативно!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2012, 00:28     Сжать массив, удалив из него все нулевые элементы
Посмотрите здесь:

C++ Сжать массив, удалив из него все элементы, модуль которых находится в интервале a,b
Сжать массив, удалив из него все элементы, величина которых находится на интервале [а,b] C++
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b] C++
C++ Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a,b].
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
05.03.2012, 01:31     Сжать массив, удалив из него все нулевые элементы #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
 
int main()
{
    std::vector <int> vec(std::istream_iterator <int> (std::cin), std::istream_iterator <int> ());
    vec.erase(std::remove(vec.begin(), vec.end(), 0), vec.end());
    std::copy(vec.begin(), vec.end(), std::ostream_iterator <int> (std::cout, " "));
    system("pause");
    return 0;
}
Курб
 Аватар для Курб
0 / 0 / 1
Регистрация: 28.12.2011
Сообщений: 31
05.03.2012, 02:08  [ТС]     Сжать массив, удалив из него все нулевые элементы #3
Я пока так не понимаю, можно проще?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.03.2012, 03:50     Сжать массив, удалив из него все нулевые элементы #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void del(int arr[], int sz)
{
   int buf;
   int pos = sz-1;
 
   for (int i = sz-2; i >=0; i--)
   {
      if (arr[i] == 0)
      {
         for (int j = i; j < pos; j++)
         {
            buf = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = buf;
         }
         pos--;
      }
   }
}
Курб
 Аватар для Курб
0 / 0 / 1
Регистрация: 28.12.2011
Сообщений: 31
07.03.2012, 02:32  [ТС]     Сжать массив, удалив из него все нулевые элементы #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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std;
void masread(int   arr[],int n){
     cout <<"\n ввод массива";
     
    for (int i=0;i<n;i++)
    {cin>>arr[i];
    }
return;}
void maswrite (int arr[], int n){
    cout<<"\n вывод массива";
    for (int i=0;i<n;i++){
        cout<<arr[i];
    }
return;}
 
void del(int arr[], int  n)
{
    int buf;
    int pos = n-1;
    int j;
    for (int i = n-2; i >=0; i--)
    {
        if (arr[i] == 0)
        {
            for ( j = i; j < pos; j++)
            {
                buf = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = buf;
            }
            pos--;
        }
    }
 
 }
int const n=10;
int main(){
    
    int n=5; 
    int arr[5];
    
    masread(  arr,n);
    maswrite(  arr,n);
    del(arr,n);
    maswrite(  arr,n);
    
    system("PAUSE");
    return 0;
};
Курб
 Аватар для Курб
0 / 0 / 1
Регистрация: 28.12.2011
Сообщений: 31
07.03.2012, 02:40  [ТС]     Сжать массив, удалив из него все нулевые элементы #6
В итоге имеем: массив 1 2 0 0 4
преобразовывается в: 1 2 4 0 0.
Нужно придумать как урезать массив.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
07.03.2012, 02:42     Сжать массив, удалив из него все нулевые элементы #7
Цитата Сообщение от Курб Посмотреть сообщение
В итоге имеем: массив 1 2 0 0 4
преобразовывается в: 1 2 4 0 0.
Нужно придумать как урезать массив.
создать новый динамически и туда скопировать ненулевые элементы
или воспользуйся vector, как уже было показано выше
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
07.03.2012, 02:51     Сжать массив, удалив из него все нулевые элементы #8
Если нужно урезать динамически получаемый массив, и не хочется пользоваться вектором, и не хочется создавать новый массив, то вроде можно воспользоваться cишной realloc(), при условии, что память была выделена через malloc() или calloc().
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
07.03.2012, 10:27     Сжать массив, удалив из него все нулевые элементы #9
http://www.cplusplus.com/reference/c...tdlib/realloc/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 18:52     Сжать массив, удалив из него все нулевые элементы
Еще ссылки по теме:

C++ Сжать массив, удалив из него все элементы, величина которых находится в интервале [a, b]
Сжать массив, удалив из него все элементы модуль которых не превышает 1. Заполнить эти элементы нулями C++
Сжать массив, удалив из него все элементы, модуль которых не превышает 1 C++

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
07.03.2012, 18:52     Сжать массив, удалив из него все нулевые элементы #10
Цитата Сообщение от Курб Посмотреть сообщение
она не заработала
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
53
54
55
56
57
58
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
void init(int* a, int n);
void rinit(int* a, int n);
void del(int* a, int& n);
 
int main()
{
   const int capacity = 10;
   int a[capacity];
 
   int n = capacity;
   
   cout << "Vvod massiva\n";
   init(a, n);
   
   cout << "Ishodniy massiv\n";
   rinit(a, n);
   cout << "\n";
 
   del(a, n);
 
   cout << "Rezultat\n";
   rinit(a, n); 
   cout << "\n";
 
   system("PAUSE");
   return 0;
}
 
void del(int* a, int& n)
{
   int k = 0;
   for(int i = 0; i < n ; i++)
   {
      if(a[i] != 0)
      {      
     a[k] = a[i];
     ++k;    
      }
   }
   n = k;
}
 
void init(int* a, int n)
{   
   for (int i = 0; i < n; i++ )
      cin >> a[i];
}
 
void rinit(int* a, int n)
{   
   for (int i = 0; i < n; i++)
      cout << a[i] << " ";
}
Yandex
Объявления
07.03.2012, 18:52     Сжать массив, удалив из него все нулевые элементы
Ответ Создать тему
Опции темы

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