다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Common Lisp 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.

아래의 소스는 CLisp으로 실행되도록 작성되었다.

  1. #!/usr/bin/env clisp
  2. ;;  Filename: makeDivisionTable.lsp
  3. ;;
  4. ;;  Purpose:  Make a division table in a handy written form.
  5. ;;
  6. ;;  Execute: clisp makeDivisionTable.lsp 12345 32
  7. ;;           clisp makeDivisionTable.lsp 500210 61
  8. ;;           ./makeDivisionTable.lsp 500210 61
  9. ;;
  10. ;;     Date:  2013, 9. 5.
  11. (defun printUsage()
  12.     (format t "사용법: clisp makeDivisionTable.lsp [피제수] [제수]~%")
  13.     (format t "손으로 작성한 형태의 나눗셈 표를 만들어준다.~%") )
  14. (defun simplify(v &optional width)
  15.     (let* ((tt "")
  16.            (slen 0))
  17.         (setf tt (format nil "~A" v))
  18.         (setf slen (length tt))
  19.         (if (and (>= slen 2) (string= (substring tt (- slen 2) slen) ".0"))
  20.             (setf tt (substring tt 0 (- slen 2))) )
  21.         (setf slen (length tt))
  22.         (if width
  23.             (if (< slen width)
  24.                 (setf tt (concatenate 'string (make-string (- width slen) :initial-element #\Space) tt)) ))
  25.         tt
  26.     )
  27. )
  28. (defun getSuffix(v)
  29.     (let* ((tt (mod (abs v) 10))
  30.            (suffix "은"))
  31.         (if (search (format nil "~A" tt) "2459")
  32.             (setf suffix "는") )
  33.         suffix
  34.     )
  35. )
  36. (defun makeTable(numer denom quotient)
  37.     (let* ((strNumer (format nil "~A" numer))
  38.            (strDenom (format nil "~A" denom))
  39.            (strQuotient (format nil "~A" quotient))
  40.            (lenN (length strNumer))
  41.            (lenD (length strDenom))
  42.            (lenQ (length strQuotient))
  43.            (offsetLeft (+ 3 lenD 3))
  44.            (spaces (make-string 100 :initial-element #\Space))
  45.            (uline (make-string (+ lenN 2) :initial-element #\_))
  46.            (sline (make-string lenN :initial-element #\-))
  47.            (bias (- lenN lenQ))
  48.            (strTmpR (substring strNumer 0 (+ bias 1)))
  49.            (tmpR (parse-integer strTmpR))
  50.            (tmpSub 0)
  51.            (oneDigit nil) )
  52.         (format t "~A~A~A~%" (substring spaces 0 offsetLeft) (substring spaces 0 bias) (format nil "~D" quotient))
  53.         (format t "~A~A~%" (substring spaces 0 (- offsetLeft 2)) uline)
  54.         (format t "~A~A~A~A" "   " strDenom " ) " strNumer)
  55.         (loop for i from 0 below lenQ do
  56.             (if (string= (substring strQuotient i (1+ i)) "0")
  57.                 (progn
  58.                     (if (< (1+ i) lenQ)
  59.                         (progn
  60.                            (setf oneDigit (substring strNumer (+ bias i 1) (+ bias i 2)))
  61.                            (format t "~A" oneDigit)
  62.                            (setf strTmpR (concatenate 'string strTmpR oneDigit))
  63.                            (setf tmpR (parse-integer strTmpR))
  64.                         )
  65.                     )
  66.                 )
  67.                 (progn
  68.                     (format t "~%")
  69.                     (setf tmpSub (* (parse-integer (substring strQuotient i (1+ i))) denom))
  70.                     (format t "~A~A~%" (substring spaces 0 offsetLeft) (simplify tmpSub (+ bias i 1)))
  71.                     (format t "~A~A~%" (substring spaces 0 offsetLeft) sline)
  72.                     (setf tmpR (- tmpR tmpSub))
  73.                     (if (and (= tmpR 0) (< (+ i 1) lenQ))
  74.                         (format t "~A~A" (substring spaces 0 offsetLeft) (substring spaces 0 (+ bias i 1)))
  75.                         (format t "~A~A" (substring spaces 0 offsetLeft) (simplify tmpR (+ bias i 1)))
  76.                     ) 
  77.                     (setf strTmpR (format nil "~D" tmpR)) 
  78.                     (if (< (+ i 1) lenQ)
  79.                         (progn
  80.                             (setf oneDigit (substring strNumer (+ bias i 1) (+ bias i 2)))
  81.                             (if (plusp (length oneDigit))
  82.                                 (progn
  83.                                     (format t "~A" oneDigit)
  84.                                     (setf strTmpR (concatenate 'string strTmpR oneDigit))
  85.                                 )
  86.                             )
  87.                             (setf tmpR (parse-integer strTmpR))
  88.                         )
  89.                     )
  90.                 )
  91.             )
  92.         )
  93.         tmpR
  94.     )
  95. )
  96. ;; Begin here
  97. (if (< (length ext:*args*) 2)
  98.     (progn
  99.         (printUsage)
  100.         (quit)
  101.     )
  102. )
  103. (setf a nil)
  104. (setf b nil)
  105. (handler-case
  106.     (progn
  107.         (setf a (parse-integer (nth 0 ext:*args*)))
  108.         (setf b (parse-integer (nth 1 ext:*args*)))
  109.         (if (minusp a)
  110.             (progn
  111.                 (format t "피제수: ~A~%" a)
  112.                 (format t "피제수는 양의 정수라야 합니다.~%")
  113.                 (quit)
  114.             )
  115.             (if (minusp b)
  116.                 (progn
  117.                     (format t "제수: ~A~%" b)
  118.                     (format t "제수는 양의 정수라야 합니다.~%")
  119.                     (quit)
  120.                 )
  121.             )
  122.         )
  123.         (setf q (floor (/ a b)))
  124.         (setf r (mod a b))
  125.         (format t "나눗셈 ~A ÷ ~A 의 결과: " a b)
  126.         (format t "몫:  ~A, " q)
  127.         (format t "나머지: ~A~%" r)
  128.         (format t "~%")
  129.         (setf k (makeTable a  b q))
  130.         (format t "~%")
  131.         (if (= k r)
  132.             (format t "~%나머지: ~A~%" k)
  133.         )
  134.         (if (= k 0)
  135.             (progn
  136.                 (format t "~A = ~A x ~A~%" a b q)
  137.                 (format t "~A~A ~A의 배수(mupltiple)이다.~%" a (getSuffix a) b)
  138.                 (format t "~A~A ~A의 약수(divisor)이다.~%" b (getSuffix b) a)
  139.                 (format t "~%")
  140.             )
  141.             (progn
  142.                 (format t "~A = ~A x ~A + ~A~%" a b q r)
  143.                 (format t "~A~A ~A의 배수(mupltiple)가 아니다.~%" a (getSuffix a) b)
  144.                 (format t "~%")
  145.             )
  146.         )
  147.     )
  148.     (parse-error (c)
  149.         (format t "예외상황: ~A" c)
  150.         (format t "이 발생였음. 다시 하시오,~%~%")
  151.     )
  152. )




실행> 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)가 아니다.




Posted by Scripter
,