프로그래밍/Io

진법(radix) 표 만들기 예제 with Io

Scripter 2008. 5. 1. 18:41

컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은  0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Io 소스 코드이다. 진법 변환에 필요한 Io 메소드로

         string fromBase(radix)
         string toBase(radix)

가 이미 있지만, 여기에 준하는 메소드

        convertAtoI(string, radix)
        convertItoA(int, radix)

를 Io 코드로 자체 작성하여 사용하였다.



  1. /*
  2.  *  Filename: makeRadixTable.io
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Execute: io makeRadixTable.io
  6.  *
  7.  *      Date:  2008/05/01
  8.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  9.  */
  10. printUsage := method(
  11.     "Usage: io makeRadixTable.io" println
  12.     "Show the radix table with 10-, 2-, 8-, 16-radices." println
  13. )
  14. convertItoA := method(num, radix,
  15.     BASE36 := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  16.     q := 0
  17.     r := 0
  18.     isNegative := false
  19.     if (num < 0) then (
  20.         isNegative = true
  21.         num = -num
  22.     )
  23.     arr := ""
  24.     q = num
  25.     r = 0
  26.     while (q >= radix,
  27.         r = q % radix
  28.         q = (q / radix) floor
  29.         arr = arr .. (BASE36 slice(r, r + 1))
  30.      )
  31.      arr =  arr .. (BASE36 slice(q, q + 1))
  32.      if (isNegative) then (
  33.          arr = "-" .. arr
  34.      )
  35.      n := arr size
  36.      ret := ""
  37.      for (i, 0, n - 1,
  38.          ret = ret .. arr slice(n - i - 1, n - i)
  39.      )
  40.      return ret
  41. )
  42. convertAtoI := method(srcStr, radix,
  43.     BASE36 := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  44.     isNegative := false
  45.     ret := 0
  46.     len := srcStr size
  47.     c := ""
  48.     i := 0
  49.     val := 0
  50.     c = srcStr at(0)
  51.     if (c == "-") then (
  52.         isNegative = true
  53.     ) elseif (c >= "0" and c <= "9") then (
  54.         ret = (c product) - ("0" product)
  55.     ) elseif (c >= "A" and c <= "Z") then (
  56.         ret = (c product) - ("A" product) + 10
  57.     ) elseif (c >= "a" and  <= "z") then (
  58.         ret = (c product) - ("a" product) + 10
  59.     )
  60.     if (ret >= adix) then (
  61.         "        Invalid character!" println
  62.         return ret
  63.     )
  64.     for (i, 1,  len - 1,
  65.         c = srcStr[i]
  66.         ret = ret * radix
  67.         if (c >= "0" and c <= "9") then (
  68.             val = c product - "0" product
  69.         ) elseif (c >= 'A' and c <= 'Z') then (
  70.             val = c product - "A" product + 10
  71.         ) elseif (c >= 'a' and c <= 'z') then (
  72.             val = c product - "a" product + 10
  73.         )
  74.         if (val >= (long) radix) then (
  75.             "        Invalid character!" println
  76.             return ret
  77.         )
  78.         ret = ret + val
  79.     )
  80.     return ret
  81. )
  82. makeTable := method(
  83.     sbuf := ""
  84.     abuf := ""
  85.     tbuf := ""
  86.     i := 0
  87.     j := 0
  88.     c := ""
  89.     for (i, 0, 3,
  90.         "+-------" print
  91.     )
  92.     "+" print
  93.     "" println
  94.     "|  Dec" print
  95.     "\t|   Bin" print
  96.     "\t|  Oct" print
  97.     "\t|  Hex  |" print
  98.     "" println
  99.     for (i, 0, 3,
  100.         "+-------" print
  101.     )
  102.     "+" print
  103.     "" println
  104.     for (i, 0, 15,
  105.         strI := i asString
  106.         if (strI size < 2) then (strI = (" " repeated(2 - (strI size))) .. strI)
  107.         sbuf = "|   " .. strI
  108.         abuf = convertItoA(i, 2)
  109.         strA := abuf
  110.         if (strA size < 4) then (strA = " " repeated(4 - strA size) .. strA)
  111.         tbuf = "\t|  " .. strA
  112.         sbuf = sbuf .. tbuf
  113.         abuf = convertItoA(i, 8)
  114.         strA = abuf
  115.         if (strA size < 2) then (strA = " " repeated(2 - strA size) .. strA)
  116.         tbuf = "\t|   " .. strA
  117.         sbuf = sbuf .. tbuf
  118.         abuf = convertItoA(i, 16)
  119.         strA = abuf
  120.         if (strA size < 2) then (strA = " " repeated(2 - strA size) .. strA)
  121.         tbuf = "\t|   " .. strA
  122.         sbuf = sbuf .. tbuf .. "  |"
  123.         sbuf println
  124.     )
  125.     for (i, 0, 3,
  126.         "+-------" print
  127.     )
  128.     "+" print
  129.     "" println
  130. )
  131. if (args size > 1 and "-h" == args at(1)) then (
  132.     printUsage()
  133.     exit(1)
  134. )
  135. makeTable()



실행> io makeRadixTable.io

+-------+-------+-------+-------+
|  Dec  |   Bin |  Oct  |  Hex  |
+-------+-------+-------+-------+
|    0  |     0 |    0  |    0  |
|    1  |     1 |    1  |    1  |
|    2  |    10 |    2  |    2  |
|    3  |    11 |    3  |    3  |
|    4  |   100 |    4  |    4  |
|    5  |   101 |    5  |    5  |
|    6  |   110 |    6  |    6  |
|    7  |   111 |    7  |    7  |
|    8  |  1000 |   10  |    8  |
|    9  |  1001 |   11  |    9  |
|   10  |  1010 |   12  |    A  |
|   11  |  1011 |   13  |    B  |
|   12  |  1100 |   14  |    C  |
|   13  |  1101 |   15  |    D  |
|   14  |  1110 |   16  |    E  |
|   15  |  1111 |   17  |    F  |
+-------+-------+-------+-------+




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.