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

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

Войти
Регистрация
Восстановить пароль
 
Барбос
0 / 0 / 0
Регистрация: 10.08.2014
Сообщений: 5
#1

STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки - C++

25.08.2014, 17:33. Просмотров 725. Ответов 1
Метки нет (Все метки)

Создать массив длины N (число N вводится с клавиатуры). Заполнить массив рандомно. Найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки (за идентификатор цепочки взять индекс первого её элемента). Для найденных чисел:
1) Определить количество найденных элементов
2) Найти все числа, которые больше А или меньше В (числа А и В вводятся с клавиатуры)
3) Найти и удалить число М (число М вводится с клавиатуры)
4) Найти число Р (вводится с клавиатуры) и вывести его соседей.
На заметку: Для выполнения пунктов (1)-(4) воспользоваться стандартными функциями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2014, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки (C++):

Поиск самой длинной цепочки из подряд идущих одинаковых элементов в массиве - C++
Помогите пожалуйста решить программу. Если можно как можно проще используя только циклы, ветвления , массивы и переменные. Сам не...

Найти суммы каждой пары подряд идущих чисел - C++
Люди, срочно нужно написать програмку. Завтра сдавать. Дана последовательность натуральных чисел. Найти суммы каждой пары подряд идущих...

Удалить из каждой группы подряд идущих цифр все начальные незначащие нули - C++
Всем доброго дня) я хз как делать эту задачу..помогите плиз..На Borland C for dos.

Алгоритмы STL. Дана последовательность целых чисел. Удалить из массива все максимальные элементы - C++
Дана последовательность целых чисел.Удалить из массива все максимальные элементы. Использовать Алгоритмы STL. Помогите доработать) ...

Вывести все комбинации из трех чисел идущих подряд - C++
здравствуйте подскажите в чем ошибка вот задача Дан вектор {0, 1, 3, 3, 6, 10, 12, 13, 15, 50}. Вывести все комбинации из трех...

Рекурсия: удалить из списка (цепочки) L все вхождения элемента Е - C++
Описать рекурсивную функцию, которая удаляет из списка (цепочки) L все вхождения элемента Е.

1
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
25.08.2014, 22:22 #2
Писал-писал, да не дописал. Тем более, что не уверен, что правильно понял некоторые пункты.
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
/*
Создать массив длины N (число N вводится с клавиатуры). Заполнить массив рандомно.
Найти все максимальные цепочки подряд идущих положительных чисел с указанием длины
каждой цепочки (за идентификатор цепочки взять индекс первого её элемента).
Для найденных чисел:
1)  Определить количество найденных элементов
2)  Найти все числа, которые больше А или меньше В (числа А и В вводятся с клавиатуры)
3)  Найти и удалить число М (число М вводится с клавиатуры)
4)  Найти число Р (вводится с клавиатуры) и вывести его соседей.
На заметку: Для выполнения пунктов (1)-(4) воспользоваться стандартными функциями.
*/
 
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <ctime>
 
int get_random(void) { return (rand() % 21) - 10; } // -10..10
 
struct positive_chain
{
    int * chain_begin;
    int size;
};
 
int set_and_show_positive_chains(int * const begin_arr, int * const end_arr, positive_chain * chains);
void find_greater_A_or_less_B_numbers(
    const positive_chain * const chains_begin,
    const positive_chain * const chains_end,
    const int A, const int B);
void del_from_all_chains(positive_chain * const begin, positive_chain * const end, const int M);
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    int N = 0;
    std::cout << "Введите количество элементов массива: N = ";
    std::cin >> N;
    std::cout << '\n';
 
    int * arr = new int[N];
    std::generate(arr, arr + N, get_random);
 
    std::cout << "Исходный массив: ";
    std::copy(arr, arr + N, std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n\n";
 
    positive_chain * chains = new positive_chain[N];
    int chains_count = set_and_show_positive_chains(arr, arr + N, chains);
    
    int A, B;
    std::cout << "Введите границы A и B: " << '\n';
    std::cout << "A = "; std::cin >> A;
    std::cout << "B = "; std::cin >> B;
    std::cout << '\n';
    find_greater_A_or_less_B_numbers(chains, chains + chains_count, A, B);
    std::cout << '\n';
 
    int M;
    std::cout << "Введите число для удаления: M = ";
    std::cin >> M;
    del_from_all_chains(chains, chains + chains_count, M);
    std::cout << "Изменённые цепочки положительных чисел: " << '\n';
    std::cout << "Цепочка" << "\t\t\t" << "всего чисел\n";
    std::copy(chains, chains + chains_count, std::ostream_iterator<positive_chain>(std::cout, "\n"));
    std::cout << '\n';
 
    int P;
    std::cout << "Введите число для поиска его соседей: P = ";
    std::cin >> P;
 
    delete [] arr;
    system("pause");
    return 0;
}
 
