
- •Часть 1
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Рабочая учебная программа
- •Учреждение образования
- •«Белорусский государственный университет
- •Информатики и радиоэлектроники»
- •Часть 2 __184__
- •Содержание дисциплины
- •1. Индивидуальные практические занятия, их характеристика
- •2. Контрольные работы, их характеристика
- •3. Курсовой проект, его характеристика
- •4. Литература
- •4.1. Основная
- •4.2. Дополнительная
- •5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- •Протокол согласования учЕбной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
- •Теоретический раздел Введение
- •1. Основные типы данных
- •1.1. Общие сведения
- •1.2. Данные типа int
- •1.3. Данные типа char
- •1.4. Модификаторы доступа const и volatile
- •1.5. Данные вещественного типа (с плавающей точкой)
- •1.6. Элементарный ввод-вывод
- •1.7. Структура простой программы на языке Си
- •2. Операции и выражения
- •2.1. Выражение и его интерпретация
- •2.2. Основные операции
- •2.2.1. Арифметические операции
- •2.2.2. Побитовые логические операции
- •2.2.3. Операции сдвига
- •2.2.4. Операция присваивания
- •2.2.5. Операция sizeof
- •2.2.6. Преобразование типов в выражениях
- •2.2.7. Операция преобразования типов
- •2.2.8. Приоритеты в языке Си
- •3. Операторы управления вычислительным процессом
- •3.1. Оператор if
- •3.2. Операции отношения
- •3.3. Логические операции
- •3.4. Операция запятая
- •3.5. Операция условия ?:
- •3.6. Оператор безусловного перехода goto
- •3.7. Оператор switch
- •`` ` `3.8. Операторы цикла
- •3.8.1. Оператор for
- •3.8.2. Оператор while
- •3.8.3. Оператор do...While
- •3.9. Оператор break
- •3.10. Оператор continue
- •4. Массивы и указатели
- •4.1. Одномерные массивы и их инициализация
- •4.2. Многомерные массивы и их инициализация
- •4.3. Объявление указателей
- •4.4. Операции над указателями
- •1) Взятие адреса
- •2) Косвенная адресация или разыменование указателя
- •3) Увеличение или уменьшение значения указателя на целое число
- •4) Разность указателей
- •5) Сравнение указателей
- •6) Присваивание указателей друг другу
- •4.6. Связь между указателями и массивами
- •4.7. Динамическое распределение памяти
- •4.8. Массивы указателей
- •5. Функции
- •5.1. Общие сведения
- •5.2. Область видимости переменных
- •5.2.1. Локальные переменные
- •5.2.2. Глобальные переменные
- •5.3. Передача параметров в функцию
- •5.4. Рекурсивные функции
- •5.5. Использование функций в качестве параметров функций
- •5.6. Указатели на функции
- •5.7. Структура программы на Си
- •5.8. Передача параметров в функцию main()
- •6. Строки
- •7. Классы хранения и видимость переменных
- •7.1. Общие сведения
- •7.2. Автоматический класс хранения (auto)
- •7.3. Регистровый класс хранения (register)
- •7.4. Статический класс хранения (static)
- •7.5. Внешний класс хранения (extern)
- •7.6. Заключение
- •8. Структуры, объединения и перечисления
- •8.1. Общие сведения
- •8.2. Инициализация структурных переменных
- •8.3. Вложенные структуры
- •8.4. Указатели на структуры
- •8.5. Массивы структурных переменных
- •8.6. Передача функциям структурных переменных
- •8.7. Оператор typedef
- •8.8. Поля битов в структурах
- •8.9. Объединения
- •8.10. Перечисления
- •9. Динамические структуры данных
- •9.1. Общие сведения
- •9.2. Связные списки
- •9.2.1. Односвязные списки
- •9.2.2. Двусвязные списки
- •9.2.3. Циклические списки
- •9.3. Стеки
- •9.4. Очереди
- •9.5. Деревья
- •9.5.1. Понятие графа
- •9.5.2. Бинарные деревья
- •10. Файлы
- •10.1. Общие сведения
- •10.2. Открытие и закрытие файлов
- •10.3. Функции ввода-вывода для работы с текстовыми файлами
- •10.4. Произвольный доступ к файлу
- •10.5. Функции ввода-вывода для работы с бинарными файлами
- •11. Директивы препроцессора
- •11.1. Основные понятия
- •11.2. Директива #include
- •11.3. Директивы препроцессора #define и #undef
- •11.3.1. Символические константы
- •11.3.2. Макросы с параметрами
- •11.3.3. Директива #undef
- •11.4. Условная компиляция
- •11.5. Директивы # и ##
- •12. Модульное программирование
- •13. Введение в объектно-ориентированное программирование
- •13.1. Постановка задачи
- •13.2. Решение задачи средствами Си
- •13.5. Наследование
- •13.6. Перегрузка
- •13.7. Ссылочный тип
- •Литература
- •Приложение 1. Рекомендации по оформлению текстов программ
- •Тесты к теоретическому разделу Вопросы к разделу 1. Основные типы данных
- •Вопросы к разделу 2. Операции и выражения
- •Вопросы к разделу 3. Операторы управления вычислительным процессом
- •Вопросы к разделу 4. Массивы и указатели
- •Вопросы к разделу 5. Функции
- •Вопросы к разделу 6. Строки
- •Вопросы к разделу 7. Классы хранения и видимость переменных
- •Вопросы к разделу 8. Структуры, объединения и перечисления
- •Вопросы к разделу 9. Динамические структуры данных
- •Вопросы к разделу 10. Файлы
- •Вопросы к разделу 11. Директивы препроцессора
- •Вопросы к разделу 12. Модульное программирование
- •Вопросы к разделу 13. Введение в ооп
- •Правильные ответы на вопросы тестов к теоретическому разделу
- •Вопросы к теоретическому зачету
- •Варианты индивидуальных заданий
- •Контрольная работа №2
- •Варианты индивидуальных заданий
- •Индивидуальные практические работы Указания к выбору варианта индивидуальных практических работ
- •Индивидуальная практическая работа № 1. Массивы и строки
- •Варианты индивидуальных заданий
- •Индивидуальная практическая работа № 2. Динамические структуры данных
- •Варианты индивидуальных заданий
9.4. Очереди
Очередь – это также подвид списка, это набор данных, доступ к которым осуществляется с двух концов. Запись осуществляется с конца очереди, называемого хвостом, а удаление из начала очереди. Принцип организации очереди – FIFO (First Input First Output) – «Первым вошел, первым вышел» -- противоположен принципу организации стека.
Структура очереди не отличается от структуры односвязного списка или стека. Она состоит из поля данных, в данном случае, элемента типа int и указателя на следующий элемент очереди (рис. 9.6):
struct Queue
{
int element;
struct Queue *nextPtr;
};
Рис. 9.6. Очередь
Различие заключается в функциях обработки. Основными функциями при работе с очередью являются функция добавления и удаления элементов. Добавление новых элементов осуществляется только в конец очереди. Функция получает в качестве параметров, указатели на начало и конец очереди, а также вставляемый элемент. При добавлении сначала под новый элемент выделяется память, а потом он вставляется в конец очереди: если очередь еще не создана, то указателям на начало и конец очереди присваивается значение указателя на новый элемент. Следует заметить, что при процедуре добавления, после того, как вставлен первый элемент, значение головного указателя изменяться не будет.
typedef struct queue *QueuePtr;
void insertElement(QueuePtr *firstPtr,
QueuePtr *endPtr,
int value)
{
QueuePtr newPtr, previousPtr, workPtr;
// выделение памяти
newPtr = (Queue *) malloc(sizeof(Queue));
if (newPtr != NULL)
{
newPtr->element = value;
newPtr->nextPtr = NULL;
if((*endPtr) == NULL) // если очереди еще нет
{
*firstPtr = newPtr; // указателям на начало и конец
// очереди присваивается значение
*endPtr = newPtr; // указателя на новый элемент
}
else
{
(*endPtr)->nextPtr = newPtr; // иначе элемент
// присоединяется к концу
(*endPtr) = newPtr; // очереди и
// переопределяется
// указатель на конец
}
}
else
printf("Error!");
}
Функция удаления элемента из очереди аналогична функции удаления элемента из стека.
void deleteElement(QueuePtr *firstPtr)
{
QueuePtr workPtr;
if (*firstPtr != NULL)
{
workPtr = *firstPtr; // рабочему указателю присваивается
// адрес начала очереди
// указателю на начало присваивается значение указателя
// на следующий элемент
(*firstPtr) = (*firstPtr)->nextPtr;
free(workPtr); //элемент из начала очереди удаляется
}
else
printf(“Error!”);
}
9.5. Деревья
9.5.1. Понятие графа
Граф – набор точек на плоскости, называемых вершинами или узлами, некоторые из которых соединены отрезками, называемыми дугами или ребрами графа. Если направление ребра не имеет значения, то граф называется неориентированным или ненаправленным, если же имеет, то граф называется ориентированным или направленным. Пример ориентированного графа представлен на рис. 9.7.
Рис. 9.7. Пример ориентированного графа
Графы в памяти можно представлять в виде матрицы смежности (рис. 9.8), под которой понимается квадратная матрица порядка n с элементами аij, где aij = 1, если существует ребро (Vi, Vj), если связи нет, то aij = 0.
|
V1 |
V2 |
V3 |
V4 |
V5 |
V1 |
0 |
1 |
0 |
1 |
0 |
V2 |
0 |
0 |
0 |
1 |
0 |
V3 |
0 |
0 |
0 |
1 |
1 |
V4 |
0 |
0 |
0 |
0 |
1 |
V5 |
0 |
0 |
0 |
0 |
0 |
Рис. 9.8. Матрица смежности ориентированного графа
Дерево – это специальный вид направленного графа. Дерево является нелинейной структурой. Оно состоит из множества связных элементов, называемых узлами. Дерево имеет одну вершину, которая является началом всего дерева и называется корнем дерева.
Каждый указатель связи в корневом узле ссылается на дочерний узел или узел-потомок. Каждый узел дерева является корнем поддерева, которое определяется данным узлом и всеми потомками этого узла (рис. 9.9).
Узел В называется предком или родителем узла Е, а узел Е – потомком узла В, если элемент не имеет потомков, то он называется листом, например Е, F, G. Узел D есть корень поддерева, содержащего узлы D, G. Узел F является корнем поддерева без потомков.
Частным случаем деревьев являются бинарные деревья.
Рис. 9.9. Представление дерева