Преобразование арабских чисел в римские. - Prolog
Формулировка задачи:
мне еще нужно преобразовать полученный список арабских чисел (максимальное значение 10) в список римских чисел, вот только не знаю как сравнивать, начал писать, но застопорился, можно ли как то цикли сделать или условия чтоб при совпадении цифра бы менялась на римскую(1 на I, 2 на II и т.д.)
Решение задачи: «Преобразование арабских чисел в римские.»
textual
Листинг программы
DOMAINS treetype=tree(integer,treetype,treetype);nil() t1=treetype* r1=integer* r2=symbol* PREDICATES scan_list(t1,r1) scan_tree(treetype,integer) translate(r1,r2) word(integer,symbol) CLAUSES word(0,"O"). word(1,"I"). word(2,"II"). word(3,"III"). word(4,"IV"). word(5,"V"). word(6,"VI"). word(7,"VII"). word(8,"VIII"). word(9,"IX"). word(10,"X"). scan_list([],[]):-!. scan_list([H|T],[N|Tail]):-scan_tree(H,N), scan_list(T,Tail). scan_tree(nil,0):-!. scan_tree(tree(Root,Left,Right),N):- Root<0,!, scan_tree(Left,A), scan_tree(Right,B), N=A+B+1. scan_tree(tree(Root,Left,Right),N):- scan_tree(Left,A), scan_tree(Right,B), N=A+B. translate([],[]). translate([H|T],[Rh|Rt]):- word(H,Rh), translate(T,Rt). GOAL clearwindow(), scan_list([tree(4, tree(2, tree(1,nil,nil), tree(3,nil,nil)), tree(5,nil,nil)), tree(3, tree(4, tree(5,nil,nil), tree(10,nil,nil)), tree(-1, tree(4,nil,nil), tree(-1,nil,nil))), tree(-1, tree(-5, tree(-3,nil,nil), tree(4,nil,nil)), tree(-3, tree(-1,nil,nil), tree(-7,nil,nil)))],N), write(N),translate(N,X), write(X).
Объяснение кода листинга программы
- В начале кода определяются типы данных и основные переменные:
treetype=tree(integer,treetype,treetype)
- тип данных для представления древовидной структуры;t1=treetype*
- тип переменной для хранения деревьев;r1=integer*
- тип переменной для хранения целых чисел;r2=symbol*
- тип переменной для хранения символов;word(integer,symbol)
- предикат для получения слова в виде числа и символа.
- Затем определены два предиката:
scan_list([],[]):-!
- предикат для сканирования списка и рекурсивного вызоваscan_tree
.scan_tree(nil,0):-!
- предикат для обработки случая, когда дерево пусто.scan_tree(tree(Root,Left,Right),N):-Root<0,!,
- предикат для обработки случая, когда узел дерева отрицательный.scan_tree(tree(Root,Left,Right),N):-Root>=0,!
- предикат для обработки случая, когда узел дерева неотрицательный.translate([],[]).
- предикат для перевода списка деревьев в список слов.translate([H|T],[Rh|Rt]):-word(H,Rh),translate(T,Rt).
- предикат для перевода каждого элемента списка в соответствующее слово.
- В основной части кода происходит следующая последовательность действий:
- Создается пустое окно с помощью
clearwindow()
. - В список
t1
добавляются деревья, представляющие арабское число. - С помощью
scan_list([tree(4,...),tree(3,...),tree(-1,...),tree(-5,...),nil],[])
происходит обход и разбор каждого дерева. - Результат разбора (список слов) сохраняется в переменной
N
. - Результат выводится на экран с помощью
write(N)
. - Затем результат перевода (список слов) выводится на экран с помощью
write(X)
.
- Создается пустое окно с помощью
- Перевод арабского числа в римское выполняется следующим образом:
- Для каждого неотрицательного узла дерева, представляющего арабское число, вызывается предикат
translate
, который переводит это число в соответствующее слово в римской системе счисления. - Для каждого отрицательного узла дерева, представляющего арабское число, вызывается предикат
translate
, который переводит это число в соответствующее слово в римской системе счисления, учитывая его знак.
- Для каждого неотрицательного узла дерева, представляющего арабское число, вызывается предикат
- Преимущественно, код написан на основе принципа разделения функциональности, где каждый предикат выполняет только одну конкретную задачу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д