Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

 

ЮФУ SMBU

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет, Университет МГУ-ППИ в Шэньчжэне), 1998–2024

 

PT for STL | Группы заданий | STL1Iter

PrevNext


Знакомство с итераторами и алгоритмами

Для всех исходных наборов данных вначале указывается их размер (т. е. количество элементов), а затем значения элементов.

Во всех заданиях группы STL1Iter обработка данных выполняется без использования контейнеров: исходные наборы считываются итератором чтения и сразу передаются требуемому алгоритму, а полученные результаты немедленно выводятся в файл или пересылаются задачнику с помощью соответствующего итератора записи.

Если алгоритм требует применения функционального объекта, то в случае компиляторов, поддерживающих стандарт C++11, следует использовать лямбда-выражения.

В большинстве ситуаций достаточно применять лямбда-выражения без захвата переменных или, если компилятор не поддерживает стандарт C++11, — обычные функции (см. указание к STL1Iter2). Более сложные задания требуют применения лямбда-выражений с захваченными внешними переменными или структур с дополнительными полями и операцией () (см. указания к STL1Iter8 и STL1Iter9).

STL1Iter1°. Дан набор целых чисел. Найти количество нулей в исходном наборе. Использовать итератор ptin_iterator и алгоритм count.

STL1Iter2°. Дан текстовый файл с именем name, содержащий строковые представления вещественных чисел. Найти количество положительных чисел в исходном файле. Использовать итератор istream_iterator и алгоритм count_if.

Указание. Если компилятор поддерживает стандарт C++11, то в качестве функционального объекта используйте лямбда-выражение [](double e){ return e > 0; }, указав его в списке параметров алгоритма.

В противном случае используйте функцию f, описав ее перед функцией Solve как bool f(double e){ return e > 0; }.

STL1Iter3°. Дан текстовый файл с именем name, содержащий английские слова. Найти количество слов длины 6. Использовать итератор istream_iterator и алгоритм count_if.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.

STL1Iter4°. Дан набор вещественных чисел. Вывести все элементы этого набора в том же порядке. Использовать итераторы ptin_iterator, ptout_iterator и алгоритм copy.

STL1Iter5°. Дан текстовый файл с именем name, содержащий строковые представления целых чисел. Вывести все числа из файла в том же порядке. Использовать итераторы istream_iterator, ptout_iterator и алгоритм copy.

STL1Iter6°. Дана строка name и набор символов. Записать в текстовый файл с именем name исходный набор символов в том же порядке, добавляя после каждого символа пробел. Использовать итераторы ptin_iterator, ostream_iterator и алгоритм copy.

STL1Iter7°. Дан текстовый файл с именем name1, содержащий строковые представления целых чисел, и строка name2. Записать в текстовый файл с именем name2 все ненулевые числа из исходного файла в том же порядке, располагая каждое число на новой строке. Использовать итераторы istream_iterator, ostream_iterator и алгоритм remove_copy.

STL1Iter8°. Дано целое число K (> 0), текстовый файл с именем name1, содержащий английские слова, и строка name2. Записать в текстовый файл с именем name2 все слова из исходного файла, длина которых не превосходит K, сохранив исходный порядок их следования и располагая каждое слово на новой строке. Использовать итераторы istream_iterator, ostream_iterator и алгоритм remove_copy_if.

Указание. Если компилятор поддерживает стандарт C++11, то в качестве функционального объекта используйте лямбда-выражение с захваченной внешней переменной k, указав это лямбда-выражение в списке параметров алгоритма: [k](string e){ return e.length() > k; }.

В противном случае используйте структуру f, которая описывается перед функцией Solve, содержит поле len и операцию (), определенную следующим образом: bool operator()(string e){ return e.length() > len; }. В алгоритме указывается конструктор f(k), инициализирующий поле len значением k.

STL1Iter9°. Дан текстовый файл с именем name, содержащий строковые представления целых чисел. Вывести числа из исходного файла с нечетными порядковыми номерами (т. е. первое число, третье число и т. д.). Использовать итераторы istream_iterator, ptout_iterator и алгоритм remove_copy_if.

Указание. Если компилятор поддерживает стандарт C++11, то в качестве функционального объекта используйте лямбда-выражение с внешней переменной num, захваченной по ссылке: [&num](int e){ return num++ % 2 == 0; } (перед вызовом алгоритма переменная num должна быть инициализирована значением 1).

В противном случае используйте структуру f, которая описывается перед функцией Solve, содержит поле num и операцию (), определенную следующим образом: bool operator()(int e){ return return num++ % 2 == 0; }. В алгоритме указывается конструктор f(1), инициализирующий поле num значением 1.

STL1Iter10°. Дан набор вещественных чисел, содержащий не менее двух элементов. Вывести числа из исходного набора с четными порядковыми номерами (т. е. второе число, четвертое число и т. д.). Использовать итераторы ptin_iterator, ptout_iterator и алгоритм remove_copy_if.

STL1Iter11°. Решить задачу STL1Iter7, используя вместо алгоритма remove_copy цикл for с параметром-итератором.

