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

удаление нулей из массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
15.01.2013, 16:06     удаление нулей из массива #1
1)Сформировать одномерный массив целых чисел, используя
датчик случайных чисел.
2)Распечатать полученный массив.
3)Удалить все элементы равные 0.
4)Добавить после первого четного элемента массива элемент
со значением M[ I-1 ]+2.
5)Распечатать полученный массив.


я понял что нужно создавать новый массив, и в него переносить числа из предыдущего, кроме нулей.

подскажите как это сделать? получиться это сделать через "if", я имею ввиду что-то вроде "если в массиве есть нули, то перенести значения кроме нулей в новый массив".

а меня хватило только на то чтоб написать это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "StdAfx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
void main()
{
    int a[100];
    int b[100], n, i;
    cout<<"\nBBeduTe pa3Mep MaccuBa: ";
    cin >> n;
    for(i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
    }
 
    system("pause");
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 16:06     удаление нулей из массива
Посмотрите здесь:

найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц C++
C++ Удаление нулей из строки
Найти количество нулей среди элементов массива, расположенных между минимальным и максимальным элементом массива. C++
Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц C++
C++ Фиксированная точка в printf() и удаление лишних нулей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Doctor_
 Аватар для Doctor_
232 / 232 / 69
Регистрация: 03.02.2011
Сообщений: 1,405
15.01.2013, 16:12     удаление нулей из массива #2
Ну так, если он встречает 0, то переходит на следующий элемент
что типа такого:
C++
1
2
3
4
5
if(a[i] == 0) {
i++;
} else {
cout << a[i] << " ";
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,904
Записей в блоге: 2
Завершенные тесты: 1
15.01.2013, 16:16     удаление нулей из массива #3
Цитата Сообщение от Zakat Посмотреть сообщение
3)Удалить все элементы равные 0.
То есть удалить? Просто переместить его в конец и уменьшить переменную, в которой храниться кол-во элементов в массиве? Или же перевыделять память под массив?
Цитата Сообщение от Zakat Посмотреть сообщение
4)Добавить после первого четного элемента массива элемент
со значением M[ I-1 ]+2.
а если i=0?
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
15.01.2013, 16:36  [ТС]     удаление нулей из массива #4
Цитата Сообщение от Doctor_ Посмотреть сообщение
C++
1
2
3
4
5
if(a[i] == 0) {
i++;
} else {
cout << a[i] << " ";
}
заменить или дописать?
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
#include "StdAfx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
void main()
{
    int a[100];
    int b[100], n, i;
    cout<<"\nBBeduTe pa3Mep MaccuBa: ";
    cin >> n;
    for(i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
        if(a[i] == 0) 
        {
            i++;
        } 
        else 
        {
            cout << a[i] << " ";
        }
    }
    
    system("pause");
 
}
если так, то да, нули не выводит, а числа дублирует.

Цитата Сообщение от Croessmah Посмотреть сообщение
То есть удалить? Просто переместить его в конец и уменьшить переменную, в которой храниться кол-во элементов в массиве? Или же перевыделять память под массив?
я даже незнаю, но как я понял, там должен быть новый массив с темиже числами только без нулей...

Цитата Сообщение от Croessmah Посмотреть сообщение
а если i=0?
хм... даже не задумывался...

Добавлено через 7 минут
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
#include "StdAfx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
void main()
{
int a[100];
int b[100], n, i;
cout<<"\nBBeduTe pa3Mep MaccuBa: ";
cin >> n;
for(i=0; i<n; i++)
{
a[i]=rand()%100;
cout<<a[i]<<" ";
if(a[i] == 0) 
{
i++;
} 
else 
{
cout << a[i] << " ";
}
}
 
system("pause");
 
}
точнее, он числа продублировал, а ноль где был там и остался
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
15.01.2013, 16:56     удаление нулей из массива #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
#include <iostream>
using namespace std;
 
