Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:
empty-line/>

Упражнения

1. Перечитайте главу и выполните все упражнения из врезок ПОПРОБУЙТЕ, если вы еще не сделали этого.

2. Найдите надежный источник документации по библиотеке STL и перечислите все стандартные алгоритмы.

3. Самостоятельно реализуйте алгоритм

count
. Протестируйте его.

4. Самостоятельно реализуйте алгоритм

count_if
. Протестируйте его.

5. Что нам следовало бы сделать, если бы мы не могли вернуть итератор

end
, означающий, что элемент не найден? Заново спроектируйте и реализуйте алгоритмы
find
и
count
, чтобы они получали итераторы, установленные на первый и последний элементы. Сравните результаты со стандартными версиями.

6. В примере класса

Fruit
из раздела 21.6.5 мы копировали структуры
Fruit
в контейнер
set
. Что делать, если мы не хотим копировать эти структуры? Мы могли бы вместо этого использовать контейнер
set<Fruit*>
. Однако в этом случае мы были бы вынуждены определить оператор сравнения для этого контейнера. Выполните это упражнение еще раз, используя контейнер
set<Fruit*
,
Fruit_comparison>
. Обсудите разницу между этими реализациями.

7. Напишите функцию бинарного поиска для класса

vector<int>
(без использования стандартного алгоритма). Выберите любой интерфейс, какой захотите. Протестируйте его. Насколько вы уверены, что ваша функция бинарного поиска работает правильно? Напишите функцию бинарного поиска для контейнера
list<string>
. Протестируйте ее. Насколько похожи эти две функции бинарного поиска? Как вы думаете, были бы они настолько похожи, если бы вам не было ничего известно о библиотеке STL?

8. Вернитесь к примеру, связанному с подсчетом частоты слов из раздела 21.6.1, и модифицируйте его, чтобы слова выводились в порядке следования частот, а не в лексикографическом порядке. Например, на экран должна выводиться строка

3: C++
, а не
C++: 3
.

9. Определите класс

Order
(заказ), члены которого содержат имя клиента, его адрес, дату рождения и контейнер
vector<Purchase>
. Класс
Purchase
должен содержать поля
name
,
unit_price
и
count
, характеризующие товар. Определите механизм считывания из файла и записи в файл объектов класса
Order
. Определите механизм для вывода на экран объектов класса
Order
. Создайте файл, содержащий по крайней мере десять объектов класса
Order
, считайте его в контейнер
vector<Order>
, отсортируйте по имени (клиента) и запишите обратно в файл. Создайте другой файл, содержащий по крайней мере десять объектов класса
Order
, примерно треть из которых хранится в первом файле, считайте их в контейнер
list<Order>
, отсортируйте по адресам (клиента) и запишите обратно в файл. Объедините два файла в третий файл, используя функцию
std::merge
.

10. Вычислите общее количество заказов в двух файлах из предыдущего упражнения. Значение отдельного объекта класса

Purchase
(разумеется) равно
unitprice*count
.

11. Разработайте графический пользовательский интерфейс для ввода заказов из файла.

12. Разработайте графический пользовательский интерфейс для запроса файла заказов; например, “Найти все заказы от

Joe
,” “определить общую стоимость заказов в файле
Hardware
” или “перечислить все заказы из файла
Clothing
.” Подсказка: сначала разработайте обычный интерфейс и лишь потом на его основе начинайте разрабатывать графический.

13. Напишите программу, “очищающую” текстовый файл для использования в программе, обрабатывающей запросы на поиск слов; иначе говоря, замените знаки пунктуации пробелами, переведите слова в нижний регистр, замените выражения don’t словами do not (и т.д.) и замените существительные во множественном числе на существительные в единственном числе (например, слово ships станет ship). Не перестарайтесь. Например, определить множественное число в принципе трудно, поэтому просто удалите букву s, если обнаружите как слово ship, так и слово ships. Примените эту программу к реальному текстовому файлу, содержащему не менее 5 000 слов (например, к научной статье).

14. Напишите программу (используя результат предыдущего упражнения), отвечающую на следующие вопросы и выполняющую следующие задания: “Сколько раз слово ship встречается в файле?” “Какое слово встречается чаще всего?” “Какое слово в файле самое длинное?” “Какое слово в файле самое короткое?” “Перечислите все слова на букву s” и “Перечислите все слова, состоящие из четырех букв”.

15. Разработайте графический пользовательский интерфейс из предыдущего упражнения.

Послесловие

Библиотека STL является частью стандартной библиотеки ISO C++, содержащей контейнеры и алгоритмы. Она предоставляет обобщенные, гибкие и полезные базовые инструменты. Эта библиотека позволяет сэкономить массу усилий: изобретать колесо заново может быть забавным, но вряд ли продуктивным занятием. Если у вас нет весомых причин избегать библиотеки STL, то используйте ее контейнеры и основные алгоритмы. Что еще важнее, библиотека STL — это пример обобщенного программирования, демонстрирующий, как способы устранения конкретных проблем и набор конкретных решений могут вырасти в мощную и универсальную коллекцию полезных инструментов. Если вам необходимо манипулировать данными — а большинство программистов именно этим и занимаются, — библиотека STL продемонстрирует пример, идею и подход к решению задачи.

  • Читать дальше
  • 1
  • ...
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: