Использование флагов форматирования.

В этой таблице перечислены флаги форматирования.

Флаг Числовое значение Назначение Действие
ios:: skipws Отменяет ввод из потока лидирующих пробельных символов (пробелов, символов табуляции, символов перевода строки). Установлен по умолчанию. ввод
ios:: unitbuf Если буфер вывода не пуст, его содержимое передаются на устройство вывода сразу при завершении операции вывода. вывод
ios:: uppercase Отображает шестнадцатеричные цифры и символ экспоненты при выводе вещественных значений в верхнем регистре. вывод
ios:: showbase Отображает обозначение основания системы счисления, в которой выводится числовое значение. Например, если выводится значение A1F, то оно будет выведено в виде 0xA1F. вывод
ios:: showpoint Отображает при выводе вещественных значений десятичную точку и нули дробной части, даже если дробная часть отсутствует. вывод
ios:: showpos Приводит к отображению знака + при выводе положительных числовых значений. вывод
ios:: left Выравнивает вывод данных по левому краю поля вывода, дополняя данные справа пробелами (или установленными символами) до ширины поля вывода. вывод
ios:: right Выравнивает вывод данных по правому краю поля вывода, дополняя данные слева пробелами (или установленными символами) до ширины поля вывода вывод
ios:: internal Выводит знак числа с левым выравниванием, а само число с правым выравниванием. Между знаком и самим числом выводятся либо пробелы, либо установленные символы заполнения, дополняя выводимое значение до ширины поля вывода. вывод
ios:: dec Устанавливает десятичную форму представления целых чисел. Флаг установлен по умолчанию. ввод/вывод
ios:: oct Устанавливает восьмеричную форму представления целых чисел. ввод/вывод
ios:: hex Устанавливает шестнадцатеричную форму представления целых чисел. ввод/вывод
ios:: scientific Устанавливает формат вывода вещественных значений в формате с экспонентой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). вывод
ios:: fixed Устанавливает формат вывода вещественных значений с фиксированной точкой. По умолчанию компилятор сам выбирает формат вывода (либо экспоненциальный, либо фиксированный). вывод
ios:: boolalpha По умолчанию логические значения представляются в виде 0 и 1. При установке этого флага эти значения представляются словами false и true. ввод/вывод

Замечания:

1. Приставка ios::указывает на то, что определение флага принадлежит классу ios, опускать ее не следует, иначе компилятор выдаст ошибку.

2. Некоторые компиляторы (старые) могут не воспринимать представления этих флагов в виде идентификаторов. В этом случае необходимо использовать их числовые эквиваленты.

3. По сути, каждый флаг можно рассматривать как целочисленную именованную константу. Все эти константы определены в классе ios.

Флаги работают как переключатели (включен - выключен, установлен - сброшен). Все флаги упакованы в одном целом значении типа longint. Это целое значение определяет общее состояние всех флагов потока. Каждый флаг в этом целом значении представлен 1 битом (1 двоичным разрядом). Установленному флагу соответствует значение 1 некоторого двоичного разряда. Если флаг сброшен (отключен), соответствующий двоичный разряд равен 0. Например, если значение состояния всех флагов равно 68, то установлены флаги uppercase и left:

Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0

Состояния флагов: 0 0 … 0 0 1 0 0 0 1 0 0 = 68

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

32. Форматирование ввода\вывода с помощью манипуляторов.

Управление флагами потоков ввода-вывода можно осуществлять с помощью, так называемых, манипуляторов ввода-вывода. В следующей таблице перечислены стандартные манипуляторы:

