Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 37
Текст из файла (страница 37)
Напишите программу, которая сохраняет текущее состояние флагов формата,устанавливает флаги showbase и hex, выводит на экран значение 100, а затемвозвращает флаги в исходное состояние.8.3. Функции width(), precision() и fill()Кроме флагов формата в классе ios определены три функции-члена. Этифункции устанавливают следующие параметры формата: ширину поля, точность и символ заполнения. Этими функциями являются соответственнофункции width(), precision() и fill().По умолчанию при выводе любого значения оно занимает столько позиций,сколько символов выводится. Однако с помощью функции width() можнозадать минимальную ширину поля.
Ниже показан прототип этой функции:streamsize width(strearasize w) ;Ширина поля задается параметром и>, а функция возвращает предыдущуюширину поля. Тип данных streamsize определен в заголовочном файле252Самоучитель C++<iostream> как одна из форм целого. В некоторых компиляторах при выполнении каждой операции вывода значение ширины поля возвращается ксвоему состоянию по умолчанию, поэтому перед каждой инструкцией вывода может понадобиться устанавливать минимальную ширину поля.После установки минимальной ширины поля, если выводимое значениетребует поле, меньшее заданной ширины, остаток поля заполняется текущим символом заполнения (по умолчанию пробелом) так, чтобы была занята вся ширина поля.
Однако запомните, если размер выводимого значенияпревосходит минимальную ширину поля, будет занято столько символов,сколько нужно. Выводимое значение не усекается.По умолчанию при выводе значений с плавающей точкой точность равнашести цифрам. Однако с помощью функции precisionQ это число можноизменить. Ниже показан прототип функции precisionQ:streamsize precision(streamsize p);Точность (число выводимых цифр после запятой) задается параметром р, авозвращает функция прежнее значение точности.По умолчанию, если требуется заполнить свободные поля, используютсяпробелы. Однако с помощью функции Ш1() можно изменить символ заполнения. Ниже показан прототип функции fill():char fill(char ch);После вызова функции fjllQ символ ch становится новым символом заполнения, а функция возвращает прежнее значение символа заполнения.1. В этом примере показана программа, которая иллюстрирует работу функцийформата:#include <iostream>using namespace std;int main(){cout.width(10); // установка минимальной ширины поляcout « "Привет" « '\n'; // по умолчанию выравнивание вправоcout.fill('%'); // установка символа заполненияcout.width(10); // установка ширины поляcout « "Привет" « '\п'; // по умолчанию выравнивание вправоcout.setf(ios::left); // выравнивание влевоcout.width(10); // установка ширины поляcout « "Привет" « '\п'; // выравнивание влевоГлава 8.
Введение в систему ввода/вывода C++253cout.width(10); // установка ширины поляcout.precision(lO); // установка точности в 10 цифрcout « 123.234567 « т\п';cout.width(lO); // установка ширины поляcout.precision(6); // установка точности в 6 цифрcout « 123.234567 « '\п';return 0;После выполнения программы на экран выводится следующее:ПриветПривет%%%%123.234567123.235%%%Обратите внимание, что ширина поля устанавливается перед каждой инструкцией вывода.2. В следующей программе показано, как с помощью функций установки флагов формата ввода/вывода C++ создать выровненную таблицу чисел:// Создание таблицы квадратных корней и квадратов^include <iostream>ftinclude <cmath>using namespace std;int main()double x;cout.precision(4);cout « "xsqrt(x)Ax 2\n\n";for(x = 2.0; x <= 20.0; x++) {cout.width(7);COUt « X « " ";cout.width(7);cout « sqrt(x) « " ";cout.width(7);cout « x*x « "\n";1,return 0;После выполнения программы на экран выводится следующее:xsqrt(x)x2231.4141Л3249Самоучитель C++254456789101112131415161718192022.
2362. 4492. 6462. 82833. 1623. 3173.4643. 6063. 7423. 87344. 1234 .2434. 3594. 472162536496481100121144169196225256289324361400.УпраАнениения)1. Разработайте программу для печати таблицы натуральных и десятичных логарифмов чисел от 2 до 100. Формат таблицы следующий: правое выравнивание, ширина поля — 10 символов, точность — 5 десятичных позиций.2. Создайте функцию center() со следующим прототипом:void center (char *s) ;Эта функция должна устанавливать заданную строку в центр экрана.
Дляреализации этой задачи воспользуйтесь функцией width(). Предполагается,что ширина экрана равна 80 символам. (Для простоты считайте, что длинастроки не превышает 80 символов.) Напишите программу, иллюстрирующуюработу этой функции.3. Поэкспериментируйте с флагами и функциями формата. После того как выближе познакомитесь с системой ввода/вывода C++, вы никогда не ошибетесь в выборе нужного формата вывода.8.4. Манипуляторы ввода/выводаВ системе ввода/вывода C++ имеется еще один способ форматированияинформации. Этот способ подразумевает использование специальных функций — манипуляторов ввода/вывода (I/O manipulators). Как вы увидите далее,манипуляторы ввода/вывода являются, в некоторых ситуациях, более удобными, чем флаги и функции формата класса ios.Глава 8. Введение в систему ввода/вывода C++255Манипуляторы ввода/вывода являются специальными функциями форматаввода/вывода, которые, в отличие от функций — членов класса ios, могутрасполагаться внутри инструкций ввода/вывода.
Стандартные манипуляторыпоказаны в табл. 8.1. Как можно заметить при изучении таблицы, значительная часть манипуляторов ввода/вывода по своим действиям аналогичнасоответствующим функциям — членам класса ios. Многие манипуляторы,представленные в табл. 8.1, стали частью языка совсем недавно, после появления стандарта Standard C++, и поддерживаются только современнымикомпиляторами.Для доступа к манипуляторам с параметрами (таким, как функция setw()),необходимо включить в программу заголовок <iomanip>. В этом заголовкенет необходимости при использовании манипуляторов без параметров.Как уже установлено, манипуляторы можно задавать внутри цепочки операций ввода/вывода. Например:cout « oct « 100 « hex « 100;cout « setw(10) « 100;Первая инструкция сообщает потоку cout о необходимости вывода целых ввосьмеричной системе счисления и выводит число 100 в восьмеричной системесчисления.
Затем она сообщает потоку ввода/вывода о необходимости выводацелых в шестнадцатеричной системе счисления и далее осуществляется выводчисла 100 уже в шестнадцатеричном формате. Во второй инструкции устанавливается ширина поля равная 10, и затем снова выводится 100 в шестнадцатеричном формате.
Обратите внимание, если используется манипулятор безаргументов (в данном примере им является манипулятор oct), скобки за ним неставятся, поскольку это на самом деле адрес манипулятора, передаваемый перегруженному оператору «.Таблица 8.1. Манипуляторы ввода/вывода языка Standard C++МанипуляторНазначениеВвод/ВыводboolalphaУстановка флага boolalphaВвод/ВыводdecУстановка флага decВвод/ВыводendlВывод символа новой строки и очисткапотокаВыводendsВывод значения NULLВыводfixedУстановка флага fixedВыводflushОчистка потокаВыводhexУстановка флага hexВ вод/ Вы водinternalУстановка флага internalВыводleftУстановка флага leftВыводnoboolalphaСброс флага boolalphaВвод/ВыводСамоучитель C++256Таблица 8.
1 (продолжение)МанипуляторНазначениеВвод/ВыводnoshowbaseСброс флага showbaseВыводnoshowpointСброс флага showpointВыводnoshowposСброс флага showposВыводnoskipwsСброс флага skipwsВводnounitbufСброс флага unitbufВыводnouppercaseСброс флага uppercaseВыводoctУстановка флага octВвод/ Вы водresetiosflagsffmtflags f)Сброс флагов, заданных параметром fВвод/ВыводrightУстановка флага rightВыводscientificУстановка флага scientificВыводsetbase (int основание)Задание основания системы счисленияВвод/Выводsetfill(int с/т)Задание символа заполнения с/тВыводsetiosf lag s(fmtf lags f)Установка флагов, заданных параметром fВвод/Выводsetprecision(int p)Задание числа цифр точности равным рВыводsetw(int w)Задание ширины поля равным w позицийВыводshowbaseУстановка флага showbaseВыводshowpointУстановка флага showpointВыводshowposУстановка флага showposВыводskipwsУстановка флага skipwsВводunitbufУстановка флага unitbufВыводuppercaseУстановка флага uppercaseВыводwsПропуск начальных пробеловВводЗапомните, что манипулятор ввода/вывода влияет только на поток, частьюкоторого является выражение ввода/вывода, содержащего манипулятор.
Манипуляторы ввода/вывода не влияют на все, открытые в данный момент,потоки.Как отмечалось в предыдущем примере, главным преимуществом манипуляторов по сравнению с функциями — членами класса ios является то, что манипуляторы обычно удобнее, так как позволяют писать более компактныепрограммы.Если вы с помощью манипулятора хотите установить конкретные флагиформата, используйте функцию setiosflagsQ.
Этот манипулятор реализует туже функцию, что и функция-член setf(). Для сброса флагов формата используйте манипулятор resetiosflags(). Этот манипулятор эквивалентен функцииunsetfQ.Глава 8. Введение в систему ввода/вывода C++257Примеры__—^\. В этой программе представлено несколько манипуляторов ввода/вывода:#include <iostream>^include <iomanip>using namespace std;int main()!cout « hex « 100 « endl;cout « oct « 10 « endl;cout « setfill('X') « setw(lO);cout « 100 « " привет " « endl;return 0;После выполнения программы на экран выводится следующее:6412ХХХХХХХ144привет2. Здесь представлена другая версия программы, в которой на экран выводитсятаблица квадратов и квадратных корней чисел от 2 до 20.
В этой версии вместо функций-членов и флагов формата используются манипуляторы ввода/вывода./* В этой версии для вывода таблицы квадратов и квадратных корнейиспользуются манипуляторы*/^include <iostream>^include <iomanip>^include <cmath>using namespace std;int main()double x;cout « setprecision(4);cout « "xsqrt(x)xA2\n\n";for(x = 2.0; x <= 20.0; x++) {cout « setw("7) « x « " ";cout « setw(7) « sqrt(x) « " ";cout « setw(7) « x*x « '\n';258_Самоучитель^C++return 0;3. Одним из самых интересных флагов формата новой библиотеки ввода/вывода является флаг boolalpha.
Этот флаг можно установить либо непосредственно, либо с помощью манипулятора boolalpha. Интересным этот флаг делает то, что он позволяет реализовать ввод и вывод значений булева типа, т. е.ключевых слов true и false, вместо которых раньше обычно приходилось использовать соответственно 1 для истинного значения и 0 для ложного.// Использование флага формата boolalpha^include <iostream>using namespace std;int main ( )Ibool b;cout « "Перед установкой флага формата boolalpha: ";b = true;cout « b « " ";b = false;cout « b « endl;cout « "После установки флага формата boolalpha: ";b = true;cout « boolalpha « b « " ";b = false;cout « b « endl;cout « "Введите значение булева типа: ";cin » boolalpha » b; // здесь можно ввести true или falsecout « "Введенное значение: " « b;return 0;Примерный результат работы программы:Перед установкой флага формата boolalpha: 1 ОПосле установки флага формата boolalpha: true f a l s eВведите значение булева типа: trueВведенное значение: trueКак видите, после установки флага формата boolalpha, для обозначения вводимых и выводимых значений булева типа используются ключевые слова trueи false.
Отметьте, что флаг формата boolalpha необходимо устанавливать отдельно для потока cin и отдельно для потока cout. Как и в случае с другимифлагами формата, установка флага boolalpha для одного потока вовсе не подразумевает его автоматической установки для другого потока.Глава 8. Введение в систему ввода/вывода C++2591. Выполните еще раз упражнения 1 и 2 из раздела 8.3, только теперь, вместофункций-членов и флагов формата, используйте манипуляторы ввода/вывода.2. Составьте инструкцию для вывода числа 100 в шестнадцатеричной системесчисления с отображением основания системы счисления (Ох).