Бинарные деревья

 

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

Высшего профессионального образования

"Комсомольский-на-Амуре государственный технический университет"

Факультет компьютерных технологий

Кафедра МОП ЭВМ






По дисциплине: "Функциональное и логическое программирование"




Студент группы 0ВТ3к-1

Коновалова. К.А.

Преподаватель Абарникова Е.Б.











Задание 1


Тема: списки и бинарные деревья.

Цель: изучить основные операции работы со списком.

Задание: написать программу реализующую:

) удаление элемента из списка перед указанным элементом.

) сортировку списка по возрастанию методом быстрой сортировки.

Для всех операций осуществить контроль ввода (элементом списка могут быть как числа, так и символы).

Теоретическое описание

Список - это бинарная структура, представляющая собой последовательность, состоящую из произвольного числа элементов. Списком может быть пустой список, не содержащий ни одного элемента, или структура, имеющая голову и хвост. Голова - первый элемент списка. Хвост - оставшаяся часть списка без первого элемента.

Список - частный случай бинарного дерева, поэтому ему присущи все свойства и возможны операции, которые можно производить над множествами.

Списком называется набор переменных одного типа, доступ к которым осуществляют функции добавления, удаления и, возможно, поиска элемента. Эта структура данных состоит из элементов массива или последовательности структур и имеет доступ к элементам через:

"голову" - первый элемент списка;

"хвост" - элемент или последовательность элементов следующих за "головой" списка.

Описание алгоритма быстрой сортировки.

Выберем случайным образом какой-то элемент х и просмотрим список, двигаясь слева направо, пока не найдем аi больший x, а затем справа налево, пока не найдем аi меньший х. Поменяем их местами и продолжим процесс просмотра с обменом, пока просмотры не встретятся где-то в середине списка.

В результате список разделится на две части: левую - с ключами, меньшими х и правую - с ключами, большими х. Этот шаг называется разделением. Х - центром.

К получившимся частям рекурсивно применяем ту же процедуру. В результате получается очень эффективная сортировка. Среднее быстродействие O(n*log(n)), но возможен случай таких входных данных, на которых алгоритм будет работать за O(n2) операций. Hа случайных входных данных вероятность такого чрезвычайно мала.

Описание программы

Описание предикатов, используемых в программе

Рассмотрим только основные предикаты, реализующие указанные в задании действия.

Список всех предикатов:


cmp(STRING,SLIST,SLIST,SLIST) %сортировка (для сравнения элементов)

del (SYMBOL,S,S) %удаление элемента перед указанным(SYMBOL)%проверка ввода пользователя

tolist(S,INTEGER,WINDOW)%запись элементов в список(S,WINDOW)%запись элементов в лист(SYMBOL,S,S)%удаление конкретного элемента(SYMBOL,S) %поиск элемента в списке(S) %проверка на наличие элементов в списке(SLIST,SLIST)%быстрая сортировка(SLIST,SLIST,SLIST)%вспомогательный предикат для сортировки(SYMBOL,S) %проверка на удаление перед первым эл-ом.


Основные предикаты:

del(SYMBOL,S,S)%удаление элемента перед указанным

·1-й аргумент - элемент, перед которым требуется удалить другой элемент;

·2-й аргумент - входной список элементов;

·3-й аргумент - результирующий список элементов.

Данное правило использует восходящую рекурсию для удаления элементов из списка (2-й аргумент) и перемещения результата удаления элементов из списка в результирующий список(3-й аргумент).

sort (SLIST,SLIST)%предикат быстрой сортировки

·1-й аргумент - список строк, который требуется отсортировать;

·2-й аргумент - отсортированный список строк (результат).

Данное правило использует восходящую рекурсию для сортировки списка(1-й аргумент) и перемещения отсортированного списка в результирующий список(2-й аргумент).

Для каждого из рассмотренных предикатов текст соответствующих правил представлен в разделе "Текст программы".

Текст программы

=SYMBOL*%предикаты_dialog_eh : EHANDLER %идентификатор окна(STRING,SLIST,SLIST,SLIST)%сортировка(SYMBOL)%проверка ввода пользователя(S,INTEGER,WINDOW)%запсиь элементов в список

tolbox(S,WINDOW)%запсиь элементов в лист(SYMBOL,S,S)%удаление конкретного элемента

nondeterm del(SYMBOL,S,S)%удалить предидущий

