다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Common Lisp 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
아래의 소스는 CLisp으로 실행되도록 작성되었다.
- #!/usr/bin/env clisp
- ;; Filename: makeDivisionTable.lsp
- ;;
- ;; Purpose: Make a division table in a handy written form.
- ;;
- ;; Execute: clisp makeDivisionTable.lsp 12345 32
- ;; clisp makeDivisionTable.lsp 500210 61
- ;; ./makeDivisionTable.lsp 500210 61
- ;;
- ;; Date: 2013, 9. 5.
- (defun printUsage()
- (format t "사용법: clisp makeDivisionTable.lsp [피제수] [제수]~%")
- (format t "손으로 작성한 형태의 나눗셈 표를 만들어준다.~%") )
- (defun simplify(v &optional width)
- (let* ((tt "")
- (slen 0))
- (setf tt (format nil "~A" v))
- (setf slen (length tt))
- (if (and (>= slen 2) (string= (substring tt (- slen 2) slen) ".0"))
- (setf tt (substring tt 0 (- slen 2))) )
- (setf slen (length tt))
- (if width
- (if (< slen width)
- (setf tt (concatenate 'string (make-string (- width slen) :initial-element #\Space) tt)) ))
- tt
- )
- )
- (defun getSuffix(v)
- (let* ((tt (mod (abs v) 10))
- (suffix "은"))
- (if (search (format nil "~A" tt) "2459")
- (setf suffix "는") )
- suffix
- )
- )
- (defun makeTable(numer denom quotient)
- (let* ((strNumer (format nil "~A" numer))
- (strDenom (format nil "~A" denom))
- (strQuotient (format nil "~A" quotient))
- (lenN (length strNumer))
- (lenD (length strDenom))
- (lenQ (length strQuotient))
- (offsetLeft (+ 3 lenD 3))
- (spaces (make-string 100 :initial-element #\Space))
- (uline (make-string (+ lenN 2) :initial-element #\_))
- (sline (make-string lenN :initial-element #\-))
- (bias (- lenN lenQ))
- (strTmpR (substring strNumer 0 (+ bias 1)))
- (tmpR (parse-integer strTmpR))
- (tmpSub 0)
- (oneDigit nil) )
- (format t "~A~A~A~%" (substring spaces 0 offsetLeft) (substring spaces 0 bias) (format nil "~D" quotient))
- (format t "~A~A~%" (substring spaces 0 (- offsetLeft 2)) uline)
- (format t "~A~A~A~A" " " strDenom " ) " strNumer)
- (loop for i from 0 below lenQ do
- (if (string= (substring strQuotient i (1+ i)) "0")
- (progn
- (if (< (1+ i) lenQ)
- (progn
- (setf oneDigit (substring strNumer (+ bias i 1) (+ bias i 2)))
- (format t "~A" oneDigit)
- (setf strTmpR (concatenate 'string strTmpR oneDigit))
- (setf tmpR (parse-integer strTmpR))
- )
- )
- )
- (progn
- (format t "~%")
- (setf tmpSub (* (parse-integer (substring strQuotient i (1+ i))) denom))
- (format t "~A~A~%" (substring spaces 0 offsetLeft) (simplify tmpSub (+ bias i 1)))
- (format t "~A~A~%" (substring spaces 0 offsetLeft) sline)
- (setf tmpR (- tmpR tmpSub))
- (if (and (= tmpR 0) (< (+ i 1) lenQ))
- (format t "~A~A" (substring spaces 0 offsetLeft) (substring spaces 0 (+ bias i 1)))
- (format t "~A~A" (substring spaces 0 offsetLeft) (simplify tmpR (+ bias i 1)))
- )
- (setf strTmpR (format nil "~D" tmpR))
- (if (< (+ i 1) lenQ)
- (progn
- (setf oneDigit (substring strNumer (+ bias i 1) (+ bias i 2)))
- (if (plusp (length oneDigit))
- (progn
- (format t "~A" oneDigit)
- (setf strTmpR (concatenate 'string strTmpR oneDigit))
- )
- )
- (setf tmpR (parse-integer strTmpR))
- )
- )
- )
- )
- )
- tmpR
- )
- )
- ;; Begin here
- (if (< (length ext:*args*) 2)
- (progn
- (printUsage)
- (quit)
- )
- )
- (setf a nil)
- (setf b nil)
- (handler-case
- (progn
- (setf a (parse-integer (nth 0 ext:*args*)))
- (setf b (parse-integer (nth 1 ext:*args*)))
- (if (minusp a)
- (progn
- (format t "피제수: ~A~%" a)
- (format t "피제수는 양의 정수라야 합니다.~%")
- (quit)
- )
- (if (minusp b)
- (progn
- (format t "제수: ~A~%" b)
- (format t "제수는 양의 정수라야 합니다.~%")
- (quit)
- )
- )
- )
- (setf q (floor (/ a b)))
- (setf r (mod a b))
- (format t "나눗셈 ~A ÷ ~A 의 결과: " a b)
- (format t "몫: ~A, " q)
- (format t "나머지: ~A~%" r)
- (format t "~%")
- (setf k (makeTable a b q))
- (format t "~%")
- (if (= k r)
- (format t "~%나머지: ~A~%" k)
- )
- (if (= k 0)
- (progn
- (format t "~A = ~A x ~A~%" a b q)
- (format t "~A~A ~A의 배수(mupltiple)이다.~%" a (getSuffix a) b)
- (format t "~A~A ~A의 약수(divisor)이다.~%" b (getSuffix b) a)
- (format t "~%")
- )
- (progn
- (format t "~A = ~A x ~A + ~A~%" a b q r)
- (format t "~A~A ~A의 배수(mupltiple)가 아니다.~%" a (getSuffix a) b)
- (format t "~%")
- )
- )
- )
- (parse-error (c)
- (format t "예외상황: ~A" c)
- (format t "이 발생였음. 다시 하시오,~%~%")
- )
- )
실행> clisp makeDivisionTable.lsp 500210 61
나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 나머지: 10 500210 = 61 x 8200 + 10 500210은 61의 배수(mupltiple)가 아니다.
'프로그래밍 > Common Lisp' 카테고리의 다른 글
손으로 계산하는 긴자리 곱셈표 만들기 with Common Lisp (0) | 2013.09.06 |
---|---|
문자열 거꾸로 하기 with Common Lips (0) | 2013.09.06 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Common Lisp (0) | 2013.09.05 |
7비트 ASCII 코드표 만들기 예제 with Common Lisp (0) | 2013.09.05 |
진법(radix) 표 만들기 예제 with Common Lisp (0) | 2013.09.04 |