
- •Д.Г. Хохлов
- •Оглавление
- •Предисловие
- •1. Основные понятия
- •2. Проектирование программы
- •2.1. Постановка и анализ задачи
- •2.2. Внешнее проектирование
- •2.2.1. Методика внешнего проектирования
- •2.2.2. Внешнее представление данных
- •2.3. Проектирование структуры программы
- •2.4. Проектирование модуля
- •2.4.1. Этапы проектирования модуля
- •2.4.2. Стиль программирования
- •2.4.3. Пример проектирования модуля
- •3. Отладка программы
- •3.1. Планирование отладки
- •3.2. Проектирование тестов
- •3.3. Отладочные средства
- •5.1.2. Файл проекта
- •6.2. Выполнение и оформление работы
- •6.2.1. Задание
- •6.2.2. Описание применения
- •6.2.3. Описание программы
- •6.2.3. Подготовка к отладке программы
- •6.2.4. Отладка программы
- •6.2.5. Заключение
- •6.2.6. Общие правила оформления
- •Список литературы
- •Приложение. Пример выполнения курсовой работы
- •1. Задание
- •2. Описание применения
- •2.1. Постановка задачи
- •2.2. Обращение к программе
- •2.3. Входные данные
- •2.4. Выходные данные
- •2.5. Сообщения
- •2.5.1. Информационные сообщения
- •2.5.2. Сообщения об ошибках
- •3. Описание программы
- •3.1. Метод решения задачи
- •3.2. Структура программы
- •3.3. Описание модулей
- •3.3.1. Main - главный модуль
- •3.3.2. Pminc - поиск минимального цикла
- •3.3.3. Vvodg - ввод графа
- •3.3.4. Vyvodp - вывод пути
- •4. Подготовка к отладке программы
- •4.1. План отладки
- •4.2. Проектирование тестов
- •4.2.1. Тесты черного ящика
- •4.2.2. Тесты белого ящика
- •4.3. Отладочные средства
- •1. Отладка программы
- •3. Заключение
- •Список литературы
- •Приложение 1. Системные файлы проекта
- •Приложение 2. Текст программы модуля main
- •Приложение 3. Текст программы модуля pminc
- •Приложение 4. Текст программы модуля vvodg
- •Приложение 5. Текст программы модуля vyvmsm
- •Приложение 6. Текст программы модуля vyvodp
- •Приложение 7. Текст программы модуля vyvsoob
- •Приложение 8. Текст отладочной программы драйвера dvvodg
- •Приложение 9. Результаты тестирования программы
- •Приложение 10. Трудоемкость курсовой работы
- •Приложение 11. Дневник выполнения курсовой работы
3.3. Описание модулей
3.3.1. Main - главный модуль
ОБРАЩЕНИЕ ИЗ MS DOS: pkrc
ЗАГОЛОВОК: void main ()
ФУНКЦИЯ: Ввод графа из стандартного входного файла stdin, поиск в нем цикла минимальной длины, вывод результата и сообщений об ошибках в стандартный выходной файл stdout.
ВХОДНЫЕ ДАННЫЕ: Нет.
ВЫХОДНЫЕ ДАННЫЕ: Нет.
ЗНАЧЕНИЕ: Нет.
РАБОЧИЕ ДАННЫЕ:
cmin - номера вершин минимального цикла (пути);
dcmin - длина цикла минимальная;
g - матрицa смежности графа.
i - номер вершины;
kp - количество петель;
kz - код завершения подпрограммы;
n - количество вершин;
АЛГОРИТМ: см. алгоритм 3.2.
Алгоритм 3.2. Алгоритм модуля main
Вывод сообщения 3;
kz = vvodg (n, g); /* ввод графа */
if (kz > 2)
{ Вывод сообщения kz+2;
Вывод сообщения 8;
} else
{ if (kz == 1) Вывод сообщения 9;
kp = 0;
for (i=0; i<n; i++) kp = kp + g[i][i];
if (kp) Вывод сообщения 10;
if (pminc (n, g, dcmin, p))
Вывод сообщения 2;
else
{ Вывод (сообщениe 1, dcmin);
vyvodp (dcmin+1, cmin); /* вывод min цикла */
}
}
3.3.2. Pminc - поиск минимального цикла
ЗАГОЛОВОК:
int pminc (int n, char g[NMAX][NMAX], int *dcmin, int c[])
ФУНКЦИЯ: Поиск минимального цикла в графе с количеством
вершин n и матрицей смежности g.
ВХОДНЫЕ ДАННЫЕ:
n - количество вершин;
g - матрицa смежности графа.
ВЫХОДНЫЕ ДАННЫЕ:
c - номера вершин найденного цикла;
dcmin - длина найденного цикла (3..n).
ЗНАЧЕНИЕ:
0 - цикл найден;
1 - граф не имеет циклов.
РАБОЧИЕ ДАННЫЕ:
v - стек с номерами вершин текущего пути;
к - указатель стека v (индекс свободной позиции).
ИСПОЛЬЗУЕМЫЙ МЕТОД: итеративный обход графа в глубину
(см. раздел 3.1).
АЛГОРИТМ: см. алгоритм 3.3.
Алгоритм 3.3. Алгоритм модуля pminc
/* Поиск кратчайшего цикла обходом графа в глубину */
dcmin = n + 1; /* длина минимального цикла (3..n) */
for (v[0]=0; v[0]<n && dcmin>3; v[0]++) /* нач-я вершина */
{ /* Обход в глубину дерева путей, начинающихся с v[0] */
k = 1; v[1] = v[0]+1; /* начальный номер преемников v[0]*/
do
{ найти номер вершины vn очередного преемника v[k-1];
if (есть vn && k<dcmin) /* есть путь вперед */
{ v[k] = vn; /* вперед: vn - в стек */
v[k+1] = v[0]; /* начальный номер преемников v[k] */
if (v[0]...v[k] - цикл)
{ dcmin = k;
c[0]...c[k] = v[0]...v[k]; /* запомнить цикл */
k = k - 3; /* назад: удалить 2 вершины пути */
v[k+1]++; /* следующий преемник v[k] */
}
k++;
}
else /* назад */
{ v[k]++; /* следующий преемник v[k-1] */
k--; /* удалить v[k] из стека */
}
}
while (k > 0 && dcmin>3); /* стек не пуст */
}
return dcmin>n;