Читаем Программирование полностью

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

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 

<p id="AutBody_Root197"><strong>11.2.3. Вывод чисел с плавающей точкой</strong></p>

 Если вы непосредственно работаете с аппаратным обеспечением, то вам нужны шестнадцатеричные числа (и, возможно, восьмеричные). Аналогично, если вы проводите научные вычисления, то должны форматировать числа с плавающей точкой. Они обрабатываются манипуляторами потока 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.234568e+003   // манипулятор научного формата является

                // персистентным

1234.57 1234.567890 1.234568e+003

Итак, существует несколько манипуляторов для работы с числами с плавающей точкой.

<p id="AutBody_Root198"><strong>11.2.4. Точность</strong></p>

По умолчанию число с плавающей точкой выводится на печать с помощью шести цифр в формате general. Формат, состоящий из шести цифр (точность формата general по умолчанию), считается наиболее подходящим, а такое округление числа — наилучшим. Рассмотрим пример.

1234.567 выводится на печать как 1234.57

1.2345678 выводится на печать как 1.23457

Округление, как правило, выполняется по правилу 4/5: от 0 до 4 — округление вниз, а от 5 до 9 — вверх. Обратите внимание на то, что такое форматирование относится только к числам с плавающей точкой.

1234567 выводится на печать как 1234567 (поскольку число целое)

1234567.0 выводится на печать как 1.23457e+006

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже