Отсортировать базу данных методом слияния - Prolog
Формулировка задачи:
Работаю в SWI-Prolog.
Реализовал всё, кроме сортировки.
Необходимо упорядочить список объектов досуга по количеству мест с помощью сортировки слиянием.
Поискав, понял, что нужно сначала БД засунуть в список, затем производить манипуляции с ним.
findall(Amount, acc(_,_,_,_,_,Amount,_), Object_list),
Но тут в список помещается лишь 1 параметр записи. Как засунуть всё? И как отсортировать базу?
Листинг программы
- /*Факты*/
- acc(1, 'Библионочь', 'Библиотека им.Горького', 'г. Орск, пр-кт. Ленина 13', 'библиотека', 50, '10.10.14').
- acc(2, 'Хоббит', 'Кинотеатр Мир', 'г. Орск, пр. Ленина 54','кинотеатр', 400, '15.12.14').
- acc(3, 'Несносные боссы', 'Киноцентр Орск', 'г. Орск, ул.Краматорская 8б','кинотеатр', 450, '20.12.14').
- acc(4, 'Концерт', 'Центр развития Радуга', 'г. Орск, ул. Просвещения 46','центр', 30, '21.11.14').
- acc(5, '90XXL', 'Night Club SKY', 'г. Орск, пер. Музыкальный 7','клуб', 200, '09.12.14').
- acc(6, 'Караоке вечер', 'Звездная Кошка', 'г. Орск, ул.Краматорская 35','бар', 70, '17.12.14').
- acc(7, 'Соревнования по футболу', 'Юбилейный', 'г. Орск,ул.Станиславского 52г','спортцентр', 300, '27.12.14').
- acc(8, 'Экскурсия', 'Музей Т.Г. Шевченко', 'г. Орск, ул. Шевченко 33','музей', 55, '05.12.14').
- acc(9, 'Спектакль Баян', 'Студия Синяя птица', 'г.Орск, ул.Нефтяников 2а','театр', 70, '08.11.14').
- acc(10, 'Тёплый вечер', 'Бульвар', 'г. Орск, пр. Ленина 56','бар', 25, '26.12.14').
- /*_______________________________________________________________________________*/
- /*Меню*/
- start :- menu.
- menu :- write('Меню: '), nl,
- write('1 - Добавить'), nl,
- write('2 - Удалить'), nl,
- write('3 - Изменить'), nl,
- write('4 - Показать'), nl,
- write('5 - Запрос 1'), nl,
- write('6 - Запрос 2'), nl,
- write('7 - Сортировка'), nl,
- write('8 - Запись на диск'), nl,
- write('9 - Выход'), nl,
- write('Ваш выбор: '), read(N), m(N).
- /*_______________________________________________________________________________*/
- /*Добавление*/
- m(1) :- write('Введите следующую информацию: '), nl,
- write('Номер: '), read(Number), nl,
- write('Название мероприятия: '), read(EventName), nl,
- write('Название объекта: '), read(ObjectName), nl,
- write('Адрес: '), read(Address), nl,
- write('Тип: '), read(Type), nl,
- write('Количество мест: '), read(PlacesAmount), nl,
- write('Дата проведения: '), read(CDate), nl,
- assertz(acc(Number, EventName, ObjectName, Address, Type, PlacesAmount, CDate)), nl,
- write('Записано!'),
- get_char(_),
- menu.
- /*_______________________________________________________________________________*/
- /*Удаление*/
- m(2) :- write('Введите номер мероприятия для удаления: '),
- read(Number),
- retract(acc(Number, _, _, _, _, _, _)), nl,
- write('Запись удалена'),
- get_char(_),
- menu.
- /*_______________________________________________________________________________*/
- /*Изменение*/
- m(3) :- write('Что вы хотите изменить? Выберите цифру: '), nl,
- write('1 - Название мероприятия'), nl,
- write('2 - Не меняю Название объекта'), nl,
- write('3 - Адрес'), nl,
- write('4 - Тип'), nl,
- write('5 - Количество мест'), nl,
- write('6 - Дата'), nl,
- write('Ваш выбор: '), read(NC), change(NC).
- /*_______________________________________________________________________________*/
- /*Вывод*/
- m(4) :- nl, nl, write('Информация БД: '), nl,
- listing(acc/7), nl,
- write('Enter'),
- get_char(_),
- menu.
- /*_______________________________________________________________________________*/
- m(5) :- write('Запрос 1'), get_char(_), menu.
- m(6) :- write('Запрос 2'), get_char(_), menu.
- /*_______________________________________________________________________________*/
- /*Сортировка*/
- m(7) :- write('Сортировка слиянием: '), nl,
- findall(Amount, acc(_,_,_,_,_,Amount,_), Object_list),
- write('Object_list: '), write(Object_list),
- get_char(_), menu.
- /*_______________________________________________________________________________*/
- /*Запись*/
- m(8) :- tell('R:\\accounting.txt'),
- listing(acc/7),
- told,
- write('Записано!'),
- get_char(_),
- menu.
- /*_______________________________________________________________________________*/
- /*Выход*/
- m(9) :- write('Выход'), get_char(_).
- /*_______________________________________________________________________________*/
- m(_) :- write('Ошибка! Число должно быть в диапазон от 1 до 9'), nl,
- write('Нажмите Enter'), get_char(_), menu.
- /*_______________________________________________________________________________*/
- /*Изменения*/
- change(1) :- write('Изменение названия мероприятия: '), nl,
- write('Номер: '), read(Number), nl,
- write('Новое название мероприятия: '), read(EventName), nl,
- write('Название объекта: '), read(ObjectName), nl,
- write('Адрес: '), read(Address), nl,
- write('Тип: '), read(Type), nl,
- write('Количество мест: '), read(PlacesAmount), nl,
- write('Дата проведения: '), read(CDate), nl,
- retract(acc(Number,_,_,_,_,_,_ )),
- assertz(acc(Number, EventName, ObjectName, Address, Type, PlacesAmount, CDate)), nl,
- write('Изменено!'),
- get_char(_),
- menu.
Решение задачи: «Отсортировать базу данных методом слияния»
textual
Листинг программы
- % помещаем в список поле, по которому будем сортировать базу
- findall(LastName, acc(_, _, LastName, _,), Object_list),
- % сортируем этот список любым из методов
- sorting(Object_list, Sorted_list),
- % показываем базу с помощью этого списка в отсортированном виде
- show_sorted(Sorted).
- %********show_sorted********
- show_sorted([]).
- show_sorted([H|T]) :- acc(Number, Name, H, Age),
- write(Number), write(' '),
- write(H), write(' '),
- write(LastName), write(' '),
- write(Age), nl,
- show_sorted(T).
Объяснение кода листинга программы
- Сначала мы объявляем список, который будем сортировать, используя поле
LastName
. - Затем мы сортируем этот список любым из методов.
- После сортировки мы выводим отсортированный список с помощью функции
show_sorted
. - Функция
show_sorted
сначала проверяет, пуст ли список. Если это так, она завершает свою работу. - Если список не пуст, она извлекает первый элемент и записывает его в переменную
H
. - Затем она записывает номер, имя, фамилию и возраст этого элемента.
- Наконец, она рекурсивно вызывает себя для оставшейся части списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д