- •1.1.1 Пример программы, выводящей текст на экран (пример 1)
- •1.1.2 Директивы препроцессору (подключение заголовочных файлов)
- •1.1.3 Комментарии
- •1.1.4 Функции
- •1.1.5 Ввод и вывод на экран
- •1.2. Переменные и их объявление
- •1.2.1 Пример программы cложения целых чисел (пример 2)
- •1.2.2 Переменные и их объявление
- •1.3. Арифметические операторы
- •1.3.1 Примеры арифметических операций (пример 3)
- •1.3.2 Группировка подвыражений с помощью скобок
- •1.4. Логические выражения и оператор if
- •1.4.1 Условные конструкции. Пример условных конструкций (пример 4)
- •1.4.2 Логические выражения. Логические операции и, или, не (пример 5)
- •1.4.3 Типичные ошибки
- •1.4.4 Вложенные условия
- •1.5. Арифметический логический оператор (пример 6)
- •1.6. Селективные конструкции
- •1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)
- •1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)
- •1.7. Циклы while и do…while
- •1.7.1 Цикл с предусловием while. Пример возведения в степень в цикле (пример 8)
- •1.7.2 Цикл с постусловием do...While
- •1.8. Пошаговый цикл for
- •1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)
- •1.8.2 Пошаговый цикл for
- •1.8.3 Операторы break и continue
- •1.8.4 Пример вычисление факториала (пример 10)
- •1.9. Функции
- •1.9.1 Использование функций библиотеки stl (пример 11)
- •1.9.2 Определение новых функций
- •1.9.3 Пример функции (пример 12)
- •1.10. Размещение программ и данных в памяти
- •1.11. Ссылки и указатели
- •1.11.1. Ссылки
- •1.11.2. Указатели
- •1.11.3. Передача параметров в функцию по ссылке и указателю
- •2.2 Организация ввода/вывода
- •2.3 Строковые переменные и константы
- •2.4 Математические функции
- •3.1. Массивы
- •3.1.1. Одномерный массив
- •3.1.2. Динамическое размещение одномерного массива
- •3.1.3. Передача массива в функцию (пример 3.1)
- •3.1.4. Двумерный массив
- •3.1.5. Динамическое размещение двумерного массива (пример 3.2)
- •3.2 Контейнеры
- •3.3. Вектор vector (пример 3.3)
- •4.4. Список list
- •3.4.1. Списки
- •3.4.2. Итераторы
- •3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)
- •3.5. Очереди и стек
- •3.5.1. Двусторонняя очередь deque (пример 3.5)
- •3.5.2. Стек stack
- •3.5.3. Очередь queue
- •3.6. Ассоциативные контейнеры
- •3.6.1. Контейнер map (пример 3.7)
- •3.6.2. Контейнер set (пример 3.8)
- •3.7. Алгоритмы
- •4.1 Структуры
- •4.1.1. Пример 4.1. Структура для работы с компонентами цвета
- •4.1.2. Передача абстрактных типов в функцию
- •4.1.3. Создание функций-членов для абстрактного типа данных. Пример 4.2. Структура для работы с компонентами цвета со встроенной функцией.
- •4.2. Классы
- •4.2.1. Пример 4.3. Класс Линза
- •4.2.2. Директивы препроцессору # if ! defined, # endif (проверка на повторное подключение)
- •4.2.3. Тип доступа к членам класса
- •4.2.4. Принципы объектно-ориентированного проектирования
- •4.2.5. Типы функций-членов класса
- •4.3 Конструкторы и деструкторы класса
- •4.3.1. Конструкторы
- •4.3.2. Деструктор (пример 4.4. Конструктор и деструктор класса Матрица)
- •4.3.3. Проверка правильности параметров. Исключительные ситуации
- •4.4. Модификаторы, селекторы и другие члены классов
- •4.4.1. Модификаторы и селекторы
- •4.4.2. Ключевые слова const и inline
- •4.4.3. Функции-утилиты
- •4.4.4. Сохраняемость
- •5.1. Типы наследования. Видимость членов классов
- •5.1.1. Наследование
- •5.1.2. Пример 5.1. Линза и зеркало как оптические детали
- •5.1.3. Последовательность вызова конструкторов
- •5.1.4. Типы наследования. Видимость членов классов
- •5.1.5. Множественное наследование
- •5.2. Виртуальные функции. Абстрактные классы
- •5.2.1. Виртуальные функции
- •5.2.2. Абстрактные классы
- •6. Полиморфизм
- •6.1. Перегрузка функций
- •6.1.1. Перегрузка функций
- •6.1.2. Преобразование типов
- •6.1.3. Параметры функций по умолчанию
- •6.2. Перегрузка операторов
- •6.2.1. Пример 6.1 (класс Complex (комплексное число))
- •6.2.6. Перегрузка операторов с присваиванием
- •6.2.7. Перегрузка преобразования типов
- •6.2.8. Перегрузка оператора доступа по индексу
- •6.2.9. Перегрузка операторов ввода/вывода
- •6.2.10. Неперегружаемые операторы
- •6.3. Шаблоны функций и классов
- •6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
- •6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
- •6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
- •6.4. Объекты-функции. Предикаты
- •6.4.1. Объекты-функции. Пример 6.5 (использование объектов-функций)
- •6.4.2. Предикаты. Пример 6.6 (использование предикатов)
2.2 Организация ввода/вывода
Потоковый ввод/вывод
Один из основных механизмов, который делает программу полезной является ввод/вывод. Все языки программирования имеют такой механизм. Среди операторов и ключевых слов нет ввода/вывода. Потому что в языке С++ ввод/вывод реализован в виде библиотеки. И вообще многие механизмы, которые делают язык С++ таким мощным реализованы в библиотеках (стандартные, специализированные, персональные).
В С++ используется механизм потокового ввода/вывода. Поток - механизм преобразования значений различного типа в последовательность символов (вывод) и наоборот (ввод), в значение переменной.
Вывод: Помещение (направление) данных в поток вывода осуществляется с помощью оператора << который также иногда называют экстрактор (extractor). Конечно, можно создать свой поток вывода, но обычно достаточно стандартных потоков:
cout - стандартный поток вывода (экран)
cerr - стандартный поток вывода ошибок (экран)
Переменную любого встроенного типа можно вывести используя следующую запись:
cout<<"x="<<x; // переменная x будет преобразована в набор символов
Можно определить операторы потокового ввода/вывода и для созданных абстрактных типов данных.
Ввод: Ввод данных из потока осуществляется аналогично с использованием обратного оператора >> (inserter):
cin - стандартный поток ввода (клавиатура)
Переменную любого временного типа можно ввести (считать) из потока:
cin>>x;
Для использования стандартной библиотеки нужно включить ее описание в текст программы. Это делается с помощью директивы препроцессору #include.
#include <iostream> // подключение стандартной библиотеки using namespace std; // объявление об использовании стандартного пространства имен void main() // функция main { cout<<"Data types:"<<endl; // вывод строки cout<<"int = "<<sizeof(int)<<endl; // вывод строки и целочисленного значения cout<<"float = "<<sizeof(float)<<endl; cout<<"double = "<<sizeof(double)<<endl; }
Форматированный ввод/вывод
В С++ используется механизм потокового ввода/вывода. Поток - механизм преобразования значений различного типа в последовательность символов (вывод) и наоборот (ввод)
#include <iostream>
Примеры, которые приводились выше и ввод/вывод, который вы использовали на практических занятиях до сих пор, обычно называют неформатированным выводом.
Часто программисту нужно более детализированное управление. Управление осуществляется для каждого потока отдельно, т.е. если вы определили какой-то формат для потока ввода, то на поток вывода он не подействует. Более того, управление влияет только на следующее выводимое значение.
#include <iomanip>
Управление можно организовать используя манипуляторы потока, которые вставляются между объектами (записываемыми или читаемыми) и тем самым изменяют состояние потока (формат вывода значений):
для вывода целых чисел
dec; // устанавливает десятичную систему счисления hex; // устанавливает шестнадцатеричную систему счисления oct; // устанавливает восьмеричную систему счисления setbase(int b); // вывод целых чисел в системе счисления с основанием b(10,8...) show base; // показывает основание системы счисления
для вывода чисел с плавающей точкой
по умолчанию используется универсальный формат, который наилучшим образом представляет число с точностью 6 значащих цифр:
float f=1234.56789; cout<<f; // 1234.57
научный формат, который представляет число десятичной дробью с одной цифрой перед точкой с показателем степени
cout<<scientific<<f; // 1.2345678e+03
фиксированный формат представляет число как целую часть с дробной частью отделенной точкой. Точность определяет максимальное число цифр после точки. Точность устанавливается с помощью манипулятора setpresision(int n) n - цифр после точки
cout<<fixed<<f; // 1234.567890
для вывода логических переменных
bool valuet=true; bool valuef=false; cout<<valuet<<valuef; // 1 0 cout<<boolalpha<< valuet<<valuef; // true false
Дополнительно можно определить ширину вывода переменных в количестве символов:
setw(int n); // если строка или число длиннее, то будут выведены все setw(0)
А также задать символ для заполнения
setfill(int c); cout<<setw(4)<<setfill(#)<<12; // ##12
Можно определить место размещения заполнителей. По умолчанию как видите заполнители размещаются до значения. Это аналогично записи:
cout<<setw(4)<<setfill('#')<<right<<12;
Можно наоборот:
cout<<setw(4)<<setfill('#')<<left<<12; // 12##
Важные манипуляторы:
endl; // заканчивается строка, т.е. вставляется символ '\n' ends; // заканчивается строка записью ' ' flush; // очистка буфера потока
Это лишь основные манипуляторы, которые вы можете использовать для форматирования. С остальными познакомьтесь самостоятельно:
Манипулятор |
Действие на поток |
showbase noshowbase |
инициирует отображение основания системы счисления |
showpos noshowpos |
инициирует явное отображение знака (+) для положительных значений |
uppercase nouppercase |
инициирует преобразование выводимых символов в верхний регистр |
showpoint noshowpoint |
инициирует отображение десятичной точки при выводе вещественных чисел |
skipws noskipws |
инициирует пропуск пробельных символов при вводе |
left |
инициирует левое выравнивание, заполнение справа |
right |
инициирует правое выравнивание, заполнение слева |
internal |
инициирует внутреннее заполнение (между значением и знаком или основанием системы счисления) |
scientific |
инициирует вывод вещественных значений в научном формате (d.ddddddddE+dd) |
fixed |
инициирует вывод вещественных значений в фиксированном формате (d.dddddd) |
setbase (int base) |
изменяет систему счисления (10, 8, 16) |
dec |
инициирует вывод целочисленных значений в десятичной системе счисления |
oct |
инициирует вывод целочисленных значений в восьмеричной системе счисления |
hex |
инициирует вывод целочисленных значений в шестнадцатеричной системе счисления |
setfill (char n) |
задает заполняющий символ |
setprecision (int n) |
изменяет точность выводимых значений |
setw (int n) |
задает ширину поля вывода |
Файловые потоки
Для первых программ стандартных потоков ввода/вывода будет достаточно, но по мере усложнения программ не обойтись без работы с файлом, которая в С++ осуществляется так же на основе механизма потоков.
#include <fstream> using namespace std; void main() { ifstream inputfile("z:\data.txt"); // создается поток ввода из файла inputfile>>x; // все то же самое что и для cin ofstream outputfile("z:\res.txt"); // создается поток вывода в файл outputfile<<x; // все то же самое что и для cout }
Обратите внимание на двойной слэш \ в имени файла. Это все из-за того, что \ - экранирующий символ.
По умолчанию ввод и вывод данных в поток осуществляется в текстовом режиме. Для того, чтобы данные выводились в двоичном режиме следует использовать следующую запись:
ofstream outfile(filename,ios::binary);
По умолчанию файл открываемый для вывода создается (если он создан), а если существует, то очищается. Для того чтобы открыть файл для добавления:
ofstream outfile(filename,ios::app);
Можно создать файловый поток, который запускает и ввод и вывод:
fstream iofile(filename,ios::in|ios::out);
