. Что делать, если мы не хотим копировать эти структуры? Мы могли бы вместо этого использовать контейнер
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 продемонстрирует пример, идею и подход к решению задачи.
Часть IV
Дополнительные темы
Глава 22
Идеалы и история
Когда кто-то говорит: “Мне нужен такой язык
программирования, которому достаточно
просто сказать, его я хочу”,
дайте ему леденец.
Алан Перлис (Alan Perlis)
В этой главе очень кратко и выборочно изложена история языков программирования и описаны идеалы, во имя которых они были разработаны. Эти идеалы и выражающие их языки программирования образуют основу профессионализма. Поскольку в настоящей книге используется язык С++, мы сосредоточили свое внимание именно на нем, а также на языках, появившихся под его влиянием. Цель этой главы — изложить основы и перспективы развития идей, представленных в книге. Описывая каждый из языков, мы рассказываем о его создателе или создателях: язык — это не просто абстрактное творение, но и конкретное решение, найденное людьми для стоявших перед ними проблем в определенный момент времени.
22.1. История, идеалы и профессионализм
История — это чушь”, — безапелляционно заявил Генри Форд (Henry Ford). Противоположное мнение широко цитируется еще с античных времен: “Тот, кто не знает историю, обречен повторить ее”. Проблема заключается в том, чтобы выбрать, какую историю следует знать, а какую следует отбросить: другое известное изречение утверждает, что “95% всей информации — это чушь” (со своей стороны заметим, что 95%, вероятно, являются преуменьшенной оценкой). Наша точка зрения на связь истории с современностью состоит в том, что без понимания истории невозможно стать профессионалом. Люди, очень мало знающие предысторию своей области знаний, как правило, являются легковерными, поскольку история любого предмета замусорена правдоподобными, но не работоспособными идеями. “Плоть” истории состоит из идей, ценность которых доказывается практикой.
Мы бы с удовольствием поговорили о происхождении ключевых идей, лежащих в основе многих языков программирования и разных видов программного обеспечения, таких как операционные системы, базы данных, графические системы, сети, веб, сценарии и так далее, но эти важные и полезные приложения можно найти повсюду. Места, имеющегося в нашем распоряжении, едва хватает лишь для того, чтобы хотя бы поверхностно описать идеалы и историю языков программирования.
Конечная цель программирования заключается в создании полезных систем. В горячке споров о методах и языках программирования об этом легко забыть. Помните об этом! Если вам требуется напоминание, перечитайте еще раз главу 1.
22.1.1. Цели и философия языка программирования
Что такое язык программирования? Для чего он предназначен? Ниже приводятся распространенные варианты ответа на первый вопрос.
• Инструмент для инструктирования машин.
• Способ записи алгоритмов.
• Средство общения программистов.
• Инструмент для экспериментирования.
• Средство управления компьютеризированными устройствами.