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

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

Войти
Регистрация
Восстановить пароль
 
 
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
#1

Удаления из массива элементов меньше одного - C++

24.02.2012, 23:29. Просмотров 989. Ответов 20
Метки нет (Все метки)

Добрый вечер, помогите пож. вот с такой задачкой..
Удалить элементы из массива, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями. Например:
(2, 0.5, 3, -0.5, -4)  (2, 3, -4, 0, 0)
Вот пытался сделать, только не уверен что правильно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int mass_zip(const int *mas,int n)
{   
    int temp; 
    for(int i=0;i<n;i++)
        temp = abs(mas[i]);
        for(int i=0;i<n;i++)
    if(temp < 1)
        {
            mas[i]=0;
            mass=mas[i];
        }
return mass;
}
Спасибо за ваши ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2012, 23:29     Удаления из массива элементов меньше одного
Посмотрите здесь:

C++ Удалить из массива все элементы, которые меньше среднеарифметического значения всех элементов исходного массива
Из массива A удалить те цепочки нечетных элементов, в которых нет ни одного элемента из массива B C++
C++ Написать функцию удаления из заданного массива отрицательных элементов
Найти сумму элементов массива, превышающих -10 и меньше 10 C++
C++ Вычислить Среднее арифм. значение элементов массива и число пар элементов которых сосед слева (т.е. индекс которого на 1 меньше) больше по величине
Найти количество элементов массива, меньше 50 C++
Переписать из одного массива в другой все элементы, значения которых больше -1.8 и меньше 2.7 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.02.2012, 23:33     Удаления из массива элементов меньше одного #2
stl::stable_partition + std::replace_if
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 23:33     Удаления из массива элементов меньше одного #3
leha-demi,
C++
1
2
#include <algorithm>
using  std::remove_if;
уберет то что укажешь в предикате, а именно условие с модулем. места от убранных значений будут заполнены нулями и помещены в конец
последовательности
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
24.02.2012, 23:55  [ТС]     Удаления из массива элементов меньше одного #4
Спасибо=) Только без библиотеки stl, а по такому типу как у меня можно?

Добавлено через 18 минут
И еще когда компилирую свой проект, выдает ошибку:
mas: невозможно присваивать значения переменной, которая объявлена как константа
Dekio
Фрилансер
Эксперт C++
5819 / 1217 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
25.02.2012, 00:00     Удаления из массива элементов меньше одного #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cmath>
#include <vector>
 
int main()
{
    std::vector <double> vec(std::istream_iterator <double> (std::cin), std::istream_iterator <double> ());
    std::fill(std::remove_if(vec.begin(), vec.end(), [] (double num) { return abs(num) < 1.0; }), vec.end(), 0.0);
    std::copy(vec.begin(), vec.end(), std::ostream_iterator <double> (std::cout, " "));
    std::cout<<std::endl;
    system("pause");
    return 0;
}
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 00:01  [ТС]     Удаления из массива элементов меньше одного #6
Цитата Сообщение от leha-demi Посмотреть сообщение
Спасибо=) Только без библиотеки stl, а по такому типу как у меня можно?

Добавлено через 18 минут
И еще когда компилирую свой проект, выдает ошибку:
mas: невозможно присваивать значения переменной, которая объявлена как константа
спасибо, но мне без stl, а примитивно совсем надо)
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.02.2012, 00:24     Удаления из массива элементов меньше одного #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
template<typename T>T* module_sort(T* mass, int size)
{
 
    T* tmp = mass;
    int lent = size;
    int count = size-1;
    while(--lent)
    {
        if(abs(*tmp)<1)
        {           
            while(abs(*tmp)<1&&*tmp!=0)
            {
            *tmp=*(tmp+(count));
            *(tmp+(count)) = 0;
            --count;
            }           
        }
                --count;//уменьшать надо) а то мусор черпнет
        ++tmp;
    }
    return mass;
};
int main()
{
 
double mass2 [] = {-0.5,1,3,-6,0.2};
module_sort(mass2,5);
return 0;
}
вот тебе примитив примитив примитивович
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.02.2012, 00:32     Удаления из массива элементов меньше одного #8
Вот реализация
C++
1
2
3
4
5
6
7
8
9
template < typename ForwardIterator, typename Predicate >
  ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,
                              Predicate pred )
{
  ForwardIterator result = first;
  for ( ; first != last; ++first)
    if (!pred(*first)) *result++ = *first;
  return result;
}
C++
1
2
3
4
5
template < typename ForwardIterator, typename T >
  void fill ( ForwardIterator first, ForwardIterator last, const T& value )
{
  while (first != last)  *first++ = value;
}
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 00:49  [ТС]     Удаления из массива элементов меньше одного #9
C++
1
2
3
4
5
6
7
8
9
10
for(int i=0 ; i<n ; i++)
   
  if (abs(mas[i])<1) 
{
     for (int j=i ; j<n-1 ; j++)
         mas[j]=mas[j]+1;
      mas[n-1]=0;
      --n;
      --i;
  }
