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

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

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

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

17.01.2012, 15:23. Просмотров 898. Ответов 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. Перед каждым положительным элемент массива вставить элемент с нулевым значением.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
18.01.2012, 01:35 #16
crazygor1, я же сказал, нужно написать функции, соответствующие заданиям. Под помощью на форуме подразумевается, что тот, кому помогают, хоть немного думает сам.
0
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 01:42  [ТС] #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;
}
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
18.01.2012, 01:46 #18
crazygor1, в С/С++ нельзя описывать одни функции внутри других. Вы должны отдельно описать эти функции, а в main'е просто вызывать их .Короче говоря, сделайте хоть что-то сами - наберите в гугле "функции с++".
0
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
18.01.2012, 01:50 #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 $
ЧЯДНТ?
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
18.01.2012, 01:54 #20
NoMasters, да-да, давненько уже на С не писал, забыл об этих тонких отличиях))
0
crazygor1
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 02:22  [ТС] #21
Всем большое спасибо за помощь! Вот готовый код программы:
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#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;
};
//перед 3м положительным
int task1()
{    
    // Создаём и заполняем вектор с клавиатуры (конец ввода - 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;   
}
//перед 4м отрицательным
int task2()
{
     // Создаём и заполняем вектор с клавиатуры (конец ввода - 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(), IsNthNegative<int, 4>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos, 0) + 2;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    return 0;
}
//после 3го положительного
int task3()
{
     // Создаём и заполняем вектор с клавиатуры (конец ввода - 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+1, 0) + 1;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    return 0;
}
//после 4го отрицательного
int task4()
{
     // Создаём и заполняем вектор с клавиатуры (конец ввода - 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(), IsNthNegative<int, 4>())) != vec.end())
        // вставляем 0 в найденную позицию, дальнейший поиск начинаем через две
        // позиции (пропускаем вставленный элемент и следующий, поскольку
        // следующий как раз является третьим, а нам надо начать отсыёт с
        // четвёртого)
        pos = vec.insert(pos+1, 0) + 1;
    
    // Выводим результирующий вектор
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "  "));
    return 0;
}
int main()
{
    int v;
    std::cout << "1- before 3rd positive"<< std::endl;
    std::cout << "2- before 4th positive"<< std::endl;
    std::cout << "3- ufter 3rd negative"<< std::endl;
    std::cout << "4- ufter 4th negative"<< std::endl;
    std::cout << "Enter number of task: "<< std::endl;
    std::cin >> v;
    switch (v)
    {
    case 1:
        task1();
        
        break;
    
    case 2:
        task2();
        
        break;
    
    case 3:
        task3();
    
        break;
    
    case 4:
        task4();
    
        break;
    
    default:
        std::cout << "Incorrect input!" << std::endl;
    
        break;
    }    
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 02:22
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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