Указание. Опишите итератор out типа ostream_iterator и организуйте цикл for с параметром-итератором in типа istream_iterator и операцией инкремента in++. В цикле выполняйте проверку введенного числа *in и в случае, если оно удовлетворяет требуемому условию, выполняйте оператор out = *in. Выражение *in можно использовать многократно; оно всегда будет соответствовать последнему прочитанному элементу данных (чтение очередного элемента выполняется при создании объекта istream_iterator и при выполнении операции инкремента).

STL1Iter12°. Решить задачу STL1Iter8, используя вместо алгоритма remove_copy_if цикл for с параметром-итератором.

Указание. Ср. с задачей STL1Iter11.

STL1Iter13°. Решить задачу STL1Iter9, используя вместо алгоритма remove_copy_if цикл for с параметром-итератором.

Указание. Опишите итератор out типа ptout_iterator и организуйте цикл for с параметром-итератором in типа istream_iterator и операцией инкремента in++. В цикле выполняйте оператор out = *in++.

STL1Iter14°. Решить задачу STL1Iter10, используя вместо алгоритма remove_copy_if цикл for с параметром-итератором.

Указание. Ср. с задачей STL1Iter13. В данном случае надо использовать цикл с параметром in типа ptin_iterator.

STL1Iter15°. Дана строка name и набор целых чисел. Записать в текстовый файл с именем name все числа из исходного набора в том же порядке, заменяя каждое число 0 на число 10 и добавляя после каждого числа два пробела. Использовать итераторы ptin_iterator, ostream_iterator и алгоритм replace_copy.

STL1Iter16°. Дан набор символов. Вывести все символы из исходного набора в том же порядке, заменяя цифровые символы на символ подчеркивания. Использовать итераторы ptin_iterator, ptout_iterator и алгоритм replace_copy_if.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.

STL1Iter17°. Дана строка name и набор символов. Записать в текстовый файл с именем name удвоенные кодовые значения всех символов из исходного набора в том же порядке, добавляя после каждого числа один пробел. Использовать итераторы ptin_iterator, ostream_iterator и алгоритм transform.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.

STL1Iter18°. Дана строка name и целое число K (> 0). Записать в текстовый файл с именем name K символов «*». Использовать итератор ostream_iterator и алгоритм fill_n.

STL1Iter19°. Даны вещественные числа A, D и целое число N. Вывести N первых членов арифметической прогрессии с первым элементом A и разностью D. Использовать итератор ptout_iterator и алгоритм generate_n.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter9. В данном случае лямбда-выражение должно содержать внешнюю переменную D, захваченную по значению, и еще одну вспомогательную вещественную переменную, захваченную по ссылке и соответствующую текущему элементу прогрессии. Если в качестве функционального объекта используется структура, то она должна содержать два поля (которые соответствуют разности и текущему элементу прогрессии).

STL1Iter20°. Дана строка name и целое число N (1 ≤ N ≤ 26). Записать в текстовый файл с именем name N начальных прописных букв латинского алфавита. Использовать итератор ostream_iterator и алгоритм generate_n.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter9.

STL1Iter21°. Даны два текстовых файла с именами name1 и name2, содержащие строковые представления целых чисел, причем в каждом файле числа располагаются по убыванию. Вывести все числа из исходных файлов в виде единой последовательности, упорядоченной по убыванию. Использовать итераторы istream_iterator, ptout_iterator и алгоритм merge с параметром — функциональным объектом.

Указание. В данном случае не требуется применять ни лямбда-выражение, ни специально описанный функциональный объект. Достаточно указать стандартный функциональный объект greater<int>(), реализующий операцию > («больше»). Парным к нему является функциональный объект less, который реализует операцию < («меньше») (операция < используется по умолчанию во многих алгоритмах).

STL1Iter22°. Даны два текстовых файла с именами name1 и name2, содержащие английские слова, причем в каждом файле слова располагаются по возрастанию длины, а слова равной длины — в лексикографическом порядке. Вывести все слова из исходных файлов в виде единой последовательности, упорядоченной таким же образом, как и исходные файлы. Использовать итераторы istream_iterator, ptout_iterator и алгоритм merge с параметром — функциональным объектом.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.

STL1Iter23°. Даны два текстовых файла с именами name1 и name2, содержащие одинаковое количество строковых представлений вещественных чисел. Вывести разности B1 − A1, B2 − A2, …, BN − AN, где N — количество чисел в каждом файле, A1, A2, …, AN — числа из файла name1, а B1, B2, …, BN — числа из файла name2. Использовать итераторы istream_iterator, ptout_iterator и алгоритм transform.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.

STL1Iter24°. Дан текстовый файл с именем name1, содержащий английские слова, строка name2 и набор английских слов, размер которого не превосходит количество слов, содержащихся в файле name1. Записать в текстовый файл с именем name2 все слова из исходного набора, дополнив каждое слово символом «-» (дефис) и словом из файла name1 с тем же порядковым номером (если файл name1 содержит больше слов, чем исходный набор, то лишние слова в файле игнорируются). Каждое дополненное слово записывать в файл с новой строки. Использовать итераторы ptin_iterator, istream_iterator, ostream_iterator и алгоритм transform.

Указание. Рекомендации по использованию функциональных объектов приведены в указании к STL1Iter2.


PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
01.01.2024