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

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

Войти
Регистрация
Восстановить пароль
 
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
#1

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

15.11.2012, 16:58. Просмотров 591. Ответов 3
Метки нет (Все метки)

Вот такая ситуация... Дани лабораторную, решил её через индексы (нужно использовать 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++
C++ Значение минимального положительного члена числовой последовательности заданной соотношением
C++ Найти минимальный элемент массива и удалить четные элементы
C++ Найти номера строк, элементы которых образуют симметричные последовательности
C++ В заданной последовательности удалить простые числа, расположив прочие элементы в порядке, обратном исходному
Найти среднее арифметическое тех элементов введенной числовой последовательности, номера которых кратны 3 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
2915 / 1344 / 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     Из числовой последовательности найти удалить элементы
Ответ Создать тему
Опции темы

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