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

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

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

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

15.01.2013, 16:06. Просмотров 2756. Ответов 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++
Здравствуйте, проблема такая. Имеется символьная строка, описанная как char* a; Как из этой строки 'a' убрать все нули? Т.е. она может...

Удаление нулей в массиве вещественных чисел - C++
Здравствуйте! Я написала функцию, которая должна удалять лишние нули в массиве вещественных чисел.но код не работает void...

Фиксированная точка в printf() и удаление лишних нулей - C++
Есть число 0.000000000001 и мне его нужно вывести на экран, но если написать printf(&quot;%.37f&quot;, 0.000000000001); выводится...

Удаление двух или более подряд стоящих нулей в одномерном динамическом массиве - C++
Привет всем :) Помогите исправить программу. Нужно удалить из одномерного динамического массива два или более подряд стоящих нулей. ...

Найти количество нулей среди элементов массива, расположенных между минимальным и максимальным элементом массива. - C++
Программу по нахождению количества нулевых элементов в массиве составила а как сделать так чтобы они находились именно между макс. и мин....

Сдвиг нулей в конец массива - C++
Извините, если данная тема уже поднималась(к сожалению, я таковой на C++ не нашёл). Суть задачи: нужно отсортировать элементы массива...

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах - C++
#include &lt;iostream&gt; #include&lt;conio.h&gt; main() { setlocale(LC_ALL, &quot;Russian&quot;); int N,digit = 0; int count = 0; std::...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Doctor_
234 / 234 / 71
Регистрация: 03.02.2011
Сообщений: 1,431
15.01.2013, 16:12     удаление нулей из массива #2
Ну так, если он встречает 0, то переходит на следующий элемент
что типа такого:
C++
1
2
3
4
5
if(a[i] == 0) {
i++;
} else {
cout << a[i] << " ";
}
Croessmah
Модератор
Эксперт CЭксперт С++
13050 / 7313 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 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
Сообщений: 144
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
Сообщений: 144
15.01.2013, 16:58  [ТС]     удаление нулей из массива #6
это круто) правда там нужно добавить после первого четного число а не заменить)
sandye51
программист С++
682 / 584 / 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
Сообщений: 144
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
Сообщений: 144
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++
В матрице A (m, n), которая состоит из нулей и единиц, найти квадрат заданного размера (квадратную подматрицу), состоящую целиком из нулей ...

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах - C++
Дано натуральное число N (N &gt; 9). Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах. Пример. N = 10 025...

String char айти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц - C++
Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц При этом в файл всегда сохраняется &quot;1&quot;....

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах (Pascal -> С++) - C++
Var i: longint; N: integer; begin write('input Nomber, pleeeaaase: '); readln(i); N:= 0; while ((i mod 10) = 0) do ...

В заданной матрице состоящей из нулей и единиц найти квадратную подматрицу, состоящую целиком из нулей - C++
Черный квадрат. В матрице состоящей из 0 и 1 найти квадрат заданного размера(квадратную подматрицу), состоящий целиком из нулей.


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

Или воспользуйтесь поиском по форуму:
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     удаление нулей из массива
Ответ Создать тему
Опции темы

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