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

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

Войти
Регистрация
Восстановить пароль
 
 
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
#1

Вставляем 0 элемент - C++

17.01.2012, 15:23. Просмотров 918. Ответов 20
Метки нет (Все метки)

Доброго времени суток!
Помогите пожалуйста с решением задачи:
данн массив размера N, вставить 0:
1)перед каждым 3м положительным
2)после каждого 3го положительного
3)перед каждым 4м отрицательным
4)после каждого четвертого отрицательного
Заранее спасибо!

Добавлено через 2 часа 10 минут
Помогите хотяб с 1м, остальное я по аналогии сделаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2012, 15:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вставляем 0 элемент (C++):

Вывести содержимое списка в следующем порядке: первый элемент, последний элемент, второй элемент, предпоследни - C++
#include <iostream> #include <list> #include <iterator> void output(std::list<int> myList, std::list<int>::iterator iter1,...

Строки. Как найти в слове первый элемент? Второй элемент, последний элемент? - C++
как найти в слове первый элемент?Второй элемент,последний элемент.С помощью каких операторов это делается??

Структура "Информация": - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить элемент перед элемент - C++
Структура "Информация": - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить...

Создать новый массив, найти наименьший элемент 3-го столбца, поменять местами наименьший элемент 3-го столбца и элемент a23 - C++
1 Создать новый одномерный массив , каждый элемент которого равен среднему арифметическому элементов соответствующей строки данной матрицы....

Найти максимальный элемент и заменить им первый элемент строки в двумерном массиве - C++
В матрице X(4,5) в каждой строке найти максимальный элемент и заменить им первый элемент строки. Предварительно первый элемент строки...

Перед каждым положительным элемент массива вставить элемент с нулевым значением - C++
6)Дан массив размера N. Перед каждым положительным элемент массива вставить элемент с нулевым значением.

20
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.01.2012, 15:25 #2
Цитата Сообщение от crazygor1 Посмотреть сообщение
Помогите хотяб с 1м,
а в чем именно проблема? Смещаешь все элементы, на место старого, где начал смещать пишешь 0. Примеров полно на форуме.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 16:16 #3
1.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
template<typename T, size_t N>
class IsNthPositive : public std::unary_function<T, bool>
{
public:
    IsNthPositive():
    m_counter()
    {
    }
    
    bool operator()(const T& arg)
    {
        if (T() < arg)
            ++m_counter;
        
        if (m_counter == N)
        {
            m_counter = 0;
            
            return true;
        }
        
        return false;
    }
    
private:
    size_t m_counter;
};
 
int main()
{
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    
    std::vector<int>::iterator pos = vec.begin();
    
    while ((pos = std::find_if(pos, vec.end(), IsNthPositive<int, 3>())) != vec.end())
        pos = vec.insert(pos, 0) + 2;
    
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    
    return 0;
}
2
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:07  [ТС] #4
Можно коментов немного плиз
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 18:16 #5
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
// Функтор, срабатывающий на n-том положительном элементе
// Параметры шаблона:
// - T - тип проверяемых элементов
// - N - номер положительного элемента, на котором должен сработать функтор
template<typename T, size_t N>
// Должен наследоваться от std::unary_function
class IsNthPositive : public std::unary_function<T, bool>
{
public:
    // В конструкторе счётчик обнуляется
    IsNthPositive():
    m_counter()
    {
    }
    
    // Основной оператор, проверяющий условие
    bool operator()(const T& arg)
    {
        // Если передан положительный элемент - увеличиваем счётчик
        if (T() < arg)
            ++m_counter;
        
        // Если отсчитали нужное количество элементов - обнуляём счётчик и
        // возвращаем true
        if (m_counter == N)
        {
            m_counter = 0;
            
            return true;
        }
        
        // В противном случае (насчитано элементов меньше N) возвращаем false
        return false;
    }
    
private:
    // Счётчик элементов
    size_t m_counter;
};
 
int main()
{
    // Создаём и заполняем вектор с клавиатуры (конец ввода - Ctrl+X)
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    
    // Первая позиция поиска - начальный элемент вектора
    std::vector<int>::iterator pos = vec.begin();
    
    // До тех пор, пока не достигли конца вектора - продолжаем поиск по условию
    // и запоминаем найденную позицию
    while ((pos = std::find_if(pos, vec.end(), IsNthPositive<int, 3>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos, 0) + 2;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    
    return 0;
}
1
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:23  [ТС] #6
а чему равен arg?
то есть для отрицательных просто сделать
if (T() > arg)
++m_counter;
?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 18:24 #7
crazygor1, да, или
C++
1
if (arg < T())
1
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:31  [ТС] #8
При нажатии контрл+икс выдаёт ошибку
Машинный код" завершилась с кодом 0 (0x0).
Что это может быть?
0
retmas
Жарю без масла
863 / 745 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
17.01.2012, 18:35 #9
C++
1
std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
не для Ctrl+X, а для Ctrl+Z
т.к. EOF с консоли считывается при нажатии Ctrl+Z
а при нажатии Ctrl+X приложению посылается сигнал SIGINTR
1
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 18:36 #10
crazygor1, это не ошибка. Программа отработала прекрасно, ошибок нет. Запускайте программу из консоли, и всё будет прекрасно.
0
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:38  [ТС] #11
Что для Ctrl+Z то и Ctrl+X одна ошибка
у меня 10я студия
создал вин32 консоль всё правильно?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 18:40 #12
crazygor1, запускайте программу по Ctrl+F5.

Добавлено через 1 минуту
retmas, кстати да, промахнулся))
1
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 23:40  [ТС] #13
Ребят, а как сделать что бы я вводил допустим в начале 1, 2,3 или 4 и оно исполняло определенную функцию, например первая эта:
C++
1
2
3
4
5
6
7
8
9
10
11
// До тех пор, пока не достигли конца вектора - продолжаем поиск по условию
    // и запоминаем найденную позицию
    while ((pos = std::find_if(pos, vec.end(), IsNthPositive<int, 3>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos, 0) + 2;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
Вторая эта:
C++
1
2
3
4
5
6
7
8
9
10
11
// До тех пор, пока не достигли конца вектора - продолжаем поиск по условию
    // и запоминаем найденную позицию
    while ((pos = std::find_if(pos, vec.end(), IsNthPositive<int, 4>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos, 0) + 3;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
и тд.
Спасибо!
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
17.01.2012, 23:51 #14
crazygor1, пишете 4 функции, в каждой код в соответствии с заданием, каждая принимает заполненный вектор. В функции main после создания и заполнения вектора вставляете код вроде такого:

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
int v;
 
std::cout << "Enter number of task: ";
std::cin >> v;
 
switch (v)
{
case 1:
    task1(vec);
    
    break;
    
case 2:
    task2(vec);
    
    break;
    
case 3:
    task3(vec);
    
    break;
    
case 4:
    task4(vec);
    
    break;
    
default:
    std::cout << "Incorrect input!" << std::endl;
    
    break;
}
1
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 01:31  [ТС] #15
А если ошибка что идентификатор task1 не найден, их нужно обьявить?
0
18.01.2012, 01:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 01:31
Привет! Вот еще темы с ответами:

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

Из положительных элементов массива вычесть первый элемент, из остальных - второй элемент - C++
Дан массив L(7). Из положительных элементов вычесть первый элемент, из остальных - второй элемент. Вывести новый массив на печать.2 3 -4 ...

В списке целых чисел поменять местами max элемент и min элемент - C++
Помогите написать эту программу на С++.

Создать список, ввести элемент и добавить этот элемент в начало списка - C++
создать список,ввести элемент и добавить этот элемент в начало списка


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

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

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