Groovy 버전이 너무 높으면 나는 에러입니다.

이런 에러를 내지 않는 버전은 현재로서는 1.8.4 와 2.0.1 까지 입니다. 그 이후 버전에서는 *.groovy 로 인식되는 Groovlet 웹페이지를 재방문할 때 404 (Resource Not Found) 에러가 납니다.


* web.xml 파일에 추가할 내요

    <servlet>

        <servlet-name>SessionExample</servlet-name>

        <servlet-class>SessionExample</servlet-class>

    </servlet>


    <servlet>

        <servlet-name>Groovy</servlet-name>

        <servlet-class>groovy.servlet.GroovyServlet</servlet-class>

    </servlet>

    <servlet>

        <servlet-name>GTemplate</servlet-name>

        <servlet-class>groovy.servlet.TemplateServlet</servlet-class>

        <init-param>

         <param-name>groovy.source.encoding</param-name>

         <param-value>UTF-8</param-value>

        </init-param>

    </servlet>


    <servlet-mapping>

        <servlet-name>GTemplate</servlet-name>

        <url-pattern>*.ghtml</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

        <servlet-name>GTemplate</servlet-name>

        <url-pattern>*.gsp</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

        <servlet-name>Groovy</servlet-name>

        <url-pattern>*.groovy</url-pattern>

    </servlet-mapping>



[참고 자료]

  1. Jira 버그 리포트: https://jira.codehaus.org/browse/GROOVY-5747  8 Oct 2012 – First call to Groovlet succeeds but subsequent calls return 404...GroovyServlet Error: script: '/test.groovy': Script not found, sending 404
  2. 이전 버전 Groovy 다운로드: http://dist.codehaus.org/groovy/distributions/
  3. 최신 버전 Groovy 다운로드: http://groovy.codehaus.org/Download?nc
  4. Groovlet 동작 확인:

 

Posted by Scripter
,

Go 언어의 int64 타입은 C 언어의 long long 터입처럼 64비트 부호 았는 정수 타입이다. 이 타입으로는 20! 까지만 정확하게 게산된다. (Go 언어의 int64 타입으로 계산 가능한 최대 팩토리얼은?  참조) 하지만 Go 언어의 "math/big" 패키지를 사용하면 (C 언어의 GMP 라이브러리를 쓰는 것 처럼) 무제한 자리수의 정수 계산이 가능하다.

다음 소스는 C 언어로 GMP 라이브러리를 이용하여 30! 까지 정확하게 계산하기의 C 언어 소스 recFactGMP01.c를 Go 언어용으로 수정한 것이다.



* 소스 파일명: recBigFact01.go

/*
 *  Filename: recBigFact01.go
 *
 *  Execute: go run recBigFact01.go
 *
 *  or
 *
 *  Compile: go build recBigFact01.go
 *  Execute: ./recBigFact01
 */

package main

import (
    "fmt"
    "math/big"
)

func factorial(v *big.Int, n int64)  *big.Int {
    var i int64
    var t *big.Int = big.NewInt(1)
    v = big.NewInt(1)
    for i = 1; i <= n; i++ {
        t = big.NewInt(i)
        v = v.Mul(v, t)
    }
    return v
}

func main() {
    var i int
    var n1 int = 9
    var n2 int = 30
    var v *big.Int
    // mpz_init (v);
    for i = n1; i <= n2; i++ {
        v = big.NewInt(1)
        v = factorial(v, int64(i))
        fmt.Printf("%d! = %s\n", i, v)
        if i == 20 {
            fmt.Printf("-- below calc are regular ----\n")
        }
    }
}

 


실행 결과:
프롬프트> go run recBigFact01.go
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
-- below calc are regular ----
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000



 

Posted by Scripter
,

 

// Filename: testComplex.go
//
// Execute: go run testComplex.go
//
// or
//
// Compile: go build  testComplex.go
// Execute: ./testComplex

package main

import (
    "fmt"
    "math/cmplx"
)

func main() {
    var z1 complex128 = 3.0 + 4.0i
    var z2 complex128 = 2.0 - 1.0i
    var z3 complex128 = z1 + z2
    var z4 complex128 = z1 - z2
    var z5 complex128 = z1 * z2
    var z6 complex128 = z1 / z2
    var z7 complex128 = cmplx.Conj(z1)
    var arg float64 = cmplx.Phase(z1)     // arument of a complex number
    var abs float64 = cmplx.Abs(z1)     // arument of a complex number

    fmt.Printf("z1 = %f + %fj\n", real(z1), imag(z1))
    fmt.Printf("z2 = %f + %fj\n", real(z2), imag(z2))
    fmt.Printf("So,\n")
    fmt.Printf("z3 = z1 + z2 = %f + %fj\n", real(z3), imag(z3))
    fmt.Printf("z4 = z1 - z2 = %f + %fj\n", real(z4), imag(z4))
    fmt.Printf("z5 = z1 * z2 = %f + %fj\n", real(z5), imag(z5))
    fmt.Printf("z6 = z1 / z2 = %f + %fj\n", real(z6), imag(z6))

    fmt.Printf("z7 = cmplx.Conj(z1) = %f + %fj\n", real(z7), imag(z7))
    fmt.Printf("arg = cmplx.Phase(z1) = %f\n", arg)
    fmt.Printf("abs = |z1| = cmplx.Abs(z1) = %f\n", abs)
}
 

/*
-------------------
Result of execution:
-------------------
z1 = 3.000000 + 4.000000j
z2 = 2.000000 + -1.000000j
So,
z3 = z1 + z2 = 5.000000 + 3.000000j
z4 = z1 - z2 = 1.000000 + 5.000000j
z5 = z1 * z2 = 10.000000 + 5.000000j
z6 = z1 / z2 = 0.400000 + 2.200000j
z7 = cmplx.Conj(z1) = 3.000000 + -4.000000j
arg = cmplx.Phase(z1) = 0.927295
abs = |z1| = cmplx.Abs(z1) = 5.000000
*/

 

Posted by Scripter
,

Go 언어의 int64 타입은 C 언어의 long long 타입에 해당한다. 즉 int64 타입은 64 비트(8 바이트)의 메모리공간을 차지하는 부호 있는 정수이다.


int64 타입의 한계로 인하여 20! 까지만 정확히 계산되었다.

* 소스 파일명: recursiveFactorial.go

package main

import (
    "fmt"
)

func recFacto(y int64, k, n int) int64 {
    if n <= 1 {
        return 1
    } else if k == n {
        return y
    }
    return recFacto(y*int64(k+1), k+1, n)
}

