Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_S.doc
Скачиваний:
24
Добавлен:
09.02.2015
Размер:
1.2 Mб
Скачать

Ввод/вывод арифметических типов данных

Пример простого ввода/вывода арифметических типов данных:

#include <iostream>

using namespace std;

int main ()

{

setlocale (0, "");

int i;

double d;

char c;

bool b;

cin >> i;

cout << i;

cin >> d;

cout << d;

cin >> c;

cout << c;

cin >> b;

cout << b;

system ("Pause");

return 0;

}

Особенности:

  1. Ввод/вывод целочисленных значений осуществляется обычным образом в десятичной системе счисления.

  2. Ввод вещественных типов данных можно осуществлять либо в формате с фиксированной точкой, либо в экспоненциальном формате.

  3. Формат вывода вещественных значений выбирается автоматически в зависимости от выводимого значения.

  4. Ввод символьных значений можно осуществлять только в виде одиночного символа. При вводе нескольких символов переменной cбудет присвоен только первый символ. Могут возникнуть сложности с вводом русских букв.

  5. Ввод/вывод логических значений осуществляется в числовом формате (0-false,1-true).

Замечание:

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

int i;

cin >> i;

При попытке ввода с клавиатуры числа 1234допущена ошибка - набрано12y34и нажата клавишаENTER(ошибочно была нажата клавишаy). Переменнаяiв этом случае будет содержать значение12, и эта ошибка может привести к непредсказуемому дальнейшему поведению программы. В любом случае символы из потока ввода извлекаются оператором>> до тех пор, пока они соответствуют числовому формату. Как только в потоке ввода встречается символ, не соответствующий числовому формату, уже извлеченные символы преобразуются в числовое значение и присваиваются переменной ввода. Остальные символы игнорируются.

Форматирование ввода / вывода

В приведенных ранее примерах были использованы простейшие способы управления вводом/выводом с помощью специальных управляющих символов (ESCAPEпоследовательностей) -'\n'и'\t'. Однако, очень часто этого бывает недостаточно, например, для аккуратного структурированного оформления данных на экране.

Более гибкое управление вводом/выводом (форматирование ввода/вывода) в C++ осуществляется либо с помощью установкифлагов форматирования, либо с помощью специальныхманипуляторов ввода/вывода.

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

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

Флаг

Числовое значение

Назначение

Действие

ios:: skipws

1

Отменяет ввод из потока лидирующих пробельных символов (пробелов, символов табуляции, символов перевода строки). Установлен по умолчанию.

ввод

ios:: unitbuf

2

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

вывод

ios:: uppercase

4

Отображает шестнадцатеричные цифры и символ экспоненты при выводе вещественных значений в верхнем регистре.

вывод

ios:: showbase

8

Отображает обозначение основания системы счисления, в которой выводится числовое значение. Например, если выводится значение A1F, то оно будет выведено в виде 0xA1F.

вывод

ios:: showpoint

16

Отображает при выводе вещественных значений десятичную точку и нули дробной части, даже если дробная часть отсутствует.

вывод

ios:: showpos

32

Приводит к отображению знака + при выводе положительных числовых значений.

вывод

ios:: left

64

Выравнивает вывод данных по левому краю поля вывода, дополняя данные справа пробелами (или установленными символами) до ширины поля вывода.

вывод

ios:: right

128

Выравнивает вывод данных по правому краю поля вывода, дополняя данные слева пробелами (или установленными символами) до ширины поля вывода

вывод

ios:: internal

256

Выводит знак числа с левым выравниванием, а само число с правым выравниванием. Между знаком и самим числом выводятся либо пробелы, либо установленные символы заполнения, дополняя выводимое значение до ширины поля вывода.

вывод

ios:: dec

512

Устанавливает десятичную форму представления целых чисел. Флаг установлен по умолчанию.

ввод/вывод

ios:: oct

1024

Устанавливает восьмеричную форму представления целых чисел.

ввод/вывод

ios:: hex

2048

Устанавливает шестнадцатеричную форму представления целых чисел.

ввод/вывод

ios:: scientific

4096

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

вывод

ios:: fixed

8192

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

вывод

ios:: boolalpha

16384

По умолчанию логические значения представляются в виде 0 и 1. При установке этого флага эти значения представляются словами false и true.

ввод/вывод

Замечания:

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

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

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

Флаги работают как переключатели (включен - выключен, установлен - сброшен). Все флаги упакованы в одном целом значении типа long int. Это целое значение определяет общее состояние всех флагов потока. Каждый флаг в этом целом значении представлен 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

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

Для управления флагами используются три функции: 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;

int main ()

{

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- определяет символ заполнения при выводе данных.

Примеры использования этих функций

Пример 1.

cout.width (10); // Ширина поля вывода 10 позиций

cout << 123 << endl;// На экран выведено 7 пробелов и число 123

cout.fill (‘.’);// Символ заполнения ‘.’

cout.width (10); // Ширина поля вывода 10 позиций

cout << 123 << endl; // На экран выведено …….123

Пример 2

cout.width (10); // Ширина поля вывода 10 позиций

cout.setf (ios :: fixed); // Вывод вещественных значений с фиксированной точкой

cout.precision (3); // Ширина поля вывода 10 позиций

cout << 1.2345 << endl;// На экран выведено 7 пробелов и число 1.234

cout.fill (‘.’);// Символ заполнения ‘.’

cout.width (10); // Ширина поля вывода 10 позиций

cout << 123 << endl; // На экран выведено …….123

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

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

Манипулятор

Назначение

Действие

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

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

4. Основные управляющие структуры программирования и управляющие конструкции в языке С++

Структурное программирование. Основные управляющие структуры программирования: последовательность, выбор (ветвление), итерации (циклы). Примеры преобразования структур. Семантика управляющих структур и инструкции языка С++. Операторы и блоки. Выбор вариантов: оператор if, расширение оператора if, множественный выбор. Итерации: цикл с предусловием, цикл с постусловием.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]