![](/user_photo/2706_HbeT2.jpg)
- •Содержание
- •Рекомендации к проведению лабораторных работ
- •Комментарии в тексте программы
- •Компиляция и запуск программы на выполнение
- •Переменные и константы
- •Операторы и выражения
- •Оператор присваивания
- •Арифметические операции
- •Логические операции
- •Составной оператор 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
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT11x1.jpg)
11
Составной оператор begin..end
Зарезервированные слова begin и end означают соответственно начало и конец тела блока. Выражения, заключенные во внутрь составного оператора могут рассматриваться Delphi как единый оператор.
Условный оператор if..then
Задачей оператора if..then (если … тогда) является выполнение действия по условию, причем условие должно быть булевского типа: Да/Нет. Синтаксис условного оператора следующий:
if <булево условие> then <оператор>;
if X>5 then Y := Y+1;
Если выполняется условие X > 5 тогда переменной Y будет присвоено значение Y+1.
Условный оператор if … then допускает включение в свою конструкцию слова else (иначе):
if <булево условие> then <оператор1> else <оператор2>;
If X>5 then Y := Y+1 else Y := Y-1;
Оператор-селектор case..of
Конструкция оператора-селектора case..of следующая:
case <селектор> of
<константа1> : <оператор1>; <константа2> : <оператор2>; <константа3> : <оператор3>;
else <оператор>; end;
В роли селектора могут выступать: переменная, выражение или функция, но обязательно порядкового типа. Недопустимы селекторы строкового и действительного типов. Оператор Case осуществляет проверку на равенство значений селектора и констант оператора. В случае если значение селектора совпадает со значением константы, то выполняется соответствующий константе оператор.
case MyValue of 1 : X:=1;
2 : X:=Y+3; else X:=0;
end;
Оператор case обладает большей наглядностью, чем группа операторов if..then. Но это не единственное из его достоинств. Ещё одним преимуществом селектора case..of считается возможность группировки констант.
var Ch:Char; |
|
. . . |
|
case ch of |
: <оператор1>; |
‘A’ .. ‘D’ |
|
‘E’ |
: <оператор2>; |
else |
<оператор3>; |
end; |
|
Операторы обработки циклов
Циклы предназначены для многократного выполнения оператора (группы операторов), заключенных во внутрь циклической конструкции. Delphi предлагает три различных типа циклов: for
.. do, repeat .. until, while .. do.
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT12x1.jpg)
12
Цикл с параметром for .. do
Цикл с параметром for .. do применяется в тех случаях, если априорно известно количество повторений, необходимых для выполнения каких то действий. Синтаксическая конструкция выглядит следующим образом:
for <параметр цикла>:=<стартовое значение>
to (downto) <конечное значение> do <оператор>;
Параметром цикла может быть любая порядковая переменная. При каждом проходе цикла она получает приращение (уменьшение) на единицу. Цикл продолжается до тех пор, пока значение параметра не достигнет конечного значения. Например нам требуется обнулить все элементы
массива MyArray : array[0..99] of integer;
for X:=0 to 99 do MyArray[X]:=0;
В том случае если шаг цикла отличен от единицы или мы заранее не знаем количество повторений тела цикла, то вместо цикла с параметром следует применять цикл с предусловием или с постусловием.
Ни в коем случае не допускается изменять значения параметра внутри тела цикла for…do. Ведь это не более чем счётчик числа итераций. Если же Ваша интуиция и логика программы подсказывают, что необходимо найти решение, в котором параметр цикла будет выступать не только в виде банального счётчика, но и в роли управляемого параметра, то на службу вместо цикла for..do надо поставить цикл while..do или repeat..until.
Цикл с предусловием while..do
Особенность цикла с предусловием заключается в том, что код, сосредоточенный в теле цикла будет выполняться до тех пор, пока соблюдается условие, описанное в заголовке цикла. Конструкция цикла выглядит так:
while <условие - логическое выражение> do <оператор>;
Условие цикла задаётся в виде булевого выражения.
X :=0;
while X<=99 do //выполнять пока значение X не превышает 99 begin
MyArray[X]:=0;
X:=X+1; end;
Предложенный пример повторил задачу обнуления массива, но уже при помощи цикла while .. do.
Цикл с предусловием уже свободен от недостатков своего предшественника – цикла for … do. В нём мы можем определять любое приращение шага и не задумываться о количестве повторений тела цикла.
Организация цикла while .. высока вероятность погони за цикла.
do требует от программиста большой внимательности, так как своим хвостом, другими словами возникновения бесконечного
Цикл с постусловием repeat..until
Оператор repeat .. until весьма схож со своим предшественником while .. do.
repeat <оператор> until <условие – логическое выражение>;
Основные отличия цикла repeat .. until от while .. do заключаются в следующем. Вопервых: оператор цикла repeat .. until вне зависимости от логического выражения будет выполнен хотя бы один раз. Это объясняется местонахождением логического выражения – проверка условия происходит после того, как выполнилось тело цикла. Во-вторых: в отличие от цикла while … do выход из цикла с постусловием осуществляется при истинности логического выражения. Другими словами: цикл repeat .. until будет выполняться до тех пор, пока логическое выражение не соблюдается.
X :=0;
![](/html/2706/363/html_6nPrlBqXsZ.l5CD/htmlconvd-KP4AzT13x1.jpg)
13
repeat
MyArray[X]:=0;
X:=X+1;
until X>100; //выполнять пока значение X меньше 100
Вложенные циклы
Одним из приёмов работы с циклами является идея использования вложенных циклов, в этом случае в теле одного цикла выполняется другой. В следующем примере представлен способ обнуления всех элементов двумерного массива A. Обращение к ячейкам массива производится в рамках двойного цикла for..do.
var A : Array[0..9, 0..9] of Integer; x, y : byte;
begin
for x:=0 to 9 do
for y:=0 to 9 do A[x, y]:=0;
end;
Процедуры break и continue
Изучение циклов было бы логически не завершенным без рассмотрения процедур прерывания текущей итерации цикла (break) и внеочередного начала следующей итерации (continue).
procedure Break; procedure Continue;
Рассмотрим такой пример:
var Accept : boolean; Counter : Integer;
begin
Accept:=true;
Counter:=0;
while Accept=true do begin
Counter:=Counter+1;
Accept:=<выражение>;
if Counter>10 then break; end;
end;
Цикл будет прерван в том случае, если значение переменной-счетчика (counter) превысит 10.
Другой пример. Нам необходимо подсчитать сумму четных чисел, входящих в диапазон от 0 до 10. Для этого воспользуемся процедурой Continue() и функцией Odd(), определяющей чётное, или нечётное число.
function Odd(X: Longint): Boolean;//X нечетное – результат true, иначе – false var Counter, Sum : Integer;
begin
Sum:=0;
for Counter:=0 to 10 do begin
if Odd(Counter)=true then Continue; Sum:=Sum+Counter;
end; Write(Sum); ReadLn; end;
Если переменная counter принимает четное значение, то выполняется выражение sum := sum + counter. В противном случае метод Continue() принуждает цикл начать новую итерацию (досрочно увеличивает счётчик Counter на единицу.