func factorial(n int) int64 {
    return recFacto(1, 1, n)
}

func main() {
    var n int = 25
    var i int
    for i = 0; i <= n; i++ {
        fmt.Printf("%d! = %d\n", i, factorial(i))
        if i == 20 {
            fmt.Printf("-- below calc are fault ----\n")
        }
    }
}



실행 결과:
프롬프트> go run recursiveFactorial.go
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
-- below calc are fault ----
21! = -4249290049419214848
22! = -1250660718674968576
23! = 8128291617894825984
24! = -7835185981329244160
25! = 7034535277573963776



 

Posted by Scripter
,


[파일명:  testSort.go]------------------------------------------------
package main

import (
    "fmt"
    "os"
    "sort"
)

func quickSort(array []string, start, end int) {
    var i int = start
    var k int = end
    var pivot string

    if end - start >= 1 {
        pivot = array[start]
        for k > i {
            for cmp(array[i], pivot) >= 0 && i <= end && k > i {
                i += 1
            }
            for cmp(array[k], pivot) < 0 && k >= start && k >= i {
                k -= 1
            }
            if k > i {
              swap(array,i, k)
            }
        }
        swap(array, start, k)

        quickSort(array, start, k - 1)
        quickSort(array, k + 1, end)
    } else {
        return
    }
}

func cmp(s string, t string) int {
     var slen int = len(s)
     var tlen int = len(t)
     if slen == 0 && tlen == 0 {
         return 0
     } else if slen == 0 {
         return 1
     } else if tlen == 0 {
         return -1
     }
     var minlen int = slen
     if tlen < slen {
         minlen = tlen
     }
     var i int
     for i = 0; i < minlen; i++ {
         if s[i] < t[i] {
             return 1
         } else if s[i] > t[i] {
             return -1
         }
     }
     if slen == tlen {
         return 0
     } else if slen < tlen {
         return 1
     } else if tlen > tlen {
         return -1
     }
     return 0
}

func swap(array []string, x int, y int) {
     var TBUF string = array[x]
     array[x]=  array[y]
     array[y] = TBUF
}

func printArray(array []string, start int,end int) {
    var i int
    fmt.Printf("[")
    for i = start; i < end; i++ {
        fmt.Printf("%s, ", array[i])
    }
    if end >= start {
        fmt.Printf("%s", array[end])
    }
    fmt.Printf("]\n")
}

func main() {
    var i int
    if len(os.Args) > 1 && len(os.Args) < 22 {
        var SBUF []string = make([]string, len(os.Args) - 1)
        for i = 0; i < len(os.Args) - 1; i++ {
            SBUF[i] = fmt.Sprintf(os.Args[i+1])
        }
        print("Original array: ")
        printArray(SBUF, 0, len(os.Args) - 2)

        quickSort(SBUF, 0, len(os.Args) - 2)
        print("Sorted array: ")
        printArray(SBUF, 0, len(os.Args) - 2)
    } else if len(os.Args) > 21 {
        fmt.Printf("Given too many items. (The counter of items should be less then 20.)\n")
    }
}
------------------------------------------------


프롬프트> chcp 65001
Active code page: 65001

프롬프트> go run testSort.go 하나 둘 셋 넷
Original array: [하나, 둘, 셋, 넷]
Sorted array: [넷, 둘, 셋, 하나]

프롬프트> go run testSort.go one two three four
Original array: [one, two, three, four]
Sorted array: [four, one, three, two]

프롬프트> chcp 949
활성 코드 페이지: 949

 

 


 

Posted by Scripter
,

초등학교 때 배우는 두 정수의 곱셈표를 만들어 주는 Go 소스이다.

/*
 * Filename: makeMultTable.go
 *
 *     Print a multiplication table.
 *
 *     Execute: go run makeMultTable.go 230 5100
 *
 *    or
 *
 *     Compile: go build makeMultTable.go
 *     Execute: ./makeMultTable 230 5100
 *
 * Date: 2012/06/28
 * Author: pkim (AT) scripts.pe.kr
 */
 
package main

import (
    "fmt"
    "os"
    "strconv"
)
   
func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func main() {
    var x, y int64
    if len(os.Args) >= 3 {
        x = atoi(os.Args[1])
        y = atoi(os.Args[2])
        print("\n")
        printMultTable(x, y)
    } else {
        printUsing()
   }
}

func atoi(s string) int64 {
    var n int
    n, _ = strconv.Atoi(s)
    return int64(n)
}

func printUsing() {
    print("Using: makeMultTable [number1] [number2]\n")
    print("Print a multiplication table for the given two integers.\n");
}

func printMultTable(x, y int64) {
    var nx, ny int64
    var z int64
    var ntail1 int
    var ntail2 int
    var y1 int
    var i int
    var strX string
    var strY string
    var strZ string
    var strT string
    var zeros string
    var whites string
    var bars string
    var line1 string
    var line2 string
    var line3 string
    var line4 string
    var loffset string
    var buf string

    nx = x
    if x < 0 { nx = -x }
    ny = y
    if y < 0 { ny = - y }
    ntail1 = 0
    ntail2 = 0
    for nx % 10 == 0 {
        nx = nx / 10
        ntail1 += 1
    }
    for ny % 10 == 0 {
        ny = ny / 10
        ntail2 += 1
    }
    z = nx * ny
    strZ = fmt.Sprintf("%d", z)
    strX = fmt.Sprintf("%d", nx)
    strY = fmt.Sprintf( "%d", ny)
    zeros = "0000000000000000000000000000000000000000"
    whites = "                                        "
    bars = "----------------------------------------"
    loffset =  "       "
    line4 = fmt.Sprintf("%s%d", loffset, nx*ny)
    buf = zeros[:ntail1 + ntail2]
    line4 += buf
    line1 = loffset
    buf = whites[:len(strZ) - len(strX)]
    buf += strX
    line1 += buf
    buf =  zeros[:ntail1]
    line1 += buf

    line2 = "   x ) "
    buf = whites[:len(strZ) - len(strY)]
    buf += strY
    line2 += buf
    buf = zeros[:ntail2]
    line2 += buf

    line3 = "     --"
    buf = bars[:len(strZ)]
    line3 += buf

    println(line1)
    println(line2)
    println(line3)
    if len(strY) > 1 {
        for i = 0; i < len(strY); i++ {
         buf = string(strY[len(strY) - i - 1])
            y1 = int(atoi(buf))
            if y1 != 0 {
                strT = fmt.Sprintf("%d", nx * int64(y1))
                line2 = loffset
                buf = whites[:len(strZ) - len(strT) - i]
                buf += strT
                line2 += buf
                println(line2)
            }
        }
        println(line3)
    }
    println(line4)
}



