Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
1

Функция ввода-вывода в Lisp печатает числа в виде трапеции

20.11.2014, 21:51. Показов 6867. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, всем!

Задание 4

(PR1 k m), которая печатает числа в виде трапеции (m - количество строк, k - число, с которого начинается печать.

вот я делаю так:


Lisp
1
2
3
4
5
6
7
8
9
(defun pr1 (k m)
    (print k)
    (cond (=m k) (terpri))
    (t (pr(+ 1 k) m))))
 
PR1
 
>(pr1 1 4)
1
Этот ответ неправильный. Я везде искал на просторах сети в справочнике lisp, там конкретного нет и непонятно описаны функции ввода-вывода. Честно не понимаю. В общем, такое задание мне нужно сделать в виде трапеция как в примере на рисунке, как это сделать. Поэтому прошу вас, объясните как решить задание. Заранее благодарю.
Миниатюры
Функция ввода-вывода в Lisp печатает числа в виде трапеции  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2014, 21:51
Ответы с готовыми решениями:

Common LISP - функция вставки числа в массив
Приветствую. Написал функцию для вставки числа в двухмерный массив. (defun...

Функция ввода / вывода
Программа ругается на переменную C, и не выводит нужно результата, посмотрите в чем ошибка ...

разработать драйвер доступа к портам ввода-вывода в виде библиотеки DLL
надо 2 задачки на зачет не знаю точно в какую группу себя отнести очень надеюсь на вашу помощь ...

Написать программу, которая печатает числа в виде таблицы
Написать программу, которая печатает числа в виде таблицы:

24
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
20.11.2014, 22:04 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
;; racket-lang.org
(define (foo k m)
  (define (pr lst)
    (printf ";")
    (for ([i (in-list lst)])
      (printf "~a " i))
    (printf "~n"))  
  (let loop ((k k) (m m))
    (if (= m 0)
        (void)
        (begin
          (pr (reverse (range 1 (add1 k))))
          (loop (add1 k) (sub1 m))))))
 
 
(foo 3 4)
;3 2 1 
;4 3 2 1 
;5 4 3 2 1 
;6 5 4 3 2 1 
(foo 1 3)
;1 
;2 1 
;3 2 1
1
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
20.11.2014, 23:40 3
Цитата Сообщение от Walimas Посмотреть сообщение
там конкретного нет
CLHS: http://clhs.lisp.se/Body/f_wr_pr.htm Всё максимально конкретно.

Цитата Сообщение от Walimas Посмотреть сообщение
Честно не понимаю.
Я бы с удовольствием пояснил, но честно не понимаю, что пояснить. Функции вывода - это функции, которые выводят. Ещё есть вопросы?

Цитата Сообщение от Walimas Посмотреть сообщение
Поэтому прошу вас, объясните как решить задание.
Не мудрствуя лукаво, используйте функции princ, которая выводит объект без перевода строки, и terpri, которая переводит строку. И вложенный цикл.
1
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
21.11.2014, 04:32  [ТС] 4
Цитата Сообщение от helter
CLHS: http://clhs.lisp.se/Body/f_wr_pr.htm Всё максимально конкретно.
Шутите что ли, helter?) там все английский язык. Как я могу это прочитать?))

Цитата Сообщение от helter
Я бы с удовольствием пояснил, но честно не понимаю, что пояснить. Функции вывода - это функции, которые выводят. Ещё есть вопросы?
Этот предмет "функ. программирования" для меня сложно понимать. Да у меня есть вопрос. Я имел в виду что как функции работает вводит и выводят. Хочу побольше узнать как это работает.
У меня лекция написали вот это.
:input - открыть для ввода
:output - открыть для вывода
:io - двусторонный (для ввода-вывода) это как понимать? Привести пример.
Еще есть функция запись и чтение из файла (PRINx поток) и (READ поток) - чем это отличается между потоков PRINx и READ? Оба потоков одинаковый или разный?

Видимо, что на лекции всегда написали очень кратко пояснений. Поэтому у меня очень много вопросов.

Еще у меня есть вопрос, вот это пример,

Lisp
1
2
3
4
(defun pr (n m)
  (cond ((= n 0)t)
       (tepri)
          (pr n(+ m 1))))
Вот ((= n 0)t) что это все значит? и почему ноль, а можно ставить например, 1 или 4?
(+ m 1) - знак плюс это как бы возрастание строк трапеция, а минус убывание строк трапеция?
0
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
21.11.2014, 04:48  [ТС] 5
Цитата Сообщение от castorsky,
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(define (foo k m)
  (define (pr lst)
    (printf ";")
    (for ([i (in-list lst)])
      (printf "~a " i))
    (printf "~n"))  
  (let loop ((k k) (m m))
    (if (= m 0)
        (void)
        (begin
          (pr (reverse (range 1 (add1 k))))
          (loop (add1 k) (sub1 m))))))
Объясните, что за функции define, in-list lst, let loop, void, reverse, range, add1, loop, sub1?
define это не функция. defun - это выражение, которые дает имя и определить новую функцию с помощью функции "defun".