scan(SYMBOL,S)%поиск элемента в списке(S)%проверка на наличие элементов в списке(SLIST,SLIST)%быстрая сортировка(SLIST,SLIST,SLIST)%вспомогательный предикат(SYMBOL,S)%проверка на удаление перед первым элементом

clauses %предложения(EL):-EL>="A",EL<="Z",!.(EL):-EL>="a",EL<="z",!.(EL):-EL>="А",EL<="Я",!.(EL):-EL>="а",EL<="я",!.(EL):-EL>="0",EL<="9",!.(EL):-EL="", dlg_error("Ошибка","Элемент не указан"),!, fail.(_):-dlg_error("Ошибка","Некоректный ввод"),!, fail.(EL,[A|LST]):-EL=A.([E|LST],N,O):-=lbox_GetItem(O,N),<>"",=N+1,!,(LST,N1,O).([],_,_).([E|LST],O):-lbox_Add(O,E),tolbox(LST,O).([],_).

%***************************************************************

delelem(_,[],[]).(EL,[E|LST],LST1):-EL=E,!,delelem(EL,LST,LST1).(EL,[E|LST],[E|LST1]):-!,delelem(EL,LST,LST1).

%***************************************************************

del(_,[],[]).(EL,[X,EL|T],[EL|T1]):-del(EL,T,T1),!.(EL,[X|T],[X|T1]):-del(EL,T,T1).

%***************************************************************(_,[]):-!,fail. %проверяем наличие элемента в списке

scan(EL,[EL|_]):-!.(EL,[_|LST]):-!,scan(EL,LST).([],L,L).([X|L1],L2,[X|L3]):-link(L1,L2,L3).([],[]).([X|Z],SORTLIST) :-(X, Z, S, L),(S, SORTS),(L, SORTL),(SORTS,[X|SORTL],SORTLIST).(_,[],[],[]).(X,[Y|TAIL], [Y|S],L):-X>Y,!,cmp(X,TAIL,S,L).(X,[Y|TAIL], S,[Y|L]):-cmp(X,TAIL,S,L).

isempty([]).%список пуст

%создание диалогового окна

dlg_dialog_Create(Parent):-_CreateResDialog(Parent,dlg_dialog_DlgType,dlg_dialog_ResID,dlg_dialog_eh,0).

%BEGIN dialog, idc_sort _CtlInfo_dialog_eh(_Win,e_Control(idc_sort,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_list),=lbox_CountAll(L),>0,=lbox_GetAll(L),(S,S1),_Clear(L),_Add(L,S1),

!.

%проверка списка на наличие в нем элементов

dlg_dialog_eh(_Win,e_Control(idc_sort,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_list),=lbox_CountAll(List),=0,

dlg_Note("Ошибка","Список пуст"),

!.

%END dialog, idc_sort _CtlInfo

%BEGIN dialog, idc_addelem _CtlInfo_dialog_eh(_Win,e_Control(idc_add_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_add),=win_GetCtlHandle(_Win,idc_list), =win_GetText(I),_len(EL,1),

chksmb(EL),_Add(O,EL), %добавление элемента в список_SetText(I,""), %очистка поля ввода

!.

%проверка на корректный ввод

dlg_dialog_eh(_Win,e_Control(idc_add_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_add),=win_GetText(O),="",

dlg_error("Ошибка","Элемент не задан"),_SetText(O,""),

!.

%проверка длины элемента

dlg_dialog_eh(_Win,e_Control(idc_add_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_add),=win_GetText(O),<>"",

dlg_error("Ошибка","Элемент должен состоять из 1 символа!"),

win_SetText(O,""),

!.

%END dialog, idc_addelem _CtlInfo

%BEGIN dialog, при нажатии кнопки выхода idc_cancel _CtlInfo_dialog_eh(_Win,e_Control(idc_cancel,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,_Destroy(_Win),

!.

%END dialog, idc_cancel _CtlInfo

%BEGIN dialog, idc_del_elem _CtlInfo

%обработка ввода пользователя - проверка списка на наличие элементов

dlg_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_list),(LIST,0,O),(LIST),

dlg_error("Ошибка","Список пуст"),

I=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),_SetText(I,""),_SetText(II,""),

!.

%проверка на заполнение обоих полей для удаления

dlg_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),=win_GetText(I),=win_GetText(O),

DEL1<>"",<>"",_error("Ошибка","Укажите один элемент для удаления в одном поле"),

win_SetText(I,""),_SetText(O,""),

!.

%удаление конкретного элемента_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_list),=win_GetText(I),_len(EL,1),(EL),(LIST,0,O),(EL,LIST),(EL,LIST,LIST1),_Clear(O),(LIST1,O),

win_SetText(I,""),

!.

%удаление элементов перед указанным

dlg_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_list),=lbox_CountAll(ListHandle),<>0,=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),=win_GetText(O),<>"",(LIST,0,ListHandle),(EL,LIST),

dlg_error("Ошибка","Удаление перед первым элементом невозможно"),

win_SetText(I,""),_SetText(O,""),

!.

%удаление элементов перед указанным_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_list),=lbox_CountAll(ListHandle),<>0,=win_GetCtlHandle(_Win,idc_befor),=win_GetText(BeforHandle),<>"",_len(EL,1),(EL),(LIST,0,ListHandle),(EL,LIST),(EL,LIST,LIST1),_Clear(ListHandle),(LIST1,ListHandle),_SetText(BeforHandle,""),

