Работа со списками
Приобретение навыков работы со списками в программах на Visual Prolog. Изображение списка в виде головы и хвоста. Удаление всех вхождений элемента в списке. Обозначение пустого списка. Вычисление суммы элементов, стоящих в списке на нечетных местах.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 27.11.2014 |
Размер файла | 94,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ БЕЛАРУСЬ
БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Факультет информационных технологий и робототехники
Кафедра программного обеспечения вычислительной техники и автоматизированных систем
Отчет по лабораторной работе № 6
по дисциплине: ”Функциональное и логическое программирование”
на тему: ”РАБОТА СО СПИСКАМИ. ”
Выполнили: студенты группы 02213 Малич К.В. Шарко А.В.
Приняла: ст.пр. Ковалькова И.А.
Минск 2014
Задание
Цель работы: приобретение навыков работы со списками в программах на Visual Prolog.
Из списка L1 получить список L2, очередной элемент которого равен среднему арифметическому очередной тройки элементов списка L1. Если число элементов списка L1 не кратно 3, то последний элемент списка L2 получается делением на 3 одного или суммы двух последних элементов списка L1. Список L1 вводится по подсказке с экрана. В результате выполнения программы должны выдаваться исходный L1 и результирующий L2 списки.
Удалить все вхождения заданного элемента в списке.
0Б Произвести сдвиг элементов списка (не циклический):
- на N позиций влево (вправо).
Определить разность между максимальным и минимальным элементами списка.
Удалить первое вхождение заданного элемента в списке.
Вычислить сумму элементов, стоящих в списке на нечетных местах, и сумму элементов, стоящих на четных местах.
Заменить в списке все элементы со значением X на значения Y.
Код программы
domains
list = real*
predicates
nondeterm read_list(integer,list)
nondeterm nov_spisok(integer,list,list)
nondeterm result
clauses
read_list(0,[]).
read_list(N,[H|T]):-readreal(H),N1 = N - 1,read_list(N1,T).
nov_spisok(0,[],[]):-!.
nov_spisok(1,[H|T],[H1|T1]):- H1 = H/3,nov_spisok(0,T,T1).
nov_spisok(2,[H|[H1|T]],[H2|T1]):- H2 = (H1+H)/2,nov_spisok(0,T,T1).
nov_spisok(N,[H|[H1|[H2|T]]],[H3|T3]):- H3 = (H+H1+H2)/3,
N1 = N - 3,nov_spisok(N1,T,T3).
result :- write("Vvedite chislo elementov massiva : "),readint(N),nl,
write("Vvedite elementi massiva : "),nl,read_list(N,H),nov_spisok(N,H,H1),nl,
write("Noviy spisok : "),write(H1),nl.
Goal result.
/*domains
list=real*
predicates
nondeterm read_list(integer,list)
nondeterm result
nondeterm chg (list, real, list)
clauses
read_list(0,[]).
read_list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).
chg ([], _ , []) if !.
chg ([H|T], H, T1) if chg (T, H, T1),!.
chg ([H|T], S, [H|T1]) if chg (T, S, T1),!.
result:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,
write("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),
write (L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, chg(L, E, LL),write ("Результирующий список:"), nl, write(LL), nl.
goal
result.*/
/*domains
list=real*
predicates
nondeterm read_list(integer,list)
nondeterm result
nondeterm del (real, list, list)
clauses
read_list(0,[]).
read_list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).
del(X, [X|T], T).
del(X, [Y|T], [Y|T1]) if del(X, T, T1).
result:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,
write("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),
write (L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, del(E, L, LL),write ("Результирующий список L="), write(LL), nl.
goal
result.*/
domains
list=integer*.
predicates
nondeterm summ_nechet(list,integer, integer)
nondeterm summ_chet(list,integer, integer)
nondeterm readlist(list)
Clauses
summ_nechet([], _, 0):-!.
summ_nechet([H|T], I, R):-
I mod 2 = 0, !, II = I + 1, summ_nechet(T, II, TR), R = TR + H;
II = I + 1, summ_nechet(T, II, R).
summ_chet([], _, 0):-!.
summ_chet([H|T], I, R):-
I mod 2 = 1, !, II = I + 1, summ_chet(T, II, TR), R = TR + H;
II = I + 1, summ_chet(T, II, R).
readlist([H|T]):-readint(H),!,readlist(T). readlist([]).
goal
write("Vvodite elementi spiska"),nl,
readlist(L),
write("Summa chetnih:"),nl,
summ_chet(L, 0, S).*/
domains
ilist=integer*
predicates
pravo(integer,ilist,ilist).
del_last(ilist,ilist).
add_last(ilist,ilist).
b(ilist,integer,ilist).
readlist(ilist).
clauses
del_last([_],[]):-!.
del_last([H|Tail],[H|NewTail]):-del_last(Tail,NewTail).
add_last([],[0]):-!.
add_last([H|Tail],[H|NewTail]):-add_last(Tail,NewTail).
pravo(0,L,L):-!.
pravo(N,T,L):-del_last(T,T1),N1=N-1,pravo(N1,[0|T1],L).
b(A,N,B):-pravo(0,A,A1),pravo(N,A1,B).
readlist([H|T]):-readint(H),!,readlist(T). readlist([]).
goal
write("Vvod N "),
readint(N),
write("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,
readlist(L),
b(L,N,B).*/
domains
list=real*
predicates
nondeterm readlist(list).
nondeterm max(list,integer).
nondeterm min(list,integer).
nondeterm res(integer,integer,integer).
clauses
max([X], X).
max([H|Tail], H)if max(Tail, M), H>M,!.
max([_|Tail], M)if max(Tail, M).
min([X], X).
min([H|Tail], H)if min(Tail, M), H<M,!.
min([_|Tail], M)if min(Tail, M).
res(X,Y, R) if R=X-Y.
readlist([H|T]):-readint(H),!,readlist(T). readlist([]).
goal
write("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,
readlist(L),
max(L, X),
min(L,Y),
res(X, Y, Res).
*/
domains
list = integer*
predicates
nondeterm print(list)
nondeterm replace(list, integer, integer, list)
clauses
print([]) :- !.
print([H|[]]) :- write(H).
print([H|T]) :- write(H, ", "), print(T).
replace([], _, _, []) :- !.
replace([H|T], X, Y, [H|R]) :- H <> X, replace(T, X, Y, R).
replace([H|T], X, Y, [Y|R]) :- H = X, replace(T, X, Y, R).
goal
write("Enter list:"), nl,
readterm(list, L), nl,
write("Enter X:"), nl,
readint(X), nl,
write("Enter Y:"), nl,
readint(Y), nl,
replace(L, X, Y, R),
write('['),
print(R),
write("]."), nl,
readchar(_).
*/
Скриншоты результатов
Ответы на контрольные вопросы
1. Что такое список?
Список - это специальный вид сложного терма, состоящий из последовательности термов, заключенных в квадратные скобки и разделенных запятой. Как обозначается отсечение в программе?
2. Голова и хвост списка. Изображение списка в виде головы и хвоста.
Н - голова, Т - хвост списка. Изображается в виде [H|T]. H- первый элемент, Т - список оставшийся.
3. Как обозначается пустой список?
4. Можно ли изобразить пустой список в виде головы и хвоста ?
Нет.
5. Что означают следующие виды изображения списка: L, [X], [ _ , A], [ _ |T], [H| _ ], [ _ ], [ _ ,B|C] ?
L - тип списка; [X] - список состоящий из одного элемента; [_,A] - список из двух элементов, первый элемент может принимать любое значение; [ _ |T], - список в котором голова принимает любое значение; [H| _ ] - список в котором не важен хвост; [_] - список из одного элемента значение которого не имеет значения; [ _ ,B|C] - список в голове которого 2 элемента, и первый может принимать любое значение.
6. Может ли быть в голове списка более одного элемента?
Да, может.
7. Принадлежит ли элемент 5 списку [[1, 2, 3], [4, 5, 6]]?
Нет, он принадлежит элементу списка.
8. Сопоставимы ли два списка: [5, 6, 7] и [H|T] ?
Да.
9. Можно ли в процедурах ввода списка ввод_списка1 и ввод_списка2 поменять местами первое и второе предложения?
Нет.
10. Как нужно изменить процедуру удал_перв_эл, чтобы можно было удалить из списка: a) два первых элемента; б) второй элемент?
удал_перв_эл([ _ | T], T).
А) удал_перв_эл([ _ ,_| T], T).
B) удал_перв_эл([ H,_ | T], [H|T]).
11. Как нужно изменить процедуру удал_посл_эл, чтобы из списка были удалены: a) два последние элементы; б) предпоследний элемент ?
А) удал([_,_],[]).
удал([H|T],[H|T1]) if удал(T,T1).
удал([_],[]).
B) удал [_,X],[X]).
удал([H|T],[H|T1]) if удал(T,T1).
удал([_],[]).
12. Как нужно изменить процедуру выдел_перв_эл, чтобы можно было выделить из списка: a) два первых элемента; б) второй элемент ?
А) выдел_перв_эл([H,H1| _ ], H,H1).
B) выдел_перв_эл([H,H1| _ ], H1).
13. Как нужно изменить процедуру выдел_посл_эл, чтобы из списка можно было выделить: a) два последние элементы; б) предпоследний элемент?
А) выдел_посл_эл([X,H], X,H).
выдел_посл_эл([ _ |T], X,H):- выдел_посл_эл(T, X,H).
B) выдел_посл_эл([X,_], X).
выдел_посл_эл([ _ |T], X):- выдел_посл_эл(T, X).
14. Как нужно изменить процедуру доб_эл_в_начало, чтобы можно было вставить заданный элемент между первым и вторым элементами списка ?
доб_эл_в_начало(E, [H,H1|T], [H,E,H1|T]).
15. Как нужно изменить процедуру доб_эл_в_конец, чтобы заданный элемент вставился перед последним элементом списка ?
доб_эл_в_конец(E, [H], [E,H]).
доб_эл_в_конец(E, [H|T], [H|T1]):- доб_эл_в_конец(E, T, T1).
16. Можно ли в программе со списками обойтись без раздела domains ?
Нет
список вхождение хвост нечетный
Вывод
Приобрели навыки работы со списками в программах на Visual Prolog.
Размещено на Allbest.ru
Подобные документы
Понятие и обработка списков. Имя домена списка. Примеры записи списков. Основные принципы работы со списками. Рекурсивная программа обработки списка. Определение номера элемента или элемента по номеру. Решение задач, использующих структуру графа.
презентация [65,0 K], добавлен 29.07.2012Операции, осуществляемые с однонаправленными списками. Порядок создания однонаправленного списка, вставка и удаление элементов. Алгоритмы основных операций с двунаправленными списками. Примеры реализации однонаправленных и двунаправленных списков.
курсовая работа [172,7 K], добавлен 20.01.2016Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.
курсовая работа [2,3 M], добавлен 27.08.2012Формирование матрицы и выполнение заданий: вычисление сумы четных элементов; максимума из нечетных элементов в строке; произведение элементов в нечетных столбцах; количество четных элементов выше главной диагонали. Создание программы в Visual Basic.
контрольная работа [12,0 K], добавлен 07.10.2012Решение задачи на составление компромиссного списка. Построение математической модели. Цена перемещения элементов. Вывод программы. Закреплении элемента а1 на первом месте, а а4 на пятом. Матрица оценок для задачи. Оптимальное решение в виде списка.
курсовая работа [37,5 K], добавлен 30.01.2016Общие сведения о Microsoft Excel. Формирование таблицы продаж в виде списка. Создание формы для ввода информации командой Данные-Форма. Выполнение сортировки, фильтрации данных в списке. Формирование промежуточных итогов по ежемесячной прибыли.
курсовая работа [23,5 K], добавлен 16.12.2010Создание классов, реализующих работу со списками и применение их к задаче построения графических моделей. Использование языка С++ для реализации списковой структуры. Назначение и условия применения программы. Руководство для программиста и оператора.
курсовая работа [131,1 K], добавлен 19.03.2010Стандартные функции для работы с динамической памятью. Представление списков цепочками звеньев. Организация файлового каталога в файловой системе в виде линейного списка на языке Visual C++. Создание блок-схемы и инструкции по работе с программой.
курсовая работа [252,0 K], добавлен 22.01.2015Правила задавания адреса при создании гиперссылок, применение атрибутов и тэгов. Способы создания якоря (метки). Использование рисунков в качестве гиперссылки. Работа с упорядоченными, неупорядоченными и вложенными списками, списками определений.
презентация [347,9 K], добавлен 19.08.2013Основы языка Visual Prolog. Введение в логическое программирование. Особенности составления прологов, синтаксис логики предикатов. Программы на Visual Prolog. Унификация и поиск с возвратом. Использование нескольких значений как единого целого.
лекция [120,5 K], добавлен 28.05.2010