Вот нашел что то похожее, мне лучше такого типа) Когда компилирую выдает ошибку:
"mas: невозможно присваивать значения переменной, которая объявлена как константа"
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
25.02.2012, 01:37     Удаления из массива элементов меньше одного #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
#include <iostream>
#include <cmath>
 
/*
 * 
 */
 
int main( int argc, char** argv ) {
 
    const int size = 10;
    double a[ size ] = { 3, -3, 0.1, -0.4, 0.5, 5, 4, 7, -0.2, 10 };
    int tmpSize = size;
    
    for ( int i = 0; i < size; i++ )
    std::cout << a[ i ] << ' ';
    std::cout << std::endl;
    
    for ( int i = 0; i < tmpSize; i++ ) {
    if ( std::abs( a[ i ] ) < 1 ) {
        for ( int j = i; j < tmpSize - 1; j++ )
        a[ j ] = a[ j + 1 ];
        
        a[ tmpSize-- ] = 0;
        i--;
    }
    }
    
    for ( int i = 0; i < size; i++ )
    std::cout << a[ i ] << ' ';
    std::cout << std::endl;
 
    return 0;
}
Вывод
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:19  [ТС]     Удаления из массива элементов меньше одного #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
) {
Сделал по вашему примеру, опять пишет две ошибки.
mas: невозможно присваивать значения переменной, которая объявлена как константа.:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
25.02.2012, 11:24     Удаления из массива элементов меньше одного #12
Выкладывайте код
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:25  [ТС]     Удаления из массива элементов меньше одного #13
C++
1
2
3
4
5
6
7
8
9
10
11
void mass_zip(const int *mas,int n)
{  int temp = n;
     for(int i=0;i<temp;i++)
         if (abs(mas[i]) < 1 )
         {
             for (int j = i; j < temp - 1; j++)
              mas[j] = mas[j+1];
              mas[temp--] = 0;
            i--;
         }
}
Вот функция
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
25.02.2012, 11:27     Удаления из массива элементов меньше одного #14
Прям как сговорились В соседней теме такая же проблема, вы передаете указатель на константные данные, и хотите их модифицировать
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:30  [ТС]     Удаления из массива элементов меньше одного #15
Понятно, а можно как то разименовать, или же только использовать динамическую?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
25.02.2012, 11:32     Удаления из массива элементов меньше одного #16
Просто уберите квалификатор const
C++
1
void mass_zip(const int *mas,int n)
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:41  [ТС]     Удаления из массива элементов меньше одного #17
Теперь выдает такие ошибки:

error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl summ_otr_element(double const *,int)" (?summ_otr_element@@YAHPBNH@Z) в функции _main

ссылка на неразрешенный внешний символ "int __cdecl summ_perv_pol(double const *,int)" (?summ_perv_pol@@YAHPBNH@Z) в функции _main

fatal error LNK1120: 2 неразрешенных внешних элементов

Вот полный код:

C++
1
2
3
4
header.h
int summ_perv_pol(const double *mas,int n);
int summ_otr_element(const double *mas,int n);
void mass_zip(double *mas,int 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
header.cpp
#include "stdafx.h"
#include <math.h>
 
double summ_perv_pol(const double *mas,int n)
{
    double sum=0;
    for(int i=0; i<(n/2); i++)
    {
        sum +=mas[i];
    }
return sum;
}
 
double summ_otr_element(const double *mas,int n)
{   double sum_otr = 0;
    int i1=0;
    int i2=0;
    
    for(int i=0;i<n;i++)
        if (mas[i]<0)
        {
            i1=i+1;
            break;
        }
    for(int i=n-1;i>=0;i--)
        if (mas[i]<0)
        {
            i2=i-1;
            break;
        }
    for(int i=i1;i<=i2;i++)
    {
        sum_otr += mas[i];
    }
     
return sum_otr;
}
 
void mass_zip(double *mas,int n)
{   
    int temp = n;
     for(int i=0;i<temp;i++)
         if (abs(mas[i]) < 1 )
         {
             for (int j = i; j < temp - 1; j++)
              mas[j] = mas[j+1];
              mas[temp] = 0;
            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
30
31
32
main.cpp
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "leha.h"
using namespace std;
 
int main()
{   const int n=6;
    double sum;
    double sum_otr;
    double mas[n]={1.6,0,-3.3,-0.5,5,-3}; 
    printf("Ishod:\n"); 
    for (int i = 0; i < n; i++) 
    {
        printf("%d ",mas[i]);
    }
    
    sum = summ_perv_pol(mas,n);
    printf("\n\nSumma pervoi polovinu: %d",sum);
    
    sum_otr = summ_otr_element(mas,n);
    printf("\n\nSumma megdy otrizatel elementamy: %d",sum_otr);
 
    mass_zip(mas,n);
    for(int i=0;i<n;i++)
    printf("\n\nSumma megdy otrizatel elementamy: %d",mas[i]);
 
    _getch();
    return 0;
}
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:51  [ТС]     Удаления из массива элементов меньше одного #18
Ой, нашел ошибку=)
Вот результат выдает:
(В чем может быть ошибка?)
Миниатюры
Удаления из массива элементов меньше одного  
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.02.2012, 13:10     Удаления из массива элементов меньше одного #19
leha-demi, тебе уже дали рабочий вариант от Toshkarik.
единственное если у него встретится 0, то вывод обрезается на 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
36
37
template<typename T>T* module_sort(T* mass, int size)
{
 
    T* tmp = mass;
    int lent = size;
    int count = size-1;
    T* Zero =0;
    while(--lent)
    {
        if(*tmp==0)
        {
            int val = lent;
            T* t2 = tmp;
            while(*(t2)==0&&val>0){
                ++t2;--val;}
 
            *tmp = *t2;
            *t2 = 0;
        }
 
        if(abs(*tmp)<1)
        {
 
            while(abs(*tmp)<1&&*tmp!=0)
            {
            *tmp=*(tmp+(count));
            *(tmp+(count)) = 0;
          --count; 
        
            }           
        }
        if(count>0)
        --count;
        ++tmp;
    }
    return mass;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2012, 13:34     Удаления из массива элементов меньше одного
Еще ссылки по теме:

C++ Найти количество элементов массива, каждый из которых меньше по значению, чем среднее среди элементов
C++ Найти количество элементов массива, каждый из которых меньше по значению чем среднее среди элементов
Определить количество элементов массива, которые меньше предыдущего и меньше последующего C++
C++ Сформировать массив из положительных элементов одного массива и отрицательных элементов другого
Сформировать массив из положительных элементов одного массива и отрицательных элементов другого C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,383
Завершенные тесты: 1
25.02.2012, 13:34     Удаления из массива элементов меньше одного #20
Да нет, у меня вроде ничего не урезается, единственное заметил, что последняя цифра дублируется. Это из за смещения на 1 >< Можно или tmpSize инициализировать как
C++
1
tmpSize = size - 1;
или просто поменять постинкремент на преинкремент вот тут
C++
1
a[ tmpSize-- ] = 0;
C++
1
a[ --tmpSize ] = 0;
Добавлено через 6 минут
В printf указан у вас целочисленный тип, когда выводите с точкой. Поменяйте %d на %f
Yandex
Объявления
25.02.2012, 13:34     Удаления из массива элементов меньше одного
Ответ Создать тему
Опции темы

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