!.

%обработка ввода пользователя:

%проверка на корректный ввод в поля элементов

dlg_dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),=win_GetText(I),=win_GetText(O),(DEL1,DEL2,DEL),="",

dlg_error("Ошибка","Элемент для удаления не указан"),

win_SetText(I,""),_SetText(O,""),

!._dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),=win_GetText(O),<>"",=win_GetCtlHandle(_Win,idc_list),=lbox_CountAll(ListHandle),=1,

dlg_error("Ошибка","Число элементов должно быть четным"),

win_SetText(I,""),_SetText(O,""),

!._dialog_eh(_Win,e_Control(idc_del_elem,_CtrlType,_CtrlWin,_CtlInfo),0):-

dlg_error("Ошибка","Заданный элемент не существует"),

I=win_GetCtlHandle(_Win,idc_del),=win_GetCtlHandle(_Win,idc_befor),_SetText(I,""),_SetText(O,""),

!.

%END dialog, idc_delelem _CtlInfo


Программа и методика испытаний

Объект испытаний

Испытуемая программа lab3.exe предназначена для работы со списками и находит свое применение в области математических и программных дисциплин, требующих соответствующей обработки данных типа список.

Цель испытаний

Испытание проводилось с целью выявления корректности выполнения программы обработки списков; отсутствия ошибочных, либо неопределенных ситуаций, возникающих в результате выполнения программы; отсутствия сбоев систем компьютера в результате работы программы.

Средства и порядок испытаний

Требования к техническим средствам:

ЭВМ модели - Pentium 4 и выше.

Объем ОЗУ - 1 Гб,

Объем свободной памяти на жестком диске 1 Гб

Программное обеспечение - операционная система Windows 2000\NT\XP.

Специальной конфигурации программного обеспечения не требуется.

Испытание программы проводились в следующем порядке:

  • испытание на корректность (адекватно ли программа реагирует на ввод вывод информации);
  • испытание на правильность;
  • испытание на надежность (процент отказа системы).

Если итог проведения испытаний удовлетворяет заданным критериям, то проведение испытаний считается успешным.

Методы испытаний

Проверка на корректность

Проверка при использовании входных данных:

  • Поле "элемент" было заполнено значениями: 1,9,2,8,3,7,4,6,5,0,а,б;
  • Поле "перед" было заполнено значением 3;
  • При нажатии на кнопку "Сортировка" результат совпал
  • с ожидаемым (рис. 2).
  • При нажатии на кнопку "Удалить" результат совпал
  • с ожидаемым (рис. 3).
  • При попытке добавления элемента с длиной более 1 символа в список, добавление не указанного элемента, удаление не указанного элемента,

Удаление перед первым элементом, выдается сообщение об ошибке (рис. 4, рис. 5, рис. 6, рис. 7, рис. 8);

Проверка на корректный вывод информации

При выводе отсортированного списка результат не отличался от ожидаемого (см. рис. 2). При удалении элемента 0 из списка перед указанным, результат не отличался от ожидаемого (см рис. 3). Поэтому можно сказать, что программа работает корректно.

Проверка на правильность

