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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Вывод переменных типа char: правильно выводится только первый символ http://www.cyberforum.ru/cpp-beginners/thread1247025.html
Всем привет. Извиняюсь, если вопрос слишком уж нелепый, но не могу понять в чем суть... #include <cstdio> int main() { char a,b,c; printf("Enter smth: "); scanf("%c,%c,%c", &a, &b, &c);
C++ Системная ошибка при использовании dll Здравствуйте. MFC-приложение. Есть функция заполнения CListBox. void CGUIAppDlg::InputListBox(CString& EditField, CListBox& MainListBox) { UpdateData(TRUE); if (EditField.IsEmpty()) { MessageBox(L"Выберите директорию",L"Сообщение", MB_OK | MB_ICONINFORMATION ); return; } http://www.cyberforum.ru/cpp-beginners/thread1247022.html
Прошел книгу Шилтда, что делать дальше? C++
Прошел книгу Шилтда, C++: Begginers Guide. Могу ли я перейти быстро на С# и писать на unity? Стоит ли мне все все все бросить и читать книги Шилтда дальше? Что паралельно совмещать? Что вообще делать после прочтения книги? Буду очень признателен тем, кто не ответят в все в одной строке. Заранее спасибо, товарищи!
Дана таблица с булевыми выражениями, некоторые элементы которой утеряны. Требуется восстановить таблицу C++
Пожалуйста, помогите решить задачу: Буль Имя входного файла: bool.in Имя выходного файла: bool.out Ограничение по времени: 2 секунды Ограничение по памяти: 64 мегабайта Булевыми числами называются такие числа, которые могут принимать два значения: True (Правда) и False (Ложь). Булевыми операциями называются операции
C++ Сокеты: после вызова send программа зависает на функции recv http://www.cyberforum.ru/cpp-beginners/thread1247001.html
Извеняюсь за такое назание темы, но уже перепробовал 100 вариантов и постоянно выкидывает данное предупреждение, уже и не знаю что блин написать)) Проблема в следующем: Изучаю сокеты и столкнулся с небольшой проблемой, в данном коде я соеденяюсь с локкал хостом на порту 2222 дабы , и прописую данный порт в прокси в браузере, дабы отлавливать его заголовки, проблема в следующем, 1) после...
C++ Запуск командной строки VS из конкретного каталога Подскажите плиз, как запустить командную строку Visual Studio Command Promt (vsvars32.bat) из необходимого каталога, так как надоело постоянно использовать инструкцию cd.. для возврата из корневого каталога этого bat-файла. Я так понимаю, надо создать bat.файл и как-то указать путь, но все мои попытки завершились безуспешно. подробнее

Показать сообщение отдельно
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
25.08.2014, 22:22     STL: найти все максимальные цепочки подряд идущих положительных чисел с указанием длины каждой цепочки
Писал-писал, да не дописал. Тем более, что не уверен, что правильно понял некоторые пункты.
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);
    }
}
 
Текущее время: 17:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru