
- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
10.3.5. Матрица достижимости. Алгоритм Уоршалла
Mатрица достижимости – это квадратная матрица d из n строк и n столбцов, где n количество вершин графа, в которой dij=1, если в графе существует путь от вершины i до вершины j, и dij = 0 в противном случае.
Пример матрицы достижимости для графа, изображенного на рис. 5, приведен на рис. 9.
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
Рис. 9. Матрица достижимости
Для построения матрицы достижимости используется алгоритм Уоршалла.
В начале алгоритма на основе матрицы смежности выполняется инициализация матрицы достижимости: 1 расставляются для прямых путей между вершинами графа (если a[i][j]!=0, то d[i][j]=1) и для элементов главной диагонали матрицы (d[i][i]=1), остальные элементы заполняются 0. Далее над матрицей достижимости выполняется n итераций, чтобы узнать, можно ли достигнуть из i-вершины j-вершину через k-вершину. Если пары вершин i, k и k, j связаны, то вершина j достижима из вершины i.
Текст функции, реализующей алгоритм Уоршалла:
void Warshall(int d[ ][size], int a[ ][size ], int n)
/* d –матрица достижимости, а – матрица смежности, n – количество вершин графа, size глобальная константа */
{
int i, j, k; //номера вершин
//Начальное заполнение матрицы достижимости
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
if(i==j)
d[i][j]=1;
else
if (a[i][j]==0)
d[i][j]=0;
else
d[i][j]=1;
//Выполнение n итераций над матрицей
for (k=0; k<=n-1; k++)
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
if (d[i][j]==0)
if (d[k][j]==1 && d[i][k]==1)
d[i][j]=1;
}
Матрицу достижимости (ее также называют транзитивным замыканием матрицы смежности) можно использовать для проверки существования пути между двумя вершинами графа. Текст функции, использующей матрицу достижимости для проверки существования пути между двумя вершинами графа:
bool path (int i, int j, int a[ ][size ], int n)
// i и j – номера вершин
// а – матрица смежности
// n – количество вершин графа
// size – глобальная константа (максимальное количество вершин)
{
int d[size][size]; // матрица достижимости
//Формирование матрицы
Warshall(d, a, n);
return d[i][j];
}
Дополнительные сведения об алгоритмах выполнения операций над графом, таких как поиск в глубину, поиск сильно связанной компоненты, проверка ацикличности графа, вывода кратчайшего пути, приведены в [4-6].
Библиографический список
Павловская Т.А. С/ С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002
Дейтл Х.М., Дейтл П.Дж. Как программировать на С++. – М.: Бином -2000
Вирт Н. Алгоритмы и структуры данных. – СПб.: Невский Диалект, 2001
Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и алгоритмы. – М.: Издательский дом «Вильямс», 2001
Седжвик Р. Фундаментальные алгоритмы на С++. Алгоритмы на графах. Часть 5. – М.: ДиаСофт, 2002
Алексеев В.Е., Таланов В.А. Графы и алгоритмы. Структуры данных. Модели вычислений. – М.: Бином, 2006
СОДЕРЖАНИЕ
Введение 3
1.Знакомство с языком С++ 4
1.1. Элементы языка программирования 4
1.2. Алфавит языка 6
1.3. Лексемы 7
1.4. Концепция данных 8
2.Основные типы данных 9
2.1.Обьявление переменных 9
2.2. Операции 11
2.2.1. Арифметические операции 14
2.2.2. Операции присваивания 15
2.2.3. Операции отношения 16
2.2.4. Логические операции 16
2.2.5. Поразрядные операции 17
2.2.6. Вычисление выражений 20
3. Структурное программирование 21
3.1. Общая характеристика операторов 21
3.2. Оператор-выражение 22
3.3. Условный оператор 22
3.4. Составной оператор 24
3.5. Операторы для программирования циклов 24
3.5.1. Оператор цикла for 25
3.5.2. Оператор цикла while 26
3.5.3. Оператор цикла do while 26
3.5.4. Оператор break 27
3.5.5. Оператор continue 28
3.6. Оператор goto 29
3.7. Пустой оператор 29
3.8. Оператор switch 30
3.9. Оператор return 31
4. Массивы 32
4.1. Объявление массива 32
4.2. Обращение к элементам массива 33
4.3. Типовые алгоритмы работы с массивами 34
4.4. Многомерные массивы 37
5. Строки 39
5.1. Объявление строки 39
5.2. Посимвольная обработка строк 40
5.3. Ввод строк 41
5.4. Библиотечные функции для работы с текстом 43
6. Указатели 46
6.1. Объявление указателей 46
6.2. Операции над указателями 47
6.3. Связь между указателями и массивами 51
6.4. Функция strtok для выделения лексем из текста 52
6.5. Динамические массивы 54
7. Структуры и объединения 56
7.1. Объявление структуры 56
7.2. Операции над структурами 57
7.3. Объявление объединения 60
8. Модульное программирование 60
8.1. Нисходящее проектирование и программирование 60
8.2. Определение и вызов функции 63
8.3. Место определения функции в программе 65
8.4. Обмен данными между функциями 69
8.4.1. Использование глобальных переменных 70
8.4.2. Использование аппарата формальных и фактических параметров 72
8.4.3. Передача массивов в функцию 75
8.5. Перегрузка функции 79
8.6. Шаблон функции 83
8.7. Рекурсивные функции 87
8.8. Функции с параметрами по умолчанию 89
8.9. Передача в функцию другой функции 91
9. Работа с файлами 93
9.1. Текстовые и двоичные файлы 94
9.2. Объявление файловых переменных 95
9.3. Чтение текстового файла 98
9.4. Создание текстового файла 100
9.5. Изменение данных в текстовом файле 102
9.6. Вывод в двоичный файл 104
9.7. Чтение данных из двоичного файла 105
9.8. Изменение данных двоичного файла 107
9.9. Организация файла с произвольным доступом 109
10. Данные с динамической структурой 110
10.1. Линейный список 110
10.1.1. Специальные типы линейных списков 111
10.1.2. Реализация линейного списка с помощью массива 112
10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка 115
10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка 120
10.2. Деревья 123
10.2.1. Основная терминология 123
10.2.2. Реализация двоичных деревьев поиска 125
10.2.3. Сбалансированные деревья 129
10.2.4. В-деревья 132
10.3. Графы 133
10.3.1. Определения 134
10.3.2. Реализация графа с помощью списков смежности 135
10.3.3. Реализация графа с помощью матрицы смежности 138
10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры 144
10.3.5. Матрица достижимости. Алгоритм Уоршалла 147
Библиографический список 149
Андреева Людмила Петровна
Программрование
Курс лекций
Изд. лицензия №020456 от 04.03.97
Подписано в печать 00.00.0000. Формат 60х84 1/16
Бумага офсетная. Печать офсетная.
Усл. печ.л. 8,2. Усл.кр.-отт. 35,34. Уч.-изд.л. 9,5
Тираж 100 экз. Заказ 00. Бесплатно
Московский государственный институт радиотехники,
электроники и автоматики (технический университет)
117454,
Москва, просп. Вернадского, 78
1 Рисунок из Википедии www.ru.wikipedia.org
2 Рисунок из Википедии www.ru.wikipedia.org