С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 39
1

построить выражение в префиксной записи

19.12.2013, 16:19. Показов 3197. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
дано выражение 1+(2*(2-4/7)) построить выражение в префиксной записи
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2013, 16:19
Ответы с готовыми решениями:

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

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

Преобразовать выражение в префиксной форме в постфиксную (C -> C++)
Помогите пожалуйста перевести программу на язык СИ. #include <cctype> #include <iostream>...

Перевод префиксной формы записи в постфиксную
Помогите пожалуйста написать алгоритм перевода из префиксной формы записи в постфиксную(минуя...

7
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
19.12.2013, 19:46 2
Lisp
1
(+ 1 (* 2 (- 2 (/ 4 7))))
0
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 39
19.12.2013, 20:05  [ТС] 3
нужна функция/программа, которая считывает введенное выражение в обычной записи и записывает его в префиксной записи
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
19.12.2013, 20:41 4
Цитата Сообщение от Лелик Посмотреть сообщение
нужна функция
- ах вот как... Искать на форуме не пробовал?

Добавлено через 6 минут
Вот код, которым я пользуюсь (не вполне мой, но с моими дополнениями):

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
25
26
27
28
29
30
31
32
33
34
35
(DEFUN inf2pref (x) 
    (PROG (hd tl cc xx rr) 
      (COND ((atomlist x) (RETURN (inf-aux x NIL NIL))))
      (SETQ rr NIL)
      (SETQ xx x) 
 LOOP (SETQ hd (CAR xx))
      (SETQ tl (CDR xx))
      (COND ((memb hd '(SIN COS LOG EXP ATN ASN ACS SH CH SQR SIGN ABS))
              (PROGN 
                   (SETQ rr (APPEND rr (LIST (LIST hd (inf2pref (CAR tl))))))
                   (SETQ tl (CDR tl)))) 
            ((ATOM hd) (SETQ rr (APPEND rr (LIST hd)))) 
            (T (SETQ rr (APPEND rr (LIST (inf2pref hd))))))
      (COND ((NULL tl) (RETURN (inf-aux rr NIL NIL))))
      (SETQ xx tl) (GO LOOP)))
      
      
(DEFUN inf-aux (ae operators operands)
   (inf-iter (CDR ae) operators (CONS (CAR ae) operands)))
      
(DEFUN inf-iter (ae operators operands)
   (PROG NIL 
      (COND ((AND (NULL ae) (NULL operators)) (RETURN (CAR operands))))
      (COND ((AND (NOT (NULL ae)) (OR (NULL operators) (GREATERP (weight (CAR ae)) (weight (CAR operators)))))
            (RETURN (inf-aux (CDR ae) (CONS (CAR ae) operators) operands))))
      (RETURN (inf-iter ae (CDR operators) (CONS (LIST (opcode (CAR operators)) (CADR operands) (CAR operands)) (CDDR operands))))))
      
(DEFUN weight (x) 
   (COND ((EQ x (QUOTE +)) 1) 
         ((EQ x (QUOTE -)) 1) 
         ((EQ x (QUOTE *)) 2) 
         ((EQ x (QUOTE \)) 2) 
         ((EQ x (QUOTE /)) 2) 
         ((EQ x (QUOTE ^)) 3) 
         (T 5)))
Вызывать так:

Lisp
1
2
3
(inf2pref '(1 + (2 * (2 - 4 / 7)))) 
 
==> (+ 1 (* 2 (- 2 (/ 4 7))))
2
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 39
19.12.2013, 21:56  [ТС] 5
Цитата Сообщение от Catstail Посмотреть сообщение
((EQ x (QUOTE \)) 2)
подскажите, пожалуйста почему у меня выводит не это а ((EQ x (QUOTE W)) 2). Это так и должно быть? или как его поменять на "\"

Добавлено через 5 минут
у меня выводит следующие ошибки:
Error: Undefined operator ATOMLIST in form (ATOMLIST X).
1 (continue) Try invoking ATOMLIST again.
2 Return some values from the form (ATOMLIST X).
3 Try invoking something other than ATOMLIST with the same arguments.
4 Set the symbol-function of ATOMLIST to another function.
5 Set the macro-function of ATOMLIST to another function.
6 (abort) Return to level 0.
7 Return to top loop level 0.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
19.12.2013, 22:49 6
1) строку с бэкслэшем просто выкинь:
Lisp
1
2
3
4
5
6
7
(DEFUN weight (x) 
   (COND ((EQ x (QUOTE +)) 1) 
         ((EQ x (QUOTE -)) 1) 
         ((EQ x (QUOTE *)) 2) 
         ((EQ x (QUOTE /)) 2) 
         ((EQ x (QUOTE ^)) 3) 
         (T 5)))
В inf2pref memb замени на member и добавь функции:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun atomlist (x)
  (cond ((null lst) t)
          ((atom (car x)) (atomlist (cdr x)))
          (t nil)))
 
(defun opcode (op) 
   (COND ((EQ op (QUOTE +)) (QUOTE +)) 
         ((EQ op (QUOTE -)) (QUOTE -)) 
         ((EQ op (QUOTE *)) (QUOTE *)) 
         ((EQ op (QUOTE /)) (QUOTE /)) 
         ((EQ op (QUOTE ^)) (QUOTE ^)) 
         (T (error 'bad_op))))
Все заработает.
1
0 / 0 / 0
Регистрация: 02.04.2012
Сообщений: 39
19.12.2013, 23:44  [ТС] 7
вот еще 5 ошибок вывело

Error: The variable LST is unbound.
1 (continue) Try evaluating LST again.
2 Specify a value to use this time instead of evaluating LST.
3 Specify a value to set LST to.
4 (abort) Return to level 0.
5 Return to top loop level 0.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37352 / 20782 / 4277
Регистрация: 12.02.2012
Сообщений: 34,192
Записей в блоге: 14
20.12.2013, 20:51 8
Цитата Сообщение от Лелик Посмотреть сообщение
вот еще 5 ошибок вывело
- не пять, а одна.

Добавлено через 12 минут
Вот код, проверенный в LispWorks:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(defun atomlist (x)
  (cond ((null x) nil)
        ((atom (car x)) (atomlist (cdr x)))
        (t nil)))        
 
(DEFUN inf2pref (x) 
    (PROG (hd tl cc xx rr) 
      (COND ((atomlist x) (RETURN (inf-aux x NIL NIL))))
      (SETQ rr NIL)
      (SETQ xx x) 
 LOOP (SETQ hd (CAR xx))
      (SETQ tl (CDR xx))
      (COND ((member hd '(SIN COS LOG EXP ATN ASN ACS SH CH SQR SIGN ABS))
              (PROGN 
                   (SETQ rr (APPEND rr (LIST (LIST hd (inf2pref (CAR tl))))))
                   (SETQ tl (CDR tl)))) 
            ((ATOM hd) (SETQ rr (APPEND rr (LIST hd)))) 
            (T (SETQ rr (APPEND rr (LIST (inf2pref hd))))))
      (COND ((NULL tl) (RETURN (inf-aux rr NIL NIL))))
      (SETQ xx tl) (GO LOOP)))
      
      
(DEFUN inf-aux (ae operators operands)
   (inf-iter (CDR ae) operators (CONS (CAR ae) operands)))
      
(DEFUN inf-iter (ae operators operands)
   (PROG NIL 
      (COND ((AND (NULL ae) (NULL operators)) (RETURN (CAR operands))))
      (COND ((AND (NOT (NULL ae)) (OR (NULL operators) (> (weight (CAR ae)) (weight (CAR operators)))))
            (RETURN (inf-aux (CDR ae) (CONS (CAR ae) operators) operands))))
      (RETURN (inf-iter ae (CDR operators) (CONS (LIST (opcode (CAR operators)) (CADR operands) (CAR operands)) (CDDR operands))))))
      
(DEFUN weight (x) 
   (COND ((EQ x (QUOTE +)) 1) 
         ((EQ x (QUOTE -)) 1) 
         ((EQ x (QUOTE *)) 2) 
         ((EQ x (QUOTE /)) 2) 
         ((EQ x (QUOTE ^)) 3) 
         (T 5)))
         
(defun opcode (op) 
 (COND ((EQ op (QUOTE +)) (QUOTE +))
       ((EQ op (QUOTE -)) (QUOTE -)) 
       ((EQ op (QUOTE *)) (QUOTE *))
       ((EQ op (QUOTE /)) (QUOTE /))
       ((EQ op (QUOTE ^)) (QUOTE ^)) 
       (T (error 'bad_opcode))))
Добавлено через 1 час 9 минут
Хотя функция opcode довольно "глупая". Происхождение ее таково: в очень старых версиях Лиспа арифметические операции задавались функциями plus, difference, times и т.д. Поэтому функция замены "+" -> Plus была необходима.
1
20.12.2013, 20:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2013, 20:51
Помогаю со студенческими работами здесь

Преобразование формы записи выражения из префиксной в постфиксную
Требуеться написать программу на языке Prolog "Преобразование формы записи выражения из префиксной...

Преобразование префиксной записи арифметического выражения в инфиксную
Доброй ночи! Пожалуйста, помогите решить мне вот такую задачку Напишите программу, которая...

Разница между префиксной и постфиксной формой записи счетчика цикла
Здравствуйте! Когда оформлял циклы всегда использовал такую запись: for(int i=0; i<10;...

Как построить выражение
Помогите надо построить выражение в ms access. Условие если срок хранения >10 месяцев то цена...


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

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