Отсортировать базу данных методом слияния - Prolog

Узнай цену своей работы

Формулировка задачи:

Работаю в SWI-Prolog. Реализовал всё, кроме сортировки. Необходимо упорядочить список объектов досуга по количеству мест с помощью сортировки слиянием. Поискав, понял, что нужно сначала БД засунуть в список, затем производить манипуляции с ним. findall(Amount, acc(_,_,_,_,_,Amount,_), Object_list), Но тут в список помещается лишь 1 параметр записи. Как засунуть всё? И как отсортировать базу?
Листинг программы
  1. /*Факты*/
  2. acc(1, 'Библионочь', 'Библиотека им.Горького', 'г. Орск, пр-кт. Ленина 13', 'библиотека', 50, '10.10.14').
  3. acc(2, 'Хоббит', 'Кинотеатр Мир', 'г. Орск, пр. Ленина 54','кинотеатр', 400, '15.12.14').
  4. acc(3, 'Несносные боссы', 'Киноцентр Орск', 'г. Орск, ул.Краматорская 8б','кинотеатр', 450, '20.12.14').
  5. acc(4, 'Концерт', 'Центр развития Радуга', 'г. Орск, ул. Просвещения 46','центр', 30, '21.11.14').
  6. acc(5, '90XXL', 'Night Club SKY', 'г. Орск, пер. Музыкальный 7','клуб', 200, '09.12.14').
  7. acc(6, 'Караоке вечер', 'Звездная Кошка', 'г. Орск, ул.Краматорская 35','бар', 70, '17.12.14').
  8. acc(7, 'Соревнования по футболу', 'Юбилейный', 'г. Орск,ул.Станиславского 52г','спортцентр', 300, '27.12.14').
  9. acc(8, 'Экскурсия', 'Музей Т.Г. Шевченко', 'г. Орск, ул. Шевченко 33','музей', 55, '05.12.14').
  10. acc(9, 'Спектакль Баян', 'Студия Синяя птица', 'г.Орск, ул.Нефтяников 2а','театр', 70, '08.11.14').
  11. acc(10, 'Тёплый вечер', 'Бульвар', 'г. Орск, пр. Ленина 56','бар', 25, '26.12.14').
  12. /*_______________________________________________________________________________*/
  13.  
  14. /*Меню*/
  15. start :- menu.
  16. menu :- write('Меню: '), nl,
  17. write('1 - Добавить'), nl,
  18. write('2 - Удалить'), nl,
  19. write('3 - Изменить'), nl,
  20. write('4 - Показать'), nl,
  21. write('5 - Запрос 1'), nl,
  22. write('6 - Запрос 2'), nl,
  23. write('7 - Сортировка'), nl,
  24. write('8 - Запись на диск'), nl,
  25. write('9 - Выход'), nl,
  26. write('Ваш выбор: '), read(N), m(N).
  27. /*_______________________________________________________________________________*/
  28. /*Добавление*/
  29. m(1) :- write('Введите следующую информацию: '), nl,
  30. write('Номер: '), read(Number), nl,
  31. write('Название мероприятия: '), read(EventName), nl,
  32. write('Название объекта: '), read(ObjectName), nl,
  33. write('Адрес: '), read(Address), nl,
  34. write('Тип: '), read(Type), nl,
  35. write('Количество мест: '), read(PlacesAmount), nl,
  36. write('Дата проведения: '), read(CDate), nl,
  37. assertz(acc(Number, EventName, ObjectName, Address, Type, PlacesAmount, CDate)), nl,
  38. write('Записано!'),
  39. get_char(_),
  40. menu.
  41. /*_______________________________________________________________________________*/
  42. /*Удаление*/
  43. m(2) :- write('Введите номер мероприятия для удаления: '),
  44. read(Number),
  45. retract(acc(Number, _, _, _, _, _, _)), nl,
  46. write('Запись удалена'),
  47. get_char(_),
  48. menu.
  49. /*_______________________________________________________________________________*/
  50. /*Изменение*/
  51. m(3) :- write('Что вы хотите изменить? Выберите цифру: '), nl,
  52. write('1 - Название мероприятия'), nl,
  53. write('2 - Не меняю Название объекта'), nl,
  54. write('3 - Адрес'), nl,
  55. write('4 - Тип'), nl,
  56. write('5 - Количество мест'), nl,
  57. write('6 - Дата'), nl,
  58. write('Ваш выбор: '), read(NC), change(NC).
  59. /*_______________________________________________________________________________*/
  60. /*Вывод*/
  61. m(4) :- nl, nl, write('Информация БД: '), nl,
  62. listing(acc/7), nl,
  63. write('Enter'),
  64. get_char(_),
  65. menu.
  66. /*_______________________________________________________________________________*/
  67. m(5) :- write('Запрос 1'), get_char(_), menu.
  68. m(6) :- write('Запрос 2'), get_char(_), menu.
  69. /*_______________________________________________________________________________*/
  70. /*Сортировка*/
  71. m(7) :- write('Сортировка слиянием: '), nl,
  72. findall(Amount, acc(_,_,_,_,_,Amount,_), Object_list),
  73. write('Object_list: '), write(Object_list),
  74. get_char(_), menu.
  75.  
  76. /*_______________________________________________________________________________*/
  77. /*Запись*/
  78. m(8) :- tell('R:\\accounting.txt'),
  79. listing(acc/7),
  80. told,
  81. write('Записано!'),
  82. get_char(_),
  83. menu.
  84. /*_______________________________________________________________________________*/
  85. /*Выход*/
  86. m(9) :- write('Выход'), get_char(_).
  87. /*_______________________________________________________________________________*/
  88. m(_) :- write('Ошибка! Число должно быть в диапазон от 1 до 9'), nl,
  89. write('Нажмите Enter'), get_char(_), menu.
  90.  
  91. /*_______________________________________________________________________________*/
  92. /*Изменения*/
  93. change(1) :- write('Изменение названия мероприятия: '), nl,
  94. write('Номер: '), read(Number), nl,
  95. write('Новое название мероприятия: '), read(EventName), nl,
  96. write('Название объекта: '), read(ObjectName), nl,
  97. write('Адрес: '), read(Address), nl,
  98. write('Тип: '), read(Type), nl,
  99. write('Количество мест: '), read(PlacesAmount), nl,
  100. write('Дата проведения: '), read(CDate), nl,
  101. retract(acc(Number,_,_,_,_,_,_ )),
  102. assertz(acc(Number, EventName, ObjectName, Address, Type, PlacesAmount, CDate)), nl,
  103. write('Изменено!'),
  104. get_char(_),
  105. menu.

Решение задачи: «Отсортировать базу данных методом слияния»

textual
Листинг программы
  1. % помещаем в список поле, по которому будем сортировать базу
  2. findall(LastName, acc(_, _, LastName, _,), Object_list),
  3.  
  4.  % сортируем этот список любым из методов
  5. sorting(Object_list, Sorted_list),
  6.  
  7. % показываем базу с помощью этого списка в отсортированном виде
  8. show_sorted(Sorted).
  9.  
  10.  
  11. %********show_sorted********
  12. show_sorted([]).
  13. show_sorted([H|T]) :- acc(Number, Name, H, Age),
  14.                       write(Number), write(' '),
  15.                       write(H), write(' '),
  16.                       write(LastName),  write(' '),
  17.                       write(Age), nl,
  18.                       show_sorted(T).

Объяснение кода листинга программы

  1. Сначала мы объявляем список, который будем сортировать, используя поле LastName.
  2. Затем мы сортируем этот список любым из методов.
  3. После сортировки мы выводим отсортированный список с помощью функции show_sorted.
  4. Функция show_sorted сначала проверяет, пуст ли список. Если это так, она завершает свою работу.
  5. Если список не пуст, она извлекает первый элемент и записывает его в переменную H.
  6. Затем она записывает номер, имя, фамилию и возраст этого элемента.
  7. Наконец, она рекурсивно вызывает себя для оставшейся части списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы