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

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

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

После каждого отрицательного числа вставьте в вектор отрицательное число -20 и выведите содержимое вектора - C++

05.06.2016, 13:33. Просмотров 344. Ответов 13
Метки нет (Все метки)

После каждого отрицательного числа вставьте в вектор отрицательное число
-20 и выведите содержимое вектора на экран

не пойму как сделать, если я делаю следующее число -20, то у меня всё время будет выполнятся условие vec[i]<0 и соответственно выводится -20.
C++
1
2
3
4
5
6
for (int i = 0; i < vec.size(); i++){
    if (vec[i] < 0){
        vec[i + 1] = -20;
}
    cout << "[" << i << "]" << vec[i] << endl;
}cout << endl;
Как выполнить данное задание? Есть идея оформить ещё один цикл for, но всё равно не представляю как сделать
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2016, 13:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос После каждого отрицательного числа вставьте в вектор отрицательное число -20 и выведите содержимое вектора (C++):

Умножить каждое число на первое отрицательное число. Добавив к каждому числу половину последнего отрицательного числа - C++
Здравствуйте! подскажите как реализовать на си++ &quot;Умножить каждое число на первое отрицательное число. Добавив к каждому числу половину...

Найти отрицательное число и после отрицательное число заменить все элемент на нули - C++
Найти отрицательное число и после отрицательное число заменить все элемент на нули

В матрицу после первого отрицательного элемента каждого столбца вставить число - C++
Ребята помогите решить задачку на С++. В массив А(N,М) после первого отрицательного элемента каждого столбца вставить число, ...

После каждого положительного числа файла F1 вставить 0, а каждое отрицательное заменить на его модуль - C++
Добрый день, помогите пожалуйста!!! Заполнить случайными целыми числами файл F1(предусмотреть и отрицательные элементы). Сформировать...

Создать список, после каждого отрицательного числа вставить в список 0 - C++
задание такое, создать список, после каждого отрицательного числа вставить в список 0. я кое-что тут пытался делать: #include...

Вставьте в массив после каждого столбца из положительных элементов столбец из 0 - C++
Вставьте в массив A(n,m) после каждого столбца из положительных элементов столбец из 0. #include &lt;iostream&gt; #include &quot;stdafx.h&quot; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 14:08 #2
Цитата Сообщение от blocker147 Посмотреть сообщение
вставьте в вектор
А не присвойте значение -20 следующему элементу. Т.е. используйте vec.insert()
А, чтобы не учитывать вставленное число, инкрементируйте i. Итого
C++
1
2
3
4
if (vec[i] < 0) {
    i++;
    vec.insert(vec.begin() + i, -20);
}
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 14:19  [ТС] #3
всё работает только я думаю это неправильный ответ, ведь в задании сказано ПОСЛЕ отрицательного элемента, а не ВМЕСТО
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 14:24 #4
Цитата Сообщение от blocker147 Посмотреть сообщение
только я думаю это неправильный ответ
Где неправильный ответ?

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
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <iterator>
int main()
{
    const size_t SIZE = 10;
    std::vector<int> vec(SIZE);
    std::default_random_engine re(std::random_device().operator()());
    std::uniform_int_distribution<> ud(-10, 10);
    std::generate(vec.begin(), vec.end(), [&]() { return ud(re); });
 
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
 
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] < 0) {
            i++;
            vec.insert(vec.begin() + i, -20);
        }
    }
 
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 14:38  [ТС] #5
а как удалить из вектора все отрицательные числа, отличные от -20.
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 14:42 #6
blocker147,
C++
1
        vec.erase(std::remove_if(vec.begin(), vec.end(), [](auto l) {return l < 0 && l!=-20; }), vec.end());
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 14:44  [ТС] #7
а есть вариант как это сделать через
C++
1
vec.erase();
?
и ещё не пойму почему у меня не хочет выводить элементы вектора:
C++
1
2
3
4
5
6
7
8
9
vector <int> vec;
    for (int i = 1; i <= 10; i++){//какая то ошибка в добавлении элементов в вектор
    vec[i] = rand() % 31 - 15;
    vec.push_back(i);
}
 
for (int i = 0; i < vec.size(); i++){
        cout << "[" << i << "]" << vec.at(i) << endl;
    }
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 14:47 #8
Не от туда скопировал, см пред. сообщение.
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 14:52  [ТС] #9
вот так сработало
C++
1
vec.push_back(rand() % 31 - 15);
и всё таки можно ли как то через
C++
1
2
3
if (vec[i] != -20){
vec.erase();
}
удалить?
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 14:58 #10
Цитата Сообщение от blocker147 Посмотреть сообщение
и всё таки можно ли как то через
Если так уж хочется через цикл:
C++
1
vec.erase(vec.begin() + i);
Но вариант с remove_if - лучше
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 15:24  [ТС] #11
вопрос по поводу этой строки
C++
1
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
её можно как то через цикл for оформить?
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 15:31 #12
Цитата Сообщение от blocker147 Посмотреть сообщение
её можно как то через цикл for оформить?
Можно по-разному (for(auto i:vec), for(auto it=vec.begin(); it!=vec.end(); it++)). По аналогии с вашими циклами:

C++
1
2
for(int i=0; i<vec.size(); i++)
    std::cout << vec[i] << " ";
1
blocker147
0 / 0 / 1
Регистрация: 14.12.2015
Сообщений: 160
05.06.2016, 15:42  [ТС] #13
В STL имеется алгоритм void reverse( Iterator _First, Iterator
_Last ), который можно применять к контейнерами с произвольным
доступом для изменения на обратный порядка следования его элеменов,
заключенных в интервале First … Last. Примените его для того, чтобы
реверсировать пять средних элементов вашего вектора.
0
avgoor
909 / 544 / 118
Регистрация: 05.12.2015
Сообщений: 1,508
05.06.2016, 15:49 #14
blocker147, Ну так примените.
C++
1
2
auto it = vec.begin() + vec.size()/2 - 2;
std::reverse(it, it + 5); // Не забудьте проверить, что в векторе есть 5 элементов
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2016, 15:49
Привет! Вот еще темы с ответами:

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

Для каждого числа последовательности вывести новое число, которое получится после записи цифр числа в обратном порядке - C++
Пожалуйста, напишите программы в С++ по функциям!). 29. Вводится последовательность из N целых чисел. Для каждого числа...

Добавить после каждого максимального числа число x - C++
Как написать программу, выполняющую следующие операции: 1) ввод одномерного массива из n целых чисел (1&lt;=n&lt;=100); 2) добавление...

Добавить после каждого отрицательного элемента его модуль - C++
С помощью векторов.


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

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

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