| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как изменить n! лисп?

Как изменить n! лисп?

Ответ
Поиск в этой теме
Непрочитано 10.01.2008, 09:33 #1
Как изменить n! лисп?
Jоhnny
 
всё что связано с упорядоченным движением заряженных частиц
 
М.О.
Регистрация: 27.07.2007
Сообщений: 1,693

В книге по лиспу приводится пример кода для вычисления 10! Как можно изменить код чтобы n задавалась бы пользователем с клавиатуры? И вообще когда я ввожу этот код в консоль, факториал не считается. Ещё не пойму зачем в начале кода стоит ;;; . Только начинаю изучать лисп поэтому не судите строго, а помогите советом.
Цитата:
;;; (setq n 10); Задайте n
(setq i 1 factorial 1)
(while (< i n)
(setq i (1+ i))
(setq factorial (* factorial i)));
Просмотров: 4560
 
Непрочитано 10.01.2008, 09:39
#2
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


(princ "/nЗадайте n:")
(setq n (getint))
Pilot вне форума  
 
Автор темы   Непрочитано 10.01.2008, 09:44
#3
Jоhnny

всё что связано с упорядоченным движением заряженных частиц
 
Регистрация: 27.07.2007
М.О.
Сообщений: 1,693


Всё= не пойму как этим пользоваться, ставлю то что ты посоветовал в начало кода вместо ;;; (setq n 10); Задайте n затем копипастю это в консоль, но ничего не выходит, ох уж этот лисп
Jоhnny вне форума  
 
Непрочитано 10.01.2008, 09:45
#4
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Цитата:
Сообщение от Jоhnny Посмотреть сообщение
Всё= не пойму как этим пользоваться, ставлю то что ты посоветовал в начало кода вместо ;;; (setq n 10); Задайте n затем копипастю это в консоль, но ничего не выходит, ох уж этот лисп
Ты сам-то понял что тут сказал? Я - нет.
Pilot вне форума  
 
Непрочитано 10.01.2008, 09:51
#5
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Символ ";" (точка с запятой) обозначает начало комментария. В любой книге по ЛИСПу это должно быть расписано в самом начале.
Код не работает потому, что задание n (setq n 10) закомментировано и не выполняется.
Если в данной книге уже такой простой код написан с ошибкой - ищите другой учебник.

Ввод числа n с клавиатуры можно сделать и так:
(initget 7)
(setq n (getint "\n Задайте n : "))

Заодно почитайте внимательно о функциях initget, getint, getreal и далее.
---------------
Еще добавлю. Точно не проверял, но далее в коде кажется ошибка, выполняется "(while (< i n)..."
При задании n=10 будет считаться только 9!. Нужно "(while (<= i n)..."

Последний раз редактировалось Олег К., 10.01.2008 в 09:58.
Олег К. вне форума  
 
Непрочитано 10.01.2008, 09:58
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


