- •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 (использование предикатов)
3.1.4. Двумерный массив
Для создания двумерного массива необходимо указать в квадратных скобках два значения – количество строк и столбцов в массиве.
тип_массива имя_массива[кол-во строк][кол-во столбцов];
Рисунок иллюстрирует индексы элементов двумерного массива. Массив содержит три строки и два столбца.
[0][0] |
[0][1] |
[1][0] |
[1][1] |
[2][0] |
[2][1] |
На самом деле, в памяти двумерные массивы хранятся по строкам, как показано на рисунке:
[0][0] |
[0][1] |
[1][0] |
[1][1] |
[2][0] |
[2][1] |
double matrix[3][2]; // двумерный массив 2х3
double sum=0.;
for(int i=0; i<3; i++) // номер строки
{
for(int j=0; j<2; j++) // номер столбца
{
sum+=matrix[i][j];
}
}
3.1.5. Динамическое размещение двумерного массива (пример 3.2)
Двумерный массив можно разместить динамически, только если представить его как одномерный. В этом случае вместо доступа по индексам [ i][ j], придется вычислять индекс одномерного массива, которому будет соответствовать необходимый элемент двумерного массива.
Например, если двумерный массив 3х2 разместить как одномерный, элементу [1][0] двумерного массива будет соответствовать индекс [2] одномерного массива.
0 |
1 |
2 |
3 |
4 |
5 |
[0][0] |
[0][1] |
[1][0] |
[1][1] |
[2][0] |
[2][1] |
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 3.2. Пример работы с динамическим двумерным массивом
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
// подключение библиотеки ввода-вывода
#include <iostream>
// подключение стандартного пространства имен для использования библиотек
using namespace std;
/////////////////////////////////////////////////////////////////////////////
void main()
{
// динамическое размещение массива 3х2
double *matrix=new double[3*2];
// инициализация массива
for(int j=0; j<2; j++) // номер столбца
{
for(int i=0; i<3; i++) // номер строки
{
matrix[i*2+j]=j*10+i;
}
}
// вывод элементов массива на экран
for(int j=0; j<2; j++) // номер столбца
{
for(int i=0; i<3; i++) // номер строки
{
cout<<matrix[i*2+j]<<" ";
}
cout<<endl;
}
delete [] matrix; //освободить память
}
/////////////////////////////////////////////////////////////////////////////
3.2 Контейнеры
При практическом программировании возможностей, которые предоставляют обычные массивы, недостаточно. Это привело к созданию и активному использованию различных гомогенных типов данных (т.е. структур данных предназначенных для хранения однотипных элементов). Вектор, стек, очередь, список, ассоциативный массив, дерево. Все эти структуры предназначены для хранения однотипных данных, но организация этого хранения, извлечения и обработки элементов этих структур осуществлена по-разному. Такие типы данных называются контейнеры.
При организации контейнера требуется решить следующие принципиальные вопросы.
Каким образом осуществляется хранение элементов контейнера? Т.е. каким образом элементы должны быть расположены в памяти: последовательно, непрерывным блоком, или они могут быть разбросаны по всей памяти.
Каким образом осуществляется доступ к элементам контейнера? По индексу или достаточно последовательного перебора.
вектор |
|
|
стек |
|
|
очередь |
|
|
список |
|
|
дерево |
|
|
ассоциативный массив |
|
|
Стандартная библиотека С++ предоставляет все возможные контейнеры, кроме деревьев. Это связано с тем, что при решении разных задач к деревьям предъявляются разнообразные требования и выработать обобщенный шаблон этой структуры данных достаточно сложно.
