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

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

Шрифт:

Если набрать на клавиатуре числа

1234 4d2 2322 2322

то программа выведет их так:

1234 1234 1234 1234

Обратите внимание на то, что при вводе манипуляторы

oct
,
dec
и
hex
являются персистентными, как и при выводе.

ПОПРОБУЙТЕ

Завершите фрагмент кода, приведенный выше, и преобразуйте его в программу. Попробуйте ввести предлагаемые числа; затем введите числа

1234 1234 1234 1234

Объясните результат. Попробуйте ввести другие числа, чтобы увидеть, что произойдет.

Для того чтобы принять и правильно интерпретировать префиксы

0
и
0x
, можно использовать оператор
>>
. Для этого необходимо отменить установки, принятые по умолчанию. Рассмотрим пример.

cin.unsetf(ios::dec); // не считать десятичным

// (т.е. 0x может означать

// шестнадцатеричное число)

cin.unsetf(ios::oct); // не считать восьмеричным

// (т.е. 12 может означать двенадцать)

cin.unsetf(ios::hex); // не считать шестнадцатеричным

// (т.е. 12 может означать двенадцать)

Функция-член потока

unsetf
сбрасывает флаг (или флаги), указанный как аргумент. Итак, если вы напишете

cin >>a >> b >> c >> d;

и введете

1234 0x4d2 02322 02322

то получите

1234 1234 1234 1234

11.2.3. Вывод чисел с плавающей точкой

Если вы непосредственно работаете с аппаратным обеспечением, то вам нужны шестнадцатеричные числа (и, возможно, восьмеричные). Аналогично, если вы проводите научные вычисления, то должны форматировать числа с плавающей точкой. Они обрабатываются манипуляторами потока

iostream
почти так же, как и целые числа. Рассмотрим пример.

cout << 1234.56789 << "\t\t(общий)\n" // \t\t — выравнивание столбцов

<< fixed << 1234.56789 << "\t(фиксированный)\n"

<< scientific << 1234.56789 << "\t(научный)\n";

В итоге получим следующие строки:

1234.57 (общий)

1234.567890 (фиксированный)

1.234568e+003 (научный)

Манипуляторы

fixed
и
scientific
используются для выбора форматов для представления чисел с плавающей точкой. Интересно, что в стандартной библиотеке нет манипулятора
general
, который устанавливал бы формат, принятый по умолчанию. Однако мы можем определить его сами, как это сделано в заголовочном файле
std_lib_facilities.h
. Для этого не требуются знания о внутреннем устройстве библиотеки ввода-вывода.

inline ios_base& general(ios_base& b) // фиксированный и научный

// формат

// сбрасывает все флаги формата с плавающей точкой

{

b.setf(ios_base::fmtflags(0), ios_base::floatfield);

return b;

}

Теперь можем написать следующий код:

cout << 1234.56789 << '\t'

<< fixed << 1234.56789 << '\t'

<< scientific << 1234.56789 << '\n';

cout << 1234.56789 << '\n'; // действует формат

// с плавающей точкой

cout << general << 1234.56789 << '\t' // предупреждение:

<< fixed << 1234.56789 << '\t' // general — нестандартный

// манипулятор

<< scientific << 1234.56789 << '\n';

В итоге получим следующие числа:

1234.57 1234.567890 1.234568e+003

  • Читать дальше
  • 1
  • ...
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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