САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АРХИТЕКТУРНО-СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ Практикум на языке ЛИСП Прохорова О.В. 01.01.2015 В учебном пособии дается решение практических задач на языке Лисп с комментариями основных действий Оглавление 1. Работа с комплексными числами ....................................................................... 3 2. Вычисление факториала ..................................................................................... 5 3. Вывод ряда чисел Фибоначчи ............................................................................ 6 4. Вычисление_1 логарифма числа loga (x) ........................................................ 7 5. Вычисление_2 логарифма числа loga (x) ........................................................ 8 6. Сортировка чисел методом пузырька ................................................................ 9 7. Работа со строками ........................................................................................... 10 8. Вычисление 1 корней квадратного уравнения a*x^2+b*x+c=0 ...................... 11 9. Вычисление 2 корней квадратного уравнения a*x^2+b*x+c=0 ...................... 13 10. Вычисление 3 корней квадратного уравнения a*x^2+b*x+c=0 ................... 15 11. Вычисление квадрата числа .......................................................................... 17 12. Вставка элемента в конец списка ................................................................. 18 13. Вставка элемента в начало списка ............................................................... 19 2 1. Работа с комплексными числами #| Работа с комплексными числами |# (defun Plus(a b c d) (defvar n) (defvar m) (setf n (+ a c)) (setf m (+ b d)) (format t "(~A + ~Ai) + (~A + ~Ai) = (~A + ~Ai) ~%" a b c d n m) ) (defun Minus(a b c d) (defvar n) (defvar m) (setf n (- a c)) (setf m (- b d)) (format t "(~A + ~Ai) - (~A + ~Ai) = (~A + ~Ai) ~%" a b c d n m) ) (defun Multiple(a b c d) (defvar n) (defvar m) (setf n (- (* a c) (* b d))) (setf m (+ (* b c) (* a d))) (format t "(~A + ~Ai) * (~A + ~Ai) = (~A + ~Ai) ~%" a b c d n m) ) (defun Div(a b c d) (defvar n) (defvar m) (setf n (/ (+ (* a c) (* b d)) (+ (* c c) (* d d)))) (setf m (/ (- (* b c) (* a d)) (+ (* c c) (* d d)))) (format t "(~A + ~Ai) / (~A + ~Ai) = (~0,1F + ~Fi) ~%" a b c d n m) ) (Plus 1 2 3 4) 3 (Minus 5 7 3 4) (Multiple 5 7 3 4) (Div 5 7 3 4) 4 2. Вычисление факториала #| Вычисление факториала рекурсивным и итеративным способами |# (defun Factorial (n) (if (= 0 n) 1 (* n (Factorial ( - n 1))))) (format t "Factorial of n is: ~A~%" (Factorial 4)) (defun fact (n) (loop for i from 1 to n for fact = 1 then (* fact i) finally (return fact))) (format t "Factorial of n is: ~A~%" (fact 6)) 5 3. Вывод ряда чисел Фибоначчи #| Вывод ряда чисел Фиббоначи |# (defun Fibonachi (n fib1 fib2) (print fib1) (print fib2) (loop for i from 1 to (- n 2) by 2 do (setf fib1 (+ fib1 fib2)) (print fib1) (setf fib2 (+ fib1 fib2)) (print fib2) ) ) (Fibonachi 12 1 1) 6 4. Вычисление_1 логарифма числа loga (x) (defun logg (a x b) #|b - граница цикла поиска |# (if (= a x) ((format t "log(x)a = ~A~%" i)(setf b 1)) ) (loop for i from 2 to b do (setf a (* a a)) (if (= a x) (format t "log(x)a = ~A~%" i)) ) ) ) (logg 2 4 5) 7 5. Вычисление_2 логарифма числа loga (x) #| функция логарифмирования, а - основание логарифма, х - число под логарифмом, с- значение логарифма (искомое) х=a^c |# (defun logg (a x b) #|b - граница цикла поиска |# (if (= a x) ((format t "log(x)a = ~A~%" i)(setf b 1)) ) (loop for i from 2 to b do (setf a (* a a)) (if (= a x) (format t "log(x)a = ~A~%" i)) ) ) ) (logg 2 4 5) 8 6. Сортировка чисел методом пузырька #|сортировка по возрастанию элементов |# (defun bubble-sort (w) (setf n (length w)) (print w) (loop for i from 1 to n do #| цикл по числу прогонов |# (loop for j from 0 to (- n 2) do #| цикл по числам внутри прогона |# (setf k (+ 1 j)) (setf d (nth j w)) (setf dd (nth k w)) ( when (> d dd ) (setf tmp (nth j w) ) (setf (nth j w) dd) (setf (nth k w ) tmp) ) ) ) (print w) ) (bubble-sort '(3 2 1)) 9 7. Работа со строками #| Работа со строками |# (defvar str1 "Heello") ;Объявление (defvar str2 "world") (defvar result) (setf result (concatenate 'string str1 str2)) ; Присвоение (print result) ; вывод на экран (print (string-upcase str1)) ; все символы — заглавные (print (string-downcase str1)) ; все символы — строчные (print (string-capitalize str1)) ; с большой буквы (print (subseq "0123456" 1 5)) ; извлечь из строки последовательность символов (print(remove #\/ "/tam/tam/bam")) ; удалить определенный символ из строки (format t "15 is ~A~%" 15) ; форматированный вывод 10 8. Вычисление 1 корней квадратного уравнения a*x^2+b*x+c=0 (defun square (a b c) (defvar d) (defvar x1) (defvar x2) (defvar x3) (defvar x4) (setf d (- (* b b) (* 4 a c))) (format t "d is ~F ~%" d) (if (> d 0) #| корни действительные |# (block (setf x2 (/ (+ (- b) (sqrt d)) (* 2 a))) (setf x1 (/ (+ (- b) (- (sqrt d))) (* 2 a))) (format t "X1 is ~F ~%" x1) (format t "X2 is ~F ~%" x2) ) ) (if (= d 0) #| корни равны |# (block 11 (setf x1 (/ (- b) (* 2 a))) (setf x2 x1) (format t "X1 is ~A~%" x1) (format t "X2 is ~A~%" x2)) ) ) (if (< d 0) #| корни комплексные |# #|(print "Complex answer") |# (block (setf x1 (/ (- b) (* 2 a))) (setf x4 ( sqrt(* d d))) (setf x2 (/ (sqrt(x4)) (* 2 a))) (setf x3 (- x2)) (format t "(~A + ~Ai)~%" x1 x2) (format t "(~A + ~Ai)~%" x1 x3) ) ) ) (square 1 2 4) 12 9. Вычисление 2 корней квадратного уравнения a*x^2+b*x+c=0 (defun square (a b c) (defvar d) (setf d (- (* b b) (* 4 a c) ) ) (format t "d is ~A~%" d) (cond ((> d 0) #| корни действительные |# (block (defvar x2) (setf x2 (/ ( + (- b) (sqrt d) ) (* 2 a) ) ) (defvar x1) (setf x1 (/ ( - (- b) (sqrt d) ) (* 2 a) ) ) (format t "X1 is ~F ~%" x1) (format t "X2 is ~F ~%" x2) ) ) ( (= d 0) (block (defvar x1) (setf x1 (/ (- b) (* 2 a) )) (format t "X1 is ~A~%" x1) (format t "X2 is ~A~%" x1) ) ) ( (< d 0) #| корни комплексные |# (block (defvar x1) 13 (setf x1 (/ (- b) (* 2 a) ) ) (format t "X1 is ~A~%" x1) (defvar x2) (setf x2 (/ (sqrt ( - d)) (* 2 a) ) ) (format t "X2 is ~A~%" x2) (format t "X1 is ~A + ~Ai ~%" x1 x2) (format t "X2 is ~A - ~Ai ~%" x1 x2) ) ) ) ) (square 1 1 1 ) 14 10. Вычисление 3 корней квадратного уравнения a*x^2+b*x+c=0 (defun square (a b c) (defvar d) (defvar x1) (defvar x2) (defvar x3) (setf d (- (* b b) (* 4 a c))) (if (> d 0) (block (setf x1 (/ (+ (- b) (sqrt d)) (* 2 a))) (setf x2 (/ (- (- b) (sqrt d)) (* 2 a))) (format t "X1 is ~F ~%" x1) (format t "X2 is ~F ~%" x2) ) ) (if (= d 0) (block (setf x1 (/ (- b) (* 2 a))) (setf x2 x1) (format t "X1 is ~A~%" x1) (format t "X2 is ~A~%" x2) ) ) (if (< d 0) (print "Complex answer") (setf d (*d d)) (setf x1 (/ (+ (- b) (* 2 a)) 15 (setf x2 (/ (- (sqrt d)) (*2 a))) (setf x3 (/ (+ (sqrt d)) (*2 a))) (format t "(~A + ~Ai)~%" x1 x2) (format t "(~A + ~Ai)~%" x1 x3) ) ) (square 1 -3 2) 16 11. Вычисление квадрата числа (defun square (num) (defvar x) (setf x ( * num num)) (format t "x is ~A~%" x) ) (square 7) 17 12. Вставка элемента в конец списка #| вставка элемента item в конец списка oldlist |# (defun ins(oldlist item) (defvar x) (setf x (cons oldlist item)) (format t "x is ~A~%" x) ) ( ins '(a b c) '(z)) 18 13. Вставка элемента в начало списка #| вставка элемента item в начало списка oldlist |# ( defun ins(item oldlist) (defvar x) (setf x (cons item oldlist )) (format t "x is ~A~%" x) ) ( ins 'z '(a b c) ) 19