다음은 대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Python 소스 코드이다.
메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환의 핵심은 Python의 빌트인 함수 int(string, radix)와 소스 코드에 자체 작성된 함수 itoa(number, radix)의 사용이다.
val = int(s, srcRdx)
ret = itoa(val, destRdx)
지원되는 진법은 2진법에서 36진법까지이다.
(Jython으로는 finally: 구문 때문에 실행이 안된다.)
- # Filename: convertRadix.py
- # Convert radix in a interactive mode.
- #
- # Execute: python convertRadix.py
- #
- # Date: 2008/03/25
- # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- import sys
- def println(s=None):
- if s != None:
- print(s)
- else:
- def printUsage():
- println("Usage: python convertRadix.py")
- println("Convert radix in a interactive mode, where the maximum radix is 36.")
- def printAbout():
- println(" About: Convert radix in a interactive mode.")
- def printMainMenu():
- println(" Command: (S)et radix, (A)bout, (Q)uit or E(x)it")
- def printMainPrompt():
- print(" Prompt>"),
- def printSubMenu(srcRadix, destRadix):
- println(" Convert Radix_" + str(srcRadix) + " to Radix_" + str(destRadix))
- println(" SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit")
- def printSubPrompt():
- print(" Input Value>>"),
- BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- def itoa(num, radix=10):
- isNegative = False
- if num < 0:
- isNegative = True
- num = -num
- arr = []
- q, r = num, 0
- while q >= radix:
- q, r = divmod(q, radix)
- arr.append(BASE36[r])
- arr.append(BASE36[q])
- if isNegative:
- arr.append("-")
- arr.reverse()
- return ''.join(arr)
- def convertRadix(s, srcRdx, destRdx):
- ret = ""
- try:
- val = int(s, srcRdx)
- ret = itoa(val, destRdx)
- return ret.upper()
- except ValueError:
- println(" Error: Cannot convert radix " + str(srcRdx))
- ret = "????"
- finally:
- return ret.upper()
- def doConvert(srcRadix, destRadix):
- line = ""
- cmd = ""
- srcStr = ""
- destStr = ""
- println("")
- printSubMenu(srcRadix, destRadix)
- try:
- while True:
- printSubPrompt()
- cmd = raw_input()
- while cmd == None:
- cmd = raw_input()
- if "main()" == cmd:
- return
- elif "exit()" == cmd or "quit()" == cmd:
- sys.exit(0)
- try:
- int(cmd, srcRadix)
- srcStr = cmd
- destStr = convertRadix(srcStr, srcRadix, destRadix)
- println(" ( " + srcStr + " )_" + str(srcRadix) + " ---> ( " + destStr + " )_" + str(destRadix))
- println("")
- except ValueError:
- pass
- except RuntimeError:
- print sys.exc_value
- def doStart():
- line = ""
- cmd = ""
- srcRadix = 10
- destRadix = 10
- srcStr = ""
- destStr = ""
- onlyOnce = True
- try:
- while True:
- println()
- if onlyOnce:
- println(" The supported maximum radix is 36.")
- onlyOnce = False
- printMainMenu()
- printMainPrompt()
- cmd = raw_input()
- while cmd == None:
- cmd = raw_input()
- if "qQxX".find(cmd) >= 0 and len(cmd) == 1:
- sys.exit(0)
- elif "aA".find(cmd) >= 0 and len(cmd) == 1:
- printAbout()
- elif "sS".find(cmd) >= 0 and len(cmd) == 1:
- line = raw_input(" Input the source and target radices (say, 16 2): ")
- st = line.split(" ")
- while len(st) < 2:
- line = raw_input(" Input the source and target radices (say, 16 2): ")
- st = line.split(" ")
- srcRadix = int(st[0])
- destRadix = int(st[1])
- doConvert(srcRadix, destRadix)
- except RuntimeError:
- print sys.exc_value
- # Begin here
- if len(sys.argv) > 1 and "-h" == sys.argv[1]:
- printUsage()
- sys.exit(1)
- doStart()
실행> python convertRadix.py
The supported maximum radix is 36.
Command: (S)et radix, (A)bout, (Q)uit or E(x)it
Prompt> s
Input the source and target radices (say, 16 2): 10 8
Convert Radix_10 to Radix_8
SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
Input Value>> 200
( 200 )_10 ---> ( 310 )_8
Input Value>> main()
Command: (S)et radix, (A)bout, (Q)uit or E(x)it
Prompt> S
Input the source and target radices (say, 16 2): 8 10
Convert Radix_8 to Radix_10
SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
Input Value>> 2666
( 2666 )_8 ---> ( 1462 )_10
Input Value>> main()
Command: (S)et radix, (A)bout, (Q)uit or E(x)it
Prompt> x
IronPython의 경우에는 구문
print 스트링,
이 Python과 달리 끝에 빈칸을 곧 바로 추가하지 않고, 빈칸 출력을 유보하고 있다가 다음 print 문을 만날 때 이 빈칸을 먼저 출력한 후 주어진 스트링을 출력한다. raw_input()과 함께 쓰일 때는 이 빈칸 하나 때문에 신경이 쓰이기도 한다. 그래서 프롬프트를 출력하는 함수를
def printMainPrompt():
print(" Prompt> "),
def printSubPrompt():
print(" Input Value>> "),
로 수정해야 한다.
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Python' 카테고리의 다른 글
7비트 ASCII 코드표 만들기 예제 with Python (or Jython or IronPython) (0) | 2008.03.31 |
---|---|
진법(radix) 표 만들기 예제 with Python (or Jython or IronPython) (0) | 2008.03.29 |
황금비율(golden ratio) 구하기 with Python or Jython (0) | 2008.03.24 |
현재 시각 알아내기 for Python, Jython, and IronPython (0) | 2008.03.24 |
조립제법(Horner의 방법) 예제 for Python (0) | 2008.03.14 |