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

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

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

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

24.02.2012, 23:29. Просмотров 1011. Ответов 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++
В целочисленном,одномерном массиве определить кол-во элементов, которые меньше предыдущего и меньше последующего

Переписать из одного массива в другой все элементы, значения которых больше -1.8 и меньше 2.7 - C++
Сформировать вещественный массив A,элементами которого являются случайные числа из диапазона .Переслать из него в массив A2 все элементы ,...

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

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

Вычислить Среднее арифм. значение элементов массива и число пар элементов которых сосед слева (т.е. индекс которого на 1 меньше) больше по величине - C++
Разработать функцию, обрабатывающую массив и вычисляющую две величины. Кроме того, разработать две функции, которые вычисляют те же самые...

Написать функцию удаления из заданного массива отрицательных элементов - C++
Написать функцию удаления из заданного массива отрицательных элементов, использовать ее для массива целых и вещественных чисел.

Найти количество элементов массива, меньше 50 - C++
дан двумерный массив целых чисел .Определить 1) сумму чётных элементов 2)количество элементов массива , меньше 50 3)среднее...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 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
Фрилансер
Эксперт С++
5837 / 1218 / 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++
3586 / 1366 / 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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
25.02.2012, 11:27     Удаления из массива элементов меньше одного #14
Прям как сговорились В соседней теме такая же проблема, вы передаете указатель на константные данные, и хотите их модифицировать
leha-demi
0 / 0 / 0
Регистрация: 06.11.2010
Сообщений: 125
25.02.2012, 11:30  [ТС]     Удаления из массива элементов меньше одного #15
Понятно, а можно как то разименовать, или же только использовать динамическую?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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     Удаления из массива элементов меньше одного
Еще ссылки по теме:

Из массива A удалить те цепочки нечетных элементов, в которых нет ни одного элемента из массива B - C++
Пожалуйста помогите! Из массива A удалить те цепочки нечетных элементов, в которых нет ни одного элемента из массива B. Пример: ...

Сформировать массив из положительных элементов одного массива и отрицательных элементов другого - C++
Даны массив А и массив В, в каждом по 10 элементов. Сформировать новый массив, состоящий из положительных элементов массива А и...

Сформировать массив из положительных элементов одного массива и отрицательных элементов другого - C++
Даны массив А и массив В, в каждом по 10 элементов. Сформировать новый массив, состоящий из положительных элементов массива А и...

Найти сумму элементов массива, превышающих -10 и меньше 10 - C++
в одномерном массиве состоящем из N целых элементов найти сумму превышающих -10 и меньше 10

Число элементов массива, не больше максимального, но и не меньше минимального - C++
Число элементов массива Х,которые не превосходят максимального элемента масива Y,и в тоже время не меньше его минимального элемента.


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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     Удаления из массива элементов меньше одного
Ответ Создать тему
Опции темы

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