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

Из числовой последовательности найти удалить элементы - C++

Восстановить пароль Регистрация
 
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
15.11.2012, 16:58     Из числовой последовательности найти удалить элементы #1
Вот такая ситуация... Дани лабораторную, решил её через индексы (нужно использовать STL Deque), прапад дал на защиту туже работу, толкьо написать на итераторах, не получается написать функцию удаления... Помогите плиз =)
Вот задача:
Из числовой последовательности найти удалить все элементы, меньшие, чем B*X, где X – среднее арифметическое трех наибольших элементов последовательности, B – задаваемый пользователем коэффициент.
Вот мой код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <deque>
#include <conio.h>
#include <stdio.h>
#include <clocale>
#include <LIMITS.H>
using namespace std;
 
int main ()
{
    setlocale(LC_ALL,"rus");
    deque <int> a;
    deque <int>::iterator iter;
    int X=0, b;
    int max1, max2, max3;
    int size;
    int n;
    FILE *in;
    puts(" Считывание данных из файла.");
    if((in=fopen("input.txt","r"))==NULL)
    {
        puts(" Не удалось открыть файл");
        getch();
        return 0;
    }
    fscanf(in,"%d",&size);
    printf(" Размер дека : %d\n", size);
    for(int i=0; i<size ; i++)
    {
        fscanf(in, "%d", &n);
        a.push_back(n);
    }
    printf(" Исходный дек: ");
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        printf(" %d ", *iter);
    }
    max1=INT_MIN;;
    max2=INT_MIN;
    max3=INT_MIN;
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        if(*iter>max1)
        {
            max1=*iter;
        }
    }
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        if(*iter<max1 && *iter>max2)
            {
                max2=*iter;
            }
    }
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        if(*iter<max1 && *iter<max2 && *iter>max3)
        {
            max3=*iter;
        }
    }
    printf("\n Первый максимальный эллемент = %d\n Второй максимальный эллемент = %d\n Третий максимальный эллемент = %d\n ", max1, max2, max3);
    X=(max1+max2+max3)/3;
    printf("Среднее арифметическое = %d", X);
    printf("\n Введите b = ");
    scanf("%d", &b);э
             //Здесь начинается удаление
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        if(*iter<(b*X))
        {
            //Здесь надо как то удалять через функцию erase, как именно?
        }
    }
            // Сдесь удаление закончилось
    if(a.empty())
    {
        printf(" Весь дек удален! ");
    }
    printf(" Оставшиеся эллементы: ");
    for(iter = a.begin(); iter != a.end(); ++iter)
    {
        printf(" %d ", *iter);
    }
    getch ();
}
Функция удаления с индексами у меня выглядела так:
C++
1
2
3
4
5
6
7
8
for(int i=0; i<a.size();i++)
    {
        if(a[i]<(b*X))
        {
            a.erase(a.begin()+i);
            i--;
        }
    }
Помогите пожалуйста...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 16:58     Из числовой последовательности найти удалить элементы
Посмотрите здесь:

C++ Вывести элементы числовой последовательности и их количество
C++ Минимум и максимум числовой последовательности
C++ Найти и удалить в списке элементы, равные сумме своих соседей.
Обработка числовой последовательности C++
Найти строки и столбцы матрицы, элементы которых образуют неубывающие последовательности C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 17:28     Из числовой последовательности найти удалить элементы #2
C++
1
2
3
4
5
    std::array<int, 6> adata = {{4, 5, 6, 4, 7, 4}};
    std::vector<int> vdata(adata.cbegin(), adata.cend());
    
    auto it = std::remove(vdata.begin(), vdata.end(), 4);
    vdata.erase(it, vdata.end());
или так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    std::array<int, 6> adata = {{4, 5, 6, 4, 7, 4}};
    std::vector<int> vdata(adata.cbegin(), adata.cend());
    
    for(auto it = vdata.begin(); it != vdata.end(); )
    {
        if(*it == 4)
        {
            it = vdata.erase(it);
        }
        else
        {
            ++it;
        }
    }
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
15.11.2012, 17:31  [ТС]     Из числовой последовательности найти удалить элементы #3
Спасибо I.M.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
15.11.2012, 18:20     Из числовой последовательности найти удалить элементы #4
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <deque>
#include <algorithm>
#include <iterator>
 
// генератор случайных целых чисел
class RandomIntegerGenerator {
 private:
  int min, max;
 public:
  RandomIntegerGenerator(int min, int max) : min(min), max(max) {}
  int operator()() { return rand() % (max - min) + min; }
};
 
// вывод deque в поток
template <class T>
std::ostream &operator<<(std::ostream &stream, const std::deque<T> &deque) {
  for (typename std::deque<T>::const_iterator i = deque.begin(); i != deque.end(); ++i)
    stream << *i << ((i < deque.end() - 1) ? ", " : "");
  return stream;
}
 
// возвращает среднее арифметическое значений
template<class InputIterator>
double getAverage ( InputIterator first, InputIterator last) {
  double result;
  int counter = 0;
  while (first!=last) {
    result += *first++;
    ++counter;
  }
  return result / counter;
}
 
int main(int argc, char *argv[]) {
  setlocale(LC_ALL,"rus");
  srand(time(0));
  
  // коэфициент
  double rate = 0.5;
 
  // исходный набор данных  
  std::deque<int> deque;
  // случайное заполнение
  std::generate_n(inserter(deque, deque.begin()), 10, RandomIntegerGenerator(0, 10));
 
  // отсортированый набор данных
  std::deque<int> sortedDeque(deque);
  // сортировка
  std::sort(sortedDeque.begin(), sortedDeque.end());
  
  // среднее значение трех самых больших величин
  double average = getAverage(sortedDeque.end() - 3, sortedDeque.end());
 
  // результирующая последовательность
  std::deque<int> result(deque);
 
  // элементы меньше этого значения будут удалены
  double threshold = rate * average;
 
  // удаление элементов
  result.erase(
    std::remove_if(result.begin(), result.end(), std::bind2nd(std::less<double>(), threshold)),
    result.end()
  );
  
  std::cout << "Исходная последовательность: " << deque << std::endl;
  std::cout << "Значения меньше этого будут удалены: " << threshold << std::endl;
  std::cout << "Результат: " << result << std::endl;
  
  std::cin.get();
  return EXIT_SUCCESS;
}
Yandex
Объявления
15.11.2012, 18:20     Из числовой последовательности найти удалить элементы
Ответ Создать тему
Опции темы

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