#include <iostream>

#include <iomanip>

#include <string>

#include <vector>

using namespace std;

// TableFormatter выдает в поток вывода символы типа T в форматированном

// виде.

template<typename T>

class TableFormatter {

public:

 TableFormatter(basic_ostream<T>& os) : out_(os) {}

 ~TableFormatter() {out_ << flush;}

 template<typename valT>

 void writeTableRow(const vector<valT>& v, int width);

 //...

private:

 basic_ostream<T>& out_;

};

template<typename T, // ссылается на список параметров шаблона класса

 typename valT>      // ссылается на список параметров функции-члена

void TableFormatter<T>::writeTableRow(const std::vector<valT>& v,

 int width) {

 ios_base::fmtflags flags = out_.flags();

 out_.flush();

 out_ << setprecision(2) << fixed; // Задать точность в случае применения

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

 for (vector<valT>::const_iterator p = v.begin(); p != v.end(); ++p)

  out_ << setw(width) << left << *p; // Установить ширину поля, его

                                     // выравнивание и записать элемент

  out_ << endl; // Очистить буфер

 out setf(flags); // Восстановить стандартное состояние флагов

}

int main() {

 TableFormatter<char> fmt(cout);

 vector<string> vs;

 vs.push_back('Sunday');

 vs.push_back('Monday');

 vs.push_back('Tuesday');

 fmt.writeTableRow(vs, 12);

 fmt.writeTableRow(vs, 12);

 fmt.writeTableRow(vs, 12);

 vector<double> vd;

 vd.push_back(4.0);

 vd.push_back(3.0);

 vd.push_back(2.0);

 vd.push_back(1.0);

 fmt.writeTableRow(vd, 5);

}

Вывод представленной в примере 10.2 программы выглядит следующим образом.

Sunday     Monday      Tuesday

4.00 3.00 2.00 1.00

Смотри также

Таблица 10.1, рецепт 10.2.

10.2. Форматирование вывода чисел с плавающей точкой

Проблема

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

Решение

Используйте стандартные манипуляторы, определенные в <iomanip> и <ios>, для управления форматом значений чисел с плавающей точкой при их записи в поток. Это можно делать очень многими способами, и в примере 10.3 предлагается несколько способов отображения значения числа «пи».

Пример 10.3. Форматирование числа «пи»

#include <iostream>

#include <iomanip>

#include <string>

using namespace std;

int main() {

 ios_base::fmtflags flags = // Сохранить старые флаги

 cout.flags();

 double pi = 3.14285714;

 cout << 'pi = ' << setprecision(5) // Обычный (стандартный) режим;

  << pi << ' ';                    // показать только 5 цифр в сумме

                                    // по обе стороны от точки.

 cout << 'pi = ' << fixed // Режим чисел с фиксированной точкой;

  << showpos              // выдать '+' для положительных чисел.

  << setprecision(3)      // показать 3 цифры *справа* от

  << pi << ' ';          // десятичной точки.

 cout << 'pi = ' << scientific // Режим научного представления;

  << noshowpos                 // знак плюс больше не выдается

  << pi * 1000 << ' ';

 cout.flags(flags); // Восстановить значения флагов

}

Это приведет к получению следующего результата.

pi = 3.1429

pi = +3.143

pi = 3.143е+003

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату