Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 38
Текст из файла (страница 38)
В следующей программе показано, как с помощью функций установки флагов формата ввода/вывода С++ создать выровненную таблицу чисел: // Создание таблицы квадратных корней и квадратов Ътпс1ис)е <1овт.леал> й1пс)иде <стас)т> ив1пя патлеарасе аМг 1пб тла1пО доиЫе х; сопл.ртес1в1оп(4); соит « "х вцг1(х) х"21п1п"р вот(х = 2.0; х с= 20.0; х++) соцб.иЫв)т(7) р СООо « Х « сопб. иЫЕЬ (7); сорб « вт(кс (х) « сопб.ыфбСЬ(7); соцб « х"х « "хп"; кеспгп 0; После выполнения программы на экран выводится следующее: х вове (х) х2 1.4! 4 4 1. 732 9 Самоучитель Сч-ч.
1. Разработайте программу для печати таблицы натуральных и десятичных логарифмов чисел от 2 до 100. Формат таблицы следующий: правое выравнивание, ширина поля — 10 символов, точность — 5 десятичных позиций. 2. Создайте функцию серег(~ со следующим прототипом: ъоЫ сеосет 1с?вт *а) Эта функция должна устанавливать заданную строку в центр экрана. Для реализации этой задачи воспользуйтесь функцией жйй().
Предполагается, что ширина экрана равна 80 символам. (Для простоты считайте, что длина строки не превышает 80 символов.) Напишите программу, иллюстрирующую работу этой функции. 3. Поэкспериментируйте с флагами и функциями формата. После того как вы ближе познакомитесь с системой ввода/вывода С++, вы никогда не ошибетесь в выборе нужного формата вывода. 8.4. Манипуляторы ввода/вывода В системе ввода/вывода С++ имеется еще один способ форматирования информации. Этот способ подразумевает использование специальных функций — манипуляторов ввода/вывода (1/Отатри!а?ога). Как вы увидите далее, манипуляторы ввода/вывода являются, в некоторых ситуациях, более удобными, чем флаги и функции формата класса 1оз.
4 5 б 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 16 2. 236 25 2. 449 36 2. 646 49 2. 828 64 3 81 3. 162 100 3. 317 121 3.464 144 3. 606 169 3. 742 196 3. 873 225 4 256 4. 123 289 4.243 324 4. 359 361 4. 472 400 Манипуляторы ввода/вывода являются специальными функциями формата ввода/вывода, которые, в отличие от функций — членов класса 1оз, могут располагаться внутри инструкций ввода/вывода. Стандартные манипуляторы показаны в табл. 8.1. Как можно заметить при изучении таблицы, значительная часть манипуляторов ввода/вывода по своим действиям аналогична соответствующим функциям — членам класса 1ов. Многие манипуляторы, представленные в табл.
8.1, стали частью языка совсем недавно, после появления стандарта Яапс!агс1 С++, и поддерживаются только современными компиляторами. Для доступа к манипуляторам с параметрами (таким, как функция ве(1у()), необходимо включить в программу заголовок <!огпап1р>. В этом заголовке нет необходимости при использовании манипуляторов без параметров. Как уже установлено, манипуляторы можно задавать внутри цепочки опера- ций ввода/вывода. Например: сощ «ос1 « 100 « Ьех «100; сош «зе1ъч(10) « 100; Первая инструкция сообщает потоку сов1 о необходимости вывода целых в восьмеричной системе счисления и выводит число 100 в восьмеричной системе счисления.
Затем она сообщает потоку ввода/вывода о необходимости вывода целых в шестнадцатеричной системе счисления и далее осуществляется вывод числа 100 уже в шестнадцатеричном формате. Во второй инструкции устанавливается ширина поля равная 10, и затем снова выводится 100 в шестнадцатеричном формате. Обратите внимание, если используется манипулятор без аргументов (в данном примере им является манипулятор ос1), скобки за ним не ставятся, поскольку это на самом деле адрес манипулятора, передаваемый перегруженному оператору <<. Таблица В. 'т.
Манипуляторы ввода/выводаязыка Вгапдатс!С++ Ввод/Вывод Манипулятор Назначение Ьоо!а!рпа Установка флага Ьоо!а!рпа Установка флага с!ее г!ес Вывод символа новой строки и очистка потока епо! епс!в Вывод значения !чО!.! Установка флага 1!хег! Очистка потока 1!хег! Установка флага Ьех Установка флага !п1егпа! Установка флага !е11 Сброс флага Ьоо!а!рпа Ьех !п1егпа! !ей поЬоо!а!рна Глава В. Введение в систему ввода/вывода С++ Ввод/Вывод Ввод/Вывод Вывод Вывод Вывод Вывод Ввод/Вывод Вывод Вывод Ввод/Вывод Самоучитель С++ 256 Таблица 8, 1(продолжение) Манипулятор Назначение Ввод/Вывод Вывод Вывод Вывод Ввод ест гезенозиацз(тгптйвцз Л пцг( зс~епббс зетЬазе (~и( основание) Ввод/Вывод Вывод зе1т(В((пт сл) зейозпацз(лп(пвцз/) зе(ргес(з(оп((п( р) зегчч(~п1 чч) Задание символа заполнения сп Установка флагов, заданных параметром / Задание числа цифр точности равным р Задание ширины поля равным и позиций Установка флага зпоиЬазе Ввод/Вы вод Вывод Вывод Вывод Вывод Вывод зпоиЬззе зпоироа~ зпоироз зк!риз опйЬФ Ввод Вывод Вывод Ввод цррегсазе из Запомните, что манипулятор ввода/вывода влияет только на поток, частью которого является выражение ввода/вывода, содержащего манипулятор.
Ма- нипуляторы ввода/вывода не влияют на все, открытые в данный момент, потоки. Как отмечалось в предыдущем примере, главным преимуществом манипуляторов по сравнению с функциями — членами класса юз является то, что манипуляторы обычно удобнее, так как позволяют писать более компактные программы. Если вы с помощью манипулятора хотите установить конкретные флаги формата, используйте функцию зейовйа~зО. Этот манипулятор реализует ту же функцию, что и функция-член зе0(). Для сброса флагов формата используйте манипулятор гезе$юзг1щзо.
Этот манипулятор эквивалентен функции ипзе1Г(). позйоиЬазе позпоиро~пт позпоироз пози(риз поцп!йхЛ поиррегсазе Сброс флага зпоиЬазе Сброс флага зпоччро(п( Сброс флага зйоччроз Сброс флага зк(риз Сброс флага цпйЬи( Сброс флага оррегсазе Установка флага ос( Сброс флагов, заданных параметром / Установка флага пцЬ( Установка флага зс(ела Задание основания системы счисления Установка флага зйоиро!и( Установка флага зпоироз Установка флага зк(риз Установка флага цпйЬи( Установка флага иррегсазе Пропуск начальных пробелов Вывод Вывод Ввод/Вывод Ввод/Вывод Вывод Вывод Глава 8.
Введение в систему ввода/вывода С++ ::.=,"ПрИМЕрЫ('.т В этой программе представлено несколько манипуляторов ввода/вывода: ((1пс1пбе <1оялгеал1> ()1пс1цбе <1опап1р> пя1пд пагзеярасе яка; 1пб паьп() соцс « )тех « 100 « епб1; соыГ. « ос~ << 10 << епб1; сон~ << яеей111('Х" ) << яеви(10); соне « 100 « " привет " « епб1; ебцгп 0; После выполнения программы на экран выводится слелуюшее: б4 12 ХХХХХХХ)44 привет 2. Здесь представлена другая версия программы, в которой на экран выводится таблица квадратов и квадратных корней чисел от 2 до 20. В этой версии вместо функций-членов и флагов формата используются манипуляторы ввода/вывода. /" Н этой версии для вывода таблицы квадратов и квадратных корней используются манипуляторы * ()тпс1цбе <1ояегеатп> 41пс1ибе <1отаптр> 41пс1ибе <апас)~> ця1пд папеярасе ябб; 1пб ~па1л() боп)>1е х; сонг « яевр есбябоп(4); сонг « "х яс(гг.(х) х"2~Мп"; аког(х = 2.0р х <= 20.0; х++) соцб « весы(7) « х « сонг « веги(7) « яс(гг(х) « соцс « яелы(7) « х*х « '1п'; Самоучитель гегпгп О; 3.
Одним из самых интересных флагов формата новой библиотеки ввода/вывода является флаг Ьоо1а1рЬа. Этот флаг можно установить либо непосредственно, либо с помощью манипулятора Ьоо1а1рЬа. Интересным этот флаг делает то, что он позволяет реализовать ввод и вывод значений булсва типа, т. е. ключевых слов багие и (а(ве, вместо которых раньше обычно приходилось использовать соответственно 1 для истинного значения и 0 для ложного.
Использование флага формата Ьоо1а1рЬа ((1пс1вс(е <тозггеага> цаги патеврасе вгг(~ 1пг пагп() ( Ьоо1 Ь; сопс « "Перед установкой флага формата Ьоо1а1рЬа: Ь = Ьгпе; соус « Ь « Ь = Юа1ае; сопЬ « Ь « епс(1; сонг « "после установки флага формата Ьоо1а1рЬа: Ь = ггпе; сепг « Ьоо1а1рЬа «Ь « Ь = га1ае; сон « Ь « епс(1; сепг « "Введите значение булева типа: сгп » Ьоо1а1рЬа » Ь; // здесь можно ввести Ггие или га1зе сепг « "Введенное значение: " « Ь; гегпгп О; Примерный результат работы программы: Перед установкой флага формата Ьоо!а1рЬа: 1 О После установки флага формата Ьоо1а1рЬа: 1гие Га1вс Введите значение булева типа: ггие Введенное значение: 1гие Как видите, после установки флага формата Ьоо1а1рЬа, для обозначения вводимых и выводимых значений булева типа используются ключевые слова 1гве и (а(ве.
Отметьте, что флаг формата Ьоо1а1рЬа необходимо устанавливать отдельно для потока с(п и отдельно для потока сонг. Как и в случае с другими флагами формата, установка флага Ьоо(а(рЬа для одного потока вовсе не подразумевает его автоматической установки для другого потока. Глава 8.
Введение в систему ввода/вывода С.ь~- 1. Выполните еще раз упражнения 1 и 2 из раздела 8.3, только теперь, вместо функций-членов и флагов формата, используйте манипуляторы ввода/вывода. 2. Составьте инструкцию для вывода числа 100 в шестнадцатеричной системе счисления с отображением основания системы счисления (Ох). Для выполнения задания воспользуйтесь манипулятором веФювйау~), 3. Объясните, что дает установка флага Ьоо1а!рЬа. 8.5. Пользовательские Функции вывода Как уже отмечалось в этой книге, одним из доводов в пользу использования операторов ввода/вывода С++, вместо аналогичных им функций ввода/вывода С, является возможность перегрузки операторов ввода/вывода для создаваемых вами классов.
В этом разделе вы узнаете, как перегрузить оператор вывода «. В языке С++ вывод иногда называется вставкой (/пвйоп), а оператор «вЂ” оператором вставки (т5егг/оп орегагог). Когда вы для вывода информации перегружаете оператор «, вы создаете функцию вставки Г!пвегтвг/ипсИапили (пввггвг). Рациональность этим терминам дает то, что оператор вывода вставляет (июгв)информацию в поток.
Во избежание путаницы мы будем называть функцию вставки пользовательской функцией вывода. У всех пользовательских функций вывода следующая основная форма: оеъкеага йорекаЕок« (оескеат гяскеат, ииа класса объект) // тело пользовательской $ункции вывода гегот.п яекеаай/ Первый параметр является ссылкой на объект типа овггеапт. Это означает, что поток 5ггеат должен быть потоком вывода. (Запомните, класс озггеагп является производным от класса 1ов.) Второй параметр получает выводимый объект. (Он, если для вашего приложения это нужно, тоже может быть параметром-ссылкой). Обратите внимание, что пользовательская функция вывода возвращает ссылку на поток вггеат, который имеет тип овггеапт.
Это необходимо, если перегруженный оператор « должен использоваться в ряде последовательных выражений ввода/вывода: соот. « оо1 «оЪ2 « оЪЗ; Внутри пользовательской функции вывода можно выполнить любую процедуру. То, что будет делать эта функция, полностью зависит от вас. Однако Самоучитель С++ 260 в соответствии с хорошим стилем программирования, следует ограничить задачи пользовательской функции вывода только вставкой информации в поток. Хотя это на первый взгляд может показаться странным, но пользовательская функция вывода не может быть членом класса, для работы с которым она создана. И вот почему.