다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 F# 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
아래의 소스는 Python 용 소스를 F# 용 소스로 거의 일대일 변환한 것이라서, F# 언어의 명령형 언어의 특징을 위주로 짜여져 있다.
- (*
 - * Filename: MakeDivisionTable.fs
 - *
 - * Purpose: Make a division table in a handy written form.
 - *
 - * Compile: fsc --codepage:949 MakeDivisionTable.fs
 - *
 - * Execute: MakeDivisionTable 12345 32
 - * MakeDivisionTable 500210 61
 - * MakeDivisionTable 234 55
 - *
 - * Date: 2010/07/15
 - * Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
 - *)
 - #light
 - exception RuntimeError of string
 - exception ValueError of string
 - let BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 - let SPACE = " "
 - let ULINE = "__________________________________________________________"
 - let HIPHEN = "----------------------------------------------------------"
 - let println s =
 - printfn "%O" s
 - let print s =
 - printf "%O" s
 - let printUsage dummy =
 - // print("Using: MakeDivisionTable [numerator] [denominator]")
 - // print("Make a division table in a handy written form.")
 - println "사용법: MakeDivisionTable [피제수] [제수]"
 - println "손으로 작성한 형태의 나눗셈 표를 만들어준다."
 - let simplify v width =
let mutable t = sprintf "%d" v - if (t.EndsWith ".0") then
 - t <- t.Substring(0, t.Length - 2)
 - let slen = t.Length
 - if slen < width then
 - t <- SPACE.Substring(0, width - slen) + t
 - t
 - let getSuffix v =
 - let mutable t = v % 10
 - let mutable suffix = "은"
 - if "2459".IndexOf(sprintf "%d" t) >= 0 then
 - suffix <- "는"
 - suffix
 - let makeTable numer denom quotient =
 - let strNumer = sprintf "%d" numer
 - let strDenom = sprintf "%d" denom
 - let strQuotient = sprintf "%d" quotient
 - let lenN = strNumer.Length
 - let lenD = strDenom.Length
 - let lenQ = strQuotient.Length
 - let offsetLeft = 3 + lenD + 3
 - let spaces = " "
 - let mutable uline = ULINE.Substring(0, lenN + 2)
 - let mutable sline = HIPHEN.Substring(0, lenN)
 - let bias = lenN - lenQ
 - println(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias) + sprintf "%d" quotient)
 - println(spaces.Substring(0, offsetLeft - 2) + uline)
 - print(" " + strDenom + " ) " + strNumer)
 - let mutable strTmpR = strNumer.Substring(0, bias + 1)
 - let mutable tmpR = int strTmpR
 - let mutable tmpSub = 0
 - let mutable oneDigit = ""
 - for i in 0..(lenQ - 1) do
 - if (strQuotient.Substring(i, 1)) = "0" then
 - if i + 1 < lenQ then
 - oneDigit <- (strNumer.Substring(bias + i + 1, 1))
 - print(oneDigit)
 - strTmpR <- strTmpR + oneDigit
 - tmpR <- int strTmpR
 - else
 - println ""
 - tmpSub <- (int (strQuotient.Substring(i, 1))) * denom
 - println(spaces.Substring(0, offsetLeft) + simplify tmpSub (bias + i + 1))
 - println(spaces.Substring(0, offsetLeft) + sline)
 - tmpR <- tmpR - tmpSub
 - if tmpR = 0 && i + 1 < lenQ then
 - print(spaces.Substring(0, offsetLeft) + spaces.Substring(0, bias + i + 1))
 - else
 - print(spaces.Substring(0, offsetLeft) + (simplify tmpR (bias + i + 1)))
 - strTmpR <- sprintf "%d" tmpR
 - if i + 1 < lenQ then
 - oneDigit <- (strNumer.Substring(bias + i + 1, 1))
 - if (oneDigit.Length) > 0 then
 - print(oneDigit)
 - strTmpR <- strTmpR + oneDigit
 - tmpR <- int strTmpR
 - println ""
 - tmpR
 - // Begin here
 - let cmdArgs = System.Environment.GetCommandLineArgs()
 - if (Array.length cmdArgs < 3 || "-h" = cmdArgs.[1]) then
 - printUsage 0
 - exit(1)
 - let mutable a = 0
 - let mutable b = 1
 - try
 - a <- int (cmdArgs.[1])
 - b <- int (cmdArgs.[2])
 - with
 - | ValueError e -> printfn "피제수: %s, 제수: %s" (cmdArgs.[1]) (cmdArgs.[2]);
 - printfn "숫자 입력에 오류가 있습니다.";
 - exit(1)
 - if a <= 0 then
 - printf "피제수: %d" a
 - printf "피제수는 양의 정수라야 합니다."
 - exit(1)
 - elif b <= 0 then
 - printf "제수: %d" b
 - printf "제수는 양의 정수라야 합니다."
 - exit(1)
 - let q = a / b
 - let r = a % b
 - printf "나눗셈 %d ÷ %d 의 결과: " a b
 - printf "몫: %d, " q
 - printfn "나머지: %d" r
 - printfn ""
 - let k = makeTable a b q
 - if k = r then
 - printfn "\n나머지: %d" k
 - if k = 0 then
 - printfn "%d = %d x %d" a b q
 - printfn "%d%s %d의 배수(mupltiple)이다." a (getSuffix a) b
 - printfn "%d%s %d의 약수(divisor)이다." b (getSuffix b) a
 - else
 - printfn "%d = %d x %d + %d" a b q r
 - 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)가 아니다.
 
'프로그래밍 > F#' 카테고리의 다른 글
| 손으로 계산하는 긴자리 곱셈표 만들기 with F# (0) | 2010.07.15 | 
|---|---|
| 문자열 거꾸로 하기 with F# (0) | 2010.07.15 | 
| 7비트 ASCII 코드표 만들기 예제 with F# (0) | 2010.07.15 | 
| 진법(radix) 표 만들기 예제 with F# (0) | 2010.07.15 | 
| 대화형 모드의 진법(radix) 변환 예제 with F# (0) | 2010.07.14 |