다음은 대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Scala 소스 코드이다.
메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환의 핵심은 java.lang.Integer 클래스와 java.lang.Long 클래스의 정적 메소드
Integer.parseInt(String, int);
java.lang.Long.toString(long, int);
울 이용하였으며, 지원되는 진법은 2진법에서 36진법 까지이다. 참고로 Java의 Long 타입과 Scala의 Long 타입은 다르므로, 여기서는 java.lang.Long.toString 처럼 Long 타입의 패키지명을 꼭 붙여야 한다. Scala에는 Integer 타입 대신 Int 타입을 쓰므로 Integer.parseInt는 그대로 써도 된다.
Scala 언어의 try ... catch ... finally ... 구문은
try {
블럭
}
catch {
case e1 : 예외타입 =>
블럭
case e2 : 예외타입 =>
블럭
}
finally {
블럭
}
- /*
- * Filename: convertRadix.scala
- * Convert radix in a interactive mode.
- *
- * Execute: scala convertRadix.scala
- *
- * Date: 2009/03/09
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- import java.io._
- import java.util._
- def printUsage() {
- println("Usage: scala convertRadix.scala")
- 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 : Int, destRadix : Int) {
- println(" Convert Radix_" + srcRadix + " to Radix_" + destRadix)
- println(" SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit")
- }
- def printSubPrompt() {
- print(" Input Value>> ")
- }
- def convertRadix(s : String, srcRdx : Int, destRdx : Int) : String = {
- var value : Long = 0L
- var t = ""
- try {
- value = Integer.parseInt(s, srcRdx)
- t = java.lang.Long.toString(value, destRdx)
- return t.toUpperCase()
- }
- catch {
- case e : NumberFormatException =>
- println(" Error: " + e.getMessage() + " cantains some invalid character.")
- t = "????"
- return t
- }
- finally {
- return t.toUpperCase()
- }
- }
- def doConvert(r : BufferedReader, srcRadix : Int, destRadix : Int) {
- var line = ""
- var cmd = ""
- var srcStr = ""
- var destStr = ""
- println()
- printSubMenu(srcRadix, destRadix)
- try {
- while (true) {
- printSubPrompt()
- cmd = r.readLine()
- if ("main()".equals(cmd)) {
- return
- }
- else if ("exit()".equals(cmd) || "quit()".equals(cmd)) {
- System.exit(0)
- }
- try {
- Integer.parseInt(cmd, srcRadix)
- srcStr = cmd
- destStr = convertRadix(srcStr, srcRadix, destRadix)
- println(" ( " + srcStr + " )_" + srcRadix + " ---> ( " + destStr + " )_" + destRadix)
- println()
- }
- catch {
- case e : NumberFormatException =>
- println(" NumberFormatException: " + e.getMessage())
- case e : IOException =>
- e.printStackTrace()
- }
- }
- }
- }
- def doStart() {
- var line = ""
- var cmd = ""
- var srcRadix = 10
- var destRadix = 10
- var srcStr = ""
- var destStr = ""
- var onlyOnce : Boolean = true
- var r : BufferedReader = new BufferedReader(new InputStreamReader(System.in))
- try {
- while (true) {
- println()
- if (onlyOnce) {
- println(" The supported maximum radix is 36.")
- onlyOnce = false
- }
- printMainMenu()
- printMainPrompt()
- cmd = r.readLine()
- if ("qQxX".contains(cmd) && cmd.length() == 1) {
- System.exit(0)
- }
- else if ("aA".contains(cmd) && cmd.length() == 1) {
- printAbout()
- }
- else if ("sS".contains(cmd) && cmd.length() == 1) {
- print(" Input the source and target radices (say, 16 2): ")
- line = r.readLine()
- var st : StringTokenizer = new StringTokenizer(line, " ,\t")
- while (st.countTokens() < 2) {
- print(" Input the source and target radices (say, 16 2): ")
- line = r.readLine()
- st = new StringTokenizer(line, " ,\t");
- }
- srcRadix = Integer.parseInt(st.nextToken())
- destRadix = Integer.parseInt(st.nextToken())
- doConvert(r, srcRadix, destRadix)
- }
- }
- }
- catch {
- case e: IOException =>
- e.printStackTrace()
- }
- }
- // Begin here
- if (args.length > 0 && "-h".equals(args(0))) {
- printUsage()
- System.exit(1)
- }
- doStart()
실행> scala convertRadix.scala
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): 16 2
Convert Radix_16 to Radix_2
SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
Input Value>> 1FF
( 1FF )_16 ---> ( 111111111 )_2
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): 2 8
Convert Radix_2 to Radix_8
SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
Input Value>> 1011001
( 1011001 )_2 ---> ( 131 )_8
Input Value>> main()
Command: (S)et radix, (A)bout, (Q)uit or E(x)it
Prompt> x
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Scala' 카테고리의 다른 글
스트링 배열에서 스트링 찾기(find) with Scala (0) | 2009.04.22 |
---|---|
스트링 배열 정렬(sorting)하기 with Scala (0) | 2009.04.18 |
황금비율(golden ratio) 구하기 with Scala (0) | 2009.03.09 |
현재 시각 알아내기 for Scala (0) | 2009.03.09 |
조립제법(Horner의 방법) 예제 for Scala (0) | 2008.06.04 |