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

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

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

Найти суммы каждой пары подряд идущих чисел C++
удалить из каждой группы идущих подряд цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка) C++
C++ Удалить из каждой группы подряд идущих цифр все начальные незначащие нули
Найти максимальное количество простых чисел, идущих подряд C++
Алгоритмы STL. Дана последовательность целых чисел. Удалить из массива все максимальные элементы C++
C++ Найти в последовательности чисел два подряд идущих нуля
Для каждых k подряд идущих чисел найти минимум C++
Из цепочки чисел нужно удалить числа кратные трем C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.08.2014, 22:22     STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки #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);
    }
}
Yandex
Объявления
25.08.2014, 22:22     STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки
Ответ Создать тему
Опции темы

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