void main()
{
    int a[100] = {0};//таким образом обнуляем значения созданным массивов 
    int b[100]= {0};
    int n, m, i, j = 0;// новые переменные m - для счётчика второго массива после удаления нулей
    // j - для перебора значений второго массива
    cout<<"\nBBeduTe pa3Mep MaccuBa: ";
    cin >> n;
    m = n;// сравниваем изначальные размеры
    for(i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    
     for(i=0; i<n; i++)
       if(a[i])//если значение положительно т.е. не равны нули
        b[j++] = a[i];//копируем его во второй массив и увеличиваем j на единицу
       else m--;// если значение равно нулю игнорируем копирование и сокращаем счётчик второго массива на 1
    cout<<"After sort"<<endl;
    for(i=0; i<m; i++)
      cout<<b[i]<<" ";
    cout<<endl;
    for(i=0; i<m; i++)
      if((b[i]%2 == 0)&&( i != 0))//ищем первое чётное число и меняем значение согласно заданию 
          //а также проверяем если i != 0 - т.е. у нас не первое число массива иначе
          // выполнение b[i-1]+2 приведёт к нежелательным результатам
      {
         b[i] = b[i-1]+2;
         break;
      }
    cout<<endl;
    cout<<"After M[I-1]+2 "<<endl;
    for(i=0; i<m; i++)
      if(b[i]) cout<<b[i]<<" ";
    cout<<endl;
  system("pause");
}
Добавлено через 5 минут
Ой извените я поменял первое чётное так будет правильно:
C++
1
2
3
4
5
6
7
8
 if((b[i]%2 == 0)&&( i != 0))//ищем первое чётное число и меняем значение согласно заданию 
          //а также проверяем если i != 0 - т.е. у нас не первое число массива иначе
          // выполнение b[i-1]+2 приведёт к нежелательным результатам
      {
 
         b[++i] = b[i-1]+2;
         break;
      }
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть удалить? Просто переместить его в конец и уменьшить переменную, в которой храниться кол-во элементов в массиве? Или же перевыделять память под массив?

а если i=0?
думаю не стоит за это переживать значение надо менят следующим за чётным...
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
15.01.2013, 16:58  [ТС]     удаление нулей из массива #6
это круто) правда там нужно добавить после первого четного число а не заменить)
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
15.01.2013, 17:00     удаление нулей из массива #7
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
#include <iostream>
#include <algorithm>
#include <iterator>
 
template <typename T>
void print_array(const char* message, T* array, unsigned int size)
{
    std::cout << message << std::endl;
    std::copy(array, array + size, std::ostream_iterator<T>(std::cout, " "));
    std::cout << std::endl;
}
 
int main()
{
    int array[] = { 1, 2, 3, 0, 0, 2, 30, 5, 0 };
    unsigned int size = sizeof(array) / sizeof(array[0]);
    
    print_array("Массив до удаления: ", array, size);
    
    int* iter = (int*)std::remove_if(array, array + size, std::bind2nd(std::equal_to<int>(), 0));
    size = static_cast<unsigned int>(iter - array);
    
    print_array("Массив после удаления: ", array, size);
    
    return 0;
}
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
15.01.2013, 17:01     удаление нулей из массива #8
Цитата Сообщение от Alexxx7 Посмотреть сообщение
if((b[i]%2 == 0)&&( i + 1< m ))//ищем первое чётное число и меняем значение согласно заданию
//и проверка на выход из массива
* * * {
* * * * *b[i] = b[i-1]+2;
* * * * *break;
* * * }
снова натормозил, теперь может и каструбато но вроде правильно
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
16.01.2013, 15:12  [ТС]     удаление нулей из массива #9
sandye51, это для меня еще темный лес))

Добавлено через 21 час 24 минуты
Alexxx7, подскажи пожалуйста за что отвечает 39ая строка кода:
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
#include "StdAfx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
 