Вот из программа "gnu common lisp" (см. на картинке). Ваш код lisp ошибка и я немного поправил тоже ошибка.
Миниатюры
Функция ввода-вывода в Lisp печатает числа в виде трапеции  
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.11.2014, 05:10 6
Цитата Сообщение от Walimas Посмотреть сообщение
Шутите что ли, helter?) там все английский язык. Как я могу это прочитать?))
А вы немецкий в школе учили? Беда. Советую начать учить английский прямо сейчас.

Цитата Сообщение от Walimas Посмотреть сообщение
Хочу побольше узнать как это работает.
В таком случае я с удовольствием присоединюсь к обсуждению. Я могу пояснить основные идеи, но спецификацию, конечно, не буду переводить.

Чтение и запись осуществляются с помощью абстракции "поток": читают из потока, пишут в поток. Например, это могут быть стандартные потоки ввода/вывода (взаимодействие с консолью), или поток может ассоциироваться с файлом, или со строкой. Поток может быть потоком ввода (когда из него можно только читать), потоком вывода (когда можно только писать), и двусторонним (когда можно читать и писать).

Функций вывода много: это семейство родственников write и format.

Семейство родственников write занимаются выводом одного объекта за раз. Они делятся на две группы: те, которые стараются сериализовать объект (чтобы его можно было восстановить, прочитав из потока), и те, которые делают более человекочитаемый вывод. Главная сериализующая функция - print, а человекочитаемая - princ. Последняя не переводит строку. Функция terpri переводит строку и больше ничего не делает. Ещё пригождаются функции write-string, write-line, write-char, предназначенные для своих типов данных (write-line печатает строку и переводит строку).

Каждая из этих функций принимает объект, который надо напечатать, а опционально - поток вывода. Если поток вывода не задан, используется стандартный вывод.

Насчёт format - читайте главу в "Практическом Common Lisp", русский перевод который вы, без сомнения, нагуглите.

Чтением занимаются: read-line читает строку, read-char читает символ, read читает лисповое выражение (типа таких, какие печатает print). read открывает дыру в безопасности, не используйте его для пользовательского ввода, если не умеете заткнуть эту дыру. Эти функции можно вызывать без аргументов (тогда они читают из стандартного ввода), а можно в качестве аргумента давать им поток ввода и ещё кое-какие вещи.

Интерактивный ввод/вывод осуществляется с помощью стандартного потока *query-io*. Там есть некоторые тонкости, не буду на них останавливаться.

То что у вас с :input и пр. - это про файлы. Чтобы открыть файл и ассоциировать с ним поток, используется макрос with-open-file (гуглите так: "with-open-file" clhs).

Цитата Сообщение от Walimas Посмотреть сообщение
((= n 0)t) что это все значит?
Читайте про cond (гуглите cond clhs). cond - оператор ветвления; в каждой ветке сначала пишется условие, а потом - одна или несколько форм. cond выбирает первую ветку, для которой условие выполняется, вычисляет формы и возвращает значение последней вычисленной формы. В данном случае (= n 0) - условие равенства n нулю. Так пишут начинающие, а труЪ-лисперы пишут (zerop n). Если это выполняется, надо вернуть t (истина).

Цитата Сообщение от Walimas Посмотреть сообщение
(+ m 1) - знак плюс это как бы возрастание строк трапеция, а минус убывание строк трапеция?
Знак плюс это как бы функция сложения.

В качестве литературы можете использовать "Практический Common Lisp".

Добавлено через 1 минуту
Цитата Сообщение от Walimas Посмотреть сообщение
Вот из программа "gnu common lisp" (см. на картинке).
Не надо лучше её использовать, это не ANSI CL, а в соответствии с CLtL2.

Цитата Сообщение от Walimas Посмотреть сообщение
Ваш код lisp ошибка и я немного поправил тоже ошибка.
castorsky пишет на диалекте Racket.
3
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
21.11.2014, 11:34 7
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun pr-1 (k m &optional (s k))
  (cond ((zerop m) 'ok)
        ((zerop k) (terpri) (pr-1 (+ s 1) (- m 1) (+ s 1)))
        (t (print k) (pr-1 (- k 1) m s)))) 
  
 
==> pr-1
(pr-1 3 4)
321
4321
54321
654321
 
==> ok
(pr-1 1 6)
1
21
321
4321
54321
654321
 
==> ok
2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
21.11.2014, 15:35 8
Цитата Сообщение от Walimas Посмотреть сообщение
Объясните, что за функции
В примере ссылка, специально для предотвращения подобных вопросов.
0
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
21.11.2014, 16:35 9
Clojure:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(ns learn-clojure.example)
 
(defn task [k m]
  (let [k (atom k)]
    (dotimes [_ m]
      (println (apply str (range @k 0 -1)))
      (swap! k inc))))
;; => #'learn-clojure.example/task
 
(task 1 4)
1
21
321
4321
;; => nil
 
(task 3 4)
321
4321
54321
654321
;; => nil
4
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
21.11.2014, 19:32  [ТС] 10
Цитата Сообщение от helter,
Не надо лучше её использовать, это не ANSI CL, а в соответствии с CLtL2.
Не понял. Ты хочешь сказать, что это не то, что я использовал эту программу? Если да, то где скачать программа, чтобы все функции работает?
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.11.2014, 19:44 11
Цитата Сообщение от Walimas Посмотреть сообщение
Не понял. Ты хочешь сказать, что это не то, что я использовал эту программу? Если да, то где скачать программа, чтобы все функции работает?
CLtL2 (Common Lisp the Language 2) - книга, в который описан до-ANSI Common Lisp. У него есть некоторые отличия от ANSI Common Lisp. ANSI CL определяется стандартом, который доступен онлайн в виде CLHS - Common Lisp Hyperspec.

Если у тебя линукс, можешь поставить SBCL из репозитория. Если нет - ну, можно CLISP попробовать: www.clisp.org.
0
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
21.11.2014, 19:54  [ТС] 12
helter, где установочный файл clisp, который ты меня дал ссылку??

P.S. не обижайся на меня. ладно?)
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.11.2014, 20:02 13
Вот тут пара ехешников есть:
http://sourceforge.net/project... lisp/2.49/
Я бы попробовал скачать и запустить, который "биг".

Цитата Сообщение от Walimas Посмотреть сообщение
P.S. не обижайся на меня. ладно?)
Да вроде не за что пока.
0
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
21.11.2014, 20:19  [ТС] 14
helter, пока. спасибо.

Добавлено через 5 минут
Здесь код lisp, которые скинули форумчане. Выдает ошибку( Ну ладно. Завтра я постараюсь сделать код lisp и выложу прямо здесь и проверим правильно сделал или нет)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
21.11.2014, 20:37 15
Цитата Сообщение от Walimas Посмотреть сообщение
Здесь код lisp, которые скинули форумчане. Выдает ошибку
- не выдает:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CL-USER 3 > (defun pr-1 (k m &optional (s k))
  (cond ((zerop m) 'ok)
        ((zerop k) (terpri) (pr-1 (+ s 1) (- m 1) (+ s 1)))
        (t (princ k) (pr-1 (- k 1) m s))))
PR-1
 
CL-USER 4 > (pr-1 4 6)
4321
54321
654321
7654321
87654321
987654321
OK
1
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
21.11.2014, 20:52 16
Цитата Сообщение от Walimas Посмотреть сообщение
Завтра я постараюсь сделать код lisp и выложу прямо здесь и проверим правильно сделал или нет)
Замечательная идея.
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
25.11.2014, 15:26 17
Цитата Сообщение от helter Посмотреть сообщение
Замечательная идея.
Которая, к сожалению, осталась только идеей.
0
2 / 2 / 1
Регистрация: 20.04.2014
Сообщений: 93
25.11.2014, 16:00  [ТС] 18
Цитата Сообщение от Catstail,
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CL-USER 3 > (defun pr-1 (k m &optional (s k))
  (cond ((zerop m) 'ok)
        ((zerop k) (terpri) (pr-1 (+ s 1) (- m 1) (+ s 1)))
        (t (princ k) (pr-1 (- k 1) m s))))
PR-1
 
CL-USER 4 > (pr-1 4 6)
4321
54321
654321
7654321
87654321
987654321
OK
вот теперь не ошибка. Слава богу)

А сейчас вот я сам немного переделал
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun pr1 (k)
            (cond
              ((= k 0) k)
              ('T (princ k) (pr1 (- k 1)))
)
)
 
PR1
 
> (pr1 4)
4321
0
Это 1 строка, немного получилось, а мне надо следующая строка как твой ответ. Вот мне препод говорил что нужно добавить (pr1 (+ k m)) и тогда будет след. строка (трепеция). Я вообще ничего не понял. Помогите мне разобраться с этими.
1
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
25.11.2014, 16:26 19
Вооот, я всегда говорю, что готовые решения расслабляют. Мы потеряли потенциального лиспера.
0
castorsky
25.11.2014, 16:39     Функция ввода-вывода в Lisp печатает числа в виде трапеции
  #20

Не по теме:

помянем :cry:

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2014, 16:39

Написать программу, которая печатает числа в виде таблицы
1 2 3 4 5 6 и 1 1 1 1 1 1 2 3 4 5 6 2 2 2 2 2 3 4 5 6 3 3 3...

Напишите функцию, которая печатает числа в следующем виде
3) Напишите функцию, которая печатает числа в следующем виде 1 33 555 7777 99999

Написать программу, которая печатает числа в виде таблицы
6 6 6 6 6 6 5 5 5 5 5 4 4 4 4 3 3 3 2 2 1 При помощи цикла нужно вывести эту таблицу на...

Функция ввода и вывода массива вещественных чисел
Полный код программы. Оформить в виде функции ввод и вывод массива вещественных чисел. Если можно с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru