Пример выполнения программы
Лабораторная работа № 3
Форматированный ввод/вывод в С++
Цель
- Освоение приемов простейшей реализации ввода данных с консоли и вывода результатов на консоль при помощи операторов потокового ввода/вывода cin и cout.
· Приобретение навыков форматированного вывода различных типов данных.
Теоретические сведения
Возможность управлять вводом-выводом в С++ обеспечивают форматирующие функции-члены, флаги и манипуляторы. Флаги, функции и манипуляторы выполняют одну и ту же задачу — задают определённый формат ввода/вывода информации в потоках. Ввод/вывод на экран/с экрана в С++ осуществляется с помощью операторов cin и cout соответственно, а значит манипуляторы форматирования используются совместно с данными операторами ввода/вывода.
Для того, чтобы пользоваться средствами ввода-вывода C++, программа должна включить файл заголовков <iostream>:
#include <iostream>
using namespace std;
Для использования манипуляторов программа должна включать файл заголовков <iomanip>
#include <iomanip>
Различие между функциями флагами и манипуляторами форматирования состоит в способе их применения. Теперь рассмотрим способы применения объектов форматирования.
//Основные форматирующие функции-члены: cout.fill('/*symbol*/'); // устанавливает символ заполнитель // где symbol-символ заполнитель, символ передаётся в одинарных кавычках cout.width(/*width_field*/); // задает ширину поля // где width_field - количество позиций(одна позиция вмещает один символ) cout.precision(/*number*/); // задает кол-во знаков после десят. точки // где number - количество знаков после десятичной точки |
Доступ к функциям осуществляется через операцию точка, а в круглых скобочках передаётся аргумент. Аргумент функции fill()может передаваться в виде символа, обрамленного одинарными кавычками, или в виде числа (код символа). Одних функций не достаточно для форматирования потоков ввода/вывода, поэтому в С++ предусмотрен ещё один способ форматирования — флаги.
Флаги форматирования позволяют включить или выключить один из параметров ввода/вывода. Чтобы установить флаг ввода/вывода, необходимо вызвать функцию setf(), если необходимо отключить флаг вывода, то используется функция unsetf(). Далее показаны конструкции установки и снятия флагов вывода.
// установка флага вывода cout.setf( ios::/*name_flag*/ ); // где name_flag - это имя флага |
Доступ к функциям оператора вывода выполняется через операцию точка. Метод setf()принимает один аргумент — имя флага. Флаги вывода объявлены в классе ios, поэтому, перед тем, как обратиться к флагу, необходимо написать имя класса — ios, после которого, с помощью операции разрешения области действия, вызвать нужный флаг.
// снятие флага вывода cout.unsetf( ios::/*name_flag*/ ); // где name_flag - это имя флага |
Если при вводе/выводе необходимо установить(снять) несколько флагов, то можно воспользоваться поразрядной логической операцией ИЛИ |. В этом случае конструкция языка C++ будет такой:
// установка нескольких флагов cout.setf( ios::/*name_flag1*/|ios::/*name_flag2*/|ios::/*name_flag_n*/ ); // снятие нескольких флагов cout.unsetf( ios::/*name_flag1*/|ios::/*name_flag2*/|ios::/*name_flag_n*/); |
В таблице 1 подробно описаны основные флаги форматирования, а также показаны примеры использования флагов.
Таблица 1 — Флаги форматирования в С++ | |||
Флаг | Назначение | Пример | Результат |
boolalpha | Вывод логических величин в текстовом виде (true, false) | cout.setf(ios::boolalpha); bool log_false = 0, log_true = 1; cout << log_false << endl << log_true << endl; | false true |
oct | Ввод/вывод величин в восьмеричной системе счисления (сначала снимаем флаг dec, затем устанавливаем флаг oct) | cout.unsetf(ios::dec); cout.setf(ios::oct); int value; cin >> value; cout << value << endl; | ввод:9910 вывод:1438 |
dec | Ввод/вывод величин в десятичной системе счисления (флаг установлен по умолчанию) | cout.setf(ios::dec); int value = 148; cout << value << endl; | |
hex | Ввод/вывод величин в шестнадцатеричной системе счисления (сначала снимаем флаг dec, затем устанавливаем флаг hex) | cout.unsetf(ios::dec); cout.setf(ios::hex); int value; cin >> value; cout << value << endl; | ввод:9910 вывод:6316 |
showbase | Выводить индикатор основания системы счисления | cout.unsetf(ios::dec); cout.setf(ios::oct | ios::showbase); int value; cin >> value; cout << value << endl; | ввод:9910 вывод:01438 |
uppercase | В шестнадцатеричной системе счисления использовать буквы верхнего регистра (по умолчанию установлены буквы нижнего регистра) | cout.unsetf(ios::dec); cout.setf(ios::hex | ios::uppercase); int value; cin >> value; cout << value << endl; | ввод:25510 вывод:FF16 |
showpos | Вывод знака плюс + для положительных чисел | cout.setf(ios::showpos); int value = 15; cout << value << endl; | +15 |
scientific | Вывод чисел с плавающей точкой в экспоненциальной форме | cout.setf(ios::scientific); double value = 1024.165; cout << value << endl; | 1.024165e+003 |
fixed | Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию) | double value = 1024.165; cout << value << endl; | 1024.165 |
right | Выравнивание по правой границе (по умолчанию). Сначала необходимо установить ширину поля (ширина поля должна быть заведомо большей чем, длина выводимой строки). | cout.width(40); cout << «khai.edu»<< endl; | __khai.edu |
left | Выравнивание по левой границе. Сначала необходимо установить ширину поля (ширина поля должна быть заведомо большей чем, длина выводимой строки). | cout.setf(ios::left); cout.width(40); cout << «khai.edu» << endl; | khai.edu__ |
Ещё один способ форматирования — форматирование с помощью манипуляторов. Манипулятор — объект особого типа, который управляет потоками ввода/вывода, для форматирования передаваемой в потоки информации. Отчасти манипуляторы дополняют функционал, для форматирования ввода/вывода. Но большинство манипуляторов выполняют точно, то же самое, что и функции с флагами форматирования. Есть случаи, когда проще пользоваться флагами или функциями форматирования, а иногда удобнее использовать манипуляторы форматирования. Именно по этому в С++ предусмотрено несколько средств форматирования ввода/вывода. В таблице 2 показаны основные манипуляторы форматирования С++.
Таблица 2 — Манипуляторы форматирования в С++ | |||
Манипулятор | Назначение | Пример | Результат |
endl | Переход на новую строку при выводе | cout << «website:» << endl << «khai.edu»; | website: khai.edu |
boolalpha | Вывод логических величин в текстовом виде (true, false) | bool log_true = 1; cout << boolalpha << log_true << endl; | true |
noboolalpha | Вывод логических величин в числовом виде (true, false) | bool log_true = true; cout << noboolalpha << log_true << endl; | |
oct | Вывод величин в восьмеричной системе счисления | int value = 64; cout << oct << value << endl; | 1008 |
dec | Вывод величин в десятичной системе счисления (по умолчанию) | int value = 64; cout << dec << value << endl; | 6410 |
hex | Вывод величин в шестнадцатеричной системе счисления | int value = 64; cout << hex << value << endl; | 408 |
showbase | Выводить индикатор основания системы счисления | int value = 64; cout << showbase << hex << value << endl; | 0x40 |
noshowbase | Не выводить индикатор основания системы счисления (по умолчанию). | int value = 64; cout << noshowbase << hex << value << endl; | |
uppercase | В шестнадцатеричной системе счисления использовать буквы верхнего регистра (по умолчанию установлены буквы нижнего регистра). | int value = 255; cout << uppercase << hex << value << endl; | FF16 |
nouppercase | В шестнадцатеричной системе счисления использовать буквы нижнего регистра (по умолчанию). | int value = 255; cout << nouppercase << hex << value << endl; | ff16 |
showpos | Вывод знака плюс + для положительных чисел | int value = 255; cout << showpos<< value << endl; | +255 |
noshowpos | Не выводить знак плюс + для положительных чисел (по умолчанию). | int value = 255; cout <<noshowpos<< value << endl; | |
scientific | Вывод чисел с плавающей точкой в экспоненциальной форме | double value = 1024.165; cout << scientific << value << endl; | 1.024165e+003 |
fixed | Вывод чисел с плавающей точкой в фиксированной форме. | double value = 1024.165; cout << fixed << value << endl; | 1024.1650 |
defaultfloat | Сброс настроек вывода чисел с плавающей точкой к умолчанию. | double value = 1024.165; cout << defaultfloat << value << endl; | 1024.165 |
setw(int number) | Установить ширину поля, где number — количество позиций, символов (выравнивание по умолчанию по правой границе). Манипулятор с параметром. | cout << setw(40) << «khai.edu» << endl; | __khai.edu |
right | Выравнивание по правой границе(по умолчанию). Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). | cout << setw(40) << right << «khai.edu» << endl; | __khai.edu |
left | Выравнивание по левой границе. Сначала необходимо установить ширину поля(ширина поля должна быть заведомо большей чем, длина выводимой строки). | cout << setw(40) << left << «khai.edu» << endl; | khai.edu__ |
setprecision(int count) | Задаёт количество знаков после запятой, где count — количество знаков после десятичной точки | cout << fixed << setprecision(3) << (13.5 / 2) << endl; | 6.750 |
setfill(int symbol) | Установить символ заполнитель. Если ширина поля больше, чем выводимая величина, то свободные места поля будут наполняться символом symbol — символ заполнитель | cout << setfill(‘0) << setw(4) << 15 << ends << endl; |
Постановка задачи
В соответствии с номером вашего варианта (порядковый номер по списку) написать программу, выполняющую следующие функции:
- Ввод с консоли заданного количества целых чисел (любых по вашему усмотрению) и вывод на консоль этих чисел без формата и согласно заданному формату (см. пример выполнения программы)
· Тоже сделать с действительными, символьными и логическими данными.
Требования
- Оформить вычисления в виде одного консольного приложения.
- Для ввода исходных данных с консоли и вывода результатов расчета на консоль применить операторы потокового ввода/вывода cin и cout.
- Оформить отчет, в отчет включить текст основной программы (все файлы) и результаты расчета.
Пример выполнения программы
Условия вариантов
Номер варианта | Целые числа | Действительные числа | Символ | Вывести значения | |||
Количество | Формат | Количество | Формат | Формат | |||
Ширина поля | Ширина поля | Количество знаков после запятой | Ширина поля | ||||
True False True True False True True False False True True False False True True False True False False True False True False False True True |