Манипулятор Назначение Действие
skipws Устанавливает флаг skipws. ввод
noskipws Обнуляет флаг skipws. ввод
unitbuf Устанавливает флаг unitbuf. вывод
nounitbuf Обнуляет флаг unitbuf. вывод
uppercase Устанавливает флаг uppercase. вывод
nouppercase Обнуляет флаг uppercase. вывод
showbase Устанавливает флагshowbase. вывод
noshowbase Обнуляет флагshowbase. вывод
showpoint Устанавливает флагshowpoint. вывод
noshowpoint Обнуляет флагshowpoint. вывод
showpos Устанавливает флагshowpos. вывод
noshowpos Обнуляет флагshowpos. вывод
left Устанавливает флагleft. вывод
right Устанавливает флагright вывод
internal Устанавливает флагinternal. вывод
dec Устанавливает флагdec. ввод/вывод
oct Устанавливает флагoct. ввод/вывод
hex Устанавливает флагhex. ввод/вывод
scientific Устанавливает флагscientific. вывод
fixed Устанавливает флагfixed. вывод
boolalpha Устанавливает флагboolalpha. ввод/вывод
noboolalpha Обнуляет флагboolalpha. ввод/вывод
endl Выводит в поток символ перевода строки. вывод
ends Выводит в поток нулевой символ (‘\0’). вывод
flush «Сбрасывает» поток. вывод
resetiosflags(флаги) Обнуляет флаги, указанные в параметре ввод/вывод
setiosflags(флаги) Устанавливает флаги, указанные в параметре ввод/вывод
setbase(int base) Устанавливает основание системы счисления в значение base (допустимые значения параметра 8, 10, 16). вывод
setfill(char ch) Устанавливает символ для заполнения в значение ch. вывод
setprecision(int p) Устанавливает количество цифр после десятичной точки в значение p. вывод
setw(int w) Устанавливает ширину поля вывода в значение w. вывод
ws Пропускает ведущие пробельные символы в потоке ввода ввод

Замечание. При использовании манипуляторов с параметрами необходимо использовать заголовочный файл <iomanip>.

Манипуляторы ввода-вывода непосредственно включаются в потоки ввода-вывода. Например: cout<<setw(20) <<right<<setfill(‘.’) << 123 <<endl;

На экран будет выведено:……………..123

Можно создавать свои собственные манипуляторы ввода-вывода.

33. Форматирование ввода-вывода с помощью функций потоков ввода-вывода

Для управления флагами используются три функции:flags, setfи unsetf.Эти функции являются членами потоковых классов coutи cin, поэтому обращаться к ним следует через идентификаторы соответствующих потоковых классов: cout.flags,cout.setf,cout.unsetf илиcin.flags, cin.setf,cin.unsetf. Если необходимо управлять флагами потока вывода, используется класс cout, если флагами потока ввода - класс cin.Все эти функции возвращают предыдущее состояние флагов.

Функция flagsможет использоваться двумя способами. Если вызвать ее без параметров, то она не изменяет состояние флагов, а только возвращает значение состояния всех флагов потока. Например, строка cout<<cin.flags() <<endl; выведет на экран целое значение соответствующее состоянию флагов потока ввода. А строка cout<<cout.flags() <<endl; выведет на экран целое значение соответствующее состоянию флагов потока вывода.

Эту функцию можно использовать и для изменения состояния флагов. Для этого при ее вызове в качестве параметра ей необходимо передать необходимое значение флага (флагов). Например, оператор cout.flags(ios::hex);установит флаг hex, все остальные флаги будут сброшены.

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

Замечание.Если вызвать функцию следующим образом:flags(0), то будут сброшены все флаги соответствующего потока.

Функция setf также служит для установки флагов. Она добавляет новый флаг (флаги) без изменения всех остальных.

/* 1 */ cout.flags(0);// Отключены все флаги

/* 2 */ cout.setf(ios :: showpos); // Установлен единственный флаг showpos

/* 3 */ cout.setf(ios :: hex); // Установлены два флага - showpos и hex

Если требуется сбросить флаг (флаги), используют функцию unsetf. В качестве параметра используется значение флага (флагов), который необходимо отключить. При этом остальные флаги изменены не будут. Например, если добавить к предыдущим строкам программы строку:/* 4 */ cout.unsetf(ios::showpos);флаг showpos будет отключен, и останется установленным только флаг hex.

