Министерство образования Республики Беларусь Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Лабораторная работа №1 по предмету объектно-ориентированное программирование
Выполнил: студент гр. 672302 Климович К.А. Проверил: Салапура М.Н.
Минск 2018 Вариант №3
Проверить какие флаги потока вывода установлены и заменить попарно на левое выравнивание на правое выравнивание (и наоборот) убрать + перед числом, если установлен и установить, если сброшен.
Теория: Простейший ввод и вывод
В С++ ввод и вывод данных производится потоками байт. Поток (последовательность байт) − это логическое устройство, которое выдает и принимает информацию от пользователя и связано с физическими устройствами ввода-вывода. При операциях ввода байты направляются от устройства в основную память. В операциях вывода – наоборот.
Имеется четыре потока (связанных с ними объекта), обеспечивающих ввод и вывод информации и определенных в заголовочном файле iostream.h:
Для ввода информации с клавиатуры используется объект cin. Формат записи cin имеет следующий вид:
cin [>>имя_переменной];
Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вводились в соответствии с форматом переменных, что не всегда может быть гарантировано.
Объект cout
Объект cout позволяет выводить информацию на стандартное устройство вывода – экран. Формат записи cout имеет следующий вид:
сout << data [ << data];
data − это переменные, константы, выражения или комбинации всех трех типов.
Простейший пример применения cout − это вывод, например, символьной строки:
cout << ”объектно-ориентированное программирование ”; cout << ”программирование на С++”.
Надо помнить, что cout не выполняет автоматический переход на новую строку после вывода информации. Для перевода курсора на новую строку надо вставлять символ ’\n’ или манипулятор endl.
cout << ”объектно-ориентированное программирование \n”; cout << ”программирование на С++”<<endl;
Для управления выводом информации используются манипуляторы.
Манипуляторы
Для форматирования выводимой информации используются манипуляторы. Описания для стандартных манипуляторов включены в файл iomanip.h
Манипуляторы dec, hex и oct используются для вывода числовой информации в десятичном, шестнадцатеричном или восьмеричном представлении. Применение их можно видеть на примере следующей программы:
#include <iostream> using namespace std; int main() { int a=0x11, b=4, // целые числа: шестнадцатеричное и десятичное c=051, d=8, // восьмеричное и десятичное i,j; i=a+b; j=c+d; cout << i <<' ' <<hex << i <<' '<<oct << i <<' ' <<dec << i <<endl; cout <<hex << j <<' ' << j <<' '<<dec << j <<' ' << oct << j <<endl; return 0; }
В результате выполнения программы на экран будет выведена следующая информация:
21 15 25 21
31 31 49 61
Манипуляторы изменяют значение некоторых переменных в объекте cout. Эти переменные называются флагами состояния. Когда объект cout посылает данные на экран, он проверяет эти флаги.
Рассмотрим манипуляторы, позволяющие выполнять форматирование выводимой на экран информации:
#include <iostream> #include <iomanip> using namespace std; int main() { int a=0x11; double d=12.362; cout << setw(4) << a << endl; cout << setw(10) << setfill('*') << a << endl; cout << setw(10 ) << setfill(' ') << setprecision(3) << d << endl; return 0; }
Результат работы программы:
17
********17
В приведенной программе использованы манипуляторы setw(), setfill(' ') и setprecision(). Синтаксис их показывает, что это функции. На самом деле это компоненты-функции (рассмотрим позже), позволяющие изменять флаги состояния объекта cout. Для их использования необходим заголовочный файл iomanip.h. Функция setw(4) обеспечивает вывод значения переменной a в четыре позиции (по умолчанию выравнивание вправо). Функция setfil(’символ’) заполняет пустые позиции символом. Функция setprecision(n) обеспечивает вывод числа с плавающей запятой с точностью до n знаков после запятой (при необходимости производится округление дробной части). Если при этом не установлен формат вывода с плавающей запятой, то точность указывает общее количество значащих цифр. Заданная по умолчанию точность − шесть цифр. Таким образом, функции имеют следующий формат:
Наряду с перечисленными выше манипуляторами в С++ используются также манипуляторы setiosflags() и resetiosflags() для установки определенных глобальных флагов, используемых при вводе и выводе информации. На эти флаги ссылаются как на переменные состояния. Функция setiosflags() устанавливает указанные в ней флаги, а resetiosflags() сбрасывает (очищает) их. В приведенной ниже таблице показаны аргументы для этих функций.
Таблица 1 Значение Результат, если значение установлено ios::skipws Игнорирование пустого пространство при вводе ios::left Вывод с выравниванием слева ios::right Вывод с выравниванием справа ios::internal Заполнение пространства после знака или основания системы счисления ios::dec Вывод в десятичном формате ios::oct Вывод в восьмеричном формате ios::hex Вывод в шестнадцатеричном формате ios::boolalpha Вывод булевых значений в виде TRUE и FALSE ios::showbase Вывод основания системы счисления ios::showpoint Вывод десятичной точки ios::uppercase Вывод шестнадцатеричных чисел заглавными буквами ios::showpos Вывод знака + перед положительными целыми числами ios::scientific Использование формы вывода с плавающей запятой ios::fixed Использование формы вывода с фиксированной запятой ios::unitbuf Сброс после каждой операции вывода ios::sktdio Сброс после каждого символа
Как видно из таблицы, флаги формата объявлены в классе ios.
Пример программы, в которой использованы манипуляторы:
#include <iostream> #include <iomanip> using namespace std; int main() { char s[]="БГУИР факультет КСиС"; cout << setw(30) << setiosflags(ios::right) << s << endl; cout << setw(30) << setiosflags(ios::left) << s << endl; }
Результат работы программы: БГУИР факультет КСиС БГУИР факультет КСиС Наряду с манипуляторами setiosflags() и resetiosflags(), для того чтобы установить или сбросить некоторый флаг, могут быть использованы функции класса ios setf() или unsetf(). Например:
#include <iostream> #include <iomanip> using namespace std;
void main() { int a; cout << "Input number: "; cin >> a; //вводим число cout.setf(ios::showpos); //устанавливаем флаг вывода со знаком + cout << a << endl; cout.unsetf(ios::showpos); //убираем флаг вывода со знаком + cout << a << endl; cout.setf(ios::right); //устанавливаем флаг вывода с выравниванием справа cout << a << endl; cout.setf(ios::left); //устанавливаем флаг вывода с выравниванием слева cout << a << endl; system("pause");