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

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

Восстановить пароль Регистрация
 
 
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 15:23     Вставляем 0 элемент #1
Доброго времени суток!
Помогите пожалуйста с решением задачи:
данн массив размера N, вставить 0:
1)перед каждым 3м положительным
2)после каждого 3го положительного
3)перед каждым 4м отрицательным
4)после каждого четвертого отрицательного
Заранее спасибо!

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

Строки. Как найти в слове первый элемент? Второй элемент, последний элемент? C++
Массивы. Заменить 3ий элемент в 1ой строке матрицы А на max элемент C++
C++ Создать новый массив, найти наименьший элемент 3-го столбца, поменять местами наименьший элемент 3-го столбца и элемент a23
Структура "Информация": - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить элемент перед элемент C++
C++ Определить максимальный по модулю элемент элемент массива и позицию в которой он расположен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.01.2012, 15:25     Вставляем 0 элемент #2
Цитата Сообщение от crazygor1 Посмотреть сообщение
Помогите хотяб с 1м,
а в чем именно проблема? Смещаешь все элементы, на место старого, где начал смещать пишешь 0. Примеров полно на форуме.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 16:16     Вставляем 0 элемент #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;
}
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:07  [ТС]     Вставляем 0 элемент #4
Можно коментов немного плиз
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 18:16     Вставляем 0 элемент #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;
}
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:23  [ТС]     Вставляем 0 элемент #6
а чему равен arg?
то есть для отрицательных просто сделать
if (T() > arg)
++m_counter;
?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 18:24     Вставляем 0 элемент #7
crazygor1, да, или
C++
1
if (arg < T())
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:31  [ТС]     Вставляем 0 элемент #8
При нажатии контрл+икс выдаёт ошибку
Машинный код" завершилась с кодом 0 (0x0).
Что это может быть?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.01.2012, 18:35     Вставляем 0 элемент #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
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 18:36     Вставляем 0 элемент #10
crazygor1, это не ошибка. Программа отработала прекрасно, ошибок нет. Запускайте программу из консоли, и всё будет прекрасно.
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:38  [ТС]     Вставляем 0 элемент #11
Что для Ctrl+Z то и Ctrl+X одна ошибка
у меня 10я студия
создал вин32 консоль всё правильно?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 18:40     Вставляем 0 элемент #12
crazygor1, запускайте программу по Ctrl+F5.

Добавлено через 1 минуту
retmas, кстати да, промахнулся))
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 23:40  [ТС]     Вставляем 0 элемент #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, "  "));
и тд.
Спасибо!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.01.2012, 23:51     Вставляем 0 элемент #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;
}
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 01:31  [ТС]     Вставляем 0 элемент #15
А если ошибка что идентификатор task1 не найден, их нужно обьявить?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.01.2012, 01:35     Вставляем 0 элемент #16
crazygor1, я же сказал, нужно написать функции, соответствующие заданиям. Под помощью на форуме подразумевается, что тот, кому помогают, хоть немного думает сам.
crazygor1
 Аватар для crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 01:42  [ТС]     Вставляем 0 элемент #17
Ну я вроде бы сделал как функции, что не так не пойму:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "stdafx.h"
#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>//перед каждым 3м положительным
{
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;
};
template<typename T, size_t N>
class IsNthNegative : public std::unary_function<T, bool>//перед каждым 4 отрицательным
{
public:
    // В конструкторе счётчик обнуляется
    IsNthNegative():
    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()
{
        int v;
 
    std::cout << "Enter number of task: ";
    std::cin >> v;
     // Создаём и заполняем вектор с клавиатуры (конец ввода - Ctrl+X)
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    // Первая позиция поиска - начальный элемент вектора
    std::vector<int>::iterator pos = vec.begin();
    switch (v)
    {
    case 1:
        task1(vec);
        {
    // До тех пор, пока не достигли конца вектора - продолжаем поиск по условию
    // и запоминаем найденную позицию
    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, "  "));
        }
        break;
    
    case 2:
        task2(vec);
        {
    // До тех пор, пока не достигли конца вектора - продолжаем поиск по условию
    // и запоминаем найденную позицию
    while ((pos = std::find_if(pos, vec.end(), IsNthNegative<int, 4>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos, 0) + 3;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
        }
        break;
    
    case 3:
        task3(vec);
    
        break;
    
    case 4:
        task4(vec);
    
        break;
    
    default:
        std::cout << "Incorrect input!" << std::endl;
    
        break;
    }
   
    
    
    
    return 0;
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.01.2012, 01:46     Вставляем 0 элемент #18
crazygor1, в С/С++ нельзя описывать одни функции внутри других. Вы должны отдельно описать эти функции, а в main'е просто вызывать их .Короче говоря, сделайте хоть что-то сами - наберите в гугле "функции с++".
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
18.01.2012, 01:50     Вставляем 0 элемент #19
silent_1991,
alex@mbook ~/abs/fifo $ cat vel.c
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(int argc, char ** argv){
        int some()
        {
                return 5;
        }
 
        printf("%d\n", some());
        return 0;
}
alex@mbook ~/abs/fifo $ gcc vel.c
alex@mbook ~/abs/fifo $ ./a.out
5
alex@mbook ~/abs/fifo $
ЧЯДНТ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 01:54     Вставляем 0 элемент
Еще ссылки по теме:

C++ Массивы: поменять местами минимальный по модулю элемент и максимальный отрицательный элемент
Вставляем текстуру через SFML C++
C++ Найти максимальный элемент и заменить им первый элемент строки в двумерном массиве

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
18.01.2012, 01:54     Вставляем 0 элемент #20
NoMasters, да-да, давненько уже на С не писал, забыл об этих тонких отличиях))
Yandex
Объявления
18.01.2012, 01:54     Вставляем 0 элемент
Ответ Создать тему
Опции темы

Текущее время: 09:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru