- •Тема 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.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
6.8.Реализация очередей
При реализации очередей, как и при реализации стеков, используется реализация списков.
Если реализация списков осуществлена на массивах, то реализация оператора удаления первого элемента очереди DEQUEUE(Q)=DELETE(FIRST(Q),Q) не эффективна т.к. требует перемещения всех элементов очереди.
Аналогичная ситуация возникала при реализации стека на списке созданного на массиве. В случае стека перемещения всех элементов удалось избежать путем идентификации вершины стека последней позицией списка. Поступим аналогично и при реализации очереди. В результате удаление первого элемента очереди будет осуществляться за одно действие DEQUEUE(Q)=DELETE(LAST(Q),Q). Однако вставка элемента в конец очереди будет осуществляться путем перемещения всех элементов очереди - ENQUEUE(x,Q)=INSERT(x,FIRST(Q),Q).
Таким образом, простым изменением идентификации первого элемента нельзя добиться выполнение обоих операторов ENQUEUE(x,Q) и DEQUEUE(Q) за одно действие. Поэтому при реализации очереди на массивах используют так называемые циклические массивы. В циклическом массиве считается, что за последним элементом следует первый элемент. Такая связь является логической и организуется программным способом.
Предложите способ реализации очереди на циклическом массиве.
6.9.Графы и деревья
Понятия теории графов широко используются при формализации различных задач. Термин "граф" ввел Д.Кенег в 1936 г.
Пусть V - непустое множество, V{2} - множество всех его двухэлементных подмножеств. Пара (V,E), где ЕV{2}, называется графом или неориентированным графом.
Элементы множества V называют вершинами графа, а элементы множества E – ребрами графа.
Ориентированным графом (орграфом), называется пара (V,E), где EVV= {(v1,v2)|v1V,v2V}.
То есть в ориентированном графе важен порядок вершин составляющих ребро. В ориентированных графах вместо термина «ребро» используют термин «дуга». 1
Далее, если речь идет о графе G=(V,E) множество вершин будем обозначать VG, а множество ребер (дуг) - EG.
Граф G можно представить в виде некоторой геометрической структуры, состоящей из двух множеств: множества точек (вершин) VG и отрезков (ребер) ЕG, которые соединяют некоторые пары точек из VG. Если указаны начало и конец ребра, то отрезок заменяют направленным отрезком.
Две вершины u и v называются смежными, если множество {u,v} является ребром (дугой), и не смежными в противном случае. Также, в этом случае говорят, что u и v являются концевыми вершинами ребра e={u,v}. Для дуги e=(u,v) концевую вершину u называют началом, a v - концом дуги.
Ребра (дуги) называются смежными, если они имеют общую концевую вершину.
Вершина v и ребро (дуга) е называются инцидентными, если v концевая вершина е, и не инцидентными в противном случае.
Ребро e={v,v} или дуга e=(v,v) называется петлей.
Ребра e1={u,v},e2={u,v},...,еk={u,v} называются кратными.
Дуги e1=(u,v),e2=(u,v),...,еk=(u,v) называются параллельными.
Цепью называется любая последовательность попарно различных ребер (дуг), такая, что соседние ребра (дуги) в ней смежны. В орграфе если в цепи учтена ориентация дуг, то она называется путем.
Если не требовать, чтобы ребра (дуги) в упомянутой последовательности были различны, то получим понятие маршрута (ориентированного маршрута).
Циклом называется цепь, у которой начальная и конечная вершины совпадают.
Контуром называется путь, у которого начальная и конечная вершины совпадают.
Граф называется связным, если для каждой пары вершин найдется соединяющий их маршрут.
Граф, который не содержит циклов, называется ациклическим.
Связный неориентированный ациклический граф называется деревом, множество деревьев называется лесом.
Граф Н называется подграфом (или частью) графа G, если VHVG, ЕНEG. Если Н - подграф графа G, то говорят, что Н содержится в G.
Покрывающим (или остовным) деревом графа G называется дерево, являющееся подграфом графа G и содержащее все его вершины.
Если каждому ребру (дуге) графа поставлено в соответствие одно или несколько чисел, то такой граф называется взвешенным.