- •Содержание
- •Рекомендации к проведению лабораторных работ
- •Комментарии в тексте программы
- •Компиляция и запуск программы на выполнение
- •Переменные и константы
- •Операторы и выражения
- •Оператор присваивания
- •Арифметические операции
- •Логические операции
- •Составной оператор begin..end
- •Условный оператор if..then
- •Оператор-селектор case..of
- •Операторы обработки циклов
- •Цикл с параметром for .. do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Процедуры break и continue
- •Оператор with..do
- •Процедуры и функции
- •Процедуры
- •Функции
- •1. Фундаментальные структуры данных
- •Общее понятие типа данных
- •Простой тип
- •Перечислимые типы данных
- •Поддиапазонны
- •Строковый тип
- •Структурные типы
- •Массивы
- •Записи
- •Множества
- •Представление структур в памяти
- •Задание
- •2. Работа с последовательностями, файлы
- •Доступ к файлу
- •Операции над файлами
- •Окончание файла
- •Пример работы с файлом
- •Задание
- •3. Анализ алгоритмов
- •Рост функций
- •Задание
- •4. Простейшие методы сортировки массивов
- •Оценка алгоритмов сортировки
- •Шейкер-сортировка
- •Сортировка простыми вставками
- •Сортировка бинарными вставками
- •Задание
- •5. Улучшенные методы сортировки массивов
- •Сортировка с помощью включений с уменьшающимися расстояниями (сортировка Шелла)
- •Пирамидальная сортировка
- •Сортировка с разделением (быстрая сортировка)
- •Задание
- •6. Сортировка последовательных файлов
- •Сортировка простым слиянием
- •Естественное слияние
- •Задание
- •7. Рекурсивные алгоритмы
- •Сравнение рекурсии и итерации
- •Задание
- •8. Динамические структуры данных, связные списки
- •Списки
- •Пример создания и заполнения списка
- •Задание
- •9. Нелинейные структуры данных
- •Граф
- •Бинарное дерево
- •Задание
- •10. Алгоритмы на графах
- •Алгоритмы обхода в глубину и по уровням
- •Построение минимального остовного дерева
- •Поиск кратчайшего пути
- •Задание
- •11. Поиск данных
- •Двоичный (бинарный) поиск элемента в массиве
- •Интерполяционный поиск элемента в массиве
- •Алгоритм Бойера-Мура
- •Задание
- •12. Хеширование
- •Отечественный стандарт хеширования
- •Создание хеш-функции
- •Хеш-функции для строковых значений, алгоритм Гонера
- •Задание
- •13. Методы сжатия текстовых данных
- •Метод “Running”
- •Словарные методы сжатия
- •Алгоритм Хаффмана
- •Задание
- •14. Алгоритмы вывода графических примитивов
- •Рисование отрезка
- •Прямое вычисление координат
- •Инкрементный алгоритм Брезенхэма
- •Простейший алгоритм закрашивания замкнутой области
- •Задание
- •15. Псевдослучайные последовательности
- •Метод середин квадратов
- •Линейный конгруэнтный метод
- •Генератор псевдослучайных чисел, поставляемый с системой
- •Оценка качества генератора ПСП
- •Задание
- •16. Параллельные алгоритмы
- •Пример многопоточного приложения
- •Задание
- •Задание на СКР
- •Вариант 1. Клеточные автоматы
- •Вариант 2. Раскрашивание карты
- •Вариант 3. Крисс-кросс
- •Вариант 4. Лабиринт
- •Список использованной литературы
- •Приложение A. Справочник по функциям Delphi
- •Операции с порядковыми типами
- •Математические функции и процедуры
- •Генерация псевдослучайного числа
- •Преобразование типов данных
- •Работа с памятью
- •Приложение Б. Компонент-сетка TStringGrid
- •Приложение В. Компонент-диаграмма TChart
- •Приложение Д. Элементарный поток – класс TThread
21
People.Money |
:= |
1500.55; |
People.Experience := |
10; |
|
end; |
|
|
Современный синтаксис позволяет создавать записи с различными вариантами полей. Будем назвать такую запись записью с вариантным полем. Синтаксис объявления выглядит следующим образом:
type <имя_типа_записи> = record <поле_1>: <тип_данных_1>; <поле_2>: <тип_данных_2>;
...
case <поле_N>: <порядковоый_тип_данных> of значение_1: (вариант 1);
...
значение_M: (вариант 2);
end;
Отличительная особенность записи с вариантным полем – наличие внутри её оператораселектора Case.
Множества
Множества представляют собой коллекцию однотипных значений. При определении множества вы можете указать диапазон значений:
type TIntSet = set of 1..10;
В качестве элементов множества могут использоваться любые порядковые типы данных:
type TCharSet = set of 'A'.. 'Z';
кроме того, вы имеете право определять свои собственные элементы множества:
type TWeekDays = set of (Mo, Tu, We, Th, Fr, St, Su);
Чем же отличаются множества от изученных ранее поддиапазонов? Представьте себе, что вы работаете в театре, правда, пока не главным режиссёром, а лишь осветителем. Так как театр весьма небольшой, то в распоряжении осветителя лишь три прожектора:
type TLampsSet = set of (Lamp1, Lamp2, Lamp3);
При освещении сцены осветитель в состоянии зажечь любой из прожекторов, или два, или все, короче говоря, выбрать любую понравившуюся комбинацию. Если ассоциировать прожектора с ячейками памяти компьютера, то это всего на всего три бита. Единичка в ячейке свидетельствует о включении, нолик о выключении соответствующего прожектора. Если множество содержит всего три элемента, то общее количество возможных комбинаций составляет 23=8. Зарезервированное слово Set способно определять множество размерностью до 256 элементов. Возведите 2 в
степень 256. и получите 1,1579208923731619542357098500869e+77 вариантов. На практике тако-
го количества вариаций никогда не понадобиться. В частности разработчики Delphi рекомендуют использовать множество с количеством элементов не более 16.
Представление структур в памяти
Проблема представления данных есть проблема отображения абстрактной структуры в память вычислительной машины. В первом приближении эта память представляет собой массив отдельных ячеек памяти, называемых словами (word). Индексы этих слов называются адресами
(address):
Представление массива — это отображение (абстрактного) массива компонент типа T в память, которая представляет собой массив компонент типа word.
Массив следует отображать таким способом, чтобы можно было максимально просто и потому эффективно вычислять адреса его компонент.
Адрес, или индекс памяти, i-ой компоненты массива вычисляется с помощью линейной функции отображения
i =i0 +i ×S , (1.1).
22
Где: i0 – адрес первой компоненты; S – число слов, которые занимает компонента.
Память
i 0
МАССИВ
Рисунок 1.2. – Представление массива в памяти
Так как по определению WORD есть минимальная доступная единица памяти, то, по-видимому, желательно, чтобы S было целым числом. Если S не целое число слов памяти (а так бывает довольно часто), то S обычно округляется до ближайшего большего целого числа [s]. В этом случае каждая компонента массива занимает [S] слов, причем часть слова величиной [S] - S остается неиспользованной
Округление числа занимаемых слов до ближайшего целого называется выравниванием.
Отношение размера памяти, которая отводится для описания структуры данных, к размеру действительно занятой памяти называется коэффициентом использования памяти:
u= ss' = [ss] , (1.2).
Содной стороны, разработчик стремится получить коэффициент использования памяти, близкий
к1. Но поскольку, с другой стороны, доступ к частям слова неясный и довольно неэффективный процесс, разработчику приходится идти на некоторый компромисс. При этом он должен учитывать следующие обстоятельства:
1.Выравнивание понижает коэффициент использования памяти.
2.Отказ от выравнивания может привести к неэффективному обращению к частям слова.
3.Обращение к частям слова может удлинить программу (оттранслированную) и этим свести на нет выигрыш, достигнутый отказом от выравнивания.
Упаковкой называется приём помещения в каждое слово более одной компоненты массива
Записи отображаются в память простым объединением отображений их компонент. Адрес компоненты ri относительно начального адреса записи называется смещением ki.
ki = S1 +S2 +...+Si−1 , (1.3)
где Si – размер компоненты.
Если в одно слово можно укладывать несколько компонент записи, то упаковка позволит экономить память (см. рис. 1.3).
23
Рисунок 1.3. – Представление в памяти упакованной записи
Желательность упаковки будет обозначаться словом packed перед словом array (или record).
Задание
1.Разработайте структуру данных позволяющую составлять прайс-лист магазина. В
прайс-лист входят следующие позиции: название товара, цена за единицу, единица измерения, количество.
2.Подготовьте структуру данных позволяющую создавать расписание телепередач на неделю. В расписание входят следующие позиции: день недели, номер канала, время начала передачи, название передачи, жанр передачи.
3.Подготовьте структуру, предназначенную для описания информации в зачётной книжке студента. Необходимо предусмотреть следующие поля данных: дисциплина,
количество часов, вид отчётности (экзамен, зачёт, курсовая работа), оценка.
4.Предложите структуру для хранения информации о произвольной музыкальной мелодии. Помимо тона звуков, ваша структура должна уметь описывать длительность звучания каждой ноты.
Совет: При определении записей (record) и массивов (array) исследуйте какой объём памяти выделяется для ваших структур при включённом и отключённом режимах упаковки (packed). Для этого вам понадобится помощь функции:
function SizeOf(X): Integer; {возвращает число задействованных байт}
Сделайте выводы об особенностях определения структур с учётом минимизации расхода памяти.
Примечание:
Результаты работы оформляются в письменном виде. В отчетё следует схематично изобразить представление в памяти данных в упакованном и неупакованном виде.