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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
Zakat
6 / 6 / 0
Регистрация: 24.12.2012
Сообщений: 143
#1

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

15.01.2013, 16:06. Просмотров 2388. Ответов 11
Метки нет (Все метки)

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() и удаление лишних нулей
C++ Сдвиг нулей в конец массива
В матрице из нулей и единиц найти квадрат заданного размера, состоящую целиком из нулей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Doctor_
 Аватар для Doctor_
233 / 233 / 69
Регистрация: 03.02.2011
Сообщений: 1,407
15.01.2013, 16:12     удаление нулей из массива #2
Ну так, если он встречает 0, то переходит на следующий элемент
что типа такого:
C++
1
2
3
4
5
if(a[i] == 0) {
i++;
} else {
cout << a[i] << " ";
}
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12513 / 7075 / 794
Регистрация: 27.09.2012
Сообщений: 17,472
Записей в блоге: 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++
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     удаление нулей из массива
Ответ Создать тему
Опции темы

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