초등학교 때 배우는 두 정수의 곱셈표를 만들어 주는 Common Lisp 소스이다.
(이 소스는 CLisp으로 잘 실행됨을 확인하였다.)

Common Lisp 언어로, 양의 정수 a를 양의 정수 b로 나는 몫을 구하려면

        (setf q (floor (/ a b)))

한다. 그 몫은 변수 q에 저장된다. 이렇게 하는 이유는

        (setf q (/ a b))

로 한 경우 q에는 분수 a/b가 저장되기 때문이다.

 

;;  Filename: makeMultTable.lsp
;;
;;     Print a multiplication table.
;;
;;     Execute: clisp makeMultTable.lsp 230 5100
;;
;;  Date: 2013, 9. 6.


(defun printUsing()
    (format t "Using: clisp makeMultTable.lsp [number1] [number2]~%")
    (format t "Print a multiplication table for the given two integers.~%")
)

(defun printMultTable(x y)
    (let* ((nx x)
           (ny y)
           (nz 0)
           (n  0)
           (y1  0)
           (ntail1 0)
           (ntail2 0)
           (strX "")
           (strY "")
           (strZ "")
           (strT "")
           (zeros  "0000000000000000000000000000000000000000")
           (whites "                                        ")
           (bars   "----------------------------------------")
           (loffset "       ")
           (line1 "")
           (line2 "")
           (line3 "")
           (line4 ""))
           
        (if  (minusp nx) (setf nx (- nx)))
        (if  (minusp ny) (setf ny (- ny)))

        (setf ntail1 0)
        (setf ntail2 0)
        (loop while (zerop (mod nx 10)) do
            (setf nx (floor (/ nx 10)))
            (setf ntail1 (1+ ntail1))
        )
        (loop while (zerop (mod ny 10)) do
            (setf ny (floor (/ ny 10)))
            (setf ntail2 (1+ ntail2))
        )

        (setf z (* nx ny))
        (setf strZ (format nil "~D" z))
        (setf strX (format nil "~D" nx))
        (setf strY (format nil "~D" ny))
        (setf n (length strY))

        (setf line4 (concatenate 'string loffset strZ))
        (setf line1 (concatenate 'string loffset (substring whites 0 (- (length strZ) (length strX))) strX))
        (setf line2 (concatenate 'string "   x ) " (substring whites 0 (- (length strZ) (length strY))) strY))
        (setf line3 (concatenate 'string "     --" (substring bars 0 (length strZ))))
        
        (format t "~A~A~%" line1 (substring zeros 0 ntail1))
        (format t "~A~A~%" line2 (substring zeros 0 ntail2))
        (format t "~A~%" line3)
        (if (> (length strY) 1)
            (progn
                (loop for i from 0 below (length strY) do
                    (setf y1 (parse-integer (substring strY (- (length strY) i 1) (- (length strY) i))))
                    (if (not (zerop y1))
                        (progn
                            (setf strT (format nil "~D" (* nx y1)))
                            (format t "~A~A~A~%" loffset (substring whites 0  (- (length strZ) (length strT) i)) strT)
                        )
                    )
                )
                (format t "~A~%" line3)
            )
        )

        (format t "~A~A~A~%" line4 (substring zeros 0 ntail1) (substring zeros 0 ntail2))
    )
)


(if (>= (length ext:*args*) 2)
    (progn
        (setf x (parse-integer (nth 0 ext:*args*)))
        (setf y (parse-integer (nth 1 ext:*args*)))
        (format t "~%")
        (printMultTable x y)
    )
    (printUsing)
)

 


실행> clisp makeMultTable.lsp 230 5100
결과>

         230
   x )   5100
     ------
         23
       115
     ------
       1173000

 

Posted by Scripter
,