void main()
{
    int a[100] = {0};//таким образом обнуляем значения созданным массивов 
    int b[100]= {0};
    int n, m, i, j = 0;// новые переменные m - для размера второго массива после удаления нулей
    // j - для перебора значений второго массива
    cout<<"\nBBeduTe pa3Mep MaccuBa: ";
    cin >> n;
    m = n;// сравниваем изначальные размеры
    for(i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    
     for(i=0; i<n; i++)
       if(a[i])//если значение положительно т.е. не равны нули
        b[j++] = a[i];//копируем его во второй массив и увеличиваем j на единицу
       else m--;// если значение равно нулю игнорируем копирование и сокращаем размер второго массива на 1
    cout<<"After sort"<<endl;
    for(i=0; i<m; i++)
      cout<<b[i]<<" ";
    cout<<endl;
    for(i=0; i<m; i++)
      if((b[i]%2 == 0)&&( i != 0))
          //ищем первое чётное число и меняем значение согласно заданию 
          //а также проверяем если i != 0 - т.е. у нас не первое число массива иначе
          // выполнение b[i-1]+2 приведёт к нежелательным результатам
      {
        
        b[++i] = b[i-1]+2;
        break;
      }
    cout<<endl;
    cout<<"After M[I-1]+2 "<<endl;
    for(i=0; i<m; i++)
      if(b[i]) cout<<b[i]<<" ";
    cout<<endl;
  system("pause");
}
или как сделать так что бы после первого четного числа программа добавила число, а не заменила следующее,
то есть там получается что в массиве идут числа ...34 69... и программа меняет 69 на 36, а нужно что бы было ...34 36 69..
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
16.01.2013, 15:27     удаление нулей из массива #10
C++
1
2
3
4
5
6
7
if((b[i]%2 == 0)&&( i + 1< m ))
          //ищем первое чётное число и меняем значение согласно заданию 
      {
        
        b[++i] = b[i-1]+2;
        break;
      }
if(b[i]%2 == 0)&&( i + 1< m ) - b[i]%2 == 0 -находим первое чётное число, i + 1< m - проверка или это число не принадлежит последней ячейке, иначе присваивать будем значение в кучу (в лучшем случае!) или в область памяти которая принадлежит кому то ещё.
После этого мы имеем i - индекс элемента с четным значением
b[++i] - обращаемся к элементу который стоит после него посредствам префиксного инкремирования, то есть сначала увеличили на 1 потом обратились и присвоили значение как записано в задании
break; - останавливаем дальнейшее выполнение цикла.
Так не дочитал вопрос и задание, щас модумаю...
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
16.01.2013, 15:34  [ТС]     удаление нулей из массива #11
ух... разобрался получилось вот что
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 for(i=0; i<n; i++)
      if((a[i]%2 == 0)&&( i != 0))
          //ищем первое чётное число и меняем значение согласно заданию 
          //а также проверяем если i != 0 - т.е. у нас не первое число массива иначе
          // выполнение b[i-1]+2 приведёт к нежелательным результатам
      {
        
        a[++i] = a[i-1]+2;
        break;
      }
    cout<<endl;
    cout<<"After M[I-1]+2 "<<endl;
    for(i=0; i<n; i++)
      if(a[i]) cout<<a[i]<<" ";
        cout<<endl;
  system("pause");
в принципе просто заменил массив b на a, и ноль в массиве а на число M[I-1]+2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 16:48     удаление нулей из массива
Еще ссылки по теме:

C++ Сдвиг нулей в конец массива
C++ Удаление нулей в массиве вещественных чисел
Удаление двух или более подряд стоящих нулей в одномерном динамическом массиве C++

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

Или воспользуйтесь поиском по форуму:
Alexxx7
97 / 33 / 5
Регистрация: 24.04.2012
Сообщений: 151
16.01.2013, 16:48     удаление нулей из массива #12
Нет нет, забыли обнулить srand() и поэтому значения повторяются и на первый взгляд сойдёт, но правильно было бы наверное так, вроде...:
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
    srand(time(NULL));//!!! а про обнуление забыли!!!
    int a[100] = {0};//таким образом обнуляем значения созданным массивов 
    int b[100]= {0};
    int n, m, i, j = 0;// новые переменные m - для размера второго массива после удаления нулей
    // j - для перебора значений второго массива
    cout<<"\nBBeduTe pa3Mep MaccuBa: ";
    cin >> n;
    m = n;// сравниваем изначальные размеры
    for(i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    
     for(i=0; i<n; i++)
       if(a[i])//если значение положительно т.е. не равны нули
        b[j++] = a[i];//копируем его во второй массив и увеличиваем j на единицу
       else m--;// если значение равно нулю игнорируем копирование и сокращаем размер второго массива на 1
    cout<<"After sort"<<endl;
    for(i=0; i<m; i++)
      cout<<b[i]<<" ";
    cout<<endl;
    //может попробывать и так
    for(i=0; i<m; i++)
      if((b[i]%2 == 0)&&( i + 1< m ))
      {
          i++; //ищем первое чётное число и меняем значение согласно заданию и передвигаем на следующее
        break;
      }//нашли i остановились
    //прогоняем ещё раз цикл но уже с j
     for(j = m+1; j > 0; j--)//пробегаем массив с конца (так легче!) не забывам увеличить "размер массива" на 1
     {
         if(j == i)// если равно вставляем и останавливаем цикл
          {
              b[j] = b[j-1]+2;
              break;
          }
          else// если до равенства не дошли смещаем значение 
            b[j] = b[j-1];
     }
 
    cout<<"After M[I-1]+2 "<<endl;
    for(i=0; i<m+1; i++)
      if(b[i]) cout<<b[i]<<" ";//тут if стоит для того чтоб не на печать не выводились нули конца массива
    cout<<endl;
  system("pause");
}
и в массиве значения разные и всё работает
Yandex
Объявления
16.01.2013, 16:48     удаление нулей из массива
Ответ Создать тему
Опции темы

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