- •Тема 1. Алгоритмы и программы 4
- •Тема 2. Характеристика языка Си 6
- •Тема 3. Основы языка Си 11
- •Тема 4.Работа с файлами 33
- •Тема 5.Распределение памяти 40
- •Тема 6. Методы организации данных в памяти эвм 43
- •Тема 7. Некоторые алгоритмы обработки данных 58
- •Тема 1. Алгоритмы и программы Цели и задачи изучения темы
- •1.1.Понятие алгоритма. Понятие программы. Способы записи алгоритмов.
- •1.2.Критерии качества программ
- •1.3.Низкоуровневые и высокоуровневые языки программирования
- •1.4.Принципы структурного программирования
- •Принципы структурного программирования.
- •2.2.Основные характеристики языка Си.
- •2.2.1.Достоинства языка Си
- •2.2.2.Компиляторы и интерпретаторы
- •2.2.3.Сильная типизация
- •2.3.Структура простой программы
- •Вопросы для повторения
- •3.1.2.Основные типы данных
- •3.1.3.Структуры данных
- •3.1.4.Оператор определения имени типа typedef
- •3.1.5.Массивы
- •3.1.6.Указатели
- •3.1.7.Указатели и массивы
- •3.1.8.Внешние и внутренние переменные
- •3.2.Стандартные функции ввода-вывода
- •3.3. Операции, операторы и выражения
- •3.3.1.Оператор присваивания
- •3.3.2.Арифметические операции
- •3.3.3.Операции увеличения и уменьшения
- •3.3.4.Операции сравнения
- •3.3.5.Логические операции
- •3.3.6.Побитовые логические операции
- •3.3.7.Операции сдвига
- •3.3.8.Операции "увеличить на", "домножить на" и т.П.
- •3.3.9.Операции с указателями. Указатели и массивы
- •3.3.10.Операция приведения типа
- •3.4.Управляющие конструкции
- •3.4.1.Фигурные скобки
- •3.4.2.Оператор выбора if и операция условия
- •3.4.3.Оператор множественного выбора switch
- •3.4.4.Оператор цикла while
- •3.4.5.Оператор цикла for
- •3.4.6.Оператор цикла do...While
- •3.5.Данные (более детальные сведения)
- •3.5.1.Структуры
- •3.5.2.Указатели и структуры
- •3.5.3.Структуры и оператор определения имени типа typedef
- •3.5.4.Строки
- •3.5.5.Матрицы и многомерные массивы
- •3.6.Пользовательские функции
- •3.6.1.Определение функций
- •3.6.2.Прототипы функций
- •3.6.3.Аргументы командной строки
- •Вопросы для повторения
- •4.2.Функция открытия файла fopen
- •4.3.Функции бинарного чтения и записи fread и fwrite
- •4.4.Функция закрытия файла fclose
- •4.5.Функции форматного чтения и записи fscanf и fprintf
- •4.6.Другие функции ввода-вывода
- •4.6.1.Функции посимвольного ввода-вывода
- •Int fgetc(file *f); - ввести один символ из файла f.
- •Int fputc(int c, file *f); - записать один символ в файл f.
- •4.6.2.Функции построкового ввода-вывода
- •Char *fgets(char *line,int size, file *f); - ввести строку из файла f.
- •Char *fputs(char *line, file *f); - записать строку в файл f.
- •4.6.3.Функции позиционирования в файле
- •Int fseek(file *f, long offset, int whence); - установить текущую позицию в файле f
- •Long ftell(file *f); - получить текущую позицию в файле f
- •Int feof(file *f); - проверить,достигнут ли конец файла f
- •Функция открытия файла fopen
- •Функции бинарного чтения и записи fread и fwrite
- •Функция закрытия файла fclose
- •5.2.Функции malloc и free
- •5.3.Выделение памяти под матрицы на этапе выполнения программы
- •Функции malloc и free.
- •6.2.Время выполнения программ
- •6.3.Списки
- •6.4.Реализация списков
- •6.5.Стеки
- •6.6.Реализация стеков
- •6.7.Очереди
- •6.8.Реализация очередей
- •6.9.Графы и деревья
- •6.10.Некоторые сд для хранения графов и деревьев
- •Матрица смежности графа, изображенного на рис.6.10
- •Матрица инцидентности графа, изображенного на рис.6.10
- •Матрица весов графа, изображенного на рис.6.11
- •Матрица смежности дерева, изображенного на рис.6.16
- •Вопросы для повторения
- •Реализация стеков.
- •Реализация очередей.
- •7.1.1.Поиск элемента в неупорядоченном массиве
- •7.1.2.Поиск элемента в упорядоченном массиве.
- •7.1.3.Фонетический поиск
- •7.2.Алгоритмы сортировки
- •7.2.1.Сортировка методом пузырька.
- •7.2.2.Сортировка вставками
- •7.2.3.Сортировка выбором
- •7.2.4.Пирамидальная сортировка
- •7.2.5.Быстрая сортировка
- •7.2.6.Сортировка слиянием
- •Этапы слияния файлов f1 и f2
- •7.3.Поиск на графах
- •7.3.1.Поиск в глубину
- •7.3.2.Поиск в ширину
- •7.4.Топологическая сортировка графа
- •7.5.Сетевое планирование
- •Информация о проекте
- •7.5.1.Алгоритм расчета наиболее ранних сроков наступления событий
- •7.5.2.Алгоритм расчета наиболее поздних сроков наступления событий
- •7.5.3.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
7.3.2.Поиск в ширину
При поиске в ширину порядок исследования дуг графа отличается. Поиск в ширину производится следующим образом:
Начинаем поиск с произвольной вершины r. Формируем множество текущих вершин A, включив в него вершину r.
Идем в ранее не пройденные вершины по всем дугам, имеющим начальную вершину, принадлежащую множеству A. Запоминаем эти дуги. Формируем множество A, включив в него конечные вершины пройденных дуг.
Процесс поиска (пункт 2) заканчивается, когда множество A станет пустым.
Поиск в ширину проиллюстрирован на рис. 7.17.
Для организации хранения множества A удобно использовать очередь. Алгоритм поиска в ширину представлен укрупненной блок-схемой на рис.7.18.
В алгоритме поиска в ширину используются те же структуры данных, что и в алгоритме поиска в глубину, за исключением того, что стек заменен очередью.
Реализация очереди может быть любой: на циклическом массиве, с помощью указателей или курсоров. Поскольку максимальная глубина очереди не может превышать числа вершин графа, то наиболее рационально реализовать очередь на циклическом массиве.
7.4.Топологическая сортировка графа
Если в ориентированном графе нет контуров (путей у которых начальная и конечная вершины совпадают), то можно перенумеровать вершины данного графа таким образом, что для каждой дуги (i,j) будет выполняться условие i<j. Такая перенумерация верши называется топологической сортировкой графа.
На рис.7.19 приведен топологически отсортированный и не отсортированный граф.
Алгоритм топологической сортировки может быть следующим:
Присвоить номер 1 вершине графа, в которую нет входящих дуг.
Присвоить следующий номер любой неперенумерованной вершине, для которой все предшествующие вершины перенумерованы. Здесь под предшествующими вершинами некоторой вершины u понимаются все вершины v, такие, что дуга (v,u) принадлежит множеству дуг графа. Если на данном шаге нет неперенумерованных вершины, для которой все предшествующие вершины перенумерованы, то это говорит о том, что исходный граф содержит контур (граф не может быть топологически отсортирован) и требуется остановить процесс перенумерации вершин.
Шаг 2 повторяется до тех пор, пока все вершины не будут перенумерованы.
Алгоритм топологической сортировки графа представлен укрупненной блок-схемой на рис.7.20. Программная реализация этого алгоритма представлена в листинге 7.11. В данном листинге граф задан матрицей смежности, элементы которой имеют логический тип. Далее (см. разд.7.5.1) возникнет необходимость осуществлять топологическую сортировку графа заданного матрицей весов, элементы которой имеют целочисленный тип. В связи с этим в листинге 7.11 проверка принадлежности дуги (i,j) графу оформлена в виде отдельной функции EDuga. Это позволит свести к минимуму изменения при переходе к хранению графа с помощью матрицы весов. Данные изменения затронут только функцию EDuga.
Топологическую сортировку графа можно выполнить и другим способом:
Присвоить переменной k значение n, где n - число вершин графа.
Найти вершину u, из которой нет выходящих дуг и присвоить ей номер k. Если на данном шаге нет вершины, из которой нет выходящих дуг, то это говорит о том, что исходный граф содержит контур и требуется остановить процесс перенумерации вершин.
Удалить вершину u вместе с входящими в нее дугами. Уменьшить k на единицу.
Шаги 2 и 3 повторять до тех пор, пока все вершины не будут перенумерованы.