실행> go run makeMultTable.go 230 5100
또는

컴파일> go build makeMultTable.go
실행> ./makeMultTable 230 5100
결과>

          230
   x )   5100
     ------
         23
       115
     ------
       1173000

 


 

Posted by Scripter
,

다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 Go 언어 소스 코드이다.
나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다.


  1. /*
  2.  *  Filename: makeDivisionTable.go
  3.  *
  4.  *  Purpose:  Make a division table in a handy written form.
  5.  *
  6.  *  Execute: go run makeDivisionTable 12345 32
  7.  *  Execute: go run makeDivisionTable 500210 61
  8.  *
  9.  *  or
  10.  *
  11.  *  Compile:  go build makeDivisionTable.go
  12.  *  Execute: ./makeDivisionTable 12345 32
  13.  *  Execute:  ./makeDivisionTable 500210 61
  14.  *
  15.  *     Date:  2012/06/27
  16.  *   Author:  PH Kim   [ pkim ((AT)) scripts.pe.kr ]
  17.  */
  18. package main
  19. import (
  20.     "fmt"
  21.     "os"
  22.     "strings"
  23.     "bytes"
  24.     "strconv"
  25. )
  26. func println(s string) {
  27.     fmt.Printf("%s\n", s)
  28. }
  29. func print(s string) {
  30.     fmt.Printf("%s", s)
  31. }
  32. func printUsage() {
  33.     println("Using: makeDivisionTable [numerator] [denominator]");
  34.     println("Make a division table in a handy written form.");
  35.     // println("사용법: makeDivisionTable [피제수] [제수]");
  36.     // println("손으로 작성한 형태의 나눗셈 표를 만들어준다.");
  37. }
  38. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  39. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  40. func simplify(v float64,width int) string {
  41.     var n, leng int
  42.     var t string = "                               ";
  43.     var tmp string = "                               "
  44.     t = fmt.Sprintf("%g", v)
  45.     n = len(t)
  46.     if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
  47.         t = t[:n-2]
  48.     }
  49.     leng = len(t)
  50.     tmp = t
  51.     if leng < width {
  52.         t = string(bytes.Repeat([]byte{' '}, width - leng))
  53.         t += tmp
  54.     }
  55.     return t
  56. }
  57. // 발음상 숫자에 맞는 주어 조사 "은", "는"을 결정한다.
  58. func getSuffix(v int64) string {
  59.     var buf string
  60.     var t int64 = v % 10
  61.     var suffix = "   "
  62.     var tbuf = "  "
  63.     var suf []string = []string { "은",  "는"}
  64.     suffix = suf[0]
  65.     tbuf = fmt.Sprintf("%d", t)
  66.     if strings.ContainsAny("2459", tbuf[0:1]) {
  67.         suffix = suf[1]
  68.     }
  69.     buf = suffix
  70.     return buf
  71. }
  72. func atoi(s string) int64 {
  73.     var n int
  74.     n, _ = strconv.Atoi(s)
  75.     return int64(n)
  76. }
  77. func makeTable(numer int64, denom int64, quotient int64) int64 {
  78.     var sbuf string
  79.     var strNumer string
  80.     var strDenom string
  81.     var strQuotient string
  82.     var strTmpR string;
  83.     var whiteChars string = "                                                                                 ";
  84.     var underbarChars string  = "_________________________________________________________________________________";
  85.     var barChars string  = "---------------------------------------------------------------------------------";
  86.     var offsetSpaces string
  87.     var biasSpaces string
  88.     var uline string;
  89.     var sline string
  90.     var i int
  91.     var lenN int
  92.     var lenD int
  93.     var lenQ int
  94.     var offsetLeft int
  95.     var bias int
  96.     var tmpR int64
  97.     var tmpSub int64
  98.     var oneDigit byte
  99.     strNumer = fmt.Sprintf("%d", numer)
  100.     strDenom = fmt.Sprintf("%d", denom)
  101.     strQuotient = fmt.Sprintf("%d", quotient)
  102.     lenN = len(strNumer)
  103.     lenD = len(strDenom)
  104.     lenQ = len(strQuotient)
  105.     offsetLeft = 3 + lenD + 3;
  106.     bias = lenN - lenQ
  107.     offsetSpaces = whiteChars[:offsetLeft]
  108.     biasSpaces = whiteChars[:bias]
  109.     uline = underbarChars[: lenN + 2]
  110.     sline = barChars[:lenN]
  111.     fmt.Printf("%s%s%d\n", offsetSpaces, biasSpaces, quotient)
  112.     sbuf = offsetSpaces[:offsetLeft - 2]
  113.     fmt.Printf("%s%s\n", sbuf, uline)
  114.     fmt.Printf("   %s ) %s", strDenom, strNumer)
  115.     strTmpR = strNumer[:bias + 1]
  116.     tmpR = atoi(strTmpR)
  117.     tmpSub = 0
  118.     for i = 0; i < lenQ; i++ {
  119.         if strQuotient[i] == '0' {
  120.             if i + 1 < lenQ {
  121.                 oneDigit = strNumer[bias + i + 1]
  122.                 fmt.Printf("%c", oneDigit)
  123.                 sbuf = fmt.Sprintf("%c", oneDigit)
  124.                 strTmpR += sbuf
  125.                 tmpR = atoi(strTmpR)
  126.             }
  127.         } else {
  128.             println("")
  129.             tmpSub = int64(strQuotient[i] - '0') * denom
  130.             fmt.Printf("%s%s\n", offsetSpaces, simplify(float64(tmpSub), bias + i + 1))
  131.             fmt.Printf("%s%s\n", offsetSpaces, sline)
  132.             tmpR = tmpR - tmpSub
  133.             if tmpR == 0 && i + 1 < lenQ {
  134.                 sbuf = whiteChars[:bias + i + 1]
  135.                 fmt.Printf("%s%s", offsetSpaces, sbuf)
  136.             } else {
  137.                 fmt.Printf("%s%s", offsetSpaces, simplify(float64(tmpR), bias + i + 1))
  138.             }
  139.             strTmpR = fmt.Sprintf("%d", tmpR)
  140.             if i + 1 < lenQ {
  141.                 oneDigit = strNumer[bias + i + 1]
  142.                 fmt.Printf("%c", oneDigit)
  143.                 sbuf = fmt.Sprintf("%c", oneDigit)
  144.                 strTmpR += sbuf
  145.                 tmpR = atoi(strTmpR)
  146.             }
  147.         }
  148.     }
  149.     println("")
  150.     return tmpR
  151. }
  152. // Go 언어의 실행 시작 지점
  153. func main() {
  154.     var a, b, q, r, k int64
  155.     var mbuf string
  156.     if len(os.Args) < 3 {
  157.         printUsage()
  158.         // os.Exit(1)
  159.         return
  160.     }
  161.     a = atoi(os.Args[1])
  162.     b = atoi(os.Args[2])
  163.     if a <= 0 {
  164.         /// fmt.Printf("피제수: %d\n", a)
  165.         /// println("피제수는 양의 정수라야 합니다.")
  166.         fmt.Printf("dividend: %d\n", a)
  167.         println("The dividend should be a positive integer.")
  168.         // os.Exit(1)
  169.         return
  170.     }
  171.     if b <= 0 {
  172.         /// fmt.Printf("제수: %d\n", b)
  173.         /// println("제수는 양의 정수라야 합니다.")
  174.         fmt.Printf("divider: %d\n", b)
  175.         println("The divider should be a positive integer.") 
  176.         // os.Exit(1)
  177.         return
  178.     }
  179.     q = a / b
  180.     r = a % b
  181.     /// fmt.Printf("나눗셈 %d ÷ %d 의 결과: ", a, b)
  182.     /// fmt.Printf("몫: %d, ", q)
  183.     /// fmt.Printf("나머지: %d\n", r)
  184.     fmt.Printf("The result of division %d / %d: ", a, b)
  185.     fmt.Printf("quotient: %d, ", q)
  186.     fmt.Printf("remainder: %d\n", r)
  187.     println("")
  188.     k = makeTable(a, b, q)
  189.     if k == r {
  190.         /// fmt.Printf("\n나머지: %d\n", k)
  191.         fmt.Printf("\nRemainder is %d\n", k)
  192.     }
  193.     if k == 0 {
  194.         fmt.Printf("%d = %d x %d\n", a, b, q)
  195.         mbuf = getSuffix(a)
  196.         mbuf = fmt.Sprintf("%s", mbuf)
  197.         /// fmt.Printf("%d%s %d의 배수(mupltiple)이다.\n", a, mbuf, b)
  198.         /// mbuf = getSuffix(b)
  199.         /// fmt.Printf("%d%s %d의 약수(divisor)이다.\n", b, mbuf, a)
  200.         fmt.Printf("%d is a multiple of %d.\n", a, b)
  201.         fmt.Printf("%d is a divisor of %d.\n", b, a)
  202.     } else {
  203.         mbuf = getSuffix(a)
  204.         fmt.Printf("%d = %d x %d + %d\n", a, b, q, r)
  205.         /// fmt.Printf("%d%s %d의 배수(mupltiple)가 아니다.\n", a, mbuf, b)
  206.         fmt.Printf("%d is not a multiple of %d.\n", a, b)
  207.     }
  208. }