template <class ostream>
ostream & operator<<(ostream & out, const positive_chain & chain)
{
    std::copy(chain.chain_begin, chain.chain_begin + chain.size, std::ostream_iterator<int>(out, " "));
    out << "\t\t\t\t" << chain.size;
    return out;
}
 
int set_and_show_positive_chains(int * const begin_arr, int * const end_arr, positive_chain * chains)
{
    int * b = begin_arr;
    int chains_count = 0;
    while (b != end_arr)
    {
        b = std::find_if(b, end_arr, std::bind2nd(std::greater<int>(), 0));
        if (b != end_arr)
        {
            chains[chains_count].chain_begin = b;
            b = std::find_if(b, end_arr, std::not1(std::bind2nd(std::greater<int>(), 0)));
            chains[chains_count].size = std::distance(chains[chains_count].chain_begin, b);
            ++chains_count;
        }
    }
 
    std::cout << "Цепочки положительных чисел: " << '\n';
    std::cout << "Цепочка" << "\t\t\t" << "всего чисел\n";
    std::copy(chains, chains + chains_count, std::ostream_iterator<positive_chain>(std::cout, "\n"));
    std::cout << '\n';
    return chains_count;
}
 
template <class condition>
struct show_if_condition_t
{
    show_if_condition_t(condition C) : cond(C) {}
    void operator()(const positive_chain & chain)
    {
        for (int * i = chain.chain_begin; i != chain.chain_begin + chain.size; ++i)
        {
            if (cond(*i))
                std::cout << *i << " ";
        }
    }
private:
    condition cond;
};
 
template <class condition>
show_if_condition_t<condition> show_if_condition(condition C)
{
    return show_if_condition_t<condition>(C);
}
 
void find_greater_A_or_less_B_numbers(
    const positive_chain * const chains_begin,
    const positive_chain * const chains_end,
    const int A, const int B)
{
    std::cout << "Числа, большие A: ";
    std::for_each(chains_begin, chains_end, show_if_condition(std::bind2nd(std::greater<int>(), A)));
    std::cout << '\n';
    std::cout << "Числа, меньшие B: ";
    std::for_each(chains_begin, chains_end, show_if_condition(std::bind2nd(std::less<int>(), B)));
    std::cout << '\n';
}
 
void del_from_chain(positive_chain & chain, const int M)
{
    int * new_end = std::partition(chain.chain_begin, chain.chain_begin + chain.size,
        std::bind2nd(std::not_equal_to<int>(), M));
    chain.size = std::distance(chain.chain_begin, new_end);
}
 
void del_from_all_chains(positive_chain * const begin, positive_chain * const end, const int M)
{
    for (positive_chain * i = begin; i != end; ++i)
    {
        del_from_chain(*i, M);
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 22:22
Привет! Вот еще темы с ответами:

Из цепочки чисел удалить числа кратные заданному числу - C++
Добрый день! Помогите пожалуйста с программой. Программа с динамическим массивом. Вводится цепочка чисел. Из этой цепочки нужно...

Найти в последовательности чисел два подряд идущих нуля - C++
Дана последовательность из n чисел найти в ней кол-во 2 подряд идущих 0 Нужно сделать блок схему

Найти максимальное количество простых чисел, идущих подряд - C++
В последовательности целых чисел найти максимальное количество простых чисел, идущих подряд (программа должна содержать логическую функцию,...

Для каждых k подряд идущих чисел найти минимум - C++
Дано n чисел. Для каждых k подряд идущих чисел найти минимальное среди них. Вся соль задачи в том, что 1 ≤ n ≤ 150000, 1 ≤ k ≤ 10000, k ≤...


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

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

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