дейтел пол дейтел как программировать на
Дейтел пол дейтел как программировать на
Physics.Math.Code запись закреплена
Как программировать на C++ [2008] Дейтел
Книга (оригинальное название «C++ How to Program, Fifth Edition») является одним из самых популярных в мире учебников по C++. Характерной ее особенностью является «раннее введение» в классы и объекты, т. е. начала объектно-ориентированного программирования вводятся уже в 3-й главе, без предварительного изложения унаследованных от языка С элементов процедурного и структурного программирования, как это делается в большинстве курсов по C++. Большое внимание уделяется объектно-ориентированному проектированию (OOD) программных систем с помощью графического языка UML 2, чему посвящен ряд факультативных разделов, описывающих последовательную разработку большого учебного проекта.
В текст книги включена масса примеров «живого кода» — подробно комментированных работающих программ с образцами их запуска, а также несколько подробно разбираемых интересных примеров. В конце каждой главы имеется обширный набор контрольных вопросов и упражнений.
Книга может служить учебным пособием для начальных курсов по C++, а также будет полезна широкому кругу как начинающих программистов, так и более опытных, не работавших прежде с C++.
Я становлюсь программистом
Очень часто сталкиваюсь с начинающими программистами и хочу им искренне помочь. C чего начать, как работать над задачами, как работать в команде, как проводить время с пользой — эта статья для вас.
С чего начать
Не дано мне знать, что вас подвинуло на программирование, но могу сразу заверить — дело интересное и в первую очередь творческое. Да, да, простите меня те, кто не связывает программирование с творчеством, но для меня это так, и в дальнейшем я попытаюсь Вас в этом убедить.
Для того чтобы начать программировать, на мой взгляд, не обязательно читать 1000-страничные книги по программированию известных авторов-профессионалов. Был в моей жизни опыт, ещё в университете я всерьез хотел заняться программированием. По программе мы проходили C++ и я начал именно с него. На тот момент читал книгу Харви и Пола Дейтела «Как программировать на C++». В ней было более 1000 страниц, читал её практически каждый день, с разбором всех заданий с примерами и т.д. Разумеется, у меня был под рукой компилятор. Все было неплохо. Но знаете, проблема в том, что эта книга диктовала мне, что нужно делать вначале, а что потом. Да, бесспорно у неё была цель в конце сделать что-то серьезное, но это не то. Забегу сразу вперед, если вы будите устраиваться на работу, предыдущие знания, полученные в книге, как минимум могут забыться, а задачи, как правило, ставят не такие, как в книге. На мой взгляд, эта проблема книг, они не учат решать задачи самостоятельно. Мнение моего близкого друга, занимающегося программирование более 7 лет, звучит примерно так:
Профессиональные книги по программированию стоит читать только тогда, когда у тебя есть немалый опыт в этом деле.
И тут я тоже с ним, пожалуй, соглашусь. Возможно, у кого-то было по-другому, так что не призываю брать близко к сердцу мои слова.
Есть ещё очень распространенная тема – это видео уроки. У меня тоже это было (уроки Евгения Попова по курсу JQuery и Javascript для начинающих, Видеокурс HTML + PHP + MYSQL). Тут воспринимаешь информацию по-другому. Плюсами таких уроков является то, что с вами наглядно в режиме реального времени решают какие-то задачи, дают комментарии, объясняют, почему сделали так, а не иначе. Признаюсь честно, некоторые видео курсы были довольно неплохими. Были задачи и примеры, которые подробно разбирались в начале следующих уроков. Если кого-то заинтересует, можете попробовать. Но у таких уроков есть тот же минус что и у книг — они диктуют вам, что делать. Возможно, было у кого-то не так, но я это почувствовал. К тому же, авторы видео уроков не всегда профессионалы, имейте это в виду.
У вас, наверное, возникает вопрос, так с чего же начать? Для начала попытайтесь понять, чем бы вы хотели заниматься. Как правило, для конкретных задач существуют свои языки программирования, если на ваши задачи нашлось несколько языков, то попытайтесь выбрать лучшие для себя. Попытайтесь понять суть языков, их тонкости, чем они особенные, чем они отличаются друг от друга, посмотрите на синтаксис, возможности. Например, Java — кроссплатформенный язык программирования (хорош в том, что на любой операционной системе программа будет работать без изменения исходного кода), код компилируется перед запуском (в отличие от интерпретаторов, выполняется быстрее). PHP – «интерпретатор» (код не компилируется перед запуском), ООП «работает» медленно и другое. Поймите, я встречал людей, которые программировали ни один год, но которые не знали этих вещей – это им минус. Вы заранее попытайтесь разобраться, что лучше и почему мне это подходит больше. Я хочу помочь вам писать код максимально правильно.
Если вы не понимаете, как работает код, то, вероятно, он работает неправильно.
Помните это, и всегда пытайтесь понять, почему программа работает именно так. Изучение нескольких языков вам в плюс; будет, с чем сравнить. И к главному, Google, Яндекс, другой поисковик – ваш лучший друг и помощник.
Главный мой совет по тому, с чего начать – делайте что-нибудь свое. А если вас взяли в какую-нибудь команду, то вы счастливчик, но об этом чуть позже.
Перед программированием
Если вы программируете на заказ, перед тем, как садиться за код или начинать думать о задаче – выясните у заказчика все детали, все до мелочей. От этого будет зависеть ваши дальнейшие действия, если что-то стало не понятно, отложите код и мысли и переспросите лучше все заново. Если сами ставите себе задачи или у вас есть цель сделать что-то свое – тогда проще.
Перед началом реализации какой-то задачи не садитесь бегом писать код – это ошибка начинающих. Возьмите листок, ручку и начните все обдумывать. Нарисуйте схему того, что вам нужно сделать. Взвесьте все моменты «За» и «Против». Попытайтесь на листочке самому себе объяснить, что именно нужно сделать. Поверьте, это может быть главное в программировании, как правило, на написание кода уходит меньше времени, чем на обдумывание всех деталей. От этих деталей зависит, какие инструменты в том или ином языке программирования вы будете использовать. Это могут быть библиотеки, фреймворки и другое. Конечно, если вы хотите написать «Hello Word» или протестировать цикл «for» — то все, что прочитали выше в этом абзаце, можно опустить.
Процесс программирования
Настоящий программист должен кодить в блокноте.
Я с этим не согласен. Среда разработки должна помогать и подсказывать во всем. Бывает так, что нужна какая-то функция, не знаете, как она называется, но знаете, к примеру, что она должна конвертировать строку в число — IDE в помощь. Я уже не говорю про отладчики программы. Рекомендую продукцию от компании JetBrains. Например, для Java — IntelliJ IDEA, для PHP — JetBrains PhpStorm (они на английском). Разумеется, можете выбрать другие, дело ваше. Спорить какая лучше, а какая нет, я не буду, статья не об этом.
В процессе написания кода часто всплывают вопросы: «А как это сделать? А какая функция делает это? А можно ли вот так?». Вернусь к уже сказанному – гуглите или ищите подсказки в IDE. Кто не знает, как правильно задавать вопросы у поисковика, можете ознакомиться с этим тут. Практика показывает, что задавать вопросы по конкретной теме лучше на английском языке, по крайней мере, очень часто бывает так, что русских ссылок просто нет. Да, придется изучать английский язык, ну это же только в плюс.
Переменные, имя классов, название методов, названия файлов и другое советую называть логично, например, если вам нужна переменная, которая хранит количество пользователей, назовите её «users_amount». Старайтесь писать придерживаясь какого-то стиля. Код должен быть понятен, когда его просто смотришь, а что вызывает трудности в понимании – комментируйте. Если вы что-то не доделали или не поняли — пользуйтесь TODO. В связке c IDE, TODO поможет вам найти участки кода, нуждающиеся в доработке. Это очень удобная вещь. Изучайте макросы в своей IDE. Зачем писать руками цикл «for» или getter, setter для переменных класса, если есть IDE, которая нажатием 2-х/3-х клавиш сделает это за Вас. Пользуйтесь инструментами, облегчающими вашу разработку, разработка — это время, а время — это деньги.
Во время написания кода делайте перерывы, да я понимаю, что задача очень интересная и нельзя оторваться, но все же, попытайтесь. Мозгу нужна разрядка и отдых, а организму питание. Есть надо обязательно. Бывает так, что не лезет ничего в голову или не думается – встаньте, походите, сделайте зарядку, посмотрите в окошко, можно выйти на улицу подышать (если это возможно) и т.д. Если у вас на работе такое начальство, что оно запрещает делать перерывы и говорит вам: «Сидеть! Работать! Куда пошел?». Долой такое начальство, попытайтесь решить проблему, если не получится, то лучше уйдите из такой компании. Помните, что программирование это хорошо, но здоровье у нас одно, о нем надо заботиться.
Работа в команде
Если устроились в какую-то компанию, где присутствует командная разработка, скажу, что Вам очень повезло. Да простят меня фрилансеры работать в такой компании – это круто.
Во-первых, вы можете узнать много нового, того, чего раньше не могли знать или просто не смогли найти это в Интернете.
Во-вторых, помощь в решении проблем. Иногда одному думать над какой-нибудь задачей тяжело, и решение принять очень трудно — тут на помощь приходят коллеги, которые могут дать быстрый и четкий совет.
В-третьих, сами задачи, что вам ставят, могут оказаться гораздо интереснее, чем те, которые были раньше. Изучение чего-то нового и есть развитие.
И наконец, работа в команде намного веселее, чем дома одному. Новые знакомства всегда интересны.
Помните, что в команде вас связывает общая цель и решать её нужно совместно. Нельзя просто залезть в чужой код и наворотить там такого, что потом ничего не работает. Тут не решаете, как оформить код. Здесь вы следуете правилам командной разработки, командному стилю. В любой хорошей компании должно быть такое. Что есть этот стиль и правила? Например, в компании, в которую вы устроились, есть общее правило, все переменные писать в нижнем регистре, названия классов через CamelCase, название методов через lowerCamelCase и т.д. Правил может быть много, и им нужно следовать. Спросите для чего? Для единообразия кода. Объясню. К примеру, мне захотелось поправить баг в вашем коде, я его открываю, правлю. Захожу в код другого разработчика, правлю, там по-другому написано, у третьего ещё по-другому, и в итоге нет единообразия. И если вы потом уйдете из этой компании, представьте, насколько людям будет тяжело разбирать чужой код. Задача очень неинтересная, поверьте. Комментируйте свой код обязательно, даже если там все понятно, если вам не дают на это время – то тогда ладно, проблемы компании.
Требуйте от вашего руководителя в компании четкой постановки задачи. Желательно, чтобы это было техническое задание, где будут четко прописаны пункты, что нужно сделать. Бывает так, что задачи мелкие, и они говорятся на словах, рекомендую все эти слова записывать. Спросите для чего? К примеру, потратили неделю на разработку какого-то модуля программы, но оказалось, что ваш руководитель сказал по-другому сделать. И тут вы начинаете переписывать (ИМХО, это самое нелюбимое занятие программиста), исправлять, тратить свое время, а может вам ещё и з/п подрежут. Минусов много. А когда у вас есть письменное подтверждение того, что вам сказали сделать, то тут уже руководитель не отвертится. Косяк его тогда. Уважайте свой труд и не стесняйтесь доказывать свою правоту, это всегда приветствуется.
Общение в компании между сотрудниками и руководителями может быть разное, бывает словесное, бывает через какие-нибудь программы (Skype, ICQ, Mail агент и другие). Хочу остановиться на последнем. О чем нужно помнить, если у вас появились какие-то вопросы к руководителю или программисту:
Заключение
Помните, что в программировании нет предела совершенству. Нужно всегда стремиться делать какие-то вещи лучше других. Не нужно сомневаться в своих силах. Местами будет сложно, непонятно – это нормально. Часто бывает такое, что открываешь код, который ты писал год назад и сам смеешься над тем, насколько там все плохо и криво — и это нормально. Это признак того, что вы развиваетесь как программист. Читайте побольше статей о программировании и IT-индустрии, ходите на конференции по программированию, слушайте умных людей и тогда, Вы точно добьетесь успеха.
IT-технологии развивается большими темпами, нынче это очень популярная тема, став программистом, вы станете частью всего этого. Легко сможете найти себе работу в любом городе, вакансий везде куча, выбирайте. Посмотрите на популярные сервисы от Google, Yandex. Посмотрите на приложения в телефонах, насколько они круто сделаны. 2Gis, ВКонтакте и многие другие – всем хочется пожать руки и сказать, какие они красавцы.
Как программировать на C++
Учебное издание.
Книга (оригинальное название «C++ How to Program, Fifth Edition») является одним из самых популярных в мире учебников по C++. Характерной ее особенностью является «раннее введение» в классы и объекты, т. е. начала объектно-ориентированного программирования вводятся уже в 3-й главе, без предварительного изложения унаследованных от языка C элементов процедурного и структурного программирования, как это делается в большинстве курсов по C++.
Большое внимание уделяется объектно-ориентированному проектированию (OOD) программных систем с помощью графического языка UML 2, чему посвящен ряд факультативных разделов, описывающих последовательную разработку большого учебного проекта.
В текст книги включена масса примеров «живого кода» — подробно комментированных работающих программ с образцами их запуска, а также несколько подробно разбираемых интересных примеров.
В конце каждой главы имеется обширный набор контрольных вопросов и упражнений. Данная книга содержит множество упражнений и проектов, взятых из разнообразных областей, что дает студенту возможность решать интересные задачи реального мира. Книга может служить учебным пособием для начальных курсов по C++, а также будет полезна широкому кругу как начинающих программистов, так и более опытных, не работавших прежде с C++. Она концентрирует внимание на принципах правильного конструирования программного обеспечения. Авторы старались избегать хитроумных терминов и описаний синтаксиса, отдавая предпочтение обучению на примерах. ISBN 0-13-185757-6 (англ.)
Содержание.
Глава 2. Введение в программирование на C++ 95
2.1. Введение 96
2.2. Первая программа на C++: печать строки текста 96
2.3. Модификация нашей первой программы 101
2.4. Другая программа на C++: сложение целых чисел 102
2.5. Организация памяти 107
2.6. Арифметика 109
2.7. Принятие решений: операции равенства и отношений 113
2.8. Конструирование программного обеспечения. Исследование требований к АТМ (необязательный раздел) 118
2.9. Заключение 129
Глава 3. Введение в классы и объекты 139
3.1. Введение 140
3.2. Классы, объекты, элемент-функции и элементы данных 141
3.3. Обзор примеров главы 142
3.4. Определение класса с элемент-функцией 143
3.5. Определение элемент-функции с параметром 147
3.6. Элементы данных, set-функции и get-функции 151
3.7. Инициализация объектов при помощи конструкторов 159
3.8. Размещение класса в отдельном файле 163
3.9. Отделение интерфейса от реализации 168
3.10. Подтверждение данных посредством set-функций 174
3.11. Конструирование программного обеспечения. Идентификация классов в спецификации требований к АТМ (необязательный раздел) 180
3.12. Заключение 188
Глава 4. Управляющие операторы: часть I 197
4.1. Введение 198
4.2. Алгоритмы 199
4.3. Псевдокод 199
4.4. Управляющие структуры 201
4.5. Оператор выбора if 205
4.6. Оператор выбора if. else 207
4.7. Оператор повторения while 212
4.8. Формулирование алгоритмов: повторение, управляемое счетчиком 214
4.9. Формулирование алгоритмов: повторение, управляемое контрольным значением 221
4.10. Формулирование алгоритмов: вложенные управляющие операторы 233
4.11. Операции присваивания 238
4.12. Операции инкремента и декремента 239
4.13. Конструирование программного обеспечения. Идентификация классовых атрибутов в системе АТМ (необязательный раздел) 242
4.14. Заключение 247
Глава 5. Управляющие операторы: часть II 265
5.1. Введение 266
5.2. Основы повторения, управляемого счетчиком 267
5.3. Оператор повторения for 269
5.4. Примеры операторов for 274
5.5. Оператор повторения do. while 279
5.6. Оператор множественного выбора switch 281
5.7. Операторы break и continue 292
5.8. Логические операции 294
5.9. Случайная подмена операции равенства (==) присваиванием (=). 299
5.10. Структурное программирование: резюме 301
5.11. Конструирование программного обеспечения. Идентификация состояний объектов и деятельности в системе АТМ (необязательный раздел) 307
5.12. Заключение 313
Глава 6. Функции и введение в рекурсию 325
6.1. Введение 326
6.2. Компоненты программ на C++ 327
6.3. Функции математической библиотеки 329
6.4. Определения функций с несколькими параметрами 331
6.5. Прототипы функций и принудительное приведение аргументов 336
6.6. Заголовочные файлы стандартной библиотеки C++ 339
6.7. Пример: генерация случайных чисел 341
6.8. Пример: азартная игра с использованием перечисления 347
6.9. Классы памяти 351
6.10. Правила для области действия 355
6.11. Стек вызовов и активационные записи 358
6.12. Функции с пустым списком параметров 363
6.13. Встроенные функции 365
6.14. Ссылки и ссылочные параметры 366
6.15. Аргументы по умолчанию 372
6.16. Унарная операция разрешения области действия 374
6.17. Перегрузка функций 375
6.18. Шаблоны функций 379
6.19. Рекурсия 381
6.20. Пример рекурсии: числа Фибоначчи 385
6.21. Рекурсия в сравнении с итерацией 388
6.22. Конструирование программного обеспечения. Идентификация операций классов в системе АТМ (необязательный раздел) 392
6.23. Заключение 400
Глава 7. Массивы и векторы 423
7.1. Введение 424
7.2. Массивы 425
7.3. Объявление массивов 427
7.4. Примеры с массивами 428
7.5. Передача массивов функциям 446
7.6. Пример: класс GradeBook с массивом для хранения оценок 450
7.7. Линейный поиск в массивах 457
7.8. Сортировка массивов вставкой 459
7.9. Многомерные массивы 461
7.10. Пример: класс GradeBook с двумерным массивом 465
7.11. Введение в шаблон класса vector стандартной библиотеки C++ 472
7.12. Конструирование программного обеспечения. Кооперация объектов в системе АТМ (необязательный раздел) 477
7.13. Заключение 486
Глава 8. Указатели и строки-указатели 505
8.1. Введение 506
8.2. Объявление и инициализация переменных-указателей 507
8.3. Операции указателей 508
8.4. Передача аргументов по ссылке с помощью указателей 512
8.5. Квалификатор const в применении к указателям 516
8.6. Сортировка выборкой с передачей по ссылке 524
8.7. Операции sizeof 527
8.8. Выражения с указателями и арифметика указателей 530
8.9. Взаимосвязь указателей и массивов 534
8.10. Массивы указателей 538
8.11. Пример: моделирование тасования и сдачи карт 540
8.12. Указатели на функцию 546
8.13. Введение в обработку строк-указателей 551
8.13.1. Элементарные сведения о символах и строках 551
8.13.2. Функции обработки строк из библиотеки 554
8.14. Заключение 562
Глава 9. Классы: часть I 591
9.1. Введение 592
9.2. Пример: класс Time 593
9.3. Область действия класса и доступ к элементам класса 601
9.4. Отделение интерфейса от реализации 603
9.5. Функции доступа и сервисные функции 604
9.6. Пример: класс Time. Конструкторы с аргументами по умолчанию 607
9.7. Деструкторы 613
9.8. Когда вызываются конструкторы и деструкторы 613
9.9. Пример: класс Time. Скрытая ошибка — возвращение ссылки на закрытый элемент данных 617
9.10. Поэлементное присваивание по умолчанию 620
9.11. Утилизируемость программного обеспечения 622
9.12. Конструирование программного обеспечения. Начало программирования классов системы АТМ (необязательный раздел) 623
9.13. Заключение 631
Глава 10. Классы: часть II 639
10.1. Введение 640
10.2. Константные объекты и константные элемент-функции 641
10.3. Композиция: объекты в качестве элементов класса 651
10.4. Дружественные функции и дружественные классы 658
10.5. Указатель this 662
10.6. Динамическое управление памятью с помощью операций new и delete 668
10.7. Статические элементы класса 670
10.8. Абстракция данных и сокрытие информации 677
10.8.1. Пример: абстрактный тип данных — массив 678
10.8.2. Пример: абстрактный тип данных — строка 679
10.8.3. Пример: абстрактный тип данных — очередь 679
10.9. Классы-контейнеры и итераторы 680
10.10. Классы-посредники 681
10.11. Заключение 684
Глава 11. Перегрузка операций; объекты Array и String 691
11.1. Введение 692
11.2. Основы перегрузки операций 693
11.3. Ограничения на перегрузку операций 695
11.4. Функции-операции как элементы класса и как глобальные функции 697
11.5. Перегрузка операций передачи в поток и извлечения из потока 698
11.6. Перегрузка одноместных операций 702
11.7. Перегрузка двухместных операций 703
11.8. Пример: класс Array 703
11.9. Преобразование типов 716
11.10. Пример: класс String 717
11.11. Перегрузка 730
11.12. Пример: класс Date 732
11.13. Класс string стандартной библиотеки 737
11.14. explicit-конструкторы 741
11.15. Заключение 744
Глава 12. Объектно-ориентированное программирование: наследование 759
12.1. Введение 760
12.2. Базовые и производные классы 762
12.3. Защищенные элементы 765
12.4. Отношения между базовыми и производными классами 766
12.4.1. Создание и тестирование класса CommissionEmployee 767
12.4.2. Создание класса BasePlusCommissionEmployee без наследования 772
12.4.3. Создание иерархии наследования CommissionEmployee — BasePlusCommissionEmployee 777
12.4.4. Иерархия наследования CommissionEmployee — BasePlusCommissionEmployee с защищенными данными 783
12.4.5. Иерархия наследования CommissionEmployee — BasePlusCommissionEmployee с закрытыми данными 790
12.5. Конструкторы и деструкторы в производных классах 798
12.6. Открытое, защищенное и закрытое наследование 806
12.7. Наследование в конструировании программного обеспечения 807
12.8. Заключение 809
Глава 13. Объектно-ориентированное программирование: полиморфизм 815
13.1. Введение 817
13.2. Примеры полиморфизма 818
13.3. Отношения между объектами в иерархии наследования 820
13.3.1. Вызов функций базового класса из объектов производного класса 821
13.3.2. Установка указателей производного класса на объекты базового класса 828
13.3.3. Вызов элемент-функций производного класса через указатели базового класса 829
13.3.4. Виртуальные функции 831
13.3.5. Сводка допустимых присваиваний объектов указателям базового и производного классов 837
13.4. Поля типа и операторы switch 838
13.5. Абстрактные классы и чисто виртуальные функции 839
13.6. Пример. Система начисления заработной платы, использующая полиморфизм 842
13.6.1. Создание абстрактного базового класса Employee 843
13.6.2. Создание конкретного производного класса SalariedEmployee 847
13.6.3. Создание конкретного производного класса HourlyEmployee 849
13.6.4. Создание конкретного производного класса CommissionEmployee 851
13.6.5. Создание косвенного конкретного производного класса BasePlusCommissionEmployee 853
13.6.6. Демонстрация полиморфной обработки 855
13.7. (Дополнительный раздел.) Техническая сторона полиморфизма, виртуальных функций и динамического связывания 860
13.8. Пример. Система начисления заработной платы, использующая полиморфизм и информацию о типе времени выполнения с нисходящими приведениями типа, dynamic_cast, typeid и type_info 864
13.9. Виртуальные деструкторы 868
13.10. Конструирование программного обеспечения. Введение наследования в систему АТМ (необязательный раздел) 869
13.11. Заключение 878
Глава 14. Шаблоны 885
14.1. Введение 886
14.2. Шаблоны функций 887
14.3. Перегрузка шаблонов функции 891
14.4. Шаблоны классов 891
14.5. Нетиповые параметры и типы по умолчанию для шаблонов класса 898
14.6. Замечания о шаблонах и наследовании 899
14.7. Замечания о шаблонах и друзьях 900
14.8. Замечания о шаблонах и статических элементах 901
14.9. Заключение 901
Глава 15. Потоковый ввод/вывод 907
15.1. Введение 909
15.2. Потоки 909
15.2.1. Классические и стандартные потоки 910
15.2.2. Заголовочные файлы библиотеки iostream 911
15.2.3. Классы и объекты потокового ввода/вывода 911
15.3. Потоковый вывод 914
15.3.1. Вывод переменных типа char 914
15.3.2. Вывод символов с помощью элемент-функции put 915
15.4. Потоковый ввод 915
15.4.1. Элемент-функции get и getline 916
15.4.2. Элемент-функции peek, putback и ignore класса istream 919
15.4.3. Безопасный по типу ввод/вывод 920
15.5. Бесформатный ввод/вывод с помощью read, gcount и write 920
15.6. Введение в манипуляторы потоков 921
15.6.1. Основание целых чисел: dec, oct, hex и setbase 921
15.6.2. Точность чисел с плавающей точкой (precision, setprecision) 922
15.6.3. Ширина поля (setw, width) 924
15.6.4. Определяемые пользователем манипуляторы выходного потока 925
15.7. Состояния формата потока и потоковые манипуляторы 927
15.7.1. Конечные нули и десятичные точки (showpoint) 928
15.7.2. Выравнивание (left, right, internal) 929
15.7.3. Заполнение (fill, setfill) 930
15.7.4. Основание целых чисел (dec, oct, hex, showbase) 932
15.7.5. Числа с плавающей точкой: научная и фиксированная нотация (scientific, fixed) 933
15.7.6. Управление верхним/нижним регистрами (uppercase) 934
15.7.7. Спецификация булева формата (boolalpha) 935
15.7.8. Установка и сброс состояний формата с помощью элемент-функции flags 936
15.8. Состояния ошибки потоков 937
15.9. Привязка потока вывода к потоку ввода 939
15.10. Заключение 940
Глава 16. Управление исключениями 951
16.1. Введение 952
16.2. Обзор управления исключениями 953
16.3. Пример: обработка попытки деления на ноль 954
16.4. Когда следует применять управление исключениями 961
16.5. Перебрасывание исключений 962
16.6. Спецификации исключений 964
16.7. Обработка непредусмотренных исключений 965
16.8. Разматывание стека 966
16.9. Конструкторы, деструкторы и управление исключениями 967
16.10. Исключения и наследование 968
16.11. Обработка отказов операции new 969
16.12. Класс auto_ptr и динамическое выделение памяти 973
16.17. Иерархия исключений стандартной библиотеки 976
16.14. Другие методы обработки ошибок 978
16.15. Заключение 979
Глава 17. Обработка файлов 987
17.1. Введение 988
17.2. Иерархия данных 988
17.3. Файлы и потоки 991
17.4. Создание последовательного файла 992
17.5. Чтение данных из последовательного файла 996
17.6. Обновление последовательных файлов 1003
17.7. Файлы произвольного доступа 1003
17.8. Создание файла произвольного доступа 1004
17.9. Произвольная запись данных в файл произвольного доступа 1010
17.10. Последовательное чтение из файла произвольного доступа 1012
17.11. Пример. Программа обработки транзакций 1015
17.12. Ввод/вывод объектов 1021
17.13. Заключение 1022
Глава 18. Класс string и обработка строковых потоков 1033
18.1. Введение 1034
18.2. Присваивание и конкатенация строк 1036
18.3. Сравнение строк 1038
18.4. Подстроки 1041
18.5. Обмен строк 1041
18.6. Характеристики строки 1042
18.7. Поиск в строке подстрок и символов 1045
18.8. Замена символов в строке 1047
18.9. Вставка символов в строку 1049
18.10. Преобразование в строки-указатели C типа char 1050
18.11. Итераторы 1051
18.12. Обработка строковых потоков 1053
18.13. Заключение 1056
Глава 19. Поиск и сортировка 1063
19.1. Введение 1064
19.2. Алгоритмы поиска 1065
19.2.1. Эффективность линейного поиска 1065
19.2.2. Двоичный поиск 1067
19.3. Алгоритмы сортировки 1073
19.3.1. Эффективность сортировки выборкой 1073
19.3.2. Эффективность сортировки вставкой 1073
19.3.3. Сортировка слиянием (рекурсивная реализация) 1074
19.4. Заключение 1081
Глава 20. Структуры данных 1089
20.1. Введение 1090
20.2. Автореферентные классы 1091
20.3. Динамическое распределение памяти и структуры данных 1092
20.4. Связанные списки 1093
20.5. Стеки 1109
20.6. Очереди 1113
20.7. Деревья 1117
20.8. Заключение 1127
Глава 21. Биты, символы, строки C и структуры 1153
21.1. Введение 1154
21.2. Определение структур 1155
21.3. Инициализация структур 1157
21.4. Использование структур с функциями 1158
21.5. typedef 1158
21.6. Пример. Высокоэффективное моделирование тасования и сдачи карт 1159
21.7. Поразрядные операции 1162
21.8. Битовые поля 1171
21.9. Библиотека обработки символов 1175
21.10. Функции преобразования строк-указателей 1181
21.11. Функции поиска из библиотеки обработки строк-указателей 1186
21.12. Функции управления памятью из библиотеки обработки строк-указателей 1191
21.13. Заключение 1195
Глава 22. Библиотека стандартных шаблонов (STL) 1209
22.1. Введение в Библиотеку стандартных шаблонов (STL) 1211
22.1.1. Введение в контейнеры 1213
22.1.2. Введение в итераторы 1218
22.1.3. Введение в алгоритмы 1224
22.2. Контейнеры последовательностей 1226
22.2.1. Контейнер последовательности vector 1227
22.2.2. Контейнер последовательности list 1236
22.2.3. Контейнер последовательности deque 1240
22.3. Ассоциативные контейнеры 1242
22.3.1. Ассоциативный контейнер multiset 1242
22.3.2. Ассоциативный контейнер set 1245
22.3.3. Ассоциативный контейнер multimap 1247
22.3.4. Ассоциативный контейнер тар 1249
22.4. Адаптеры контейнеров 1250
22.4.1. Адаптер stack 1251
22.4.2. Адаптер queue 1253
22.4.3. Адаптер priority_queue 1254
22.5. Алгоритмы 1256
22.5.1. fill, fill_n, generate и generate_n 1257
22.5.2. equal, mismatch и lexicographical_compare 1258
22.5.3. remove, remove_if, remove_copy и remove_copy_if 1261
22.5.4. replace, replace_if, replace_copy и replace_copy_if.1264
22.5.5. Математические алгоритмы 1266
22.5.6. Элементарные алгоритмы поиска и сортировки 1269
22.5.7. swap, iter_swap и swap_ranges 1272
22.5.8. copy_backward, merge, unique и reverse 1273
22.5.9. inplace_merge, unique_copy и reverse_copy 1276
22.5.10. Операции над множествами 1277
22.5.11. lower_bound, upper_bound и equal_range 1281
22.5.12. Кучевая сортировка 1283
22.5.13. min и max 1286
22.5.14. Алгоритмы STL, не представленные в этой главе 1287
22.6. Класс bitset 1289
22.7. Функциональные объекты 1292
22.8. Заключение 1296
22.9. Ресурсы по STL в Internet и Web 1296
Приложения.
Приложение А. Таблица старшинства и ассоциативности операций 1337
Приложение Б. Набор символов ASCII 1341
Приложение В. Основные типы 1343
Приложение Г. Код, унаследованный от C 1345
Г.1. Введение 1346
Г.2. Переадресация ввода/вывода в системах UNIX/LINUX/Mac OS X и Windows 1346
Г.З. Списки аргументов переменной длины 1348
Г.4. Аргументы командной строки 1351
Г. 5. Замечания о компиляции программ из нескольких исходных файлов 1352
Г. 6. Выход из программы с помощью exit и at exit 1354
Г.7. Квалификатор типа volatile 1356
Г. 8. Суффиксы для целых констант и констант с плавающей точкой 1356
Г.9. Обработка сигналов 1357
Г. 10. Динамическое распределение памяти с помощью calloc и realloc 1359
Г.11. Безусловный переход: goto 1360
Г.12. Объединения 1362
Г.13. Спецификации компоновки 1366
Г. 14. Заключение 1366
Приложение Д. Препроцессор 1373
Д.1. Введение 1374
Д.2. Директива препроцессора #include 1375
Д.З. Директива #define: символические константы 1375
Д.4. Директива #define: макросы 1376
Д.5. Условная компиляция 1378
Д.6. Директивы #error и #pragma 1380
Д.7. Операции # и ## 1380
Д.8. Предопределенные символические константы 1381
Д.9. Макрос подтверждения 1381
Д.10. Заключение 1382
Приложение Е. Код учебного примера АТМ 1387
Е.1. Реализация проекта АТМ 1387
Е.2. Класс АТМ 1388
Е.З. Класс Screen 1395
Е.4. Класс Keypad 1397
Е.5. Класс CashDispenser 1398
Е.6. Класс DepositSlot 1400
Е.7. Класс Account 1401
Е.8. Класс BankDatabase 1403
Е.9. Класс Transaction 1407
Е.10. Класс Balancelnquiry 1409
Е. 11. Класс Withdrawal 1411
Е.12. Класс Deposit 1416
Е.13. Тестовая программа ATMCaseStudy.cpp 1420
Е.14. Заключение 1420
Приложение Ж. UML 2. Дополнительные типы диаграмм 1421
Ж.1. Введение 1421
Ж.2. Дополнительные типы диаграмм 1421
Приложение 3. Ресурсы в Internet и Web 1423
3.1. Ресурсы 1423
3.2. Учебные руководства 1425
3.3. FAQ (часто задаваемые вопросы) 1426
3.4. Visual C++ 1426
3.5. Группы новостей 1426
3.6. Компиляторы и инструменты разработки 1427
Техническая литература 1429
Предметный указатель 1435