- •Программирование на языке Паскаль
- •Содержание
- •Введение. Структура программы. Типы данных
- •Структура программы в зыке Паскаль
- •Комментарии
- •Раздел описания переменных
- •Имена идентификаторов в языке Паскаль
- •Типы данных в языке Паскаль
- •Целые типы
- •Вещественные типы
- •Раздел описания констант
- •Оператор ввода
- •Составной оператор
- •Условный оператор
- •Выражения
- •Арифметические операции
- •Логические выражения
- •Логические операции
- •Приоритеты операций
- •Стандартные математические и арифметические функции
- •Структурированные операторы
- •Оператор выбораCase
- •Оператор циклаFor
- •Оператор циклаWhile
- •Inc(n); { Увеличение значения пременнойnна 1 }
- •Оператор циклаRepeat
- •Пользовательские порядковые и составные типы. Процедуры и функции
- •Раздел описания типов
- •Интервальный тип
- •Перечислимый тип
- •Тип массив
- •Строковый тип
- •Процедуры и функции для работы со строками
- •Типизированные константы
- •Процедуры и функции
- •Обращение к процедурам и функциям
- •Процедуры и функции. Процедурные типы. Тип указатель
- •МодификаторыVar иConst в описании формальных параметров
- •Локальность и область действия
- •Процедурные типы
- •Тип указатель
- •Нулевой указатель
- •Работа с текстовыми файлами. Тип запись. Алгоритмы сортировки
- •Файловые типы
- •Процедуры и функции для работы с текстовыми файлами
- •Стандартные текстовые файлы
- •Тип запись
- •Обращение к элементам записи
- •Алгоритмы сортировки
- •Алгоритмы сортировки
- •Алгоритмы сортировки сравнениями
- •Объектно-ориентированное программирование. Структура программного модуля
- •Тип данных «объект»
- •Тип данных «класс»
- •Классификация стилей программирования
- •Структура программного модуля
- •Основы визуального программирования
- •Элемент управления «Поле ввода»
- •Элемент управления «Кнопка»
- •Элемент «Метка»
- •Элемент «Группа переключателей»
- •0:ShowMessage('Выбран вариант 1');
- •Виды изображений
- •КлассTPicture
- •КлассTBitmap
- •ОператорWith
- •КлассTCanvas
- •Библиографический список
- •620002, Екатеринбург, Мира, 19
Тип запись
Синтаксис
RECORD
<Список имен 1>:<Тип 1>;
<Список имен 2>:<Тип 2>;
∙ ∙ ∙
<Список имен N>:<Тип N>;
END
При описании переменной типа «запись» в памяти создается последовательность переменных различного типа (сравните с типом массив, который описывает последовательность переменных одного типа).
Пример
TYPE
Date=RECORD
Day:1..31;
Month:(Jan,Feb,Mar,…,Nov,Dec);
Year:Integer;
END;
Student=RECORD{ К примеру со списком студентов}
Fam,Name,Pat:STRING;
Fakultet:(MM,RT,MT,FT, … );
Group:Integer;
END;
VAR
D:Date;
S:ARRAY [1..100] OF Student;
Обращение к элементам записи
Осуществляется с помощью оператора « . » (точка).
Пример
D.Day:=23;
D.Month:=Oct;
D.Year:=2002;
S[5].Fam:='Иванов';
S[5].Fakultet:=MM;
Переменные одного и того же типа «запись» можно присваивать друг другу:
Пример
S[4]:=S[5];
Таким образом, тип «запись» позволяет группировать данные различного типа в одной переменной (или, например, в одном элементе массива).
Раз уж речь зашла о списках, необходимо сказать об их сортировке (например, необходимо отсортировать вышеописанный список студентов по алфавиту). Рассмотрим кратко, какие вообще существуют алгоритмы сортировки, их характеристики.
Алгоритмы сортировки
Алгоритмы сортировки
Все алгоритмы сортировки можно поделить на две группы: сортировка сравнениями и лексикографическая сортировка. Эти два вида алгоритмов отличаются тем, что при сортировке сравнениями неизвестна внутренняя структура объектов. При этом они вообще могут иметь различную структуру, необходимо только уметь сравнивать объекты друг с другом (например, числа). На самом деле только одного сравнения объектов недостаточно, оно должно обладать еще некоторыми дополнительными свойствами, например транзитивностью, т.е. если a<b иb<c, то должно бытьa<c. Предположим, что мы должны сравнивать вектора фактически являющиеся парами чисел видаr=(x,y). Определим операцию сравнения двух объектовr1=(x1,y1) иr2=(x2,y2) так:r1<r2 тогда и только тогда, когдаx1<x2 илиy1<y2. Удовлетворяет ли такое сравнение вышеприведенному условию? Возьмем 3 вектора:a=(3,9),b=(4,7),c=(1,8). По описанному способу сравнения получаем:a<b,b<c, ноa не меньшеc. Таким образом, при выборе этого отношения порядка не в каждом случае можно упорядочить заданную последовательность элементов.
Лексикографическая сортировка обычно применяется при сортировке объектов с известной внутренней структурой. Например, упорядочивание текстовых строк по алфавиту. Внутренняя структура строк известна: строка состоит из символов; количество символов алфавита ограничено.
Алгоритмы сортировки сравнениями
Рассмотрим один из простейших алгоритмов сортировки сравнениями: так называемую пузырьковую сортировку.
Алгоритм «Пузырьковая сортировка»
1. Повторять:
А. Для всех элементов списка, кроме последнего, повторять:
1. Если текущий элемент больше следующего, то поменять их местами.
2. Конец цикла при условии, что ни одной замены не произошло.
Проиллюстрируем работу алгоритма на примере последовательности из 5-ти чисел: 5, 3, 1, 4, 2. Работа алгоритма пузырьковой сортировки проиллюстрирована на следующем рисунке.
► |
5┐ |
|
3 |
|
3 |
|
3 |
|
3 |
|
► |
3┐ |
|
1 |
|
1 |
|
1 |
|
1 |
|
► |
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
3┘ |
► |
5┐ |
|
1 |
|
1 |
|
1 |
|
|
1┘ |
► |
3 |
|
3 |
|
3 |
|
3 |
|
|
3 |
► |
3┐ |
|
2 |
|
2 |
|
2 |
|
1 |
|
1┘ |
► |
5┐ |
|
4 |
|
4 |
|
|
4 |
|
4 |
► |
4┐ |
|
2 |
|
2 |
|
|
2 |
|
2┘ |
► |
3 |
|
3 |
|
3 |
|
4 |
|
4 |
|
4┘ |
► |
5┐ |
|
2 |
|
|
2 |
|
2 |
|
2┘ |
► |
4 |
|
4 |
|
|
4 |
|
4 |
|
4 |
► |
4 |
|
4 |
|
2 |
|
2 |
|
2 |
|
2┘ |
|
5 |
|
|
5 |
|
5 |
|
5 |
|
5 |
|
5 |
|
|
5 |
|
5 |
|
5 |
|
5 |
|
5 |
Видно, что на каждом шаге внешнего цикла самый большой элемент перемещается в конец списка. При этом не обязательно просматривать весь список каждый раз, так как на каждом шаге последний элемент оказывается на своем месте. В связи с этим на каждом шаге можно просматривать на один элемент меньше, и алгоритм можно модифицировать.
Алгоритм «Пузырьковая сортировка»
1. Присвоить переменной k количество элементов списка.
2. Повторять:
А. Уменьшить k на 1.
Б. Для первых k элементов списка повторять:
1. Если текущий элемент больше следующего, то поменять их местами.
3. Конец цикла, при условии, что ни одной замены не произошло.
Сколько времени будет выполняться такая сортировка? За элементарную операцию примем операцию сравнения двух элементов и подсчитаем, сколько таких операций необходимо произвести, если дан список из n элементов. На каждом шаге будет просматриваться на один элемент меньше. В худшем случае (когда исходный массив отсортирован по убыванию) каждый раз будет производиться хотя бы один обмен элементов, пока не останется только один элемент, и сортировку не закончится. На первом шаге будет сделаноn-1 сравнение, на второмn-2 сравнения, и т.д. до одного сравнения. Итого, имеем арифметическую прогрессию от 1 доn-1 сn-1 элементом. Сумма этой прогрессии:
.
При больших значениях n эта функция ведет себя какn2. В таком случае говорят, что вычислительная сложность алгоритма равнаO(n2). Эта оценка вычислительной сложности алгоритма называется асимптотической. Такая оценка обычно является достаточно плохой. Возникают вопросы: можно ли написать алгоритм, который будет работать быстрее и какой самый быстрый алгоритм вообще можно написать? Ответ – можно, и это . Невозможно написать более быстрый алгоритм сортировки сравнениями. Для лексикографической сортировки наиболее быстрый алгоритм имеет вычислительную сложность .
При сортировке для обмена элементов списка можно использовать дополнительную переменную.
Пример (см. пример из параграфа 6.4)
VAR
Temp:Student;
k,i:Integer;
Stop:Boolean;
. . .
{ Сортировка массива Sсо списком студентов по фамилии. Пусть длина списка задана переменнойn}
k:=n;
REPEAT
Dec(k);
Stop:=True;
FOR i:=1 TO k DO
IF S[i].Name>W[i+1].Name THEN
BEGIN
Temp:=S[i];
S[i]:=S[i+1];
S[i+1]:=Temp;
Stop:=False;
END;
UNTILStop;