![](/user_photo/2706_HbeT2.jpg)
- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
9.9. Организация файла с произвольным доступом
Файл, в котором доступ к любой записи выполняется без доступа к предшествующим записям, называется файлом с произвольным доступом. Для работы с файлами с произвольным доступом кроме рассмотренной ранее функции seekp, используются функции seekg, tellp, tellg.
Функция seekg перемещает указатель считывания файла относительно заданной вторым операндом функции позиции на определенное первым параметром количество байтов.
Синтаксис вызова функции seekg:
f.seekg(смещение в байтах, заданная позиция)
где f – файловая переменная.
Функция tellp определяет текущую позицию указателя записи от начала файла, а функция tellg – позицию указателя считывания. Значение позиции задается в байтах.
Синтаксис вызова функций tellp и tellg:
f. tellp()
f.tellg()
Необходимым условием организации файла с произвольным доступом является одинаковая длина всех записей файла. Кроме того каждая запись файла должна иметь уникальное значение некоторого поля или совокупности полей. Минимальное количество полей записи, значение которых однозначно определяет запись, в файле называется первичным ключом. Так записи двоичного файла с информацией о муниципальных округах имеют одинаковую длину, а номер муниципального округа является певичным ключом записей файла. Если номерам муниципальных округов присвоены значения от 1 до 123, то при расположении записей в файле по возрастанию значений номеров муниципальных округов, адрес записи (номер байта от начала файла) можно определить по формуле:
(Номер муниципального округа -1) * длина записи
Для такой организации файла можно реализовать прямой доступ к записи по номеру муниципальнго округа. В программе на языке С++ позицию чтения информации о заданном муниципальном округе в файле можно установить с помощью функции seekg, смещение в которой относительно начала файла можно задать по приведенной выше формуле.
Пример функции, в которой выполняется чтение из двоичного файла с произвольным доступом информации о муниципальном округе с заданным номером:
void read_record(char file_name[], int n)
{
mo m;
ifstream f; //файловый поток
f.open(“mo.mos”, ios::in|ios::binary); //открытие файла для чтения
//Перемещение указателя к записи
f.seekg((n-1)*(sizeof m),ios::beg);
f.read((char*)&m,sizeof m); //чтение записи
cout<<m.number<<’ ‘<<m.name<<’ ‘<<m.ao<<’ ‘<<m.tel;
f.close();
}
10. Данные с динамической структурой
Данные, которые при работе программы изменяют свой размер и/ или структуру, называются данными с динамической структурой. Примерами таких данных являются: линейные и циклические списки, деревья, графы.
10.1. Линейный список
Линейный список – это последовательность элементов, как правило, одного типа. Элементы в списке упорядочены по положению: элемент в списке из n элементов a1, а2, …аn может занимать одно из положений от 1 до n. Каждый элемент аi имеет предшествующий (кроме первого) и последующий (кроме последнего) элементы. Над линейным списком выполняются операции: вставка элемента, исключение элемента, поиск, упорядочивание, просмотр, очистка и другие.
Структура данных в виде линейного списка используется во многих прикладных задачах, например, при учете товаров на складе, продаже и резервировании билетов на самолеты. В программировании используют два способа хранения элементов линейного списка в оперативной памяти:
в массиве;
в связанном указателями списке структур.
Способ хранения определяет способ программной реализации структуры данных.