Листинг 1.3. Перечисления

#include <iostream>

 

using namespace std;

 

enum Esc {BEL='\a', BSP='\b', NEW='\n', RET='\r', TAB='\t' }; //спецсимволы;

enum Errors { OK, ER_FILE, ER_VALUE }; //ошибки;

 

int main (void)

{

cout << static_cast<char>(NEW) << endl;

 

return OK;

}

 

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

 

1.8. Потоковый ввод – вывод

В С++ операции ввода и вывода реализуются с помощью объектов «cin» и «cout», доступных при подключении стандартной библиотеки <iostream>. Они предназначены для работы со стандартными потоками. Потоком же называют некоторый абстрактный канал связи между источником данных и их приемником. Для объекта «cin» источником является консоль, а для объекта «cout», консоль является приемником, поэтому «cin» используется для ввода данных, а «cout» – для их вывода.

Для того, чтобы вывести на экран какие-либо данные, необходимо воспользоваться оператором вывода «<<», а для ввода данных используется оператор ввода «>>». Наравне со стандартными потоками вывода возможно и использование унаследованных из языка С функций «printf()» или «scanf()», однако их использование представляется более утомительным, т.к. эти функции требуют явного указания типов данных. Более того, операторы ввода и вывода могут быть перегружены, что делает работу со своими классами аналогичной работе со стандартными.

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

 

Листинг 1.4. Каскадирование.

#include <iostream>

 

using namespace std;

 

int main (void)

{

char c;

int i;

cout << "enter char x and int y" << endl;

cin >> c >> i;

 

cout << "c = " << c << endl << "i = " << i << endl;

 

return 0;

}

 

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

Наиболее часто употребляется манипулятор «endl», функциональность которого для консоли аналогична выводу символа «\n» – переводу строки. В стандартной библиотеке, в файле <iomanip> определены различные манипуляторы, позволяющие форматировать поток.

 

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

#include <iostream>

#include <iomanip>

 

using namespace std;

 

int main (void)

{

const bool x = true;

cout << boolalpha << x << " or " << noboolalpha << x << endl;

 

const unsigned int y = 15;

cout << "hex: " << hex << y << endl;

cout << "oct: " << oct << y << endl;

cout << "dec: " << dec << y << endl;

 

double z = 1234567889e-9;

cout << z << endl;

cout << left << setw(10) << setfill('0') << z << endl;

cout << right << setw(10) << setfill('0') << z << endl;

cout << setprecision(9) << z << endl;

cout << noshowpoint << 1.0 << endl;

cout << showpoint << 1.0 << endl;

 

return 0;

}

Таблица 1.4. Некоторые стандартные манипуляторы.

Манипулятор Описание
boolalpha / noboolalpha Логические переменные в виде «true», «false» или «1», «0»
hex / dec / oct Числа в шестнадцатеричном, десятичном, восьмеричном виде
setprecision() Задание числа выводимых дробных разрядов
setw() Задание ширины поля вывода чисел
setfill() Задание символа – заполнителя свободного пространства
internal Заполнение между знаком или основанием и самим числом
left / right Задание положения поля данных
showpoint / noshowpoint Дробные чисела без дробной части с точкой или без нее
showpos Выводить знак «+» перед положительными числами
skipws / noskipws Пропуск пробельных символов или их считывание, как лексем
ws Пропуск пробельной последовательности
uppercase Вывод в верхнем регистре шестнадцатеричных символов, «E» и «X»
scientific / fixed Экспоненциальный вывод числа или вывод с фиксированной точкой

 

 

Наряду с манипуляторами применяются различные методы по работе с потоками ввода – вывода. Метод «ignore()» удаляет из потока ввода часть символов. Метод «clear()» сбрасывает флаги состояния потока, например, флаг «goodbit» – отсутствия ошибок. Доступ к флагам осуществляется соответствующими методами; для «goodbit» – это метод «good()».

 

Листинг 1.6. Методы.

 

#include <iostream>

#include <iomanip>

#include <fstream>

 

using namespace std;

 

int main (void)

{

int iter;

cin >> iter; //ввод целого числа;

cout << cin.good() << endl; //при неверном вводе;

cin.clear(ios::goodbit); //сброс флага good;

cin.ignore(1, '\n'); //удаление из потока введеного числа;

cin >> iter; //очередной ввод;

cout << endl;

 

return 0;

}

 

1.9. Операции

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

Любое использование операндов и знаков операций называется выражением. Выражение может состоять из нескольких знаков операций и операндов. В таком случае, операции выполняются в соответствии со своими приоритетами. Порядком выполнения можно управлять, используя скобки «()».

Обычно, результат операции сохраняется в некоторой переменной. Это сохранение производится посредством операции присваивания «=». Все операции можно также разделить на группы в соответствии с их назначением: арифметические, поразрядные, логические, отношения и условный.

1.9.1. Арифметические операции

К бинарным арифметическим операциям относятся следующие: «+», «–», «*», «/», «%». К унарным арифметическим операциям относятся операции: «–», «++» и «––».