> 1 <

Автор Сообщение

stas89

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#5094   2011-11-21 13:32 GMT+3 часа(ов)      
Здравствуйте. Требуется помощь
Для представления римских цифр используются символы: I - один, V - пять, X -десять, L - пятьдесят. С - сто, D - пятьсот, М - тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила; так, например., 482 -CDLXXXII, 1999 - MCMXCIX. Напишите функцию (f R), которая переводит число R, записанное римскими цифрами, в десятичную запись; например, (f '(С DLX X X 11)) = 482. Исходное число не превышает 1999.

отредактировал(а) stas89: 2011-12-03 16:13 GMT+3 часа(ов)

Paul4936

Members


Статус

42 сообщений

Где: Russia
Род занятий: (\/)(o_O)(\/)
Возраст: 30

#5095   2011-11-21 15:04 GMT+3 часа(ов)      
Вас что всех в гугле забанили, в библиотеку не пускают а с лекций гонят?
Или просто Battlefield 3 и TES 5: Skyrim вышли?
Вторая и четвертая элементарны, 3 тоже не сложная плюс почти везде есть решение такогой,как и 1.
Цитата
stas89 :
... в связи с тем что с XLisp сталкиваюсь впервые комментарии к решению приветствуются.

для решения 3 задачи использовал следующий код

(defun F (roman &optional (table '((I . 1)(V . 5)(X . 10)(L . 50)(C . 100)(D . 500)(M . 1000))))

(if roman

((lambda (curr tail)

(if (null tail) curr

((lambda (next result)

(funcall (if (< curr next) '- '+) result curr))

(cdr (assoc (car tail) table))

(F tail))))

(cdr (assoc (car roman) table))

(cdr roman))))

Аргумент вызова функции (F) - список символов, представляющий римское числительное: (F '(M C M X C I I))


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

stas89

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#5096   2011-11-21 15:18 GMT+3 часа(ов)      
все немного не так. я работаю и банально нет времени. код чужой не спорю, просто нуждается в доработке, в помощи которой я и нуждаюсь.

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#5097   2011-11-21 16:02 GMT+3 часа(ов)      
Сформулируйте, пожалуйста, признаки "неправильного ввода" (в задаче 3).

stas89

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#5098   2011-11-21 16:52 GMT+3 часа(ов)      
как сделать так, чтобы программа считала только правильные риммские числа и не считала неправильные - два случая:
1) пример: XXIVII - т.е. если число I стоит до V и после нее тоже... (это как пример)
2) пример: IIIX - и если перед X стоят три одинаковые цифры...

stas89

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#5385   2011-12-22 18:31 GMT+3 часа(ов)      
(defun checkM (RNS RPT)
(cond
((null RNS)
nil
)
((and (< RPT 3) (eql (car RNS) 'M))
(checkM (cdr RNS) (1+ RPT))
)
(t
RNS
)
)
)



(defun checkDCCDM (RNS RPT DF)
(cond
((null RNS)
nil
)
((and (eql (car RNS) 'D) (zerop RPT) (zerop DF))
(checkDCCDM (cdr RNS) 0 1)
)
((and (eql RPT 1) (or (eql (car RNS) 'D) (eql (car RNS) 'M)))
(cdr RNS)
)
((and (< RPT 3) (eql (car RNS) 'C))
(checkDCCDM (cdr RNS) (+ RPT 1) DF)
)
(t RNS)
)
)



(defun checkLXXLC (RNS RPT LF)
(cond
((null RNS)
nil
)
((and (eql (car RNS) 'L) (zerop RPT) (zerop LF))
(checkLXXLC (cdr RNS) 0 1)
)
((and (eql RPT 1) (or (eql (car RNS) 'L) (eql (car RNS) 'C)))
(cdr RNS)
)
((and (< RPT 3) (eql (car RNS) 'X))
(checkLXXLC (cdr RNS) (+ RPT 1) LF)
)
(t RNS)
)
)


(defun checkVIIVX (RNS RPT VF)
(cond
((null RNS)
nil
)
((and (eql (car RNS) 'V) (zerop RPT) (zerop VF))
(checkVIIVX (cdr RNS) 0 1)
)
((and (eql RPT 1) (or (eql (car RNS) 'V) (eql (car RNS) 'X)))
(cdr RNS)
)
((and (< RPT 3) (eql (car RNS) 'I))
(checkVIIVX (cdr RNS) (+ RPT 1) VF)
)
(t RNS)
)
)



(defun isr (RNS)
(null (checkVIIVX (checkLXXLC (checkDCCDM (checkM RNS 0) 0 0) 0 0) 0 0))
)

(defun rim2dec (R)
(cond
((null R)
0
)
((eql (first R) 'I)
(if (or (eql (second R) 'V) (eql (second R) 'X))
(- (f (cdr R)) 1)
(+ (f (cdr R)) 1)
)
)
((eql (first R) 'V)
(+ (f (cdr R)) 5)
)
((eql (first R) 'X)
(if (or (eql (second R) 'L) (eql (second R) 'C))
(- (f (cdr R)) 10)
(+ (f (cdr R)) 10)
)
)
((eql (first R) 'L)
(+ (f (cdr R)) 50)
)
((eql (first R) 'C)
(if (or (eql (second R) 'D) (eql (second R) 'M))
(- (f (cdr R)) 100)
(+ (f (cdr R)) 100)
)
)
((eql (first R) 'D)
(+ (f (cdr R)) 500)
)
((eql (first R) 'M)
(+ (f (cdr R)) 1000)
)
)
)

(defun f (R)
(if (isr R)
(rim2dec R)
nil
)
)

stas89

Members


Статус

5 сообщений

Где: Russia
Род занятий:
Возраст:

#5386   2011-12-22 18:33 GMT+3 часа(ов)      
Вот правильный код решения задачи с римскими числами с учетом корректности ввода, на будущее кто с этим столкнется)
> 1 <


Онлайн :

0 пользователь(ей), 29 гость(ей) :