Для форматирования данных можно применять различные флаги форматирования, определенные внутри класса ios, или вызывать разнообразные функции-члены.

Для установки флага используется функция setf().Например, чтобы установить флаг showpos, можно применить следующий оператор.

cout.setf(ios :: showpos);

Здесь cout это поток. Префикс ios:: перед флагом showpos необходим, поскольку флаг showposявляется перечислимой константой, определенной в классе ios.

‘::’ - оператор разрешения области видимости.

Установка флага showpos позволяет вывести знак перед положительными числами.

Установка флага showpoint позволяет выводить десятичную точку и незначащие нули при отображении десятичных чисел.

Пример 5. Следующая программа выводит на экран число 100, устанавливая флаги showpos и showpoint.

#include <iostream.h>

int main(){

cout.setf(ios :: showpoint);

cout.setf(ios :: showpos);

cout << 100.0; // Выводит число +100.0
return 0;

}

Любой вызов функции setf() связан с конкретным потоком. К аргументам функции setf() можно применять логическую операцию "ИЛИ". Например, предыдущие вызовы можно заменить одним.

cout.setf(ios::showpoint | ios::showpos);

Эта функция unsetf()используется для сброса одного или нескольких флагов формата.

Если установлен флаг scintiefic, число выводится в научном формате.

Если ус­тановлен флаг fixed, десятичное число выводится в обычном виде.

При выводе чисел в научном формате буква е по умолчанию выводится как строчная. Кроме того, буква х в восьмеричном представлении чисел также считается строчной. Если необходимо вывести эти буквы как прописные, следует установить флаг uppercase.

Пример 6. Функция unsetf () иллюстрируется следующей программой. Сначала она устанавливает флаги uppercase и scientific, затем выводит число 100.12 в научном формате. В данном случае научный формат числа содержит прописную букву "Е". После этого программа сбрасывает флаг uppercase и снова выводит число 100.12 в научном формате, на этот раз используя строчную букву "е".

#include <iostream.h>

int main(){

cout.setf (ios :: uppercase | ios :: scientific);

cout << 100.12; // Выводит число 1.0012Е+02

cout.unsetf(ios :: uppercase); // Сбрасывает флаг uppercase

cout << " \n" << 100.12; // Выводит число 1.0012е+02

return 0;

}

Если установлен флаг left, строки вывода выравниваются по левому краю.

Если установлен флаг right, строки вывода выравниваются по правому краю.

Если уста­новлен флаг internal, между знаком числа и его первой цифрой пробелы вставляют­ся так, чтобы число заполнило собой все поле вывода.

По умолчанию числовые значения выводятся в десятичном виде. Однако основа­ние системы счисления можно изменить. Для вывода восьмеричных чисел предназна­чен флаг oct. Установка флага hex позволяет выводить числа в шестнадцатеричном виде. Вывод чисел в десятичном формате обеспечивается флагом dec.

Установка флага showbase позволяет вывести на экран основание системы счисления. Например, при выводе шестнадцатеричных чисел значение 1F будет представлено как Ox1F.

Функция flags()позволяет устанавливать все флаги формата, связанные с потоком.

Пример 7. Сначала flags() создает битовую маску, в которой установлены флаги showpos, showbase, oct и right. Все остальные флаги сброшены. Затем для установки флагов форматирова­ния, связанных с потоком cout, используется функция flags().

#include <iostream.h>

int main(){

cout << 100.12;

// Флаги showpos, showbase, oct и right установлены, остальные сброшены.

long int f = ios :: showpos | ios :: showbase | ios :: oct | ios :: right;

cout.flags(f); // Задается состояние всех флагов.

cout << 100.12;

return 0;

}

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

Поскольку числа обычно выводятся в десятичном, восьмеричном и шестнадцате­ричном виде, поля dec, oct и hexназывают общим именем basefield. Аналогично поля left, right и internal называют adjustfield. Кроме того, поля scientific и fixedобъединяют общим именем floatfield.

В классе ios предусмотрены три функции-члена, позволяющие изменять ширину поля вывода, точность и символ-заполнитель. Они называются width(), preci­sion() и fill() соответственно.

Функция width()из­меняет минимальную ширину поля вывода, т. е. количество позиций, которые занимает число при выводе.

При выводе действительных чисел можно задавать количество цифр после десятичной точки (точность числа), используя функцию precision().По умолчанию после десятичной точки выводится 6 цифр. В некоторых реализациях это значение следует задавать перед каждым выводом, ина­че будет использоваться точность, предусмотренная по умолчанию.

Кроме того, если поле вывода не заполнено, оно автоматически дополняется про­белами. Символ-заполнитель можно изменить, использовав функцию fill().

Пример 8. Программа иллюстрирует применение этих функций.

#include <iostream.h>

int main()

{ cout.precision(4) ;

cout.width(10);

cout << 10.12345 << "\n"; // Выводит на экран 10.12

cout.fill('*');

cout.width(10);

cout << 10.12345 << "\n"; // Выводит на экран *****10.12

// Ширина поля вывода распространяется и на строки

cout.width(10);

cout << "Hi!" << "\n"; // Выводит *******Hi!

cout.width(10);

cout.setf(ios :: left); // Выравнивает по левому краю

cout << 10.12345; // Выводит на экран 10.12*****

return 0;

} Результат работы этой программы выглядит так.

10.12

*****10.12

*******Hi!

10.12*****

Пример 9. Программа просит пользователя ввести свое имя и затем приветствует его.

#include <iostream.h>

int main() {

char name [8.0];

cout<< "Enter your name: ";

cin>> name;

cout <<"Hello " << name<< "!";

return 0;

}

Практическая часть

1 Изучите теоретическую часть и подробно разберите примеры программ.

3 Составьте программу на языке С/С++, которая просит пользователя ввести свое имя, приветствует его, затем решает задачу в соответствии с одним из вариантов заданий, выдает результат в виде подробного полного сообщения и с добрыми пожеланиями прощается с пользователем по имени. Реализуйте два варианта программы: используя систему ввода/вывода в стиле языка С и в стиле языка С++.

Варианты заданий

1 Вычислите площадь параллелограмма при условии, что известна длина и ширина.

2 Вычислите объем параллелепипеда, если известна длинна, ширина, высота.

3 Вычислите координаты середины отрезка (a, b), если отрезки заданы координатами своих концов.

4 Вычислите площадь треугольника, если известны длины его сторон.

5 Вычислите площадь трапеции, если известны основания a, b и высота h.

6 Найдите сумму, разность, произведение и частное двух целых чисел.

7 Найдите корень квадратный от суммы двух вещественных чисел.

8 Составьте алгоритм пересчета веса из фунтов в килограммы ( 1 фунт равняется 409,5 гр).

4 Оформите отчет по выполнению практической работы, в котором отразите: номер работы, тему, цель, задание, листинг программ, краткие выводы, ответы на вопросы.

Вопросы для контроля

1. Какие операторы ввода/вывода символов и строк используются в языке С/С++?

2. Какие модификаторы спецификаторов ввода/вывода вы знаете?

Литература

1. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб. : Питер, 2011. – 461 с.

2. Шилдт Г. Полный справочник по С++, 4-е издание. : Пер. с англ. – М. : Издательский дом «Вильям», 2012. – 800 с.

Практическая работа № 8

Тема: Форматированный ввод-вывод на консоль.

Цель: Научиться составлять на языке программирования С++ простейшие программы, реализующие ввод/вывод данных на консоль.

Оборудование и программное обеспечение:

1 Персональный компьютер IBM PC/AT.

2 Операционная система Windows XP.

3 Среда программирования С++.

Теоретическая часть

Каждый поток связан с набором флагов формата, управляющих представлением информации. Класс iosобъявляет битовую маску под названием fmtflags,значения которой используются для установки и сброса флагов формата.

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

Если установлен флаг left, строки вывода выравниваются по левому краю.

Если установлен флаг right, строки вывода выравниваются по правому краю.

Если уста­новлен флаг internal, между знаком числа и его первой цифрой пробелы вставляют­ся так, чтобы число заполнило собой все поле вывода.

Если ни один из этих флагов не установлен, по умолчанию выполняется выравнивание по правому краю.

По умолчанию числовые значения выводятся в десятичном виде. Однако основа­ние системы счисления можно изменить. Для вывода восьмеричных чисел предназна­чен флаг oct. Установка флага hex позволяет выводить числа в шестнадцатеричном виде. Вывод чисел в десятичном формате обеспечивается флагом dec.

Установка флага showbase позволяет вывести на экран основание системы счисления. Например, при выводе шестнадцатеричных чисел значение 1F будет представлено как Ox 1F.

При выводе чисел в научном формате буква е по умолчанию выводится как строчная. Кроме того, буква х в восьмеричном представлении чисел также считается строчной. Если необходимо вывести эти буквы как прописные, следует установить флаг uppercase.

Установка флага showpos позволяет вывести знак перед положительными числами.

Установка флага showpoint позволяет выводить десятичную точку и незначащие нули при отображении десятичных чисел.

Если установлен флаг scintiefic, число выводится в научном формате.

Если ус­тановлен флаг fixed, десятичное число выводится в обычном виде.

Если ни один из этих флагов не установлен, компилятор сам выбирает подходящее представление чисел.

Если установлен флаг unitbuf, то после каждой операции вставки буфер очищается.

Флаг boolalpha позволяет вводить и выводить булевские значения true и false.

Поскольку числа обычно выводятся в десятичном, восьмеричном и шестнадцате­ричном виде, поля dec, oct и hexназывают общим именем basefield. Аналогично поля left, right и internal называют adjustfield. Кроме того, поля scientific и fixedобъединяют общим именем floatfield.

Для установки флага используется функция setf().

fmtflags setf ( fmtflags флаги )

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

void unsetf (fmtf lags флаги)

Иногда необходимо точно определить текущее состояние формата, не изменяя его флаги. Для этого используется функция-член flags (), которая возвра­щает текущее состояние каждого флага формата.

fmtflags flags();

Функция flags() имеет вторую форму, позволяющую устанавливать все флаги формата, связанные с потоком. Прототип этой версии функции flags() показан ниже.

fmtflags flags(fmtflags f) ;

В классе ios предусмотрены три функции-члена, позволяющие изменять ширину поля вывода, точность и символ-заполнитель. Они называются width(), preci­sion() и fill() соответственно.

Стандартные манипуляторы

Наши рекомендации