При использовании этих процедур можно оперировать не одиночными флагами, а объединением нескольких флагов. Например, строки 2 и 3 можно заменить одной строкой: cout.setf( ios :: showpos | ios :: hex);

Объединение флагов осуществляется с помощью операции | - арифметическое ИЛИ.

Рассмотрим некоторые примеры использования флагов форматирования.

#include <iostream>

using namespace std;

Intmain ()

{

setlocale (0, "");

cout<< 255 <<endl; //На экране видим 255 -по умолчанию установлен флаг dec

cout.setf (ios :: hex); //Включаем флагhex- хотим видеть на экране ff

cout<< 255 <<endl; //На экране видим 255- изменений не произошло

system ("Pause");

return 0;

}

В этом примере установка флагаhex не привела ни к каким изменениям. Причиной этого явилось то, что одновременно с установленным флагом hex остался установленным и флаг dec. Для исправления ситуации необходимо сначала отключить флаг dec, а затем уже установить флаг hex:

cout.unsetf(ios :: dec); //Отключаемфлагdec

cout.setf(ios :: hex); //Включаемфлагhex- хотим видеть на экране ff

cout<< 255 <<endl;//На экране видим ff- то, что хотели

Среди всех флагов можно выделить три группы, в каждой из которых флаги управляют одной и той же характеристикой ввода / вывода, но являются взаимоисключающими. Флагам каждой из этих групп в классе ios присвоены обобщающие имена:

Группа Флаги Обобщающее имя
Флаги основания систем счисления dec, oct,hex basefield
Флаги выравнивания left, right,internal adjustfield
Флаги формата вещественных значений scientific,fixed floatfield

Обобщающие имена групп удобно использовать для выполнения операции со всеми флагами группы, например, для сброса всех флагов группы:cout.unsetf (ios ::basefield); //Отключаемфлагиdec, oct, hexза один прем

Болеетого, функциюsetfможно использовать с двумя параметрами: setf (новые флаги, маска)

В этом случае функция setfустанавливает только те флаги, которые одновременно присутствуют и в первом и во втором параметре, а те флаги, которые присутствуют во втором параметре, но отсутствуют в первом, будут сброшены. Это дает возможность отключать и включать флаги за один вызов функции setf. Например, для установки любого флага из группы basefield достаточно использовать всего один оператор: cout.setf (ios :: hex, ios ::basefield);

Здесь второй параметр содержит три флага: dec, oct,hex. Первый параметр содержит флаг hex. Этот флаг будет установлен, а флаги dec и oct будут сброшены.

В классе coutимеются еще несколько функций управляющих форматом вывода данных. К ним относятся:

· precision - определяет точность представления вещественных значений;

· width - устанавливает ширину поля вывода;

· fill - определяет символ заполнения при выводе данных.

34. Управление шириной поля вывода и выравниванием данных при выводе

35. Управление форматом вывода вещественных значений

36. Основные понятия структурного программирования

При хаотическом программировании возникают очень серьезные отрицательные последствия:

1) затруднено восприятие программы (алгоритма);

2) сложно проводить доказательство правильности программы, ее отладку, тестирование;

3) практически невозможна модификация программы;

4) при отсутствии систематических приемов в программировании очень сложно организовать коллективную работу над общей задачей.

Все это привело к созданию определенных методологий в программировании. И, пожалуй, первым таким методом является структурное программирование. Его основные положения:

1) программа должна составляться достаточно мелкими шагами, так чтобы реализация каждого шага не вызывала никаких затруднений;

2) сложная задача должна разбиваться на достаточно простые, легко воспринимаемые части, каждая из которых имеет только один вход и один выход;

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

Доказана теорема о структурировании (Бем и Джекопини)

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