실행> go run makeDivisionTable.go 500210 61

또는

컴파일> go build makeDivisionTable.go

실행> ./makeDivisionTable.go 500210 61

The result of division 500210 / 61: quotient: 8200, remainder: 10 8200 ________ 61 ) 500210 488 ------ 122 122 ------ 10 Remainder is 10 500210 = 61 x 8200 + 10 500210 is not a multiple of 61.
Posted by Scripter
,

자바에서 Math.sqrt() 메소드로 제곱근을 구하고,  Math.cbrt() 메소드로 세제곱근을 구하듯이, Go 언어에서도 math.Sqrt() 함수로 제곱근을 구하고,  math.Cbrt() 함수로 세제곱근을 구할 수 있다. 하지만 네제곱근이나 n제곱근을 구할려면 대신, math.Pow() 함수를 사용할 수 밖에 없다.

가령 2의 4제곱근을 구하려면
       math.Pow(2.0, 1.0/4.0)
로 한다. math.Pow() 함수 속에는 정수형 숫자가 허용되지 않기에, 2는 (float64 상수 리터럴) 2.0 으로 표현해야 한다.

5의 세제곱근을 구하려면
        math.Pow(5.0, 1.0/3.0)
로 한다.

Go 언어로 3제곱근, 4제곱근, n제곱근 구하는 예제


소스 파일명: example.go

#include <stdio.h>
package main
import (
     "fmt"
    "math"
)
   
func main() {
  /// fmt.Printf("5의 세제곱근: %.16f\n",  math.Pow(5.0, 1.0/3.0))
  fmt.Printf("The cbrt of 5: %.16f\n",  math.Pow(5.0, 1.0/3.0))
  // 출력 결과: 1.7099759466766968
  // 검산
  /// fmt.Printf("5의 세제곱근의 세제곱: %.16f\n", math.Pow(1.7099759466766968, 3.0))
  fmt.Printf("The cube of cbrt of 5: %.16f\n", math.Pow(1.7099759466766968, 3.0))
  // 출력 결과: 4.9999999999999981
 
  /// fmt.Printf("\n\n\n\t< 2의 n제곱근 표 >\n\n");
  fmt.Printf("\n\n\n\t< Table of two' square roots >\n\n");
  var n float64
  for n = 2.0; n <= 20.0; n++ {
    /// fmt.Printf("2의 %2.0f제곱근 = %.16f\n", n, math.Pow(2.0, 1.0 / n))
    fmt.Printf("The %2.0f-th root of 2 is %.16f\n", n, math.Pow(2.0, 1.0 / n))
  }
}




컴파일 및 실행 결과 화면:

$ go build example.go
$ ./example
5의 세제곱근: 1.7099759466766968
The cbrt of 5: 1.7099759466766968
The cube of cbrt of 5: 4.9999999999999991
 
        < Table of two' square roots >
The  2-th root of 2 is 1.4142135623730951
The  3-th root of 2 is 1.2599210498948732
The  4-th root of 2 is 1.1892071150027210
The  5-th root of 2 is 1.1486983549970351
The  6-th root of 2 is 1.1224620483093730
The  7-th root of 2 is 1.1040895136738123
The  8-th root of 2 is 1.0905077326652577
The  9-th root of 2 is 1.0800597388923061
The 10-th root of 2 is 1.0717734625362931
The 11-th root of 2 is 1.0650410894399627
The 12-th root of 2 is 1.0594630943592953
The 13-th root of 2 is 1.0547660764816467
The 14-th root of 2 is 1.0507566386532194
The 15-th root of 2 is 1.0472941228206267
The 16-th root of 2 is 1.0442737824274138
The 17-th root of 2 is 1.0416160106505838
The 18-th root of 2 is 1.0392592260318434
The 19-th root of 2 is 1.0371550444461919
The 20-th root of 2 is 1.0352649238413776


 

