Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Системы счисления как с ней работать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию Системы счисления как с ней работать - 14.05.2007, 22:40

Уважаемые участники форума, помогите пожалуйста с задачей перевода числа из десятичной системы счисления в N-ричную (N>1). Очень тяжело идёт у меня изучение языка, для опытных же програмистов, думаю, справиться будет не очень трудно.

Выручите плиз.

Да ... преподаватель ждёт от меня две программы - с использованием циклов и присваивания и без них ... буду очень признателен за любую помощь
Ответить с цитированием
  (#2 (permalink)) Старый
ment ment вне форума
Member
 
Сообщений: 28
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.03.2007
По умолчанию 14.05.2007, 22:51

DEC->HEX
HEX->DEC
на автолиспе сделанные на скорую кривую руку подойдут?
Ответить с цитированием
  (#3 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 14.05.2007, 22:52

Алгоритм: делим число на N с остатком; неполное частное - еще раз; и т.д. пока не получим 0; остатки собираем в список; в конце список переворачиваем и выводим на экран (хотя можно сразу копить в обратном порядке). Вы не оговорили, можно ли пользоваться встроенной арифметикой, или же деление нужно реализовывать самому.

Кстати, циклы часто позволяют обойтись без присваивания.
Ответить с цитированием
  (#4 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 14.05.2007, 23:00

Цитата:
Алгоритм: делим число на N с остатком; неполное частное - еще раз; и т.д. пока не получим 0; остатки собираем в список; в конце список переворачиваем и выводим на экран (хотя можно сразу копить в обратном порядке). Вы не оговорили, можно ли пользоваться встроенной арифметикой, или же деление нужно реализовывать самому.

Кстати, циклы часто позволяют обойтись без присваивания.
Судя по моим предыдущим отчётам этому преподавателю, ничем встроенным пользоваться нельзя
Ответить с цитированием
  (#5 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 14.05.2007, 23:16

Вот решение, использующее цикл и встроенную арифметику, и не использующее присваивания. Работает с целыми неотрицательными числами.
Код:
(defun encode (n base)
  (do ((n n (truncate n base))
       (tail nil (cons (digit-char (rem n base) base) tail)))
      ((zerop n)
       (format t "~{~C~}"(or tail '(#\0))))))
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 14.05.2007, 23:29

Цитата:
Вот решение, использующее цикл и встроенную арифметику, и не использующее присваивания. Работает с целыми неотрицательными числами.
Код:
(defun encode (n base)
  (do ((n n (truncate n base))
       (tail nil (cons (digit-char (rem n base) base) tail)))
      ((zerop n)
       (format t "~{~C~}"(or tail '(#\0))))))
Громадное спасибо, Алексей.
У меня два вопроса:
1)
Цитата:
CL-USER 4 > (ENCODE 20 5)
40
NIL

CL-USER 5 > (ENCODE 15 16)
F
NIL
что обозначает NIL после представления числа? и может ли для какого-то теста там появиться что-то другое?

2) Если нетрудно, не могли бы Вы в двух словах объяснить что написано в строках кода? В изучении LISP'а я ещё не сталкивался почти ни с одним из операторов из текста Вашей программы.
Ответить с цитированием
  (#7 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 14.05.2007, 23:46

Цитата:
что обозначает NIL после представления числа?
Возвращаемое значение. Данная функция печатает результат на экране и возвращает NIL. Если в первом аргументе FORMAT заменить T на NIL, функция ничего не будет печатать, а будет возвращать строку.

DO - оператор цикла; судя по заданию, он должен был быть на занятиях.
TRUNCATE и REM - вычисляют неполное частное (округляется в сторону нуля) и остаток.
(DIGIT-CHAR n base) - переводит число n, меньшее base, в соответствующую литеру-цифру.
ZEROP - проверяет аргумент на равенство 0.
FORMAT - распечатывает список цифр в красивом виде.
Ответить с цитированием
  (#8 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 14.05.2007, 23:56

Цитата:
Возвращаемое значение. Данная функция печатает результат на экране и возвращает NIL. Если в первом аргументе FORMAT заменить T на NIL, функция ничего не будет печатать, а будет возвращать строку.

DO - оператор цикла; судя по заданию, он должен был быть на занятиях.
TRUNCATE и REM - вычисляют неполное частное (округляется в сторону нуля) и остаток.
(DIGIT-CHAR n base) - переводит число n, меньшее base, в соответствующую литеру-цифру.
ZEROP - проверяет аргумент на равенство 0.
FORMAT - распечатывает список цифр в красивом виде.
Большое спасибо. Вы меня очень выручили.
Ответить с цитированием
  (#9 (permalink)) Старый
imported__Evil imported__Evil вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.05.2007
По умолчанию 16.05.2007, 02:37

Цитата:
Вот решение, использующее цикл и встроенную арифметику, и не использующее присваивания. Работает с целыми неотрицательными числами.
Код:
(defun encode (n base)
  (do ((n n (truncate n base))
       (tail nil (cons (digit-char (rem n base) base) tail)))
      ((zerop n)
       (format t "~{~C~}"(or tail '(#\0))))))
Думаю не сложно будет брат помоги написать функцию переводящую символьный атом N-ричной CC в десятиную (1<C<11)
Зарание спасибо!!!
Ответить с цитированием
  (#10 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 16.05.2007, 12:15

Цитата:
FORMAT - распечатывает список цифр в красивом виде.
Алексей, подскажите пожалуйста, что значит ~{ и ~C в операторе Format?
Ответить с цитированием
  (#11 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 16.05.2007, 22:00

Цитата:
что значит ~{ и ~C в операторе Format?
http://www.lispworks.com/documentation/Hyp...Body/22_cgd.htm
http://www.lispworks.com/documentation/Hyp...Body/22_caa.htm
FORMAT - это функция
Ответить с цитированием
  (#12 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 19.05.2007, 22:41

Спасибо за ссылки.

Алексей, мне очень неудобно Вас беспокоить, но вынужден опять просить Вашей помощи. Можете ли Вы написать код программы, реализующей ту же задачу (перевод из деятичной в n-ричную) без использования циклов и присваивания ... рекурсией например ... больше мне надеяться не на кого, не знаю я людей, кто так бы разбирался в ЛИСПе.
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 20.05.2007, 00:25

Код:
(defun encode (n base &optional tail)
  (if (zerop n)
      (format t "~{~C~}"(or tail '(#\0)))
      (encode (truncate n base) base
              (cons (digit-char (rem n base) base) tail))))
Ответить с цитированием
  (#14 (permalink)) Старый
Паркер Паркер вне форума
Member
 
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.05.2007
По умолчанию 20.05.2007, 14:33

Цитата:
Код:
(defun encode (n base &optional tail)
  (if (zerop n)
      (format t "~{~C~}"(or tail '(#\0)))
      (encode (truncate n base) base
              (cons (digit-char (rem n base) base) tail))))
*тут должен находиться смайлик, снимающий шляпу*

Алексей, и всё-таки вот эту строку

Код:
(format t "~{~C~}"(or tail '(#\0)))
я никак понять не могу. Объясните мне ёё пожалуйста поподробней.

Не посоветуете ли какое-нибудь пособие по ЛИСПу на русском языке, а то английским я не владею. Скачал "Мир Лиспа" 1й том, но там как-то не всё есть (например, то, что я у Вас спрашивал по формату). В частности, не знаю до сих пор, как работает в Лиспе логический оператор OR, что возвращает (не подскажете, кстати)
Ответить с цитированием
  (#15 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 20.05.2007, 15:06

Цитата:
(format t "~{~C~}"(or tail '(#\0)))
FORMAT-инструкция ~{ - цикл по элементам списка, заданного очередным параметром. В нашем случае параметр после формата один - список цифр. Каждый элемент списка (у нас - очередная литера-цифра) выводится по шаблону, записанному между ~{ и ~}. В данном случае - ~C, т.е. вывод одной литеры "как есть".
Вот еще пример:
Код:
CL-USER> (format t "|~{<~C> - ~}|" '(#\a #\b #\c))
|<a> - [b] - <c> - |
NIL
Цитата:
Не посоветуете ли какое-нибудь пособие по ЛИСПу на русском языке
Я знаю всего две книжки по Лиспу на русском языке - "Мир Лиспа" (очень старая) и "Структура и интерпретация компьютерных программ" (начальный курс программирования с использованием языка Scheme). Если Вы собираетесь работать программистом, учить английский все равно придется.

Цитата:
как работает в Лиспе логический оператор OR
В ANSI Common Lisp: (OR подформа1 ... подформаn). Последовательно выполняются указанные подформы. Если какая-либо из подформ возвращает объект, отличный от NIL, вычисление всей формы прекращается, и этот объект возвращается как результат. Если все подформы возвращают NIL, результатом является NIL.
Пример:
(let ((n 3)) (or (zerop n) (/ 1 n))) => 1/3
(let ((n 0)) (or (zerop n) (/ 1 n))) => истина
(let ((n 0)) (or (/ 1 n) (zerop n))) => ошибка "деление на 0"
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разные системы счисления xonyx Вопросы начинающих программистов 6 09.11.2011 21:13
Системы счисления как с ними правильно работать Kolbui Вопросы начинающих программистов 2 04.01.2011 16:20
Преобр-е вещественных чисел из одной системы счисления в другую Crash Override Prolog 16 08.12.2008 06:13
Преобразование чисел в другие системы счисления Виталик 1 Delphi 3 27.11.2006 23:04
Не найду ошибку! СИСТЕМЫ СЧИСЛЕНИЯ! klim666 Pascal 2 30.05.2006 12:28
Перевод чисел из 10-й системы счисления в 16-ую worker00 Вопросы начинающих программистов 6 16.05.2006 09:55
Многоагентные системы как с ними работать Kim_X Java 1 05.05.2006 15:33
Экспертные системы как с ними работать maksimka2006 Информационные технологии 1 20.04.2006 22:03
Перевод из одной системы счисления в другую [b1o].GeN Delphi 1 22.12.2004 12:02
Как написат программу для перевода чисел одной системы счисления в другую на Delphi Drawn Вопросы начинающих программистов 10 18.11.2004 15:51
Написать программу которая будет находить все системы счисления SeGMent Вопросы начинающих программистов 2 25.04.2004 03:19
Как перевести положительное число из двоичной системы счисления в десятичную Anonymous Вопросы начинающих программистов 5 10.12.2003 02:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов