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

아래의 소스는 Python 용 소스를 F# 용 소스로 거의 일대일 변환한 것이라서, F# 언어의 명령형 언어의 특징을 위주로 짜여져 있다.

  1. (*
  2.  *  Filename: MakeDivisionTable.fs
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Compile: fsc --codepage:949 MakeDivisionTable.fs
  7.  *
  8.  *  Execute: MakeDivisionTable 12345 32
  9.  *           MakeDivisionTable 500210 61
  10.  *           MakeDivisionTable 234 55
  11.  *
  12.  *     Date:  2010/07/15
  13.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  14.  *)
  15. #light
  16. exception RuntimeError of string
  17. exception ValueError of string
  18. let BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  19. let SPACE = "                                                          "
  20. let ULINE = "__________________________________________________________"
  21. let HIPHEN = "----------------------------------------------------------"
  22. let println s =
  23.     printfn "%O" s
  24. let print s =
  25.     printf "%O" s
  26. let printUsage dummy =
  27.     // print("Using: MakeDivisionTable [numerator] [denominator]")
  28.     // print("Make a division table in a handy written form.")
  29.     println "사용법: MakeDivisionTable [피제수] [제수]"
  30.     println "손으로 작성한 형태의 나눗셈 표를 만들어준다."
  31. let simplify v width =
        let mutable t = sprintf "%d" v
  32.     if (t.EndsWith ".0") then
  33.         t <- t.Substring(0, t.Length - 2)
  34.     let slen = t.Length
  35.     if slen < width then
  36.         t <- SPACE.Substring(0, width - slen) + t
  37.     t
  38. let getSuffix v =
  39.     let mutable t = v % 10
  40.     let mutable suffix = "은"
  41.     if "2459".IndexOf(sprintf "%d"  t) >= 0 then
  42.         suffix <- "는"
  43.     suffix
  44. let makeTable numer denom quotient =
  45.     let strNumer = sprintf "%d" numer
  46.     let strDenom = sprintf "%d" denom
  47.     let strQuotient = sprintf "%d" quotient
  48.     let lenN = strNumer.Length
  49.     let lenD = strDenom.Length
  50.     let lenQ = strQuotient.Length
  51.     let offsetLeft = 3 + lenD + 3
  52.     let spaces = "                                                                                 "
  53.     let mutable uline  = ULINE.Substring(0, lenN + 2)
  54.     let mutable sline  = HIPHEN.Substring(0, lenN)
  55.     let bias = lenN - lenQ
  56.     println(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias) + sprintf "%d" quotient)
  57.     println(spaces.Substring(0, offsetLeft - 2) + uline)
  58.     print("   " + strDenom + " ) " + strNumer)
  59.     let mutable strTmpR = strNumer.Substring(0, bias + 1)
  60.     let mutable tmpR = int strTmpR
  61.     let mutable tmpSub = 0
  62.     let mutable oneDigit = ""
  63.     for i in 0..(lenQ - 1) do
  64.         if (strQuotient.Substring(i, 1)) = "0" then
  65.             if i + 1 < lenQ then
  66.                 oneDigit <- (strNumer.Substring(bias + i + 1, 1))
  67.                 print(oneDigit)
  68.                 strTmpR <- strTmpR + oneDigit
  69.                 tmpR <- int strTmpR
  70.         else
  71.             println ""
  72.             tmpSub <- (int (strQuotient.Substring(i, 1))) * denom
  73.             println(spaces.Substring(0, offsetLeft) + simplify tmpSub  (bias + i + 1))
  74.             println(spaces.Substring(0, offsetLeft) + sline)
  75.             tmpR <- tmpR - tmpSub
  76.             if tmpR = 0 && i + 1 < lenQ then
  77.                 print(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias + i + 1))
  78.             else 
  79.                 print(spaces.Substring(0, offsetLeft) + (simplify tmpR (bias + i + 1))) 
  80.             strTmpR <- sprintf "%d" tmpR
  81.             if i + 1 < lenQ then
  82.                 oneDigit <- (strNumer.Substring(bias + i + 1, 1))
  83.                 if  (oneDigit.Length) > 0 then
  84.                     print(oneDigit)
  85.                 strTmpR <- strTmpR + oneDigit
  86.             tmpR <- int strTmpR
  87.     println ""
  88.     tmpR
  89. // Begin here
  90. let cmdArgs = System.Environment.GetCommandLineArgs()
  91. if (Array.length cmdArgs < 3 || "-h" = cmdArgs.[1]) then
  92.     printUsage 0
  93.     exit(1)
  94. let mutable a = 0
  95. let mutable b = 1
  96. try
  97.     a <- int (cmdArgs.[1])
  98.     b <- int (cmdArgs.[2])
  99. with
  100.     | ValueError e -> printfn "피제수: %s, 제수: %s" (cmdArgs.[1]) (cmdArgs.[2]);
  101.                       printfn "숫자 입력에 오류가 있습니다.";
  102.                       exit(1)
  103. if a <= 0 then
  104.     printf "피제수: %d" a
  105.     printf "피제수는 양의 정수라야 합니다."
  106.     exit(1)
  107. elif b <= 0 then
  108.     printf "제수: %d" b
  109.     printf "제수는 양의 정수라야 합니다."
  110.     exit(1)
  111. let q = a / b
  112. let r = a % b
  113. printf "나눗셈 %d ÷ %d 의 결과: " a b
  114. printf "몫: %d, " q
  115. printfn "나머지: %d" r
  116. printfn ""
  117. let k = makeTable a b q
  118. if k = r then
  119.     printfn "\n나머지: %d" k
  120. if k = 0 then
  121.     printfn "%d = %d x %d" a b q
  122.     printfn "%d%s %d의 배수(mupltiple)이다." a (getSuffix a) b
  123.     printfn "%d%s %d의 약수(divisor)이다." b (getSuffix b) a
  124. else
  125.     printfn "%d = %d x %d + %d" a b q r
  126.     printfn "%d%s %d의 배수(mupltiple)가 아니다." a (getSuffix a) b



컴파일> fsc --codepage:949   MakeDivisionTable.fs

실행> MakeDivisionTable.py 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
,