Posted by Scripter
,

콘솔에 삼각형

         *
       * *
      *   *
     *     *
    *       *
   *         *
  *           *
 *             *
*****************


을 출력하는 Go 언어 컨솔 애플리케이션을 만들어 보자. 이런 소스 코드의 작성은 학원이나 학교에서 프로그래밍 입문자에게 과제로 많이 주어지는 것 중의 하나이다. 코끼리를 보거나 만진 사람들이 저마다 그 생김새를 말할 때 제각기 다르게 표현할 수 있듯이 이런 소스 코드의 작성도 알고 보면 얼마든지 많은 방법이 있을 것이다. 여기서는 쉬운 코드 부터 작성해 보고 차츰차츰 소스를 바꾸어 가면서 Go 언어 프로그래밍의 기초부분을 터득해 보기로 한다.

삼각형 출력 부분을 main() 함수에서 하지 않고, 별도로 구현된 printTriange() 함수에서 하기로 한다.

우선 첫번 째 예제는 Go 언어의 컨솔 출력 함수 fmt.Printf() 의 사용법 만 알면 누구나 코딩할 수 있는 매우 단순한 소스 코드이다.


삼각형 출력 예제 1
/*
 *  Filename: printTriangle1.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle1.go
 *  
 *  or
 *  
 *  Compile: go build printTriangle1.go
 *  Execute: ./printTriangle1
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    println("        *        ")
    println("       * *       ")
    println("      *   *      ")
    println("     *     *     ")
    println("    *       *    ");
    println("   *         *   ")
    println("  *           *  ")
    println(" *             * ")
    println("*****************")
}

func main() {
    printTriange()
}




위의 소스 코드는 아무 알고리즘도 없는 너무 단순한 코드이다. 이런 코드를 작성했다간 출력 모양이나 크기를 변경해야 하는 상황을 맞이하면 위드프로세서로 문서 만드는 것 이상으로 많은 수작업을 하거나 아니면 포기하는 지경에 이를 수도 있다. 그래서 다음 처럼 좀 더 나은 소스 코드를 작성하였다.



삼각형 출력 예제 2
/*
 *  Filename: printTriangle2.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle2.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle2.go
 *  Execute: ./printTriangle2
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var i, k int
    for i = 0; i < 8; i++ {
        for k = 0;  k < 8 - i; k++ {
            print(" ")
        }
        for k = 0;  k < 2*i + 1; k++ {
            if k == 0 || k == 2*i {
                print("*");
            } else {
                print(" ")
            }
        }
        for k = 0;  k < 8 - i; k++ {
            print(" ")
        }
        println("")
    }
    for i = 0; i < 17; i++ {
        print("*")
    }
    println("")
}

func main() {
    printTriange()
}



위의 소스 코드는 컨솔 출력 함수 fmt.Printf() 와  for 구문을 적절히 사용하여 구현되었다. 숫자 몇 곳만 수정하면 출력되는 삼각형의 크기를 바꿀 수 있다. 한 줄에 출력될 문자를 구성하는 알고리즘은 위의 예제와 근본적으로 같지만 string 타입의 변수를 적절히 사용하여 한 즐씩 출력하는 소스 코드를 다음 예제와 같이 작성해 보았다.



삼각형 출력 예제 3
/*
 *  Filename: printTriangle3.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle3.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle3.go
 *  Execute: ./printTriangle3
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var line string = "                 "
    var pline2 string
    var i int
    pline2 = line[0:8] + "*"
    println(pline2)
    for i = 1; i < 8; i++ {
        pline2 = line[0:8-i] + "*" + line[8-i+1:8]
        pline2 += line[0:i] + "*"
        println(pline2)
    }

    pline2 = ""
    for i = 0; i < 17; i++ {
        pline2 += "*"
    }
    println(pline2)
}

func main() {
    printTriange()




별(*) 문자를 이용하여 삼각형을 출력하는 일은 빈칸  문자와 별 문자를 적당한 좌표(위치)에 촐력하는 일이다. 기본 문자열을 빈칸 만으로로 구성된 문자열로 하고, 이 문자열에 한 두 개의 빈칸을 별(*) 문자로 바꾸어 출력하는 기법으로 작성한 것이 다음 소스 코드이다. 단, 마지막 줄에 츨력될 문자열은 stars라는 별도의 변수로 처리하였다.



삼각형 출력 예제 4
/*
 *  Filename: printTriangle4.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle4.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle4.go
 *  Execute: ./printTriangle4
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var whites string = "                 ";
    var stars string  = "*****************";
    var line2 string
    var i int
    println(whites[0:8]+"*"+whites[9:]);
    for i = 1; i < 8; i++ {
        line2 = whites;
        println(line2[:8-i] + "*"  + line2[8-i+1:8+i] + "*" + line2[8+i+1:]);
    }
    println(stars);
}

func main() {
    printTriange()
}




빈칸 문자를 별(*) 문자로 바꾸기 위해, 위의 소스 코드에서는 line2 변수에 whites 의 스트링 값을 통째로 저장하여 출력하였지만, 다음 소스 코드에서는 line2 변수에 출력될 스트링값을 만든어 저장한 후 line2를 출력하였다.



삼각형 출력 예제 5
/*
 *  Filename: printTriangle5.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle5.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle5.go
 *  Execute: ./printTriangle5
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var whites string = "                 ";
    var stars string  = "*****************";
    var line2 string
    var i int
    var start int = 8
    line2 = whites[0:start]+"*"+whites[start+1:]
    println(line2);
    for i = 1; i < 8; i++ {
        line2 = whites[0:start-i]+"*"+whites[start-i+1:start+i] + "*" + line2[start+i+1:]
        println(line2)
    }
    println(stars)
}

func main() {
    printTriange()
}




출력되는 삼각형이 좌우 대칭이라는 사실에 착안하여, 다음 소스 코드에서는 각 줄을 처음 8자, 중앙 한 문자, 끝 8자(처음 8자의 역순)로 string을 만들어 출력하였다.



삼각형 출력 예제 6
/*
 *  Filename: printTriangle6.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle6.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle6.go
 *  Execute: ./printTriangle6
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func reverse(s string) string {
    var n int = len(s)
    var t string = ""
    var i int
    for i = 0; i < n; i++ {
        t += s[n - i - 1:n-i]
    }
    return t
}

func printTriange() {
    var whites string = "        "
    var stars string  = "********"
    var line2 string
    var i int
    var start int = 8
    line2 = whites + "*" + whites
    println(line2);
    for i = 1; i < 8; i++ {
        line2 = whites[0:start-i]+"*"+whites[start-i+1:]
        print(line2)
        line2 = reverse(line2)
        println(" " + line2)
    }
    println(stars + "*" + stars)
}

func main() {
    printTriange()
}




다음 소스 코드는 한 줄에 출력될 문자열의 데이터를 17비트 이진법 수로 구성하고, 이 이진법수의 비트가 0인 곳에는 빈칸을, 1인 곳에는 별(*)을 출력하는 기법으로 작성되었다.



삼각형 출력 예제 7
/*
 *  Filename: printTriangle7.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle7.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle7.go
 *  Execute: ./printTriangle7
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func convertItoA(num int64, radix int) (ret string) {
    var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var tmp string
    var arr string
    var q, r int64
    var i, n int
    var isNegative bool = false

    if num < 0 {
        isNegative = true
        num = -num
    }
    arr = ""
    q = num
    r = 0

    for q >= int64(radix) {
        r = q % int64(radix)
        q = q / int64(radix)
        tmp = BASE36[r:r+1]
        arr += tmp
    }
    tmp = BASE36[q:q+1]
    arr += tmp
    if isNegative {
        arr += "-"
    }

    n = len(arr)
    for i = 0; i < n; i++ {
        ret += arr[n - i - 1:n-i]
    }
    return ret
}

func convertAtoI(str string, radix int) (ret int64) {
    var isNegative bool = false
    var len int = len(str)
    var c byte
    var i int
    var val int64

    c = str[0]
    if c == '-' {
        isNegative = true
    } else if c >= '0' && c <= '9' {
        ret = int64(c) - int64('0');
    } else if c >= 'A' && c <= 'Z' {
        ret = int64(c - 'A') + 10
    } else if c >= 'a' && c <= 'z' {
        ret = int64(c - 'a') + 10;
    }
    if ret >= int64(radix) {
        println("        Invalid character!")
        return ret
    }

    for i = 1; i < len; i++ {
        c = str[i]
        ret *= int64(radix)
        if c >= '0' && c <= '9' {
            val = int64(c - '0')
        } else if c >= 'A' && c <= 'Z' {
            val = int64(c - 'A') + 10
        } else if c >= 'a' && c <= 'z' {
            val = int64(c - 'a') + 10
        }
        if val >= int64(radix) {
            println("        Invalid character!")
            return ret
        }
        ret += val
    }

    if isNegative {
        ret = -ret
    }
   
    return ret
}

func printTriange() {
    var start int = 0x100
    var total int64 = 0
    var val int64 = int64(start)
    var data string
    var i int
    var k uint

    for k = 0; k < 8; k++ {
        val = int64((start << k) | (start >> k))
        data = convertItoA(val, 2);
        for i = 0; i < 17 - len(data); i++ {
            print(" ")
        }
        for i = 0; i < len(data); i++ {
            if data[i] == '0' {
                print(" ")
            } else {
                print("*")
            }
        }
        println("")
        total |= val
    }
    val = int64((start << 8) | (start >> 8))
    total |= val
    data = convertItoA(total, 2)
    for i = 0; i < 17 - len(data); i++ {
        print(" ")
    }
    for i = 0; i < len(data); i++ {
        if data[i] == '0' {
            print(" ")
        } else {
            print("*")
        }
    }
    println("")
}

func main() {
    printTriange()
}




기본적인 원리는 위의 소스 코드와 같지만 이진법수의 한 비트 마다 한 문자씩 츨력하는 대신에 출력된 한 줄의 문자열을 완성하여 이를 fmt.Printf() 로 출력하는 기법으로 재작성한 것이 다음의 소스 코드이다. 자체 구현된 replaceAll() 함수를 이용하여, 모든 0을 빈칸으로, 모든 1을 별(*) 문자로 바꾸었으며, 별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 total을 준비하였다. for 반복 구문의 블럭 내에서 구문

            total |= val

이 하는 일이 무엇인지 이해할 수 있으면 좋다.




삼각형 출력 예제 8
/*
 *  Filename: printTriangle8.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle8.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle8.go
 *  Execute: ./printTriangle8
 *
 *      Date:  2012/06/26
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func convertItoA(num int64, radix int) (ret string) {
    var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var tmp string
    var arr string
    var q, r int64
    var i, n int
    var isNegative bool = false

    if num < 0 {
        isNegative = true
        num = -num
    }
    arr = ""
    q = num
    r = 0

    for q >= int64(radix) {
        r = q % int64(radix)
        q = q / int64(radix)
        tmp = BASE36[r:r+1]
        arr += tmp
    }
    tmp = BASE36[q:q+1]
    arr += tmp
    if isNegative {
        arr += "-"
    }

    n = len(arr)
    for i = 0; i < n; i++ {
        ret += arr[n - i - 1:n-i]
    }
    return ret
}

func convertAtoI(str string, radix int) (ret int64) {
    var isNegative bool = false
    var len int = len(str)
    var c byte
    var i int
    var val int64

    c = str[0]
    if c == '-' {
        isNegative = true
    } else if c >= '0' && c <= '9' {
        ret = int64(c) - int64('0');
    } else if c >= 'A' && c <= 'Z' {
        ret = int64(c - 'A') + 10
    } else if c >= 'a' && c <= 'z' {
        ret = int64(c - 'a') + 10;
    }
    if ret >= int64(radix) {
        println("        Invalid character!")
        return ret
    }

    for i = 1; i < len; i++ {
        c = str[i]
        ret *= int64(radix)
        if c >= '0' && c <= '9' {
            val = int64(c - '0')
        } else if c >= 'A' && c <= 'Z' {
            val = int64(c - 'A') + 10
        } else if c >= 'a' && c <= 'z' {
            val = int64(c - 'a') + 10
        }
        if val >= int64(radix) {
            println("        Invalid character!")
            return ret
        }
        ret += val
    }

    if isNegative {
        ret = -ret
    }
   
    return ret
}

func replaceAll(str string, s string, t string) string {
    var val string = ""
    var n int = len(s)
    var i int
    for i = 0; i < len(str); i++ {
        if i + n <= len(str) && str[i:i+n] == s {
            val += t
            i += n -1
        } else {
            val += str[i:i+1]
        }
    }
    return val
}

func printTriange() {
    var zeros string = "00000000"
    var start int = 0x100
    var total int64 = 0
    var val int64 = int64(start)
    var data string
    var line string
    var k uint

    for k = 0; k < 8; k++ {
        val = int64((start << k) | (start >> k))
        data = convertItoA(val, 2)
        line = zeros[0: 17 - len(data)]
        line += data
        line = replaceAll(line, "0", " ")
        line = replaceAll(line, "1", "*")
        println(line)
        total |= val
    }

    val = int64((start << 8) | (start >> 8))
    total |= val;
    line = convertItoA(total, 2)
    line = replaceAll(line, "0", " ")
    line = replaceAll(line, "1", "*")
    println(line)
}

func main() {
    printTriange()
}




심각형의 좌우 대칭성과 []byte 타입의 자료를 이용하여 한 줄씩 출력하는 기법이다.
별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 last를 준비하였다.



삼각형 출력 예제 9
/*
 *  Filename: printTriangle9.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle9.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle9.go
 *  Execute: ./printTriangle9
 *
 *      Date:  2012/06/27
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
    "bytes"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var WIDTH int = 17
    var start int = 8
    var data []byte = bytes.Repeat([]byte{' '}, WIDTH)
    var last []byte = bytes.Repeat([]byte{'*'}, WIDTH)
    var i, k int

    for k = 0; k < WIDTH; k++ {
         data[k] = ' '
         last[k] = ' '
    }
    data[start] = '*'
    last[start] = '*'
    for i = 0; i < WIDTH; i++ {
        fmt.Printf("%c", data[i])
    }
    println("")
    data[start] = ' '

    for k = 1; k < WIDTH/2; k++ {
        data[start - k] = '*'
        last[start - k] = '*'
        data[start + k] = '*'
        last[start + k] = '*'

        for i = 0; i < WIDTH; i++ {
            fmt.Printf("%c", data[i])
        }
        println("")
        data[start - k] = ' '
        data[start + k] = ' '
    }

    last[start - WIDTH/2] = '*'
    last[start + WIDTH/2] = '*'
    for i = 0; i < WIDTH; i++ {
        fmt.Printf("%c", last[i])
    }
    println("")
}

func main() {
    printTriange();
}




다음 예제는 수학에서 xy-좌표평면에 점을 찍듯이 논리 구문

             (x + y - 8 == 0) || (y - x + 8 == 0) || (y - 8 == 0)

가 참이 되는 위치에 별(*) 문자를 표시하는 기법으로 작성된 소스 코드이다.




삼각형 출력 예제 10
/*
 *  Filename: printTriangle10.go
 *            Print a triangle on console.
 *
 *  Execute: go run printTriangle10.go
 * 
 *  or
 * 
 *  Compile: go build printTriangle10.go
 *  Execute: ./printTriangle10
 *
 *      Date:  2012/06/27
 *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
 */

