Автор работы: Пользователь скрыл имя, 20 Января 2013 в 16:15, курсовая работа
Курсовой проект “Сортировка данных” разработан на языке программирования ТурбоПролог, учитывая всю специфику данного языка, а особенно работа со списками и рекурсия.
Сила Турбо-Пролога заключается в его возможностях поиска и сопоставления. Внутренние унификационные процедуры бесстрастно перебирают все возможные комбинации правил, пытаясь удовлетворить заданную программистом цель. Пролог, как видим, базируется на естественных для человека логических принципах, и поэтому, чем больше вы им занимаетесь, тем он становится все более привлекательным.
Белорусский национальный технический университет
Кафедра ПОВТ и АС
по дисциплине «Функциональное и логическое программирование»
на тему
«Сортировка данных»
Исполнитель: студент ФИТР 3 курса гр. 107219
Сенькевич А.П.
Руководитель: доцент Ковальков А.Т.
МИНСК
2011
Белорусский национальный технический университет
Кафедра ПОВТ и АС
К курсовому проекту
по дисциплине «Функциональное и логическое программирование»
на тему
«Сортировка данных»
Исполнитель: студент ФИТР 3 курса гр. 107219
Сенькевич А.П.
Руководитель: доцент Ковальков А.Т.
МИНСК
2011
Содержание
ВВЕДЕНИЕ…………………………………………………….…
1. ПОСТАНОВКА ЗАДАЧИ…………………………………..…...…...6
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ…………………………………….……7
3. СТРУКТУРНАЯ СХЕМА ПРОГРАММЫ………………….………9
4. ОПИСАНИЕ ПРЕДИКАТОВ…………………….……...…….…..
5. ТЕКСТ ПРОГРАММЫ………………………………………..…….
6. ТЕСТИРОВАНИЕ ПРОГРАММЫ………………………….……...16
7. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ…………………………....………2
ВЫВОДЫ…………………………………………………………….
ЛИТЕРАТУРА……………………………………………………
ПРИЛОЖЕНИЕ…………………………………….…...…
Введение
Курсовой проект “Сортировка данных” разработан на языке программирования ТурбоПролог, учитывая всю специфику данного языка, а особенно работа со списками и рекурсия.
Сила Турбо-Пролога
Турбо-Пролог является компиляторно-ориентированным языком программирования высокого уровня; разработан фирмой Borland International и предназначен для программирования задач из области искусственного интеллекта. Как язык программирования ИИ Турбо-Пролог особенно хорош для создания экспертных систем, динамических баз данных, программ с применением естественно-языковых конструкций; он также может быть использован и для других задач общего характера. Турбо-Пролог имеет окна, цветную графику и интерактивные средства ввода-вывода, что свидетельствует о его максимальном удобстве для пользователя прикладных программ.
Стоит отметить ещё одно свойство Пролога. Я бы назвал его языком сверхвысокого уровня в том смысле, что он более приближен к той предметной области, которой принадлежит решаемая задача, нежели традиционные языки высокого уровня. В связи с этим он удобен для создания пробных версий (или прототипов) программ с целью проверки работоспособности новых концепций и алгоритмов. И из-за этого же его свойства программы на Прологе зачастую выполняются медленнее, чем написанные "вручную" на традиционных языках. Объясняется это тем, что базовый алгоритм выполнения программы на Прологе основан на переборе большого числа вариантов решений.
Разработать программу сортировки данных:
Нужная операция выбирается из меню.
Быстрая сортировка
Автором так называемой "быстрой" сортировки является Хоар. Он назвал ее быстрой потому, что в общем случае эффективность этого алгоритма довольно высока. Идея метода следующая. Выбирается некоторый "барьерный" элемент, относительно которого мы разбиваем исходный список на два подсписка. В один мы помещаем элементы, меньшие барьерного элемента, во второй — большие либо равные. Каждый из этих списков мы сортируем тем же способом, после чего приписываем к списку тех элементов, которые меньше барьерного, вначале сам барьерный элемент, а затем — список элементов не меньших барьерного. В итоге получаем список, состоящий из элементов, стоящих в правильном порядке.
Предикат sort_q будет реализовывать алгоритм быстрой сортировки Хоара. Он будет состоять из двух предложений. Правило будет осуществлять с помощью предиката partition разделение непустого списка на два подсписка, затем сортировать каждый из этих подсписков рекурсивным вызовом себя самого, после чего, используя предикат conc (созданный нами ранее), конкретизирует второй аргумент списком, получаемым объединением отсортированного первого подсписка и списка, сконструированного из барьерного элемента (головы исходного списка) и отсортированного второго подсписка.
Сортировка вставкой
Сортировка вставкой основана на том, что если хвост списка уже отсортирован, то достаточно поставить первый элемент списка на его место в хвосте, и весь список будет отсортирован. При реализации этой идеи создадим два предиката.
Задача предиката insert — вставить значение (голову исходного списка) в уже отсортированный список (хвост исходного списка), так чтобы он остался упорядоченным. Его первым аргументом будет вставляемое значение, вторым — отсортированный список, третьим — список, полученный вставкой первого аргумента в нужное место второго аргумента так, чтобы не нарушить порядок.
Предикат sort_v, собственно, и будет организовывать сортировку исходного списка методом вставок. В качестве первого аргумента ему дают произвольный список, который нужно отсортировать. Вторым аргументом он возвращает список, состоящий из элементов исходного списка, стоящих в правильном порядке.
Пузырьковая сортировка
Идея этого метода заключается в следующем. На каждом шаге сравниваются два соседних элемента списка. Если оказывается, что они стоят неправильно, то есть предыдущий элемент меньше следующего, то они меняются местами. Этот процесс продолжаем до тех пор, пока есть пары соседних элементов, расположенные в неправильном порядке. Это и будет означать, что список отсортирован.
Сортировка слияниям
Метод слияний — один из самых "древних" алгоритмов сортировки. Его придумал Джон фон Нейман еще в 1945 году. Идея этого метода заключается в следующем. Разобьем список, который нужно упорядочить, на два подсписка. Упорядочим каждый из них этим же методом, после чего сольем упорядоченные подсписки обратно в один общий список.
Для начала создадим предикат, который будет делить исходный список на два. Он будет состоять из двух фактов и правила. Первый факт будет утверждать, что пустой список можно разбить только на два пустых подсписка. Второй факт будет предлагать разбиение одноэлементного списка на тот же одноэлементный список и пустой список. Правило будет работать в случаях, не охваченных фактами, т.е. когда упорядочиваемый список содержит не менее двух элементов. В этой ситуации мы будем отправлять первый элемент списка в первый подсписок, второй элемент — во второй подсписок, и продолжать распределять элементы хвоста исходного списка.
Графический вид структурной схемы
программы находится в графичес
process(Key)(char): (i) –создание системы запросов в меню.
begin_work – Главный предикат.
read_list (List)(string*): (o) – Чтение списка строк List.
write_list(List)(string*): (i) – Печать списка строк List.
sort_p (List1,List2,Num,Out)( string*, string*,integer,char): (i,o,o,i) – Сортировка списка строк перестановкой, где List1– входной список, List2 – полученный список при сортировке, Num – количество рекурсий, Out – показывает, нужно ли выводить промежуточные результаты сортировки или нет.
sort_v (List1,List2,Num,Out)( string*, string*,integer,char): (i,o,o,i) – Сортировка списка строк вставкой, где List1– входной список, List2 – полученный список при сортировке, Num – количество рекурсий, Out – показывает, нужно ли выводить промежуточные результаты сортировки или нет.
sort_q1 (List1,List2,Num,Out)( string*, string*,integer,char): (i,o,o,i) – Быстрая сортировка списка строк, где List1– входной список, List2 – полученный список при сортировке, Num – количество рекурсий, Out – показывает, нужно ли выводить промежуточные результаты сортировки или нет.
insert (El,List1,List2,Num)(string, string*, string*,integer): (i,i,o,o) – Вставка элемента El в список List1 и получаем список List2, где Num – подсчет количества рекурсий.
devide (Str,List1,List2,List3,Num)(
сonnect (List1,List2,List3,Num)( string*, string*, string*,integer): (i,i,o,o) – Соединение двух списков List1 и List2 в один List3, где Num – подсчет количества рекурсий.
q_sort (Sp,Sv,Sq,Res)(integer,
fusion_sort(List1,List2,Num,
splitting(List1,List2,List3,
DOMAINS
list_string=string*
file=myfile
PREDICATES
nondeterm repeat
nondeterm begin_work
nondeterm make_menu
nondeterm process(char)
nondeterm read_list(list_string)
nondeterm write_list(list_string)
nondeterm sort_p(list_string,list_
nondeterm perest(list_string,list_
nondeterm sort_v(list_string,list_
nondeterm insert(string,list_string,list
nondeterm sort_q1(list_string,list_
nondeterm devide(string,list_string,
nondeterm connect(list_string,list_
nondeterm q_sort(integer,integer,
nondeterm write_s(list_string,char)
nondeterm sort_view(list_string,list_
nondeterm fusion_sort(list_string,list_
nondeterm fusion(list_string,list_
nondeterm splitting(list_string,list_
CLAUSES
begin_work:-
make_menu.
make_menu:-
repeat,
write(" Выберите один из пунктов меню, нажав на клавиши от 1 до 5 ."),nl,
write(" 1. Сортировка перестановкой."),nl,
write(" 2. Сортировка вставкой."),nl,
write(" 3. Быстрая сортировка."),nl,
write(" 4. Сортировка слиянием."),nl,
write(" 5. Оценка алгоритмов на быстродействие."),nl,
write(" Esc - Выход из программы."),nl,
readchar(C),
process(C),
C=27,!.
process('1'):-
write(" 1. Сортировка перестановкой."),nl,
write(" Введите список, для окончания ввода нажмите Esc:"),nl,
read_list(List1),
sort_p(List1,List2,_,'n'),
write(" Полученный результат: "),nl,
write_list(List2),write("Наж
readchar(_),!.
process('2'):-
write(" 2. Сортировка вставкой."),nl,
write(" Введите список, для окончания ввода нажмите Esc:"),nl,
read_list(List1),
sort_v(List1,List2,_,'n'),
write(" Полученный результат: "),nl,
write_list(List2),write("Наж
readchar(_),!.
process('3'):-
write(" 3. Быстрая сортировка. "),nl,
write(" Введите список, для окончания ввода нажмите Esc:"),nl,
read_list(List1),
sort_q1(List1,List2,_,'n'),
write(" Полученный результат: "),nl,
write_list(List2),write("Наж
readchar(_),!.
process('4'):-
write(" 4. Сортировка слиянием. "),nl,
write(" Введите список, для окончания ввода нажмите Esc:"),nl,
read_list(List1),
fusion_sort(List1,List2,_,'
write(" Полученный результат: "),nl,
write_list(List2),write("Наж
readchar(_),!.
process('5'):-
write(" 5. Оценка алгоритмов на быстродействие."),nl,
write(" Оценка сортировки проводится по количеству рекурсий,"),nl,
write(" осуществляемых
при сортировке списка
write(" Введите список, для окончания ввода нажмите Esc:"),nl,
read_list(List),
sort_p(List,_,Np,'n'),
sort_v(List,_,Nv,'n'),
sort_q1(List,_,Nq,'n'),