Листинг 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. Арифметические операции
К бинарным арифметическим операциям относятся следующие: «+», «–», «*», «/», «%». К унарным арифметическим операциям относятся операции: «–», «++» и «––».