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

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

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

Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки - C++

20.05.2013, 02:56. Просмотров 579. Ответов 13
Метки нет (Все метки)

вот задача

В одномерном массиве из n элементов вычислить:
1) сумму элементов с нечетными индексами
1) сумму элементов между первым и последним отрицательным элементами

ее нужно реализовать при помощи алгоритмов из библиотеки <algorithm>. первое, на чем я застопорилась, это какие алгоритмы здесь вообще можно применить? я не знаю, как решить эти задачи при помощи алгоритмов, про которые я прочитала... существуют ли алгоритмы для суммы элементов по определенному критерию?

с суммой между отрицательными еще как-то можно разобраться при помощи find_if, наверно.
вот начальный кусочек кода)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool find_negative(int val1)//Функция сравнения
{
    return val1<0;
}
int main()
{
    int a[5]={-1,2,-5,3,4};
    vector<int> array(a,a+5);
    cout<<*find_if(array.begin(),array.end(),find_negative);
    system("pause");
    return(0);
};
подскажите пожалуйста, а какие алгоритмы еще можно использовать?

Добавлено через 1 час 15 минут
и почему, если писать так, то не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<algorithm>
#include<vector>
#include <numeric>
using namespace std;
bool find_negative(int val1)
{
    return val1<0;
}
 
int main()
{
    int a[5]={-1,2,-5,3,4};
    vector<int> array(a,a+5);
    vector<int>::iterator fotr;
    vector<int>::reverse_iterator lotr;
     fotr=find_if(array.begin(),array.end(),find_negative);
     lotr=find_if(array.rbegin(),array.rend(),find_negative);
     cout<<accumulate(fotr,lotr,0);
            system("pause");
     return(0);
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2013, 02:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с одномерным массивом с использованием контейнерных классов и алгоритмов библиотеки (C++):

Работа с одномерным целочисленным массивом в функции - C++
Здравствуйте. Я написал несколько функций по работе с массивом. В dimentInt() я объявляю массив и передаю его в addNewElIDA, которая...

Работа с одномерным массивом (найти наиболее часто встречающееся число) - C++
Дан одномерный массив A, найти наиболее часто встречающееся число. Если таких чисел несколько, то определить наименьшее из них.

Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL - C++
Сортировка слов по количеству в них букв 'А'. Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL. Мне не...

Работа с одномерным массивом. Вывести индексы тех элементов, значение которых больше 5 - C++
Работа с одномерным массивом. Вывести индексы тех элементов, значение которых больше 5. Напишите пожалуйста программу. Спасибо)

Найти первый начальный и второй центральный момент случайной величины (работа с одномерным массивом) - C++
Найти , где (k=10) - заданный вектор и следует организовать ввод его элементов с клавиатуры.

Работа с массивом классов - C++
Доброго времени суток. Появилась такая проблема: в классе hypergraph находятся два массива классов с которыми необходимо выполнять...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
20.05.2013, 03:07 #2
1.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    int sum = 0;
    for (int i=1; i < v.isze(); i+=2)
        sum += v[i];
    std::cout << sum << std::endl;
}
Или здесь надо всенепременно поизвращаться с алгоритмом accumulate и передачей переменной из внешнего блока, отвечающей за индекс и инкрементирующейся при каждом обходе? Или for_each прилепить ненужный?
0
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:17  [ТС] #3
MrGluck, поизвращаться надо( смысл задания именно в этом. Так-то мы такие задачи еще в школе через обычные массивы решали, я знаю, как это делается без всяких библиотек. А accumulate - это единственное, что я нарыла для суммирования, но оно из другой библиотеки...
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
20.05.2013, 03:25 #4
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <numeric>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    std::vector<int>::iterator it1 = std::find_if(v.begin(), v.end(),
        [](const int x) { return x < 0; } );
    std::vector<int>::reverse_iterator it2 = std::find_if(v.rbegin(), v.rend(),
        [](const int x) { return x < 0; } );
    std::cout << std::accumulate(++it1, v.begin() + std::distance(++it2, v.rend()), 0);
}
Надо помнить, что нельзя пихать в один алгоритм iterator и reverse_iterator.

