0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
1

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

05.06.2016, 13:33. Показов 3779. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2016, 13:33
Ответы с готовыми решениями:

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

После каждого числа n, в котором число десятков меньше числа единиц, вставьте n
С клавиатуры вводится одномерный массив целых чисел: сначала вводится количество элементов в...

После каждого слова вставьте слово «Бум!» и выведите список на консоль в одну строку через пробел
Получается все, кроме последнего условия. хэлп%-) Задачка: Считывать с консоли слова, вводимые...

Вставить 1 после каждого четного отрицательного числа и 0 после каждого нечетного положительного исходного массива
нужно Вставить 1 после каждого четного отрицательного числа и 0 после каждого нечетного...

13
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
05.06.2016, 14:19  [ТС] 3
всё работает только я думаю это неправильный ответ, ведь в задании сказано ПОСЛЕ отрицательного элемента, а не ВМЕСТО
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
05.06.2016, 14:38  [ТС] 5
а как удалить из вектора все отрицательные числа, отличные от -20.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
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
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.06.2016, 14:47 8
Не от туда скопировал, см пред. сообщение.
1
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
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
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.06.2016, 14:58 10
Цитата Сообщение от blocker147 Посмотреть сообщение
и всё таки можно ли как то через
Если так уж хочется через цикл:
C++
1
vec.erase(vec.begin() + i);
Но вариант с remove_if - лучше
1
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
05.06.2016, 15:24  [ТС] 11
вопрос по поводу этой строки
C++
1
copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
её можно как то через цикл for оформить?
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
0 / 0 / 5
Регистрация: 14.12.2015
Сообщений: 186
05.06.2016, 15:42  [ТС] 13
В STL имеется алгоритм void reverse( Iterator _First, Iterator
_Last ), который можно применять к контейнерами с произвольным
доступом для изменения на обратный порядка следования его элеменов,
заключенных в интервале First … Last. Примените его для того, чтобы
реверсировать пять средних элементов вашего вектора.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2016, 15:49
Помогаю со студенческими работами здесь

Как переделать программу, чтобы после каждого отрицательного числа вставлять z, а не только после первого
const nmax=50; type T=array of integer; var a:T; i,n,k,z:integer; begin ReadLn...

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

Вставить 1 после каждого четного отрицательного числа
помогите с задачкой пожалуйста) Вставить 1 после каждого четного отрицательного числа и 0 после...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru