ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 2) онлайн

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

Мы уже говорили о том, что манипуляторы — это особые операции, использу- емые совместно с операцией вставки << для того, чтобы видоизменять вывод, ко- торый делает программа. Мы познакомились с манипулятором endl, а теперь вве- дем в рассмотрение еще один манипулятор — setw, который изменяет ширину поля вывода.

Можно рассматривать каждую переменную, выводимую с помощью объекта cout, как занимающую некоторое поле — воображаемое пространство с опреде- ленной длиной. По умолчанию такое поле имеет достаточный размер для того, чтобы хранить нужную переменную. Так, например, целое число 567 займет размер в 3 символа, а текстовая строка "pajamas" — 7 символов. Разумеется, су- ществуют ситуации, когда подобный механизм не является удобным. Приведем пример программы WIDTH1, печатающей названия городов и численность их на- селения в виде двух столбцов:

//width1.cpp

//демонстрирует необходимость применения манипулятора setw #include <iostream> using namespace std;

int main() {

long pop1 = 4789426, pop2 = 274124, pop3 = 9761;

cout << "Город " << "Нас." << endl

<<"Москва " << pop1 <<endl

<<"Киров " << pop2 <<endl

<<"Угрюмовка " <<pop3 <<endl;

return 0;

}

Вывод программы будет выглядеть следующим образом:

Город Нас. Москва 4789426 Киров 274124 Угрюмовка 9761

Очевиден недостаток такого формата печати: очень неудобно визуально срав- нивать числа между собой. Было бы гораздо приятней читать печатаемую ин- формацию, если бы второй столбец был выровнен по правому краю. Но тогда нам пришлось бы вставлять в имена городов нужное количество пробелов, что также неудобно. Теперь мы приведем пример программы .WIDTH2, решающей данную проблему путем использования манипулятора setw. который определяет длину полей имен городов и численности населения:

//width2.cpp

//применение манипулятора setw #include <iostream>

#include <iomanip>       // для использования setw

using namespace std;

int main() {

long pop1 = 8425785, pop2 = 47, pop3 = 9761;

cout << setw(9) << "Город" << setw(12) << "Население" << endl

<< setw(9) << "Москва" << setw(12) << pop1 << endl << setw(9) << "Киров" << setw(12) << pop2 << endl << setw(9) << "Угрюмовка" << setw(12) << pop3 << endl; return 0;

}

Манипулятор setw печатает число или строку, следующую за ним в потоке, в поле фиксированной длины n, где n — аргумент манипулятора setw(n). Значе- ние переменной, помещаемой в поле, выравнивается справа. Рисунок 2.8 демон- стрирует, как это делается. Для того чтобы избежать переполнения значения переменной, хранящей численность населения города, в низкоразрядных опера- ционных системах для такой переменной определен тип long.

Рис. 2.8. Длина полей и setw

Вот результат работы программы WIDTH2:

    Город   Население

   Москва     8425785

    Киров          47

Угрюмовка        9761

 

43