- •Д.Г. Хохлов
- •Оглавление
- •Предисловие
- •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. Дневник выполнения курсовой работы
Приложение 2. Текст программы модуля main
/**************************************************************/
/* Курсовая работа */
/* по алгоритмическим языкам и программированию */
/* Поиск кратчайшего цикла в графе */
/* Группа 4105 И.И. Иванов 17.03.95 */
/**************************************************************/
#include <stdio.h>
#include "graf.h"
void main()
{
int n; /* количество вершин графа */
char g[NMAX][NMAX]; /* матрицa смежности графа */
int i; /* номер вершины */
int cmin[NMAX+1]; /* номера вершин минимального цикла */
int dcmin; /* длина цикла минимальная */
int kp; /* количество петель */
int kz; /* код завершения подпрограммы */
vyvsoob (3); /* "Введите граф ..." */
kz = vvodg (&n, g); /* ввод графа */
if (kz > 1) /* Ввод прерван */
{ vyvsoob (kz+2); /* Вывод сообщения 5 - 7 */
if (kz == 3) /* Недопустимое n */
printf (" %d\n", NMAX);
if (kz == 4) /* Недопустимый N верш. */
printf (" %d\n", n-1);
vyvsoob (8); /* Решение прекращено */
}
else
{ if (kz == 1) /* Было повторение ребер */
vyvsoob (9); /* Вывод сообщения 9 */
vyvmsm (n, g);
/* подсчет и удаление петель */
kp = 0;
for (i=0; i<n; i++)
{ kp = kp + g[i][i];
g[i][i] = 0;
}
if (kp) vyvsoob (10); /* Были петли (удалены) */
if (pminc (n, g, &dcmin, cmin)) /* поиск min цикла */
vyvsoob (2); /* Нет циклов */
else
{ vyvsoob (1); /* Минимальный цикл... */
printf ("%d:\n", dcmin);
vyvodp (dcmin+1, cmin); /* вывод min цикла */
}
}
}
Приложение 3. Текст программы модуля pminc
/********************************************************************/
/* Поиск минимального цикла в графе с количеством вершин n, */
/* матрицей смежности g. Значение функции: 0 - цикл найден, */
/* 1 - граф не имеет циклов. Номера вершин найденного цикла */
/* - в векторе c, его длина - dcmin (3..n). */
/* Метод: итеративный обход графа в глубину. */
/* И.И. Иванов 13.03.95 */
/********************************************************************/
#include "graf.h"
int pminc (int n, char g[][NMAX], int *dcmin, int c[])
{
int v[NMAX+1]; /* стек с номерами вершин текущего пути */
int k; /* указатель стека v */
int j; /* номер строки матрицы смежности */
int vn; /* номер очередной вершины текущего пути */
/* Поиск кратчайшего цикла обходом графа в глубину */
*dcmin = n + 1; /* длина минимального цикла (3..n) */
for (v[0]=0; v[0]<n && *dcmin>3; ) /* начальная вершина */
{ /* Обход в глубину дерева путей, начинающихся с v[0] */
k = 1; v[1] = v[0]+1; /*нач-ный номер преемников v[0]*/
do
{ /* найти вершину vn - очередного преемника v[k-1] */
j = v[k-1];
for (vn=v[k]; vn<n && (g[j][vn]==0 || k>1 && vn==v[k-2]); vn++ ) ;
if (vn<n && k<*dcmin) /* можно вперед */
{ v[k] = vn; /* вперед: vn - в стек */
v[k+1] = v[0]; /* начальный преемник v[k] */
if (v[0]==v[k] && k>0) /* нашли цикл */
{ *dcmin = k;
/* запомнить цикл v[0]...v[k] */
for (j=0; j<=k; j++) c[j] = v[j];
k = k - 3; /* назад: удалить 2 вершины пути */
v[k+1]++; /* следующий преемник v[k] */
}
k++;
} else /* назад */
{ k--; /* удалить v[k] из стека */
v[k]++; /* следующий преемник v[k-1] */
}
} while (k > 0 && *dcmin>3); /* стек не пуст */
}
return *dcmin > n;
}