
- •Содержание
- •Рекомендации к проведению лабораторных работ
- •Комментарии в тексте программы
- •Компиляция и запуск программы на выполнение
- •Переменные и константы
- •Операторы и выражения
- •Оператор присваивания
- •Арифметические операции
- •Логические операции
- •Составной оператор 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

19
Строковый тип
Строковый тип данных предназначен для хранения последовательности букв, цифр и других символов. Обычная строка представляет собой ничто иное, как массив символьных значений и плюс некоторая служебная информация. В Delphi реализовано четыре основных строковых типа (см. таблицу 1.5).
Таблица 1.5. Строковый тип данных
Тип |
Максимальная длина |
|
Размер в памяти |
||
|
|
|
|
|
|
ShortString |
255 символов |
|
2 .. 256 байт |
||
String |
определяется директивой компилятора $H. Если она включена, то соответствует AnsiString, |
||||
|
|
|
иначе ShortString |
||
AnsiString |
около 231символов |
|
4 байта .. 2 Гбайта |
||
WideString |
около 230символов |
|
4 байта .. 2 Гбайта |
||
|
|
|
|
|
|
Программист имеет возможность явным образом указать размер строки. Для этого следует воспользоваться квадратными скобками:
var S:string[10]; //10 символов
Структурные типы
Основное назначение структурных типов – совместное хранение множества однотипных или разнотипных значений.
Массивы
Массив это регулярная структура: все его компоненты - одного типа, называемого базовым типом. Массив также это структура с так называемым случайным доступом, все его компоненты могут выбираться произвольно и являются одинаково доступными.
Плюсов у массива всего два, но зато больших:
1.доступ за константное время к любому элементу;
2.память тратится только на данные.
Минус – один, но тоже большой: статичность, неизменность структуры.
Массив, как и переменную необходимо объявить. Для этого необходимо указать размерность массива и тип хранимых данных:
var <Имя_массива>: array [<нижняя граница> .. <верхняя граница>] of <тип_элементов>;
Если вы полагаете, что в программе будет применяться несколько однотипных массивов, то предварительно стоит определить тип массива, и затем создавать массивы на базе объявленного типа.
type TMyArray = Array [0..9] of integer; // массив из 10 элементов Var Array1, Array2 : TMyArray;
Для обращения к элементам массива с целью чтения или записи достаточно указать индекс элемента в массиве:
NewArray[0]:=199; // 0 элементу массива присваивается значение 199 I:=NewArray[9]; // в переменную I записано содержимое 9-го элемента массива
Иногда полезно задавать массив в виде константы. В нижеприведённом примере двенадцать ячеек массива используются для хранения количества дней в месяцах високосного года.
const
DaysInMonth: array [1..12] of byte = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Вполне реально объявлять "квадратные", "кубические" массивы и массивы более высоких размерностей. Например, объявление двумерного массива размерностью 10 на 10 ячеек выглядит следующим образом:
var MyArray : Array[0..9,0..9] of cardinal;

20
или
var MyArray : Array[0..9] of Array[0..9] of cardinal;
Но теперь, для того, чтобы обратиться к интересующей нас ячейке двухмерного массива потребуется указать 2 индекса.
MyArray[3,6]:=56;
или
MyArray[3][6]:=56;
У рассмотренного выше способа хранения данных есть один существенный недостаток – объявив размерность массива (сделав его статическим), мы не сможем выйти за его границы. А что делать, если заранее даже приблизительно не известно, сколько элементов может оказаться в массиве? В таких случаях используют динамические массивы. Характерным отличием динамического массива от статического заключается в том, что границы такого массива могут изменяться во время работы приложения.
Естественно, что объявление динамического массива выглядит несколько иначе:
var MyArray: array of INTEGER;
Как видите, при объявлении массива мы не определяем его размерность. Но, перед заполнением массива нам, всё-таки, это придётся сделать с помощью метода SetLength():
SetLength(MyArray, 10); //распределяем память для 10-ти элементов массива
Отсчёт элементов динамического массива всегда начинаются с нуля. Если вы работаете с многомерным динамическим массивом следующего вида:
var MyArray : Array of Array of Char;
то все размерности массива можно задавать одновременно:
SetLength(MyArray, 10, 5); //распределили память для 2-х мерного массива
или последовательно для каждого индекса. Такие массивы (с переменной длиной по разным индексам) называют динамическими разреженными массивами.
SetLength(MyArray,3); |
//массив состоит |
из 3-х строк |
||
SetLength(MyArray[0],3); |
//в |
нулевой |
строке 3 элемента |
|
SetLength(MyArray[1],2); |
//в |
первой – 2 элемента |
||
SetLength(MyArray[2],10); |
//во второй |
– 10 |
элементов |
Записи
Рассмотрим небольшую задачу. Необходимо организовать учёт сотрудников фирмы. Учету подлежат: фамилия работника, его заработная плата и стаж работы на предприятии в годах. На первый взгляд решение лежит на ладони – берём три переменных типа String, Currency и Byte соответственно с их помощью обрабатываем данные. Но эта задача решается элегантнее с помощью механизма записей! Объявляем тип TPeople:
type
TPeople = Record Surname : String; Money : Currency; Experience : byte;
end;
Запись TPeople определяет единый тип данных, содержащий три разнотипных элемента, называемых полями записи. Доступ к полям записи осуществляют по их имени. Вот пример заполнения такой записи:
var People : TPeople; //объявление переменной на основе типа данных TPeople begin
People.Surname