![](/user_photo/2706_HbeT2.jpg)
- •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.3. Реализация графа с помощью матрицы смежности
При представлении графа матрицей смежности информация о графе задается следующим образом:
количество вершин – целое число (n);
метки вершин – массив из n объектов (v[n]);
связи вершин и веса дуг – матрица смежности (a[n][n]).
Матрица смежности – это квадратная матрица, размеры которой равны количеству вершин (n). Элемент матрицы смежности а[i][j] равен значению дуги, соединяющей вершины v[i] и v[j], или 0, если нет дуги между вершинами v[i] и v[j]. Если орграф не взвешенный, то значение а[i][j]=1, если есть дуга между вершинами i и j, и а[i][j]=0, если нет дуги между i и j. Матрица смежности для графа, изображенного на рис. 5, приведена на рис. 7.
0 |
7 |
9 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
0 |
0 |
0 |
2 |
0 |
15 |
11 |
0 |
6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
14 |
0 |
0 |
0 |
9 |
0 |
Рис. 7. Матрица смежности
Матричная модель графа упрощает реализацию операций над графами. Недостатком представления графа матрицей смежности является необходимость выделять память под всю матрицу, размер которой пропорционален n2, даже если дуг в графе мало. Как следствие этого время выполнения операций над графом, например, поиска в графе также пропорционально n2.
Пример программы, выполняющей операции над графом, реализованном с помощью матрицы смежности. Операции:
создание пустого графа;
добавление вершины;
добавление дуги;
удаление вершины;
удаление дуги;
вывод смежных вершин заданной вершины;
получение веса дуги;
вывод матрицы смежности.
Метки вершин графа заданы символами. Максимальное количество вершин задано глобальной константой.
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
const int size=10;
//Создание пустого графа
void create(int a[size][size],int &n);
//Добавление вершины с меткой name
void add_v( char v[size], char name, int &n);
//Добавление дуги между вершинами name1 и name2 с весом х
void add_a(char name1, char name2, int x, int a[size][size], char v[size], int n);
//Получение номера вершины по ее метке name
int get_v(char v[size], int n, char name);
//Удаление вершины по ее метке name
void del_v(char v[size], char name, int &n, int a[size][size] );
//Удаление дуги между вершинами name1 и name2
void del_a(char name1, char name2, int a[size][size], char v[size], int n);
//Получение веса дуги между вершинами name1 и name2
int get_value(char name1, char name2, int a[size][size], char v[size], int n);
//Вывод матрицы смежности
void output_a(int a[size][size], int n);
void main()
{
int n; //количество вершин
int a[size][size]; //матрица смежности
int x; //вес дуги
char v[size]; //массив вершин
char name1, name2, name; //метки вершин
create(a,n); //инициализация матрицы смежности, n=0
output_a(a,n); //вывод матрицы смежности
//Добавление вершин
for (int i=1; i<=5; i++)
{
cout <<"name:" ; cin>>name;
add_v( v, name, n);
}
for (int i=1; i<=7; i++) //цикл добавление дуг
{
cout <<"name1:" ; cin>>name1;
cout <<"name2:" ; cin>>name2;
cout <<"x:" ; cin>>x;
add_a(name1,name2,x,a,v, n);
}
output_a(a,n);
cout <<"name:" ; cin>>name;
output_v(name, v, n, a); //вывод смежных с name вершин
//Получение веса дуги между вершинами name1 и name2
cout <<"name1:" ; cin>>name1;
cout <<"name2:" ; cin>>name2;
x=get_value(name1,name2,a,v,n);
if (x==-1)
cout<<"error"<<endl;
else
cout<<x<<endl;
//Удаление вершины с меткой name
cout <<"name:" ; cin>>name;
del_v( v, name, n,a);
output_a(a,n);
//Удаление дуги между вершинами name1 и name2
cout <<"name1:" ; cin>>name1;
cout <<"name2:" ; cin>>name2;
del_a(name1,name2, a,v, n);
output_a(a,n);
getch();
}
void create(int a[size][size], int &n)
{
n=0;
for (int i=0; i<size; i++)
for (int j=0; j<size; j++)
a[i][j]=0;
}
void add_v( char v[size], char name, int &n)
{
if(n<=size)
{
v[n]=name;
n++;
}
else
cout<<"error"<<endl;
}
void add_a(char name1, char name2, int x, int a[size][size], char v[size], int n)
{
int i, j;
i=get_v(v,n,name1);
if (i==-1){cout<<"error"; return;}
j=get_v(v,n,name2);
if (j==-1){cout<<"error"; return;}
a[i][j]=x;
}
int get_v(char v[size], int n, char name)
{
for(int i=0; i<n; i++)
if(v[i]==name)
return i;
return -1;
}
void del_v(char v[size], char name, int &n, int a[size][size] )
{
int p, i, j;
p=get_v(v,n,name);
if (p==-1){cout<<"error"; return;}
for(i=p; i<=n-2; i++)
v[i]=v[i+1];
for(i=0; i<=p-1; i++)
for(j=p; j<=n-2; j++)
a[i][j]=a[i][j+1];
for(i=p; i<=n-2; i++)
for(j=p; j<=n-2; j++)
a[i][j]=a[i+1][j+1];
for(i=p; i<=n-2; i++)
for(j=0; j<=p-1; j++)
a[i][j]=a[i+1][j];
n--;
}
void del_a(char name1,char name2,int a[size][size],char v[size], int n)
{
int i, j;
i=get_v(v,n,name1);
if (i==-1){cout<<"error"<<endl; return ;}
j=get_v(v,n,name2);
if (a[i][j]==0){cout<<"error"<<endl; return ;}
a[i][j]=0;
}
int get_value(char name1, char name2, int a[size][size], char v[size], int n)
{
int i, j;
i=get_v(v,n,name1);
if (i==-1){cout<<"error"<<endl; return -1;}
j=get_v(v,n,name2);
if (a[i][j]==0){cout<<"error"<<endl; return -1;}
return a[i][j];
}
void output_a(int a[size][size], int n)
{
if (n==0)
cout<<"a is empty";
else
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
cout<<endl; }