При выполнении операций над списком результат должен совпадать с результатами, полученными вручную, на основе эмпирических закономерностей. В процессе тестирования программа отреагировала правильно, результат ввода списка, его сортировки, удаления из него элемента перед указанным, совпал с ожидаемым (см рис. 2, рис. 3).

При проверке на правильность, результат не отличался от ожидаемого, поэтому можно сказать, что программа работает правильно.

Проверка на надежность

При изменении входных данных не должен изменяться внешний вид пользовательского интерфейса. При выводе списка '1,9,2,8,3, 7,4, 6,5,0,а,б внешний вид пользовательского интерфейса не отличался от интерфейса, полученного при вводе списка '3', '5', 'x', 'y', 'Z' (см рис. 2 и рис. 9).

Программа выдает сбой лишь в случае, если в списке есть элемент, состоящий более чем из одного символа. Но такой элемент нельзя ввести пользователю в поле, так как на добавление элементов стоит ограничение по длине.

Поскольку процент отказа программы не превышает процента отказа, установленного нормами, то можно сделать вывод, что программа работает надежно.

Эскизы экранных форм


Рис. 1. Результат работы программы при корректных данных.

Рис. 2. Результат сортировки списка.


Рис. 3. Результат удаления элемента из списка перед указанным.


Рис. 4. Вывод сообщения об ошибке при отсутствии элемента для добавления.


Рис. 5. Вывод сообщения об ошибке при добавлении элемента с длиной более 1 символа.


Рис. 6. Вывод сообщения об ошибке при нажатии на кнопку удалить, если список пуст.


Рис. 7. Вывод сообщения об ошибке при отсутствии элемента для удаления.

Рис. 8. Вывод сообщения об ошибке при попытке удаления элемента перед первым элементом.


Рис. 9. Результат работы программы при разных входных данных.


Задание 2


ТЕМА: Бинарные деревья.

ЦЕЛЬ: Научиться работать с бинарными деревьями.

ЗАДАНИЕ 2: Написать программу для обхода бинарного дерева по схеме: Правое поддерево - Корень - Левое поддерево. Все необходимые исходные данные задаются пользователем. Вывод результата осуществляется в отдельное окно.

Теоретические сведения

Бинарное дерево - частный случай составной структуры. Бинарные деревья задаются с помощью тренарного функтора:

программа сортировка предикат бинарный

tree( Element, Left, Right ); void - пустое дерево.


Например:

( a, b, c ); tree ( a, tree( b, void, void), tree( c, void, void) ).


Проверка принадлежности дереву:

_mem ( X, tree( X, L, R ))._mem ( X, tree( Y, L, R )) :- tree_mem ( X, L )._mem ( X, tree( Y, L, R )) :- tree_mem ( X, R ).


Две ветви бинарного дерева могут быть различны, но иногда это различие не существенно. Доступ к отдельным элементам. Для осуществления этого используется идея обхода дерева в предписанном порядке. Существует три варианта:

а) сверху вниз: ( V, L, R )

pre ( tree ( X, L, R ), XS ) :- pre ( L, LS ), pre ( R, RS ), append ( [ X | LS ], RS, XS ).( void, [ ] ).

б) слева направо: ( L, V, R )

in ( tree ( X, L, R ), XS ) :- in ( L, LS ), in ( R, RS ), append ( LS, [ X | RS ], XS ).

in ( void, [ ] ).

в) снизу вверх: ( L, R, V )

post (tree( X, L, R ), XS ):- pre( L, LS ), pre( R, RS ), append( RS, [ X ], RS1),append( LS, RS1, XS ).

post ( void, [ ] ).


Логика программы

= tree(tr, string, tr); void=string*append(slist, slist, slist)in(tr, slist)([], Ys, Ys).([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).(tree(L, X, R), XS) :-in(R,RS),in(L,LS),append(LS,[X|RS],XS).(void,[]).(tree (tree (void, "b", void), "a", tree (void, "c", void)), R), write (R).


Список использованных источников


. Дж. Доорс, А. Р. Рейблен, С. Вадера. ПРОЛОГ - язык программирования будущего. - М.: Финансы и статистика, 1990.

. Л. Стерлинг, Э. Шапиро. Искусство программирования на языке ПРОЛОГ. - М.: Мир, 1990.

. И. Братко. Программирование на языке Пролог для искусственного интеллекта. - М.: Мир, 1990.


Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение Высшего профессионального образован

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