package main

import (
    "fmt"
)

func println(s string) {
    fmt.Printf("%s\n", s)
}

func print(s string) {
    fmt.Printf("%s", s)
}

func printTriange() {
    var a byte
    var x, y int

    for y = 0; y <= 8; y++ {
        for x = 0; x <= 16; x++ {
            if (x + y - 8 == 0) || (y - x + 8 == 0) || (y - 8 == 0) {
                a = '*';
            } else {
                a = ' ';
            }
            fmt.Printf("%c", a)
        }
        println("")
    }
}

func main() {
    printTriange();
}



Posted by Scripter
,

ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다.  이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다.  ( 참고:  ASCII - Wikipedia, the free encyclopedia )

다음은  7bit ASCII 코드표를 만들어 보여주는 Go 언어 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수

        convertAtoI()
        convertItoA()

의 구현도 포함되어 있다.



  1. /*
  2.  *  Filename: makeAsciiTable.go
  3.  *            Make a table of ascii codes.
  4.  *
  5.  *  Execute: go run makeAsciiTable.go
  6.  *
  7.  *  or
  8.  *
  9.  *  Compile: go build makeAsciiTable.go
  10.  *  Execute: ./makeAsciiTable
  11.  *
  12.  *      Date:  2012/06/25
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19. )   
  20. func println(s string) {
  21.     fmt.Printf("%s\n", s)
  22. }
  23. func print(s string) {
  24.     fmt.Printf("%s", s)
  25. }
  26. func printUsage() {
  27.     println("Usage: makeAsciiTable")
  28.     println("Make a table of ascii codes.")
  29. }
  30. func convertItoA(num int64, radix int) (ret string) {
  31.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  32.     var tmp string
  33.     var arr string
  34.     var q, r int64
  35.     var i, n int
  36.     var isNegative bool = false
  37.     if num < 0 {
  38.         isNegative = true
  39.         num = -num
  40.     }
  41.     arr = ""
  42.     q = num
  43.     r = 0
  44.     for q >= int64(radix) {
  45.         r = q % int64(radix)
  46.         q = q / int64(radix)
  47.         tmp = BASE36[r:r+1]
  48.         arr += tmp
  49.     }
  50.     tmp = BASE36[q:q+1]
  51.     arr += tmp
  52.     if isNegative {
  53.         arr += "-"
  54.     }
  55.     n = len(arr)
  56.     for i = 0; i < n; i++ {
  57.         ret += arr[n - i - 1:n-i]
  58.     }
  59.     return ret
  60. }
  61. func convertAtoI(str string, radix int) (ret int64) {
  62.     var isNegative bool = false
  63.     var len int = len(str)
  64.     var c byte
  65.     var i int
  66.     var val int64
  67.     c = str[0]
  68.     if c == '-' { 
  69.         isNegative = true
  70.     } else if c >= '0' && c <= '9' {
  71.         ret = int64(c) - int64('0');
  72.     } else if c >= 'A' && c <= 'Z' {
  73.         ret = int64(c - 'A') + 10
  74.     } else if c >= 'a' && c <= 'z' {
  75.         ret = int64(c - 'a') + 10;
  76.     }
  77.     if ret >= int64(radix) {
  78.         println("        Invalid character!")
  79.         return ret
  80.     }
  81.     for i = 1; i < len; i++ {
  82.         c = str[i]
  83.         ret *= int64(radix)
  84.         if c >= '0' && c <= '9' {
  85.             val = int64(c - '0')
  86.         } else if c >= 'A' && c <= 'Z' {
  87.             val = int64(c - 'A') + 10
  88.         } else if c >= 'a' && c <= 'z' {
  89.             val = int64(c - 'a') + 10
  90.         }
  91.         if val >= int64(radix) {
  92.             println("        Invalid character!")
  93.             return ret
  94.         }
  95.         ret += val
  96.     }
  97.     if isNegative {
  98.         ret = -ret
  99.     }
  100.     return ret
  101. }
  102. func makeTable() {
  103.      var asc = [...] string {
  104.      "NUL", "SOH", "STX", "ETX", "EOT",
  105.      "ENQ", "ACK", "BEL", "BS", "HT",
  106.      "LF", "VT", "FF", "CR", "SO",
  107.      "SI", "DLE", "DC1", "DC2", "DC3",
  108.      "DC4", "NAK", "SYN", "ETB", "CAN",
  109.      "EM", "SUB", "ESC", "FS", "GS",
  110.      "RS", "US", "Spc"  }
  111.     var control = [...]string{
  112.         "NUL (null)",
  113.         "SOH (start of heading)",
  114.         "STX (start of text)",
  115.         "ETX (end of text)",
  116.         "EOT (end of transmission)",
  117.         "ENQ (enquiry)",
  118.         "ACK (acknowledge)",
  119.         "BEL (bell)",
  120.         "BS  (backspace)",
  121.         "TAB (horizontal tab)",
  122.         "LF  (line feed, NL new line)",
  123.         "VT  (vertical tab)",
  124.         "FF  (form feed, NP new page)",
  125.         "CR  (carriage return)",
  126.         "SO  (shift out)",
  127.         "SI  (shift in)",
  128.         "DLE (data link escape)",
  129.         "DC1 (device control 1)",
  130.         "DC2 (device control 2)",
  131.         "DC3 (device control 3)",
  132.         "DC4 (device control 4)",
  133.         "NAK (negative acknowledge)",
  134.         "SYN (synchronous idle)",
  135.         "ETB (end of trans. block)",
  136.         "CAN (cancel)",
  137.         "EM  (end of medium)",
  138.         "SUB (substitute, EOF end of file)",
  139.         "ESC (escape)",
  140.         "FS  (file separator)",
  141.         "GS  (group separator)",
  142.         "RS  (record separator)",
  143.         "US  (unit separator)"   }
  144.     var sbuf, abuf, tbuf string
  145.     var i, j int
  146.     var c byte
  147.     print("    ");
  148.     for i = 0; i < 8; i++ {
  149.         print("+----")
  150.     }
  151.     print("+")
  152.     println("")
  153.     print("    ")
  154.     print("| 0- ");
  155.     print("| 1- ");
  156.     print("| 2- ");
  157.     print("| 3- ");
  158.     print("| 4- ");
  159.     print("| 5- ");
  160.     print("| 6- ");
  161.     print("| 7- ");
  162.     print("|")
  163.     println("")
  164.     print("+---")
  165.     for i = 0; i < 8; i++ {
  166.         print("+----")
  167.     }
  168.     print("+")
  169.     println("")
  170.     for i = 0; i < 16; i++ {
  171.         tbuf = ""
  172.         sbuf = convertItoA(int64(i), 16)
  173.         tbuf += "| "
  174.         tbuf += sbuf
  175.         tbuf += " "
  176.         for j = 0; j < 8; j++ {
  177.             if j*16 + i <= 32 {
  178.                 abuf = fmt.Sprintf("| %-3s", asc[j*16 + i])
  179.             } else if (j*16 + i == 127) {
  180.                 abuf = fmt.Sprintf("| %-3s", "DEL")
  181.             } else {
  182.                 c = byte(j*16 + i)
  183.                 abuf = fmt.Sprintf("| %2c ", c);
  184.             }
  185.             tbuf += abuf
  186.         }
  187.         tbuf += "|"
  188.         println(tbuf)
  189.     }
  190.     print("+---")
  191.     for i = 0; i < 8; i++ {
  192.         print("+----")
  193.     }
  194.     print("+")
  195.     println("")
  196.     println("")
  197.     for i = 0; i < 16; i++ {
  198.         sbuf = fmt.Sprintf("%-30s",  control[i])
  199.         tbuf = fmt.Sprintf("  %-34s",  control[i+16])
  200.         print(sbuf)
  201.         println(tbuf)
  202.     }
  203. }
  204. func main() {
  205.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  206.         printUsage()
  207.         os.Exit(1)
  208.     }
  209.     makeTable()
  210. }




실행> go run makeAsciiTable.go

또는

컴파일> go build makeAsciiTable.go

실행> ./makeAsciiTable

    +----+----+----+----+----+----+----+----+
    | 0- | 1- | 2- | 3- | 4- | 5- | 6- | 7- |
+---+----+----+----+----+----+----+----+----+
| 0 | NUL| DLE| Spc|  0 |  @ |  P |  ` |  p |
| 1 | SOH| DC1|  ! |  1 |  A |  Q |  a |  q |
| 2 | STX| DC2|  " |  2 |  B |  R |  b |  r |
| 3 | ETX| DC3|  # |  3 |  C |  S |  c |  s |
| 4 | EOT| DC4|  $ |  4 |  D |  T |  d |  t |
| 5 | ENQ| NAK|  % |  5 |  E |  U |  e |  u |
| 6 | ACK| SYN|  & |  6 |  F |  V |  f |  v |
| 7 | BEL| ETB|  ' |  7 |  G |  W |  g |  w |
| 8 | BS | CAN|  ( |  8 |  H |  X |  h |  x |
| 9 | HT | EM |  ) |  9 |  I |  Y |  i |  y |
| A | LF | SUB|  * |  : |  J |  Z |  j |  z |
| B | VT | ESC|  + |  ; |  K |  [ |  k |  { |
| C | FF | FS |  , |  < |  L |  \ |  l |  | |
| D | CR | GS |  - |  = |  M |  ] |  m |  } |
| E | SO | RS |  . |  > |  N |  ^ |  n |  ~ |
| F | SI | US |  / |  ? |  O |  _ |  o | DEL|
+---+----+----+----+----+----+----+----+----+

NUL (null)                      DLE (data link escape)
SOH (start of heading)          DC1 (device control 1)
STX (start of text)             DC2 (device control 2)
ETX (end of text)               DC3 (device control 3)
EOT (end of transmission)       DC4 (device control 4)
ENQ (enquiry)                   NAK (negative acknowledge)
ACK (acknowledge)               SYN (synchronous idle)
BEL (bell)                      ETB (end of trans. block)
BS  (backspace)                 CAN (cancel)
TAB (horizontal tab)            EM  (end of medium)
LF  (line feed, NL new line)    SUB (substitute, EOF end of file)
VT  (vertical tab)              ESC (escape)
FF  (form feed, NP new page)    FS  (file separator)
CR  (carriage return)           GS  (group separator)
SO  (shift out)                 RS  (record separator)
SI  (shift in)                  US  (unit separator)



 

Posted by Scripter
,