다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 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 |