다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Lua 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.
- --[[
- Filename: makeDivisionTable.lua
- Purpose: Make a division table in a handy written form.
- Execute: lua makeDivisionTable.lua 12345 32
- lua makeDivisionTable.lua 500210 61
- Date: 2008/05/15
- Author: PH Kim [ pkim ((AT)) scripts.pe.kr ]
- --]]
- function printUsage()
- -- print("Using: lua makeDivisionTable.lua [numerator] [denominator]")
- -- print("Make a division table in a handy written form.")
- print("사용법: lua makeDivisionTable.lua [피제수] [제수]")
- print("손으로 작성한 형태의 나눗셈 표를 만들어준다.")
- end
- -- 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
- -- 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
- function simplify(v, width)
- t = "" .. v
- tlen = string.len(t)
- if string.sub(t, tlen-2) == ".0" then
- t = string.sub(t, 1, tlen-2)
- end
- if width ~= nil then
- if tlen < width then
- t = string.sub(" ", 1, width - tlen) .. t
- end
- end
- return t
- end
- function getSuffix(v)
- t = v % 10
- suffix = "은"
- if string.find("2459", "" .. v) then
- suffix = "는"
- end
- return suffix
- end
- function makeTable(numer, denom, quotient)
- strNumer = tostring(numer)
- strDenom = tostring(denom)
- strQuotient = tostring(quotient)
- lenN = string.len(strNumer)
- lenD = string.len(strDenom)
- lenQ = string.len(strQuotient)
- offsetLeft = 3 + lenD + 3
- spaces = " "
- uline = string.rep("_", lenN + 2)
- sline = string.rep("-", lenN)
- bias = lenN - lenQ
- print(string.sub(spaces, 1, offsetLeft) .. string.sub(spaces, 1, bias) .. quotient)
- print(string.sub(spaces, 1, offsetLeft - 2) .. uline)
- io.write(" " .. strDenom .. " ) " .. strNumer)
- strTmpR = string.sub(strNumer, 1, bias + 1)
- tmpR = tonumber(strTmpR)
- tmpSub = 0
- oneDigit = nil
- for i = 1, lenQ do
- if string.sub(strQuotient, i, i) == "0" then
- if i < lenQ then
- oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
- io.write(oneDigit)
- strTmpR = strTmpR .. oneDigit
- tmpR = tonumber(strTmpR)
- end
- else
- print("")
- tmpSub = tonumber(string.sub(strQuotient, i, i)) * denom
- print(string.sub(spaces, 1, offsetLeft) .. simplify(tmpSub, bias + i))
- print(string.sub(spaces, 1, offsetLeft) .. sline)
- tmpR = tmpR - tmpSub
- if tmpR == 0 and i < lenQ then
- io.write(string.sub(spaces, 1, offsetLeft - 1) .. string.sub(spaces, 1, bias + i + 1))
- else
- io.write(string.sub(spaces, 1, offsetLeft - 1) .. simplify(tmpR, bias + i + 1))
- end
- strTmpR = tostring(tmpR)
- if i < lenQ then
- oneDigit = string.sub(strNumer, bias + i + 1, bias + i + 1)
- io.write(oneDigit)
- strTmpR = strTmpR .. oneDigit
- tmpR = tonumber(strTmpR)
- end
- end
- end
- print("")
- return tmpR
- end
- if #arg < 2 then
- printUsage()
- os.exit(1)
- end
- a = null
- b = null
- a = tonumber(arg[1])
- b = tonumber(arg[2])
- if a <= 0 then
- print("피제수: " .. a)
- print("피제수는 양의 정수라야 합니다.")
- os.exit(1)
- elseif b <= 0 then
- print("제수: " .. b)
- print("제수는 양의 정수라야 합니다.");
- os.exit(1)
- end
- q = math.floor(a / b)
- r = a % b
- io.write("나눗셈 " .. a .. " ÷ " .. b .. " 의 결과: ")
- io.write("몫: " .. q .. ", ")
- print("나머지: " .. r)
- print("")
- k = makeTable(a, b, q)
- if k == r then
- print("\n나머지: " .. k)
- end
- if k == 0 then
- print(a .. " = " .. b .. " x " .. q)
- print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)이다.")
- print(b .. getSuffix(b) .. " " .. a .. "의 약수(divisor)이다.")
- else
- print(a .. " = " .. b .. " x " .. q .. " + " .. r)
- print(a .. getSuffix(a) .. " " .. b .. "의 배수(mupltiple)가 아니다.")
- end
실행> lua makeDivisionTable.lua 500210 61
나눗셈 500210 ÷ 61 의 결과: 몫: 8200, 나머지: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 나머지: 10 500210 = 61 x 8200 + 10 500210은 61의 배수(mupltiple)가 아니다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Lua' 카테고리의 다른 글
스트링 배열 정렬(sorting)하기 with Lua (0) | 2009.04.20 |
---|---|
손으로 계산하는 긴자리 곱셈표 만들기 with Lua (0) | 2009.03.06 |
클래스 상속(subclassing) 예제 with Lua (0) | 2008.04.05 |
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Lua (0) | 2008.04.05 |
7비트 ASCII 코드표 만들기 예제 with Lua (0) | 2008.03.31 |