초등학교 때 배우는 두 정수의 곱셈표를 만들어 주는 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
'프로그래밍 > Common Lisp' 카테고리의 다른 글
스트링 배열 정렬(sorting)하기 with Common Lisp (0) | 2013.09.06 |
---|---|
Pollard's rho method 소개: 정수의 인수분해(factorizing integers) with Common Lisp (0) | 2013.09.06 |
문자열 거꾸로 하기 with Common Lips (0) | 2013.09.06 |
손으로 만드는 나눗셈 계산표 with Common Lisp (0) | 2013.09.06 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Common Lisp (0) | 2013.09.05 |