Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В цикле for
происходит вызов функции lround(n(е))
для округления возвращенного вызовом n(е)
значения до ближайшего целого числа. Получив целое число, соответствующее случайному числу с плавающей точкой, используем его для индексирования вектора счетчиков. Поскольку вызов n(е)
может создавать числа и вне диапазона от 0 до 9, проверим полученное число на принадлежность диапазону прежде, чем использовать его для индексирования вектора vals
. Если число принадлежит диапазону, увеличиваем соответствующий счетчик.
Когда цикл заканчивается, вывод содержимого вектора vals
выглядит следующим образом:
0: ***
1: ********
2: ********************
3: **************************************
4: **********************************************************
5: ******************************************
6: ***********************
7: *******
8: *
Выведенные строки содержат столько звездочек, сколько раз встретилось соответствующее значение, созданное генератором случайных чисел. Обратите внимание: эта фигура не совершенно симметрична. Если бы она была симметрична, то возникли бы подозрения в качестве генератора случайных чисел.
bernoulli_distribution
Как уже упоминалось, есть одно распределение, которое не получает параметр шаблона. Это распределение bernoulli_distribution
, являющееся обычным классом, а не шаблоном. Это распределение всегда возвращает логическое значение true
с заданной вероятностью. По умолчанию это вероятность .5.
В качестве примера распределения этого вида напишем программу, которая играет с пользователем. Игру начинает один из игроков (пользователь или программа). Чтобы выбрать первого игрока, можно использовать объект класса uniform_int_distribution
с диапазоном от 0 до 1. В качестве альтернативы этот выбор можно сделать, используя распределение Бернулли. С учетом, что игру начинает функция play()
, для взаимодействия с пользователем может быть использован следующий цикл:
string resp;
default_random_engine e; // e имеет состояние, поэтому располагается
// вне цикла!
bernoulli_distribution b; // по умолчанию четность 50/50
do {
bool first = b(e); // если true, программа ходит первой
cout << (first ? "We go first"
: "You get to go first") << endl;
// играть в игру, угадывая, кто ходит первым
cout << ((play(first)) ? "sorry, you lost"
: "congrats, you won") << endl;
cout << "play again? Enter 'yes' or 'no'" << endl;
} while (cin >> resp && resp[0] == 'y');
Для повторного запроса на продолжение игры используем цикл do while
(см. раздел 5.4.4).
Поскольку процессоры возвращают ту же последовательность чисел (см. раздел 17.4.1), их объявляют за пределами циклов. В противном случае при каждой итерации создавался бы новый процессор, выдающий каждый раз те же значения. Распределения также могут хранить состояние и также должны определяться вне циклов.
Одна из причин использования в этой программе распределения bernoulli_distribution
заключается в том, что это предоставит программе лучший шанс пойти первой:
bernoulli_distribution b(.55); // предоставить программе небольшое
// преимущество
Такое определение b
предоставит программе 55/45 шансов на первый ход.
Упражнение 17.31. Что случилось бы в программе игры данного раздела, будь объекты b
и е
определены в цикле do
?
Упражнение 17.32. Что случилось бы, будь строка resp
определена в цикле?
Упражнение 17.33. Напишите версию программы преобразования слова из раздела 11.3.6, допускающую несколько преобразований для заданного слова и случайно выбирающую применяемое преобразование.
17.5. Еще о библиотеке ввода и вывода
Глава 8 познакомила вас с базовой архитектурой и наиболее часто используемой частью библиотеки ввода-вывода. В этом разделе рассматриваются три более специализированных средства, поддерживаемых библиотекой ввода-вывода: управление форматом, не форматированный ввод-вывод и произвольный доступ.
17.5.1. Форматированный ввод и вывод
Кроме флага состояния (см. раздел 8.1.2), каждый объект iostream
имеет также флаг формата, контролирующий подробности формата ввода и вывода. Флаг формата контролирует такие аспекты, как формат записи целочисленных значений, точность значений с плавающей запятой, ширина выводимого элемента и т.д.
Библиотека определяет набор перечисленных в табл. 17.17 и 17.18 манипуляторов (manipulator) (см. раздел 1.2), изменяющих флаг формата потока. Манипулятор — это функция или объект, влияющие на состояние потока и применяемые как операнд оператора ввода или вывода. Как и операторы ввода и вывода, манипулятор возвращает потоковый объект, к которому он применяется; таким образом, можно объединить манипуляторы и данные в один оператор.
Таблица 17.17. Манипуляторы, определенные в объекте iostream
boolalpha |
Отображать значения true и false как строки |
*noboolalpha |
Отображать значения true и false как 0 и 1 |
showbase |
Создавать префикс, означающий базу целочисленных значений |
*noshowbase |
Не создавать префикс базы чисел |
showpoint |
Всегда отображать десятичную точку для значений с плавающей запятой |
*noshowpoint |
Отображать десятичную точку, только если у значения есть дробная часть |
showpos |
Отображать + для положительных чисел |
*noshowpos |
Не отображать + в неотрицательных числах |
uppercase |
Выводить 0X в шестнадцатеричной и E в экспоненциальной формах записи |
*nouppercase |
Выводить 0x в шестнадцатеричной и е в экспоненциальной формах записи |
*dec |
Отображать целочисленные значения с десятичной базой числа |
hex |
Отображать целочисленные значения с шестнадцатеричной базой числа |
oct |
Отображать целочисленные значения с восьмеричной базой числа |
left |
Добавлять дополняющие символы справа от значения |
right |
Добавлять дополняющие символы слева от значения |
internal |
Добавлять дополняющие символы между знаком и значением |
fixed |
Отображать значения с плавающей точкой в десятичном представлении |
scientific |
Отображать значения с плавающей точкой в экспоненциальном представлении |
hexfloat |
Отображать значения с плавающей точкой в шестнадцатеричном представлении (нововведение С++11) |
defaultfloat |
Вернуть формат числа с плавающей точкой в десятичный (нововведение С++11) |
unitbuf |
Сбрасывать буфер после каждой операции вывода |
*nounitbuf |
Восстановить обычный сброс буфера |
*skipws |
Пропускать отступы в операторах ввода |
noskipws |
Не пропускать отступы в операторах ввода |
flush |
Сбросить буфер объекта ostream |
ends |
Вставить нулевой символ, а затем сбросить буфер объекта ostream |
endl |
Вставить новую строку, а затем сбросить буфер объекта ostream |
*Означает стандартное состояние потока
Читать дальшеИнтервал:
Закладка: