- •Тема 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.5.1.Алгоритм расчета наиболее ранних сроков наступления событий
Обозначим время, необходимое для выполнения операции (x,y) через t(x,y). Проанализируем сетевой график, чтобы определить, как быстро может быть завершен соответствующий ему проект. Для этого для каждого события x рассчитаем величину E(x) - наиболее ранний из возможных сроков наступления события x.
Рассмотрим фрагмент некоторого сетевого графика, представленный на рис.7.22. Пусть известны наиболее ранние сроки наступления 5,8 и 9 события, т.е. известно, что событие 5 в наилучшем случае (наиболее рано) произойдет через четыре единицы времени после начала работы над проектом, событие 8 - через 7 единиц времени, а событие 9 - через 6. Также известны времена выполнения операций (5,14), (8,14) и (9,14), которые равны 6,4 и 3 единицам времени соответственно. Требуется рассчитать наиболее ранний срок наступления события 14. Очевидно, что событие 14 не может произойти, пока не завершатся все операции (5,14), (8,14) и (9,14). Операция (5,14) в лучшем случае завершиться через E(5)+t(5,14)=4+6=10 единиц времени после начала работы над проектом. Аналогично операция (8,14) в лучшем случае завершиться через E(8)+t(8,14)=7+4=11, а операция (9,14) - через E(9)+t(9,14)=6+3=9 единиц времени после начала работы над проектом. Таким образом, все операции (5,14), (8,14),(9,14) завершаться через max(10,11,9)=11 единиц времени и наиболее ранний срок наступления события 14 также равен 11 единицам времени.
В общем случае наиболее ранний срок события j в сетевом графике G=(V,E) рассчитывается по формуле:
Алгоритм расчета наиболее ранних сроков наступления событий представлен на рис.7.23.
7.5.2.Алгоритм расчета наиболее поздних сроков наступления событий
Проанализируем сетевой график, с целью определения для каждого события x наиболее поздний срок его наступления L(x), т.е. срок появления события x, еще допускающий своевременное окончание всего проекта.
Рассмотрим фрагмент некоторого сетевого графика, представленный на рис.7.24. Пусть известны наиболее поздние сроки наступления 20,24 и 29 события и эти сроки соответственно равны 16, 19 и 22 единицам времени. Другими словами, если событие 20 наступит через 16 единиц времени после начала работы над проектом, то еще можно в намеченный срок завершить весь проект. Если же событие 20 наступит по прошествии более 16 единиц времени от начала работы над проектом, то это приведет к задержке выполнения проекта. Аналогично, если 24 или 29 событие наступят соответственно по прошествии 19 и 22 единиц времени от начала работы над проектом, то это также приведет к задержке выполнения проекта.
Требуется рассчитать наиболее поздний срок наступления события 17. Очевидно, что событие 17 не может произойти позже, чем через L(20)-t(17,20)=16-5=11 единиц времени после начала работы над проектом. Кроме того, событие 17 не может произойти позже, чем L(24)-t(17,24)=19-4=15 единиц времени, иначе событие 24 наступит слишком поздно, (более 19 единиц времени). Также событие 17 не может произойти позже, чем L(29)-t(17,29)=22-8=16 единиц времени, иначе событие 29 наступит слишком поздно, (более 22 единиц времени).
Таким образом, наиболее ранний срок наступления события 17 равен min(11,15,16)=11 единицам времени.
В общем случае наиболее поздний срок события i в сетевом графике G=(V,E) рассчитывается по формуле:
Алгоритм расчета наиболее поздних сроков наступления событий представлен на рис.7.25.
Пример расчета наиболее ранних и наиболее поздних сроков наступления событий представлен на рис.7.26. Расчет состоит из следующих этапов:
E(1)=0;
E(2)=E(1)+t(1,2)=0+4=4;
E(3)=max{E(1)+t(1,3), E(2)+t(2,3)}=max{4+1, 0+3}=5;
E(4)=E(1)+t(1,4)=0+4=4;
E(5)=max{E(2)+t(2,5), E(3)+t(3,5)}=max{4+7, 5+4}=11;
E(6)=max{E(4)+t(4,6), E(5)+t(5,6)}=max{4+2, 11+1}=12;
E(7)=max{E(2)+t(2,7), E(5)+t(5,7), E(6)+t(6,7)}=max{4+8, 11+3, 12+4}=16;
L(7)=E(7)=16;
L(6)=L(7)-t(6,7)=16-4=12;
L(5)=min{L(7)-t(5,7), L(6)-t(5,6)}=min{16-3, 12-1}=11;
L(4)=L(6)-t(4,6)=12-2=10;
L(3)=L(5)-t(3,5)=11-4=7;
L(2)=min{L(7)-t(2,7), L(5)-t(2,5), L(3)-t(2,3)}=min{16-8, 11-7, 7-1}=4;
L (1)=min{L(4)-t(1,4), L(3)-t(1,3), L(2)-t(1,2)}=min{10-4, 7-3, 4-4}=0.
Операция (x,y), для которой E(x)=L(x) и E(y)=L(y) является критической и задержка ее выполнения приведет к задержке выполнения всего проекта. На рис.7.26 дуги, соответствующие критическим операциям выделены жирно. Такие дуги образуют путь из начального события в конечное событие. Этот путь называется критическим. В данном случае такой путь один, хотя в общем случае сетевой график может содержать много критических путей. Простейший пример сетевого графика содержащего два критических пути представлен на рис.7.27.