Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
crazygor1
6 / 6 / 4
Регистрация: 06.02.2010
Сообщений: 131
1

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

17.01.2012, 15:23. Просмотров 975. Ответов 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
Ответы с готовыми решениями:

Вывести содержимое списка в следующем порядке: первый элемент, последний элемент, второй элемент, предпоследни
#include <iostream> #include <list> #include <iterator> void...

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

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

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

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

20
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
17.01.2012, 15:25 2
Цитата Сообщение от crazygor1 Посмотреть сообщение
Помогите хотяб с 1м,
а в чем именно проблема? Смещаешь все элементы, на место старого, где начал смещать пишешь 0. Примеров полно на форуме.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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 / 4
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:07  [ТС] 4
Можно коментов немного плиз
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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 / 4
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:23  [ТС] 6
а чему равен arg?
то есть для отрицательных просто сделать
if (T() > arg)
++m_counter;
?
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
17.01.2012, 18:24 7
crazygor1, да, или
C++
1
if (arg < T())
1
crazygor1
6 / 6 / 4
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:31  [ТС] 8
При нажатии контрл+икс выдаёт ошибку
Машинный код" завершилась с кодом 0 (0x0).
Что это может быть?
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
17.01.2012, 18:36 10
crazygor1, это не ошибка. Программа отработала прекрасно, ошибок нет. Запускайте программу из консоли, и всё будет прекрасно.
0
crazygor1
6 / 6 / 4
Регистрация: 06.02.2010
Сообщений: 131
17.01.2012, 18:38  [ТС] 11
Что для Ctrl+Z то и Ctrl+X одна ошибка
у меня 10я студия
создал вин32 консоль всё правильно?
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
17.01.2012, 18:40 12
crazygor1, запускайте программу по Ctrl+F5.

Добавлено через 1 минуту
retmas, кстати да, промахнулся))
1
crazygor1
6 / 6 / 4
Регистрация: 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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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 / 4
Регистрация: 06.02.2010
Сообщений: 131
18.01.2012, 01:31  [ТС] 15
А если ошибка что идентификатор task1 не найден, их нужно обьявить?
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
18.01.2012, 01:35 16
crazygor1, я же сказал, нужно написать функции, соответствующие заданиям. Под помощью на форуме подразумевается, что тот, кому помогают, хоть немного думает сам.
0
crazygor1
6 / 6 / 4
Регистрация: 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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
18.01.2012, 01:46 18
crazygor1, в С/С++ нельзя описывать одни функции внутри других. Вы должны отдельно описать эти функции, а в main'е просто вызывать их .Короче говоря, сделайте хоть что-то сами - наберите в гугле "функции с++".
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
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
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
18.01.2012, 01:54 20
NoMasters, да-да, давненько уже на С не писал, забыл об этих тонких отличиях))
0
18.01.2012, 01:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 01:54

Массивы. Заменить 3ий элемент в 1ой строке матрицы А на max элемент
Помогите пож Матрица А цифры любые заменить 3ий элемент в 1ой строке...

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

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


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

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

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