![](/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. Матрица достижимости. Алгоритм Уоршалла
Основные достоинства в-дерева:
В дереве полезное использование пространства внешней памяти свыше 50%. За счет выделения под дерево памяти с запасом необходимость балансировки дерева по высоте возникает не очень часто.
Произвольный доступ к записи реализуется посредством малого количества операций обращения к физическим блокам внешней памяти.
В среднем достаточно эффективно реализуются операции включения и удаления записей; а алгоритмы балансировки при добавлении и удалении данных не очень сложны и требуют небольшого времени.
10.3. Графы
10.3.1. Определения
Граф – непустое конечное множество элементов, называемых вершинами, и попарно соединяющих их линий, называемых ребрами. С помощью графов можно наглядно представить отношения между объектами. Например, автобусное сообщение между объектами - населенными пунктами можно представить в виде графа, в котором вершины – населенные пункты, а ребра - автомобильные дороги.
Ориентированный граф (сокращенно орграф) – Это граф, на ребрах которого указаны направления. Ориентированное ребро называют дугой. Дуга задается парой вершин: начальной и конечной, например,V2V1.
Взвешенный орграф – это орграф, дуги которого имеют значения (вес). Взвешенный орграф изображен на рис. 5.
Рис. 5. Взвешенный орграф
Для представления ориентированного графа в программе используются различные структуры данных [3, 4]. Выбор способа представления графа зависит от операций, которые будут выполняться над вершинами и дугами графа. Любой из способов должен описывать данные графа:
количество вершин;
метки вершин;
связи вершин (наличие дуг между вершинами);
веса дуг, для взвешенного графа.
Наиболее часто используются следующие представления графа:
матрица смежности;
списки смежности.
10.3.2. Реализация графа с помощью списков смежности
При представлении графа списками смежности информация о данных графа задается следующим образом:
количество вершин – целым числом (n);
метки вершин, связи вершин и веса дуг – массивом из n структур, каждая из которых имеет 2 поля: метку вершины и указатель на список смежности.
Список смежности для i-вершины – это список всех вершин графа, смежных с вершиной i с указанием веса дуг от i вершины до смежных с ней. На рис. 6 приведены списки смежности для вершин графа, изображенного на рис. 5.
1: 2 (7), 3 (9)
3: 6 (2)
4: 2 (15), 3 (11), 5 (6)
6: 1 (14), 5 (9)
Рис. 6. Списки смежности для вершин графа
Списки смежности предпочтительнее матрицы смежности, если граф имеет много вершин, но мало дуг. Список смежности можно реализовать с помощью связанного указателями однонаправленного списка. Элемент списка смежности – это структура:
struct element
{
int name; //метка смежной вершины, может быть и другого типа
int value; //вес дуги к смежной вершине
element *next; //указатель на следующий элемент списка
};
Тип вершины графа – это структура:
struct vertex
{
int name; //метка вершины
element *next; //указатель на начало списка смежности
};
Пример программы, выполняющей операции над графом, реализованном с помощью списков смежности. Операции:
создание массива из n вершин графа и пустых списков смежности;
добавление дуги;
вывод графа в виде списка смежных вершин каждой вершины;
получение номера вершины по ее метке.
Метки вершин графа заданы символами.
#include <iostream.h>
#include <conio.h>
struct element //тип элемента списка смежности
{
char name; //метка смежной вершины
int value; //значение дуги к смежной вершине
element *next; //указатель на следующий элемент
};
struct vertex //тип вершины графа
{
char name; //метка вершины
element *next; //указатель на начало списка смежности
};
//Создание массива вершин v[n] спустыми списками смежности
void create (vertex v[ ],int n);
//Добавление дуги между вершинами char1 и char2 с весом х
void add(vertex v, char name1,char name2, int x);
//Вывод графа
void output(vertex v,int n);
//Получение индекса вершины по ее метке
int get_v(vertex v[ ], int n, char name);
сonst int size=10; //максимальное количество вершин графа
void main()
{
vertex v[size]; //массив вершин
int n; //количество вершин
int m; //количество дуг
int x; //вес дуги
char name1,name2; //метки вершин
cout<<”n? “; cin>>n;
create (v,n);
//Ввод дуг
cout<<”m? “; cin>>m;
for (int i=0; i<m; i++)
{
cout<<”name1? “; cin>>name1;
cout<<”name2? “; cin>>name2;
cout<<”x? “; cin>>x;
add(v,name1,name2, x);
}
output(v,n); //вывод графа
getch();
}
void create (vertex v[ ], int n)
{
char name;
for (int i=0; i<n; i++)
{
cout<<”name? “; cin>>name;
v[i].name=name;
v[i].next=0;
}
}
void add(vertex v, char name1, char name2, int x)
{
int i,j;
element*p;
p=new element;
p->name=name2;
p->value=x;
i=get_v(v,n,name1);
if(i==-1)
{cout<<”error”<<endl; return;}
p->next=v[i]->next;
}
void output(vertex v, int n)
{
element*p; //указатель на элемент списка смежности
for (int i=0; i<n; i++) //цикл по спискам смежности
{
cout<v[i].name<<' ';
p=v[i].next;
while (p!=0) //цикл по i-списку смежности
{
cout<<p->name<<’ ‘<<p->value<<” “; //вывод метки вершины
p=p->next;
}
cout<<endl; //вывод i-списка с новой строки
}
cout<<endl;
}
int get_v(vertex v[ ], int n, char name)
{
for (int i=0;i<n; i++)
if (v[i].name==name)
return i; //возвращение индекса вершины
return -1;
}