У тебя в последней строке лишняя закрывающая скобка, либо убери ее, либо добавь в начало (defun <имя функции ()>, а после "копипаста" в консоль, введи имя своей функции в скобках.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 10.01.2008, 10:02
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Прошу прощения насчет скобки наврал - она к (while относится
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 10.01.2008, 10:05
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Код:
[Выделить все]
(defun c:factorial (/ num loc:!)
  (defun loc:! (num)
    (cond
      ((<= num 0)
       1
       )
      (t (* num (loc:! (1- num))))
      ) ;_ end of cond
    ) ;_ end of defun
  (vl-load-com)
  (if (= (type (setq num (vl-catch-all-apply
                           '(lambda () (getint "\nВведите число <Отмена> : "))
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'int
         ) ;_ end of =
    (princ (strcat "\nФакториал числа "
                   (itoa num)
                   " равен "
                   (vl-princ-to-string (loc:! num))
                   ) ;_ end of strcat
           ) ;_ end of princ
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 10.01.2008 в 10:30. Причина: Подправил код слеганца
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.01.2008, 10:13
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Уж Крыс напишет - так напишет
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.01.2008, 10:13
#10
Jоhnny

всё что связано с упорядоченным движением заряженных частиц
 
Регистрация: 27.07.2007
М.О.
Сообщений: 1,693


Всем спасибо, крыс, сейчас буду анализировать твой код. На счёт книжки скажу что у меня хорошая книжка, то что ; это комментарии там тоже написано, не понятно только зачем ;;; это что значит, что всё что идёт дальше это каменты чтоли?
Jоhnny вне форума  
 
Непрочитано 10.01.2008, 10:32
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Дима_, так там же все просто - рекурсия на вычисление факториала самое сложное (ИМХО, конечно).
Jоhnny, то, что идет после ";;;", тоже является однострочным комментарием. Просто количество ";" (1, 2 или 3 штуки) перед текстом при автоматическом форматировании могут по-разному сдвинуть комментарий.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.01.2008, 10:38
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Дима_, так там же все просто - рекурсия на вычисление факториала самое сложное (ИМХО, конечно).
Согласен, но к такому стилю написания (не только в лиспе), уж лет 10 привыкнуть не могу - голова по другому видимо думает - ассемблером испорчена.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 10.01.2008, 10:49
#13
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


Ну вот, а в начале всего-то 5 строк было. Если еще и комментарии добавить ...

Алексей, поясните пожалуйста, почему в данном примере применено vl-catch-all-apply? Ведь и без этой конструкции getint выдаст либо число, либо nil, проверка правильно сработает.
Олег К. вне форума  
 
Непрочитано 10.01.2008, 11:15
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


vl-catch-all-apply для отлова нажатия на Esc в момент запроса числа. Если этого не сделать, команда будет прервана в аварийном режиме.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.01.2008, 11:49
#15
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


А-а, вот про Esc я и забыл.
Хотя в данном примере аварийный выход вроде не вызовет непоправимых последствий.
Вот какая мысль еще появилась. Оправдано ли включение в подобный код (небольшой и по размеру и по выполняемой функции) сделанный отдельной программой, проверок на все возможные ошибки? Ведь ничего никуда не передается, не строится по расчитанным значениям, всего-то операции с числами. Не все ли равно, будет появляться надпись *error* или нет? Разве что с эстетической точки зрения.
Кстати, услышать бы мнение ShaggyDocа, если он здесь появится.
Олег К. вне форума  
 
Непрочитано 10.01.2008, 11:53
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Факториал "сам по себе" - не более чем учебная задача. А вот если оно участвует в каком-то другом куске? Там без отлова не обойтись (правда, и логика там будет немного иная). В общем-то отлов - на любителя в данной конкретной ситуации, тут ты прав на 100%. Можно сказать, что привычка у меня уже в этом отношении
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.01.2008, 11:49
#17
Jоhnny

всё что связано с упорядоченным движением заряженных частиц
 
Регистрация: 27.07.2007
М.О.
Сообщений: 1,693


Конечно, мне в у чебных целях надо, то что там отловы какие-то я вообще ничего не понимаю, я думал там пару строк ввести ещё и всё заработает, пока не получилось
Jоhnny вне форума  
 
Непрочитано 11.01.2008, 12:06
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Если в учебных, то (ИМХО) достаточно будет функции
Код:
[Выделить все]
  (defun loc:! (num)
    (cond
      ((<= num 0)
       1
       )
      (t (* num (loc:! (1- num))))
      ) ;_ end of cond
    ) ;_ end of defun
Вся "соль" в ней
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.01.2008, 12:55
#19
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Jоhnny Посмотреть сообщение
Конечно, мне в у чебных целях надо, то что там отловы какие-то я вообще ничего не понимаю, я думал там пару строк ввести ещё и всё заработает, пока не получилось
Чтобы заработал код из первого поста, достаточно раскомментарить первую строку, но код приведённый Алексеем элегантнее.
Alaspher вне форума  
 
Непрочитано 11.01.2008, 14:03
#20
Олег К.

Инженер-теплотехник
 
Регистрация: 17.08.2006
Смоленск
Сообщений: 307


>> Jоhnny
Как это не работает? Все работает. Только при работе из командной строки нельзя оставлять символы вне скобок "( )". Все что не в скобках рассматривается как команды, в том числе пробелы и энтеры.
Вот такой код уж точно работает:
Код:
[Выделить все]
(setq n 10)
(setq i 1 factorial 1)
(while (< i n)
(setq i (1+ i))
(setq factorial (* factorial i)))
Вообще то, интересный пример оказывается. Считается 10!, но на самом деле 2*3*4*5*6*7*8*9*10. Попробуйте другой вариант:
Код:
[Выделить все]
(setq n 10)
(setq i 1 factorial 1)
(while (<= i n)
(setq factorial (* factorial i))
(setq i (1+ i)))
и подумайте в чем разница.

И еще. После загрузки кода из №18 нужно набрать: (loc:! 10)
Олег К. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как изменить n! лисп?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить размер текста во всех блоках с одинаковым имене red AutoCAD 78 28.03.2022 08:07
Как изменить толщину по умолчанию полилиний Гиорги AutoCAD 7 18.01.2017 08:56
на злобу дня !! zaza-noza Разное 63 22.05.2009 15:10
Как изменить своиства блока-интересная штука... Marie AutoCAD 6 24.03.2005 23:47
Как изменить имя штриховки по умолчанию виталич AutoCAD 5 27.02.2004 14:20