Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Выражаю признательность студентам, ассистентам и преподавателям Техасского университета агрокультуры и машиностроения (курс ENGR 112), которые вольно или невольно помогли написать эту книгу, а также Уолтеру Догерити (Walter Daugherity), прослушавшему этот курс. Кроме того, я благодарен Дэмиану Дечеву (Damian Dechev), Трейси Хэммонд (Tracy Hammond), Арне Толструпу Мэдсену (Arne Tolstrup Madsen), Габриэлю Дос Рейосу (Gabriel Dos Reis), Николасу Страуструпу (Nicholas Stroustrup), Дж. К. ван Винкелю (J. C. van Winkel), Грэгу Версундеру (Greg Versoonder), Ронни Уарду (Ronnie Ward) и Леору Зольману (Leor Zolman) за конструктивные замечания к рукописи книги. Большое спасибо Могенсу Хансену (Mogens Hansen) за объяснение принципов работы программного обеспечения по управлению двигателем, а также Элу Ахо (Al Aho), Стивену Эдвардсу (Stephen Edwards), Брайану Кернигану (Brian Kernighan) и Дэйзи Нгуен (Daisy Nguyen) за то, что помогли мне спрятаться от того, что могло отвлечь от работы на книгой на протяжении летних месяцев.
Благодарю рецензентов, которых издательство Addison-Wesley подыскало для меня: Ричарда Энбоди (Richard Enbody), Дэвида Густафсона (David Gustafson), Рона Мак-Карти (Ron McCarty) и К. Нараяанасвами (K. Narayanaswamy). Их комментарии, основанные в основном на преподавании языка С++ или курса Computer Science 101 на уровне колледжа, были очень полезными. Я признателен также моему редактору Питеру Гордону (Peter Gordon) за многочисленные комментарии и терпение (не в последнюю очередь). Большое спасибо техническому персоналу издательства Addison–Wesley. Они много сделали для повышения качества книги: корректору Джулии Грейди (Julie Grady), верстальщику Крису Кини (Chris Keane), художнику Робу Мохару (Rob Mauhar), техническому редактору Джулии Нахил (Julie Nahil) и литературному редактору Барбаре Вуд (BarbaraWood).
В дополнение к моим несистематическим попыткам проверить тексты программ Башар Анабтави (Bashar Anabtawi), Йинан Фан (Yinan Fan) и Юрий Солодкий (Yuriy Solodkyy) проверили все фрагменты программ с помощью компиляторов Microsoft C++ 7.1 (2003), 8.0 (2005) и GCC 3.4.4.
Я хотел бы также поблагодарить Брайана Кернигана и Дуга Мак-Илроя (Doug McIlroy) за очень высокие стандарты качества, установленные ими для программирования, а также Денниса Ритчи (Dennis Ritchie) и Кристена Нийгарда (Kristen Nygaard) за ценные уроки по практической разработке языков программирования.
Обращение к читателям
“Если карта не соответствует местности,
доверяй местности.”
Швейцарская армейская поговорка
Эта глава содержит разнообразную информацию; ее цель — дать представление о том, что можно ожидать от остальной части книги. Пожалуйста, пролистайте ее и прочитайте то, что найдете интересным. Для преподавателей полезной будет большая часть книги. Если же вы читаете книгу без помощи хорошего преподавателя, то не пытайтесь прочитать и понять все, что написано в этой главе; просто взгляните на раздел “Структура книги” и первую часть раздела “Педагогические принципы”. Возможно, вы захотите вернуться и перечитать эту главу еще раз, когда научитесь писать и выполнять свои собственные программы.
0.1. Структура книги
Книга состоит из четырех частей и нескольких приложений.
• В части I, “Основы”, описаны фундаментальные концепции и методы программирования на примере языка С++ и библиотек, необходимых для начала разработки программ. К этим концепциям относятся система типов, арифметические операции, управляющие конструкции, обработка ошибок, а также разработка, реализация и использование функций и пользовательских типов.
• В части II, “Ввод и вывод”, описаны способы ввода числовых и текстовых данных с клавиатуры и из файлов, а также вывода результатов на экран и в файлы. Кроме того, в ней показано, как вывести числа, текст и геометрические фигуры в виде графической информации, а также как ввести данные в программу с помощью графического пользовательского интерфейса (GUI).
• Часть III, “Данные и алгоритмы”, посвящена контейнерам и алгоритмам из стандартной библиотеки С++ (standard template library — STL). В ней продемонстрирована реализация и использование контейнеров (таких как vector, list и map) с помощью указателей, массивов, динамической памяти, исключений и шаблонов. Кроме того, описаны разработка и использование алгоритмов из стандартной библиотеки (таких как sort, find и inner_product).
• Часть IV, “Расширение кругозора”, посвящена изложению идей и истории программирования на примерах матричных вычислений, обработки текста, тестирования, а также встроенных систем управления на основе языка С.
• Приложения содержат полезную информацию, которая была пропущена в тексте по причинам педагогического характера. В частности, приводится краткий обзор языка С++ и возможностей стандартной библиотеки, а также продемонстрированы принципы работы с интегрированными средами разработки (integrated development environment — IDE) и библиотекой графического пользовательского интерфейса (graphical user interface — GUI).
К сожалению, программирование нельзя так просто разделить на четыре четко разделенные области. По этой причине предложенная классификация является довольно грубой, хотя мы считаем ее полезной (иначе не стали бы ее предлагать). Например, операции ввода в книге используются намного раньше детального описания стандартных потоков ввода-вывода в языке С++. Как только для описания какой-то идеи нам требуется упомянуть несколько тем, мы предпочитаем изложить минимум информации, а не отсылать читателя к подробному изложению темы в другом месте. Строгая классификация больше нужна для справочников, чем для учебников.
Порядок изложения определяется методами программирования, а не языковыми конструкциями (см. раздел 0.2). Обзор свойств языка содержится в приложении А.
Для облегчения работы читателей, впервые читающих книгу и еще не знающих, какая информация является действительно важной, мы используем три вида пиктограмм, которые должны привлечь внимание.
• Метка: концепции и методы (как в данном разделе).
• Метка: совет.
• Метка: предупреждение.
0.1.1. Общие принципы
В книге я обращаюсь к вам непосредственно. Это проще и понятнее, чем принятое в научных работах косвенное обращение в третьем лице. Под местоимением “вы” я подразумеваю вас, читатель, а под местоимением “мы” — себя и преподавателей или нас с вами, работающих вместе над решением задачи, как если бы мы сами находились в одной комнате.
Эту книгу следует читать главу за главой от начала до конца. Довольно часто у вас будет появляться желание вернуться в какое-то место и перечитать его во второй или в третий раз. На самом деле это единственное разумное поведение, так как со временем некоторые детали стираются в памяти. В таких случаях вы обязательно рано или поздно постараетесь их освежить. Однако, несмотря на предметный