Использование флагов форматирования.
В этой таблице перечислены флаги форматирования.
Флаг | Числовое значение | Назначение | Действие |
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) логика программы должна опираться на минимальное число достаточно простых базовых управляющих структур.
Доказана теорема о структурировании (Бем и Джекопини)