Добавлено через 3 минуты
1 задача с всенепременным применением алгоритма из хедера algorithm.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    std::vector<int> v = {-1, 2, -5, 3, 4};
    bool evenIndex = true;
    int sum = 0;
    std::for_each(v.begin(), v.end(), [&evenIndex, &sum](const int x)
        { if (!evenIndex) sum += x; evenIndex = !evenIndex; } );
    std::cout << sum << std::endl;
}
Можно еще copy за уши притянуть с копированием в поток ostream через итераторы.
1
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:47  [ТС] #5
Вау! Спасибо большое за помощь! Я думаю, этого будет достаточно) а не могли бы вы объяснить, что это за конструкция [ ](const int x) ?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
20.05.2013, 03:52 #6
migtymasha, лямбда-функция (из стандарта С++11)
0
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:07  [ТС] #7
MrGluck, а ваш код работал?

Добавлено через 26 минут
у меня компилятор ругается на синтаксис в лямбде-функции
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.05.2013, 14:09 #8
Цитата Сообщение от migtymasha Посмотреть сообщение
у меня компилятор ругается на синтаксис в лямбде-функции
Вероятно не поддерживает. Какой компилятор? Проверить код можно онлайн на ideone.com.
0
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:16  [ТС] #9
Tulosba, пишу в Visual Studio 2008
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
20.05.2013, 14:19 #10
migtymasha, ваш компилятор не поддерживает С++11 и соотв. лямбда-функций.

Пробуйте переписать через функторы, хотя я даже не знаю, как замыкания организовать, кроме как через глобальные переменные, что не есть хорошо. Если очень хочется - можно из буста взять л-функции.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.05.2013, 14:22 #11
Цитата Сообщение от migtymasha Посмотреть сообщение
пишу в Visual Studio 2008
Однозначно не поддерживает С++11. Даже VS2012 не в полном объеме поддерживает. Поэтому лямбды нужно заменить на обычные функции или функциональные объекты.

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
как замыкания организовать, кроме как через глобальные переменные, что не есть хорошо.
MrGluck, так можно же хранить состояние в функторе.
0
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 15:16  [ТС] #12
MrGluck, единственное, на что меня хватило
C++
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int su=0; bool evenIndex=true;
int sum(int val)
{
    
    if (!evenIndex)
    {
        su += val;
        evenIndex = !evenIndex;
    };
    return su;
};
это неправильно, конечно) ошибок не выдает, но в ответе какое-то 16-ричное число...

думаю, эту задачу я решу обычным методом, т.к. мозгов на большее не хватает, а зачет завтра( слава богу, у нас аспирант код не проверяет, для него главное - чтобы правильно считало)

и спасибо за помощь, сумму между отрицательными я нашла без лямбды-функции, но с вашими исправлениями в accumulate.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.05.2013, 16:01 #13
Насчет хранения состояния в функторе, имелось в виду следующее:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
class EvenAccumulator
{
public:
    EvenAccumulator( int& sum ) : sum(sum), even(true) { }
    void operator()(int value)
    {
        if( !even )
        {
            sum += value;
        }
        even = !even;
    }
private:
    bool even;
    int& sum;
};
 
int main()
{
    int a[5]={-1,2,-5,3,4};
    std::vector<int> v(a, a+5);
    int sum = 0;
    EvenAccumulator acc( sum );
    std::for_each( v.begin(), v.end(), acc );
    std::cout << sum << std::endl;
}
1
migtymasha
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 17:59  [ТС] #14
Tulosba, !!! работает! спасибо большое и вам, я даже поняла, что вы написали)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 17:59
Привет! Вот еще темы с ответами:

Работа с текстовыми файлами (с использованием классов) - C++
С использованием классовИмеется текстовый файл. Напечатать. а)его первую строчку. б)его пятую строчку. в)его первые пять строк. ...

Задача с одномерным массивом - C++
1)Сформировать одномерный массив целых чисел используя датчик случайных чисел. 2)Распечатать полученный массив 3)Удалить 5 первых...

Программа работы с одномерным динамическим массивом - C++
Помогите пожалуйста!!! //Реализовать функционал работы с одномерным динамическим массивом. // 1. Создание массива // 2. Заполниние...

Затруднения с одномерным массивом( максимальное значение) - C++
Здравствуйте! Нужно составить программу, которая вводит 10 целых элементов одномерного массива, находит максимальных элемент и выводит...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.05.2013, 17:59
Ответ Создать тему
Опции темы

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