
- •4. Инкремент и декремент
- •5. Операции сравнения (операции отношения)
- •7. Ввод- вывод
- •10. Оператор цикла с постусловием do-while
- •13. Работа с символами
- •15. Указатели и Массивы.
- •16. Некоторые функции из библиотеки string.H
- •17. Перечисления (enum)
- •19. Функции
- •20. Передача данных в функцию по значению, по указателю, по ссылке.
- •21. Передача массивов в функцию. Указатель на функцию
- •22. Встраиваемые функции. Перегрузка функций. Передача массивов в функцию. Указатель на функцию
- •23. Параметры функций по умолчанию, функции с переменным числом параметров.
- •25. Работа с файлами
- •26. Директивы препроцессора
- •27. Базовые принципы объектно-ориентированного программирования
- •29. Базовые блоки ооп. Объект. Класс
- •30. Реализация механизма сокрытия информации
7. Ввод- вывод
Механизм для ввода-вывода в Си++ называется потоком . Название произошло от того,что информация вводится и выводится в виде потока байтов – символ за символом.
Класс istream реализует поток ввода, класс ostream – поток вывода. Эти классы определены в файле заголовков iostream.h. Библиотека потоков ввода-вывода определяет три глобальных объекта: cout, cin и cerr. cout называется стандартным выводом, cin – стандартным вводом, cerr – стандартным потоком сообщений об ошибках. cout и cerr выводят на терминал и принадлежат к классу ostream, cin имеет тип istream и вводит с терминала. Разница между cout и cerr существенна в Unix – они используют разные дескрипторы для вывода. В других системах они существуют больше для совместимости.
Вывод осуществляется с помощью операции <<, ввод с помощью операции >>. Выражение
cout << "Пример вывода: " << 34;
напечатает на терминале строку "Пример вывода", за которым будет выведено число 34. Выражение
int x;
cin >> x;
введет целое число с терминала в переменную x. (Разумеется, для того, чтобы ввод произошел, на терминале нужно напечатать какое-либо число и нажать клавишу возврат каретки.)
Операции << и >> для потоков
В классах iostream операции >> и << определены для всех встроенных типов языка Си++ и для строк (тип char* ). Если мы хотим использовать такую же запись для ввода и вывода других классов, определенных в программе, для них нужно определить эти операции.
Манипуляторы и форматирование ввода-вывода
Часто бывает необходимо вывести строку или число в определенном формате. Для этого используются так называемые манипуляторы.
Манипуляторы – это объекты особых типов, которые управляют тем, как ostream или istream обрабатывают последующие аргументы. Некоторыеманипуляторы могут также выводить или вводить специальные символы.
С одним манипулятором мы уже сталкивались, это endl. Он вызывает вывод символа новой строки. Другие манипуляторы позволяют задавать формат вывода чисел:
endl при выводе перейти на новую строку;
ends вывести нулевой байт (признак конца строки символов);
flush немедленно вывести и опустошить все промежуточные буферы;
dec выводить числа в десятичной системе (действует по умолчанию);
oct выводить числа в восьмеричной системе;
hex выводить числа в шестнадцатиричной системе счисления;
setw (int n) установить ширину поля вывода в n символов ( n – целое число);
setfill(int n) установить символ-заполнитель; этим символом выводимое значение будет дополняться до необходимой ширины;
setprecision(int n) установить количество цифр после запятой при выводе вещественных чисел;
setbase(int n) установить систему счисления для вывода чисел; n может принимать значения 0, 2, 8, 10, 16, причем 0 означает систему счисления по умолчанию, т.е. 10.
Использовать манипуляторы просто – их надо вывести в выходной поток. Предположим, мы хотим вывести одно и то же число в разных системах счисления:
int x = 53;
cout << "Десятичный вид: " << dec
<< x << endl
<< "Восьмиричный вид: " << oct
<< x << endl
<< "Шестнадцатиричный вид: " << hex
<< x << endl
Аналогично используются манипуляторы с параметрами. Вывод числа с разным количеством цифр после запятой:
double x;
// вывести число в поле общей шириной
// 6 символов (3 цифры до запятой,
// десятичная точка и 2 цифры после запятой)
cout << setw(6) << setprecision(2) << fixed << x << endl;
8. см. № 4
9. тернарная операция «?:» В С++ есть условная операция, очень похожая на условный оператор выбора if else. Условная операция «? :» называется тернарной операцией (то есть трёхместная (имеет три операнда), единственная в C++).
Форма записи тернарной операции в C++
"условие" ? "выражение 1" : "выражение 2";
Если условие истинно, то выполняется выражение 1, иначе (условие ложно) выполняется выражение 2.
Пример:1 a > b ? cout << a : cout << b; // если а > b, то выполняется cout << a, иначе выполняется cout << b
Таким образом, если, а > b напечатать а, иначе напечатать b. То есть, программа печатает большее из чисел. Использование условной операции может в некоторых случаях упрощать код, тогда как воспользоваться оператором if else таким же образом не возможно.
Операторы передачи управления
Оператор goto
Оператор безусловного перехода goto имеет формат:
goto metka;
В теле той же функции должна присутствовать ровно одна конструкция вида:
metka: оператор;
Оператор goto передает управление оператору с меткой metka. Метка –это обычный идентификатор. Оператор goto может передать управление на метку, обязательно расположенную в одном с ним теле функции.
Операторы if и goto могли бы заменить все операторы ветвления, передачи управления и цикла, но такой подход оказался не очень удобен. Применение goto может нарушить принципы структурного и модульного программирования, по которым все блоки, из которых состоит программа, должны иметь только один вход и один выход. Кроме того, операторы выбора и цикла выглядят более изящно и позволяют ускорить выполнение программы.
Использование оператора безусловного перехода оправдано в двух случаях:
- принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей;
- переход из нескольких мест функции в одно (например, если перед выходом из функции необходимо всегда выполнять какие-либо одни и те же действия).
В остальных случаях для записи любого алгоритма существуют более подходящие средства, а использование goto приводит только к усложнению структуры программы и затруднению отладки. В любом случае не следует с помощью goto передавать управление внутрь операторов if, switch и циклов. Нельзя переходить внутрь блоков, содержащих инициализацию переменных, на операторы, расположенные после нее, поскольку в этом случае инициализация не будет выполнена:
int k; ...
goto metka; ...
{int a = 3. b = 4;
k = a + b;
metka: int m = k + 1; ... }
После выполнения этого фрагмента программы значение переменной m не определено.
Оператор break
Оператор прерывает выполнение оператора switch. Управление передается следующему за ним оператору. Об этом было уже сказано выше. Здесь следует лишь подчеркнуть, что break относится к операторам передачи управления.