Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11

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

20.05.2013, 02:56. Показов 1902. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2013, 02:56
Ответы с готовыми решениями:

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

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

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

13
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.05.2013, 03:07
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
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:17  [ТС]
MrGluck, поизвращаться надо( смысл задания именно в этом. Так-то мы такие задачи еще в школе через обычные массивы решали, я знаю, как это делается без всяких библиотек. А accumulate - это единственное, что я нарыла для суммирования, но оно из другой библиотеки...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.05.2013, 03:25
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
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 03:47  [ТС]
Вау! Спасибо большое за помощь! Я думаю, этого будет достаточно) а не могли бы вы объяснить, что это за конструкция [ ](const int x) ?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.05.2013, 03:52
migtymasha, лямбда-функция (из стандарта С++11)
0
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:07  [ТС]
MrGluck, а ваш код работал?

Добавлено через 26 минут
у меня компилятор ругается на синтаксис в лямбде-функции
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.05.2013, 14:09
Цитата Сообщение от migtymasha Посмотреть сообщение
у меня компилятор ругается на синтаксис в лямбде-функции
Вероятно не поддерживает. Какой компилятор? Проверить код можно онлайн на ideone.com.
0
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 14:16  [ТС]
Tulosba, пишу в Visual Studio 2008
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.05.2013, 14:19
migtymasha, ваш компилятор не поддерживает С++11 и соотв. лямбда-функций.

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

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
как замыкания организовать, кроме как через глобальные переменные, что не есть хорошо.
MrGluck, так можно же хранить состояние в функторе.
0
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 15:16  [ТС]
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.05.2013, 16:01
Насчет хранения состояния в функторе, имелось в виду следующее:
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
1 / 1 / 0
Регистрация: 13.05.2013
Сообщений: 11
20.05.2013, 17:59  [ТС]
Tulosba, !!! работает! спасибо большое и вам, я даже поняла, что вы написали)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2013, 17:59
Помогаю со студенческими работами здесь

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

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

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

Разработка и отладка алгоритмов и программ с использованием шаблонов классов и алгоритмов библиотеки STL
1. Создать объект-контейнер и заполнить его данными. 2. Просмотреть контейнер. 3. Изменить контейнер, удалив из него одни...

Работа с одномерным массивом
Паскаль. Задан одноименный массив X, содержащий N элементов Определить: А) Сумму всех положительных элементов массива Б) Максимальный...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru