- •Тема 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.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
Этапы слияния файлов f1 и f2
Итерация |
Номер текущей элемента файла |
Элемент, записываемый в файл F3 |
|
F1 |
F2 |
||
i |
j |
||
1 |
1 |
1 |
F31=F11=1 |
2 |
2 |
1 |
F32=F12=2 |
3 |
3 |
1 |
F33=F21=3 |
4 |
3 |
2 |
F34=F22=4 |
5 |
3 |
3 |
F35=F13=5 |
6 |
4 |
3 |
F36=F14=7 |
7 |
5 |
3 |
F37=F23=8 |
8 |
5 |
4 |
F38=F24=8 |
9 |
5 |
5 |
F39=F25=10 |
10 |
5 |
6 |
F310=F15=11 |
11 |
6 |
6 |
F311=F16=12 |
12 |
7 |
6 |
F312=F26=15 |
13 |
7 |
7 |
F313=F17=16 |
14 |
8 |
7 |
F314=F27=17 |
15 |
8 |
* |
F315=F18=20 |
7.3.Поиск на графах
На практике часто возникают задачи, связанные с прохождением по вершинам графа. Например, необходимо ответить на вопрос: достижима ли вершина d из вершины r? То есть, существует ли путь из вершины r в вершину d.
Для ответа на вопрос, достижима вершина d из вершины r или нет, необходимо организовать обход вершин графа, начиная из вершины r. Если во время обхода мы встретим вершину d, следовательно, вершина d достижима из вершины r, в противном случае - d из r не достижима.
Существует два способа организации обхода: поиск в глубину и поиск в ширину.
7.3.1.Поиск в глубину
Поиск в глубину на графе G=(V,E) осуществляется по следующим правилам:
Начинаем поиск с начальной вершины r. В качестве текущей вершины v берем вершину r.
Из текущей вершины v двигаемся в любую, ранее не пройденную вершину w, если такая вершина найдется (если вершины w нет, см. пункт 3). Запоминаем дугу, по которой мы попали в вершину w. В качестве текущей вершины v берем вершину w.
Если из вершины v мы не можем попасть в ранее не пройденную вершину w, то возвращаемся в вершину x, из которой мы попали в v. В качестве текущей вершины v берем вершину x.
Процесс поиска (пункты 2, 3) заканчивается, когда мы пытаемся вернуться назад из вершины, с которой начался поиск (вершина r).
Поиск в глубину проиллюстрирован на рис. 7.15.
Алгоритм поиска в глубину представлен укрупненной блок-схемой на рис.7.16.
В алгоритме поиска в глубину требуется определять номер неокрашенной вершины (k) смежной вершине v (см. рис.7.16). Данные действия проще всего реализовать, когда исходный граф хранится матрицей смежности или упакованной матрицей смежности.
В алгоритме используются операции со стеком. Реализация стека может быть любой: на массиве, с помощью указателей или курсоров. Наиболее рационально реализовать стек на массиве. Это связано с тем, что максимальная глубина стека не может превышать числа вершин графа.
Для окраски вершин графа (см. рис.7.16, оператор «Окрасить вершину K») следует использовать множество. В данное множество заносятся окрашенные вершины. Если в алгоритмическом языке стандартный тип «множество» отсутствует, то для реализации множества можно использовать массив M длины n, где n - число элементов множества. Элементами массива M являются числа 0 и 1, причем, M[i]=0, если i-ый элемент принадлежит множеству и M[i]=1, если i-ый элемент не принадлежит множеству. В этом случае оператор «Окрасить вершину K» реализуется следующим образом: M[K]:=1.
Отметим, что дуги, по которым осуществляется обход графа (окрашенные дуги) в результате выполнения алгоритма поиска, образуют ориентированное дерево с корнем в начальной вершине. Поэтому для окраски дуги графа (см. рис.7.16, оператор «Окрасить дугу (v,K)») следует использовать массив P, хранящий ориентированное дерево (см. разд. 2.4.8). В этом случае оператор «Окрасить дугу (v,K)» реализуется следующим образом: P[K]:=v.