Учебный курс "Введение в методы программирования"
Лабораторный практикум Лабораторная работа 1: Упорядочивание (сортиро...
271 downloads
192 Views
410KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Учебный курс "Введение в методы программирования"
Лабораторный практикум Лабораторная работа 1: Упорядочивание (сортировка) массивов 1. Постановка учебно-практической задачи Выполнение лабораторной работы направлено на освоение основных приемов использования массивов, методов доступа к элементам массивов, их реорганизации и модификации. В качестве практической проблемы, требующей решения, рассматривается известная задача сортировки (упорядочивания) массива в порядке возрастания (убывания) его элементов. При решении этой задачи требуется исходный массив, содержащий произвольные целые числа, преобразовать к виду, когда каждый элемент массива находится перед другим элементом этого массива, если его значение меньше (больше), чем значение сравниваемого элемента. В данной лабораторной работе необходимо изучить ряд известных алгоритмов сортировки и создать комплекс программ, реализующий • линейный поиск элемента в массиве; • метод двоичного поиска элемента в упорядоченном массиве; • метод сортировки выбором; • метод сортировки пузырьком; • метод сортировки включением; • метод быстрой сортировки +) . Разрабатываемый программный комплекс должен обеспечивать • вывод на экран меню; • ввод исходной информации; • формирования массивов с большим числом элементов; • выбор метода сортировки; • сортировку массива; • печать результата; • замеры времени выполнения сортировок массива. Демонстрация работоспособности разработанных программных средств должна обеспечивать два варианта контроля: контроль работоспособности каждого из методов и контроль временных характеристик всех реализованных методов. 2. Учебно-методические цели работы Данная задача представляет собой упрощенный учебно-ознакомительный вариант широко распространенной задачи сортировки, которая применяется в широком классе реальных задач, и умение и знание алгоритмов сортировки и их особенностей является необходимой частью образования специалиста по программному обеспечению. Наряду с ознакомлением с проблемой упорядочивания массивов и методами ее решения, выполнение работы направлено на достижение следующих учебно-методических целей: • приобретение навыков и приемов использования массивов, доступа к их элементам и преобразований массивов; • практическое освоение принципов модульного программирования (использование процедур и функций); +)
Задача повышенной сложности, рассматривается как тема дополнительного задания
• освоение и изучение встроенных функций языка Zonnon и модуля System (применение генератора псевдослучайных чисел и замеры датчиков времени); • получения навыков сравнительного анализа эффективности разных алгоритмов. 3. Рекомендации по выполнению работы Программа должна обеспечить сортировку массивов размером произвольной длины до 10000 элементов и выводить для контроля: - при небольшом количестве элементов (например, менее 20) - неупорядоченный массив и массив после сортировки для каждого из предложенных алгоритмов; - при значительном объеме данных (более 20) выводить время сортировки одного и того же массива для всех четырех предложенных алгоритмов. Содержимое массива рекомендуется формировать с помощью генератора псевдослучайных чисел, замеры времени производить средствами модуля System (Random, DateTime). В ходе выполнения лабораторной работы предполагается реализация методов линейного и двоичного поиска элемента массива и разработка программ для четырех широко используемых алгоритмов сортировки: • метод выбора; • метод пузырька; • метод включения; • метод быстрой сортировки. Для простоты изложения описания алгоритмов будут проводиться на примере задач сортировки массивов по возрастанию. 3.1. Поиск элемента массива на основе линейного просмотра. Результатом работы алгоритма линейного поиска значения Val в массиве А являются индекс Pos и логическая переменная ResultOk, которая принимает значение TRUE, если такой элемент содержится в массиве А, и FALSE - в противном случае. Индекс Pos принимает значение, равное номеру искомого элемента, если такой найден, и значение, равное -1 - в противном случае. Алгоритм линейного поиска Шаг 1. Полагается Pos:=-1 и ResultOk:=FALSE, и значение переменной цикла J:=0. Шаг 2. Если A[J]=Val, то переменным Pos и ResultOk присваиваются соответственно значения Pos:=J, ResultOk:=TRUE и алгоритм завершает работу. В противном случае значение переменной цикла увеличивается на единицу J:=J+1. Шаг 3. Если JNBegin. Сортировка и вывод результатов при выборе такого режима производится для всех созданных массивов. Для сортировки массивов используется
алгоритм сортировки, выбранный пользователем в меню. После выполнения сортировки для одного массива программа выводит временные характеристики вычислений, подсказку - сообщение о своей работе и ждет нажатия клавиши для продолжения вычислений для нового массива с увеличенным числом элементов на NStep элементов. Кроме того, в качестве дополнительного задания повышенной сложности рекомендуется в качестве основных действий программы, включаемых в меню, предусмотреть возможность демонстрационных показов работы алгоритмов сортировки с пошаговым отображением работы каждого алгоритма после каждой итерации. 4.3. Рекомендации по стилю программирования Оформление программы, наглядность текста программы зависит от выбранного стиля программирования разработчика. Стиль программирования является составной частью культуры программирования. Правилом для выбора хорошего стиля рекомендуется следовать девизу: “Ничего лишнего, но и ничего непонятного”. Основные рекомендации при выборе стиля могут состоять в следующем: • наименования переменных, типов, процедур, функций и т.п. должны отображать их смысл и назначение; • комментарии должны пояснять основные действия в программе и назначение используемых в программе структур данных; • в программе должны применяться пробелы, отступы, абзацы для повышения ее читабельности. Поясним приведенные рекомендации на примере написания программ сортировки и бинарного поиска. Задача. Известен номер группы первокурсников и список студентов из этой группы. По заданной фамилии студента определить, занимается ли он в данной группе и под каким номером находится в списке группы. Программа. module Main; const Lmax = 30; type TIndex TName TList byte
= = = =
(* максимальная численность группы *)
integer; (* тип индексов массива *) string; (* тип данных для фамилии *) array Lmax of TName; (* тип для списка фамилий *) integer{8};
var StudentList Name StudentNumb Numb NumbGr i ResultOk
:TList; :TName; :byte; :integer; :integer; :byte; :boolean;
(* исходный список фамилий (* интересующая фамилия (* кол-во студентов в группе (* номер в списке группы (* номер группы
*) *) *) *) *)
(* результат поиска фамилии
*)
(* процедура сортировки массива A методом выбора *) procedure SelectSort (var A:TList; N:byte); var i, j :TIndex;
Val :TName; begin for j:=0 to N - 2 do for i:=j+1 to N - 1 do if A[i] < A[j] then Val:=A[i]; A[i]:=A[j]; A[j]:=Val; end end end end SelectSort; (* бинарный поиск элемента в упорядоченном массиве *) procedure BinarySearch ( var A : TList; (* исходный массив *) First : TIndex; (* начальный индекс поиска *) Last : TIndex; (* конечный индекс поиска *) Val : TName; (* искомое значение *) var Pos: integer; (* индекс массива - место нахождения элемента *) var ResultOk : boolean (* результат поиска *) ); var Middle, TempLast :TIndex; begin (* запоминание длины массива *) TempLast:=Last; (* замена в цикле отрезка неопределенности от First до Last после разбиения его на две равные части на новый, равный одной из этих частей, до тех пор, пока его длина не будет равна единице *) while FirstA[Middle] then First:=Middle + 1 else Last :=Middle - 1; end end; Pos:=First; (* проверка - содержится ли элемент с искомым значением в массиве *) ResultOk:=false; if Pos0) & (StudentNumb