
- •Кафедра с а п р
- •Часть 1
- •1. Алфавит языка Паскаль
- •Данные в языке Паскаль
- •2.1 Порядковые типы данных
- •2.1.1 Целые типы данных
- •2.1.2 Логический тип данных
- •Символьный тип данных
- •2.1.4 Перечислимый тип данных
- •Ограниченный тип данных
- •2.2 Вещественные типы данных
- •3. Структура программ на языке TurboPascal
- •Описание меток
- •Описание переменных
- •Var имя переменной : тип;
- •Описание типов
- •Описание простых и типизированных констант
- •Арифметические выражения
- •Логические выражения
- •Оператор присваивания
- •Составной оператор
- •Процедуры ввода и вывода данных
- •Линейные алгоритмы и программы
- •Операторы условной и безусловной передачи управления
- •Алгоритмы и программы с разветвлением
- •10. Оператор выбора
- •11. Операторы циклов
- •11.1 Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Циклические алгоритмы и программы
- •Вариант 3
- •Использование циклических алгоритмов и программ для вычисления суммы членов ряда
- •При составлении алгоритма и программы будем считать, что точность
- •Массивы и их описание
- •Var Имя_массива: Array[t1] of [t2];
- •Var Имя_массива: Имя_типа_массива;
- •12.1 Работа с одномерными массивами
- •12.2 Работа с двумерными массивами
- •Текст программы
- •Варианты заданий
- •Строковый тип данных. Операции над строками
- •Множества в Паскале, их описание. Операции над множествами
- •Var Имя множества:Set of базовый тип;
- •Var Имя множества:Имя типа;
- •Тип данных - записи, их описание и использование. Оператор присоединения
- •1. Var Имя записи:record
- •Var Имя записи:Имя типа для записи;
- •15.1 Работа с массивом из записей
- •16 Подпрограммы
- •16. 1 Процедуры. Описание процедур. Область действия имён Локальные и глобальные параметры
- •16.2 Подпрограммы типа function, их описание
- •17. Задача сортировки: алгоритмы и программы
- •Сортировка выбором
- •Обменная сортировка
- •Сортировка слиянием
- •18 Задача поиска: алгоритмы и программы
- •18.1 Линейный поиск
- •Двоичный поиск
Обменная сортировка
Обменная сортировка основывается на последовательном сравнении двух рядом стоящих элементов и если порядок следования нарушен, элементы меняются местами. Сравнения производятся до тех пор, пока при очередном цикле просмотра всех рядом стоящих пар элементов, ни одна пара элементов не будет меняться местами. В том случае, если элементы массива уже упорядочены, алгоритм закончит свою работу после одного цикла просмотра всех рядом стоящих пар.
Просмор пар может начинаться с начала массива или с его конца, в последнем случае алгоритм называют алгоритмом пузырьковой сортировки. Подробнее об этом можно ознакомиться в [2,3].
Рассмотрим работу алгоритма по схеме.
Схема алгоритма обменной сортировки
нет
да
нет да
Key - ключ, определяющий была ли перестановка пар элементов;
Z - переменная, необходимая для хранения промежуточного элемента при перестановке.
Текст программы обменной сортировки
Uses crt;
Var M:array[1..1000] of integer;
i,Z,n:integer; Key:byte;
Begin Clrscr;
{Ввод n и формирование массива М как в предыдущей программе}
Repeat
Key:=0;
For i:=1 to n-1 do
If M[i] > M[i+1] then
begin
Z:=M[i];
M[i]:=M[i+1];
M[i+1]:=Z;
Key:=1;
end;
Until Key=0;
Writeln(' Упорядоченный массив');
For i:=1 to n do write(M[i],' '); readkey;
End.
Сортировка слиянием
Алгоритм сортировки слиянием используется в тех случаях, когда данные расположены на внешних носителях информации или сортируется данные очень большого объема, которые невозможно расположить в оперативной памяти целиком. В этом случае данные могут быть сохранены, например, в отдельных файлах, таких размеров, которые могут быть помещены в оперативную память, например в массивы. Производится загрузка данных из файлов в массивы и сортировка данных каждого из массивов отдельно. Упорядоченные данные снова записываются в файлы. Затем производится сортировка слиянием уже упорядоченных данных, расположенных в отдельных файлах.
Поскольку мы пока не знакомы с работой с файлами в ТР, рассмотрим алгоритм сортировки слиянием на примере слияния двух предварительно упорядоченных массивов Х и Y в один массив Z. Данные в массивах расположены в порядке возрастания их значений.
Обзначим через переменные dx, dy - длину (размер) массивов X, Y соответственно. Переменные ix, iy - счетчики (адреса) тех же массивов. Переменная iz - счетчик числа элементов нового массива Z.
Схема алгоритма сортировки слиянием
нет
да
да да
нет нет
Текст программы сортировки слиянием
Uses crt;
Var { Описание массивов и переменных}
X, Y: array[1..1000] of integer;
Z: array[1..2000] of integer;
dx,dy,ix,iy,iz,i:integer;
Begin Clrscr; { Ввод данных}
Write(' Введите длину массива Х '); readln(dx);
Writeln(' Введите упорядоченный по возрастанию массив Х');
For i:=1 to dx do read(X[i]); readln;
Write(' Введите длину массива Y '); readln(dy);
Writeln(' Введите упорядоченный по возрастанию массив Y');
For i:=1 to dy do read(Y[i]); readln;
ix:=1; iy:=1; iz:=0;
While (ix<=dx) and (iy<=dy) do
if X[ix]<Y[iy] then
begin {Перезапись значения из массива Х в массив Z}
inc(iz); Z[iz]:=X[ix]; inc(ix);
end
else
begin {Перзапись значения из массива Y в массив Z}
inc(iz); Z[iz]:=Y[iy]; inc(iy);
end;
{ Один из массивов полностью переписан }
if ix>dx then { Переписан массив Х, дописываем все оставшееся из Y}
for i:=iy to dy do
begin
inc(iz); Z[iz]:=Y[i];
end
else { Переписан массив Y, дописываем все оставшееся из X }
for i:=ix to dx do
begin
inc(iz); Z[iz]:=X[i];
end;
{ Вывод результата слияния на экран}
writeln(' Полученный массив Z');
for i:=1 to iz do write(Z[i],' '); readln;
End.
Лабораторная работа №10
Цель работы:
Изучить алгоритмы сортировки.
Приобрести навыки программирования задач сортировки данных различных типов.
Типовое задание
Разработать схему алгоритма и программу решения задачи с использованием алгоритмов сортировки.
Варианты самостоятельных заданий
В а р и а н т 1
Дана квадратная матрица размером n x n, содержащая вещественные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки выбором. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 2
Дана прямоугольная матрица размером n x м, содержащая вещественные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки обменом. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 3
Дана прямоугольная матрица размером n x м, содержащая вещественные числа. Определить сумму положительных элементов в каждой строке матрицы и упорядочить номера строк по возрастанию значений найденных сумм с помощью алгоритма обменной сортировки. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 4
Дана квадратная матрица размером n x n, содержащая вещественные числа. Определить сумму элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью сортировки выбором. Вывести упорядоченный список номеров столбцов и соответствующих им сумм.
В а р и а н т 5
Даны два одномерных массива, содержащие вещественные числа. Упорядочить по убыванию значений каждый из массивов с помощью алгоритма сортировки выбором, а затем получить новый массив, содержащий элементы двух заданных массивов также упорядоченный по убыванию, используя алгоритм сортировки слиянием.
В а р и а н т 6
Дана квадратная матрица размером n x n, содержащая вещественные положительные числа. Определить сумму четных элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью обменной сортировки. Вывести упорядоченный список номеров столбцов и соответствующих им сумм.
В а р и а н т 7
Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки выбором. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 8
Дана прямоугольная матрица размером n x м, содержащая целые положительные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки обменом. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 9
Дана прямоугольная матрица размером n x м, содержащая целые числа. Определить сумму положительных элементов в каждой строке матрицы и упорядочить номера строк по возрастанию значений найденных сумм с помощью алгоритма обменной сортировки. Вывести упорядоченный список номеров строк и соответствующих им сумм.
В а р и а н т 10
Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью сортировки выбором. Вывести упорядоченный список номеров столбцов и соответствующих им сумм.
В а р и а н т 11
Даны два одномерных массива, содержащие целые числа. Упорядочить по убыванию значений каждый из массивов с помощью алгоритма сортировкивыбором, а затем получить новый массив, содержащий элементы двух заданных массивов также упорядоченный по убыванию, используя алгоритм сортировки слиянием.
В а р и а н т 12
Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму четных элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью обменной сортировки. Вывести упорядоченный список номеров столбцов и соответствующих им сумм.
В а р и а н т 13
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 999) и
2 - фамилия (символьное поле длиной 20).
Упорядочить массив записей по убыванию значений табельных номеров с помощью алгоритма сортировки выбором и вывести новый массив.
В а р и а н т 14
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 999) и
2 - фамилия (символьное поле длиной 20).
Упорядочить массив записей по убыванию значений табельных номеров с помощью алгоритма обменной сортировки и вывести новый массив.
В а р и а н т 15
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 999) и
2 - фамилия (символьное поле длиной 20).
Упорядочить массив записей по возрастанию значений табельных номеров с помощью алгоритма обменной сортировки и вывести новый массив.
В а р и а н т 16
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 999) и
2 - фамилия (символьное поле длиной 20).
Упорядочить массив записей по возрастанию значений табельных номеров с помощью алгоритма сортировки выбором и вывести новый массив.
В а р и а н т 17
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 9999) и
2 - фамилия (символьное поле длиной 30).
Упорядочить массив записей по полю фамилия (в алфавитном порядке) с помощью алгоритма сортировки выбором и вывести новый массив.
В а р и а н т 18
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 9999) и
2 - фамилия (символьное поле длиной 30).
Упорядочить массив записей по полю фамилия (в алфавитном порядке) с помощью алгоритма обменной сортировки и вывести новый массив.
В а р и а н т 19
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 9999) и
2 - фамилия (символьное поле длиной 30).
Упорядочить массив записей по полю фамилия (в порядке обратном алфавитному) с помощью алгоритма обменной сортировки и вывести новый массив.
В а р и а н т 20
Дан массив, состоящий из записей. Каждая запись содержит два поля:
1 - табельный номер (целое число в диапазоне от 0 до 9999) и
2 - фамилия (символьное поле длиной 30).
Упорядочить массив записей по полю фамилия (в порядке обратном алфавитному) с помощью алгоритма сортировки выбором и вывести новый массив.