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

        convertAtoI(string, radix)
        convertItoA(int64, radix)

를 Go 언어 코드로 자체 작성하여 사용하였다.


  1. /*
  2.  *  Filename: makeRadixTable.go
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Execute: go run makeRadixTable.go
  6.  *
  7.  *  or
  8.  *
  9.  *  Compile: go build makeRadixTable.go
  10.  *  Execute: ./makeRadixTable
  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. type _TOKEN struct {
  21.     a string
  22.     b string
  23. }
  24. func println(s string) {
  25.     fmt.Printf("%s\n", s)
  26. }
  27. func print(s string) {
  28.     fmt.Printf("%s", s)
  29. }
  30. func printUsage() {
  31.     println("Usage: makeRadixTable")
  32.     println("Show the radix table with 10-, 2-, 8-, 16-radices.")
  33. }
  34. func convertItoA(num int64, radix int) (ret string) {
  35.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  36.     var tmp string
  37.     var arr string
  38.     var q, r int64
  39.     var i, n int
  40.     var isNegative bool = false
  41.     if num < 0 {
  42.         isNegative = true
  43.         num = -num
  44.     }
  45.     arr = ""
  46.     q = num
  47.     r = 0
  48.     for q >= int64(radix) {
  49.         r = q % int64(radix)
  50.         q = q / int64(radix)
  51.         tmp = BASE36[r:r+1]
  52.         arr += tmp
  53.     }
  54.     tmp = BASE36[q:q+1]
  55.     arr += tmp
  56.     if isNegative {
  57.         arr += "-"
  58.     }
  59.     n = len(arr)
  60.     for i = 0; i < n; i++ {
  61.         ret += arr[n - i - 1:n-i]
  62.     }
  63.     return ret
  64. }
  65. func convertAtoI(str string, radix int) (ret int64) { 
  66.     var isNegative bool = false
  67.     var len int = len(str)
  68.     var c byte
  69.     var i int
  70.     var val int64
  71.     c = str[0]
  72.     if c == '-' {
  73.         isNegative = true
  74.     } else if c >= '0' && c <= '9' {
  75.         ret = int64(c) - int64('0');
  76.     } else if c >= 'A' && c <= 'Z' {
  77.         ret = int64(c - 'A') + 10
  78.     } else if c >= 'a' && c <= 'z' {
  79.         ret = int64(c - 'a') + 10;
  80.     }
  81.     if ret >= int64(radix) {
  82.         println("        Invalid character!")
  83.         return ret
  84.     }
  85.     for i = 1; i < len; i++ {
  86.         c = str[i]
  87.         ret *= int64(radix)
  88.         if c >= '0' && c <= '9' {
  89.             val = int64(c - '0')
  90.         } else if c >= 'A' && c <= 'Z' {
  91.             val = int64(c - 'A') + 10
  92.         } else if c >= 'a' && c <= 'z' {
  93.             val = int64(c - 'a') + 10
  94.         }
  95.         if val >= int64(radix) {
  96.             println("        Invalid character!")
  97.             return ret
  98.         }
  99.         ret += val
  100.     }
  101.     if isNegative {
  102.         ret = -ret
  103.     }
  104.     return ret
  105. }
  106. func makeTable() {
  107.     var sbuf, abuf, tbuf string
  108.     var i int
  109.     for i = 0; i < 4; i++ {
  110.         print("+-------")
  111.     }
  112.     print("+")
  113.     println("")
  114.     print("|  Dec")
  115.     print("\t|   Bin")
  116.     print("\t|  Oct")
  117.     print("\t|  Hex  |")
  118.     println("")
  119.     for i = 0; i < 4; i++ {
  120.         print("+-------")
  121.     }
  122.     print("+")
  123.     println("")
  124.     for i = 0; i < 16; i++ {
  125.         sbuf = fmt.Sprintf("|   %2d", i)
  126.         abuf = convertItoA(int64(i), 2)
  127.         tbuf = fmt.Sprintf("\t|  %4s", abuf)
  128.         sbuf += tbuf
  129.         abuf = convertItoA(int64(i), 8)
  130.         tbuf = fmt.Sprintf("\t|   %2s", abuf)
  131.         sbuf += tbuf
  132.         abuf = convertItoA(int64(i), 16)
  133.         tbuf = fmt.Sprintf("\t|    %-2s |", abuf)
  134.         sbuf += tbuf
  135.         println(sbuf)
  136.     }
  137.     for i = 0; i < 4; i++ {
  138.         print("+-------");
  139.     }
  140.     print("+")
  141.     println("")
  142. }
  143. func main() {
  144.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  145.         printUsage()
  146.         os.Exit(1)
  147.     }
  148.     makeTable()
  149. }



실행> go run akeRadixTable.go

컴파일> go build makeRadixTable.go

실행> ./makeRadixTable

+-------+-------+-------+-------+
|  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  |
+-------+-------+-------+-------+



 

Posted by Scripter
,

다음은  대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Go 언어 소스 코드이다.
메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환을 하는 핵심 함수 convertAtoI()와 convertItoA()의 소스가 자체 제작되어 포함되어 있다. 이를 이용하는 부분은 152~153째 줄에 있는 

         val = convertAtoI(s, srcRdx) 
         ret = convertItoA(val, destRdx)

이다. 지원되는 진법은 2진법에서 36진법 까지이다.
    



  1. /*
  2.  *  Filename: convertRadix.go
  3.  *
  4.  *            Convert radix in a interactive mode.
  5.  *
  6.  *  Execute: go run convertRadix.go
  7.  *
  8.  *  or
  9.  *
  10.  *  Compile: go build convertRadix.go
  11.  *  Execute: ./convertRadix
  12.  *
  13.  *      Date:  2012/06/25
  14.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  15.  */
  16. package main
  17. import (
  18.     "fmt"
  19.     "bufio"
  20.     "os"
  21.     "strings"
  22. )   
  23. type _TOKEN struct {
  24.     a string
  25.     b string
  26. }
  27. func println(s string) {
  28.     fmt.Printf("%s\n", s)
  29. }
  30. func print(s string) { 
  31.     fmt.Printf("%s", s)
  32. }
  33. func printUsage() {
  34.     println("Usage: convertRadix")
  35.     println("Convert radix in an interactive mode, where the maximum radix is 36.")
  36. }
  37. func printAbout() {
  38.     println("    About: Convert radix in a interactive mode.")
  39. }
  40. func printMainMenu() {
  41.     println("  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it")
  42. }
  43. func printMainPrompt() {
  44.     print("  Prompt> ")
  45. }
  46. func printSubMenu(srcRadix int, destRadix int) {
  47.     var sbuf string
  48.     fmt.Sprintf(sbuf, "    Convert Radix_%d to Radix_%d", srcRadix, destRadix);
  49.     println(sbuf);
  50.     println("    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit");
  51. }
  52. func printSubPrompt() {
  53.     print("    Input Value>> ");
  54. }
  55. func convertItoA(num int64, radix int) (ret string) {
  56.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  57.     var tmp string
  58.     var arr string
  59.     var q, r int64
  60.     var i, n int
  61.     var isNegative bool = false
  62.     if num < 0 {
  63.         isNegative = true
  64.         num = -num
  65.     }
  66.     arr = ""
  67.     q = num
  68.     r = 0
  69.     for q >= int64(radix) {
  70.         r = q % int64(radix)
  71.         q = q / int64(radix)
  72.         tmp = BASE36[r:r+1]
  73.         arr += tmp
  74.     }
  75.     tmp = BASE36[q:q+1]
  76.     arr += tmp
  77.     if isNegative {
  78.         arr += "-"
  79.     }
  80.     n = len(arr)
  81.     for i = 0; i < n; i++ {
  82.         ret += arr[n - i - 1:n-i]
  83.     }
  84.     return ret
  85. }
  86. func convertAtoI(str string, radix int) (ret int64) {
  87.     var isNegative bool = false
  88.     var len int = len(str)
  89.     var c byte
  90.     var i int
  91.     var val int64
  92.     c = str[0]
  93.     if c == '-' {
  94.         isNegative = true
  95.     } else if c >= '0' && c <= '9' {
  96.         ret = int64(c) - int64('0')
  97.     } else if c >= 'A' && c <= 'Z' {
  98.         ret = int64(c - 'A') + 10
  99.     } else if c >= 'a' && c <= 'z' {
  100.         ret = int64(c - 'a') + 10
  101.     }
  102.     if ret >= int64(radix) {
  103.         println("        Invalid character!")
  104.         return ret
  105.     }
  106.     for i = 1; i < len; i++ {
  107.         c = str[i]
  108.         ret *= int64(radix)
  109.         if c >= '0' && c <= '9' {
  110.             val = int64(c - '0')
  111.         } else if c >= 'A' && c <= 'Z' {
  112.             val = int64(c - 'A') + 10
  113.         } else if c >= 'a' && c <= 'z' {
  114.             val = int64(c - 'a') + 10
  115.         }
  116.         if val >= int64(radix) {
  117.             println("        Invalid character!")
  118.             return ret
  119.         }
  120.         ret += val
  121.     }
  122.     if isNegative {
  123.         ret = -ret
  124.     }
  125.     return ret
  126. }
  127. func convertRadix(s string, srcRdx  int, destRdx int) (ret string) {
  128.     var val int64
  129.     val = convertAtoI(s, srcRdx)
  130.     ret = convertItoA(val, destRdx)
  131.     return ret
  132. }
  133. func readLine() (data string) {
  134.     fmt.Scanf(data, "%s") //
  135.     return data
  136. }
  137. func readTwo() (token _TOKEN) { 
  138.     token.a = ""
  139.     token.b = ""
  140.     fmt.Scanf("%s %s", &token.a, &token.b)    // call twice, is It a bug?
  141.     fmt.Scanf("%s %s", &token.a, &token.b)    // call twice, is It a bug?
  142.     return token
  143. }
  144. func tokenize(ptoken _TOKEN, line string, c byte) {
  145.     var i int
  146.     var from, to int
  147.     i = 0
  148.     for line[i] != c {
  149.         i += 1
  150.     }
  151.     from = i
  152.     for line[i] == c {
  153.         i += 1
  154.     }
  155.     to = i
  156.     ptoken.a = line[0: to - from]
  157.     for line[i] != c {
  158.         i += 1
  159.     }
  160.     from = i
  161.     for line[i] == c {
  162.         i += 1
  163.     }
  164.     to = i
  165.     ptoken.b = line[0: to - from]
  166. }
  167. func doConvert(srcRadix int,destRadix int) {
  168.     var sbuf string
  169.     var cmd string
  170.     var srcStr string
  171.     var destStr string
  172.     println("")
  173.     printSubMenu(srcRadix, destRadix)
  174.     for {
  175.         printSubPrompt()
  176.         cmd = ""
  177.         fmt.Scanf("%s", &cmd)        // call twice, is It a bug?
  178.         for cmd == "" {
  179.             fmt.Scanf("%s", &cmd)       // call twice, is It a bug?
  180.         }
  181.         if cmd == "main()" {
  182.             return
  183.         } else if cmd == "exit()" || cmd == "quit()" {
  184.             os.Exit(0)
  185.         } '
  186.         srcStr = cmd
  187.         destStr = convertRadix(srcStr, srcRadix, destRadix)
  188.         sbuf = fmt.Sprintf("        ( %s )_%d   --->   ( %s )_%d", srcStr, srcRadix, destStr, destRadix);
  189.         println(sbuf)
  190.         println("")
  191.     }
  192. }
  193. func doStart() { 
  194.     var srcRadix int = 10
  195.     var destRadix int = 10 
  196.     var st _TOKEN
  197.     var onlyOnce bool = true
  198.     for {
  199.         println("")
  200.         if onlyOnce {
  201.             println("  The supported maximum radix is 36.")
  202.             onlyOnce = false
  203.         }
  204.         printMainMenu()
  205.         printMainPrompt()
  206.         var cmd string = ""
  207.         fmt.Scanf("%s", &cmd)    // call twice, is It a bug?
  208.         fmt.Scanf("%s", &cmd)    // call twice, is It a bug?
  209.         if  len(cmd) == 1&& strings.IndexAny("qQxX", cmd) >= 0 {
  210.             os.Exit(0)
  211.         }  else if len(cmd) == 1&& strings.IndexAny("aA", cmd) >= 0 {
  212.             printAbout()
  213.         }  else if len(cmd) == 1&& strings.IndexAny("sS", cmd) >= 0 {
  214.             print("  Input the source and target radices (say, 16 2): ") 
  215.             st = readTwo()
  216.             srcRadix = int(convertAtoI(st.a, 10))
  217.             destRadix = int(convertAtoI(st.b, 10))
  218.             doConvert(srcRadix, destRadix)
  219.         }
  220.     }
  221. }
  222. func waitCommand(str string) string {
  223.         print(str)
  224.         reader := bufio.NewReader(os.Stdin)
  225.         input, _ := reader.ReadString('\n')
  226.         if len(input) > 0 && input[len(input) -1] == '\n' {
  227.             input = input[0:len(input) -1]
  228.         }
  229.         if len(input) > 0 && input[len(input) -1] == '\r' {
  230.             input = input[0:len(input) -1]
  231.         }
  232.         return input
  233. }
  234. func main() {
  235.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  236.         printUsage()
  237.         return
  238.     }
  239.     doStart()
  240. }




실행> go run convertRadix.go

또는

컴파일> go build convertRadix.go
실행> ./convertRadix

  The supported maximum radix is 36.
  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 8 16

    Convert Radix_8 to Radix_16
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 1234
        ( 1234 )_8   --->   ( 29C )_16

    Input Value>> main()

  Command: (S)etup radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 16 8

    Convert Radix_16 to Radix_8
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 29c
        ( 29c )_16   --->   ( 1234 )_8

    Input Value>> exit()



Posted by Scripter
,

다음은  이차방정식 x^2 - x - 1 = 0 의 양의 근 즉 황금비율(golden ratio)을 구하는 Go 애플리케이션 소스이다. 황금비율을 구하는 비례방정식은 1 : x = x : (x+1) 이며, 이를 이차방정식으로 표현한 것이 x^2 - x - 1 = 0 이다.

See:  Golden ratio - Sajun.org

* Go 프로그램 소스는 (한글이 주석에만 포함되어 있더러도) UTF-8 인코딩으로 저장해야 한다.

  1. /*
  2.  *  Filename: testGoldenRatio.go
  3.  *    황금률(즉, 이차방정식 x^2 - x - 1  = 0 의 양의 근)을 계산한다.
  4.  *
  5.  *   Execute: go run testGoldenRatio.go
  6.  *
  7.  *   or
  8.  *
  9.  *   Compile: go build testGoldenRatio.go
  10.  *   Execute: ./testGoldenRatio
  11.  *
  12.  *      Date:  2012/06/20
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19.     "math"
  20. )
  21. type PAIR struct {
  22.     x1 float64
  23.     x2 float64
  24. }
  25. func printUsing() {
  26.     fmt.Printf("Using: testGoldenRatio [-h|-help]\n")
  27.     fmt.Printf("This calculates the value of the golden ratio.\n")
  28. }
  29. // 이차방정식 a x^2 + b x + c  = 0 의 근을 구한다.
  30. func findQuadraticRoot(a float64, b float64, c float64) (zeros PAIR) {
  31.     if a == 0.0 {
  32.         fmt.Printf("Since the highest coefficient is zero, the given equation is not a quadratic equation.\n")
  33.         return
  34.     } else if b*b - 4*a*c < 0.0 {
  35.         fmt.Printf("Since the discriminant %f is negative, the given equation has no real root.\b", b*b - 4*a*c)
  36.         return
  37.     }
  38.     zeros.x1 = (-b + math.Sqrt(b*b - 4*a*c)) / (2.0 * a)
  39.     zeros.x2 = (-b - math.Sqrt(b*b - 4*a*c)) / (2.0 * a)
  40.     return
  41. }
  42. func main() {
  43.     var x1, x2 float64
  44.     if len(os.Args) > 1 && (os.Args[1] == "-h" || os.Args[1] == "-help") {
  45.         printUsing()
  46.         return
  47.     }
  48.    var  values = findQuadraticRoot(1.0, -1.0, -1.0)
  49.     x1 = values.x1
  50.     x2 = values.x2
  51.     if x1 >= x2 {
  52.         fmt.Printf("The bigger root is %f, \n", x1);
  53.         fmt.Printf("and the less root is %f.\n", x2);
  54.     } else {
  55.         fmt.Printf("The bigger root is %f, \n", x2);
  56.         fmt.Printf("and the less root is %f.\n", x1);
  57.     }
  58. }



컴파일> go build testGoldenRatio.go

실행> ./testGoldenRatio
The bigger root is 1.618034,
and the less root is -0.618034.


go run 명령을 이용하면 소스 코드를 직접 실행시킬 수 있다.

실행> go run testGoldenRatio.go
The bigger root is 1.618034,
and the less root is -0.618034.



Posted by Scripter
,

아래의 소스 testBigInt.go 는 GMP 사용 예제 for C 의 testGMP.c 를 Go 언어 용으로 수정한 것이다.

Go 언어는 (C 언어와 달리) 긴 자리 정수 타입을 빌트인 패키지로 내장하고 있다. 긴 자리 정수 타입을 사용하기 위해서는 (소스 파일의 선두에) "math/big" 패키지를 미리 임포트(수입)해야 한다.

 

  1. /*
  2.  *  Filename: testBigInt.go
  3.  *
  4.  *   Compile: go build testBigInt.go
  5.  *   Execute: ./testBigInt
  6.  *
  7.  *  or
  8.  *
  9.  *   Execute without compiling: go run testBigInt.go
  10.  *
  11.  *    Output: 2470450
  12.  */
  13. package main
  14. import (
  15.     "fmt"
  16.     "math/big"
  17. )   
  18. func foo(param *big.Int, n int64) *big.Int{
  19.     var i int64
  20.     var r *big.Int = big.NewInt(1)
  21.     r.Mul(param, big.NewInt(n))
  22.     for i = 1; i < n; i++ { 
  23.         r.Add(r, big.NewInt(i*7))
  24.     }
  25.     return r
  26. }
  27. func main() {
  28.     var r *big.Int;
  29.     /// var n *big.Int = big.NewInt(123456)
  30.     var n *big.Int = big.NewInt(1)
  31.     n.SetInt64(123456)
  32.     r = foo(n, 20)
  33.     fmt.Printf("%s\n", r)
  34. }



실행> go run testBigInt,go
2470450


컴파일> go build testBigInt.go
실행> ./testBigInt
2470450




Posted by Scripter
,

현재 시각을 컨솔에 보여주는 간단한 애플리케이션의 Go 언어 소스 코드이다.
UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다.
* UTC(Universal Time  Coordinated, 협정세계시, 協定世界時)

  1. /*
  2.  *  Filename: testCTime.go
  3.  *
  4.  *  Compile:  go build  testCTime.go
  5.  *  Execute:  ./testCTime
  6.  *
  7.  *  Execute without compiling:  go run  testCTime.go
  8.  *
  9.  *  Date:  2012. 6. 18.
  10.  */
  11. package main
  12. import (
  13.     "fmt"
  14.     "time"
  15.     "math"
  16. )
  17. func main() {
  18.     var weekNames []string = []string {  "일", "월", "화", "수", "목", "금", "토" };     // Hangul
  19.     // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
  20.     t1 := time.Now()
  21.     fmt.Printf("UTC: %d초\n", t1.Unix())   // Hangul
  22.     /// fmt.Printf("UTC: %dsec\n", t1.Unix())      // Engliish
  23.     // 현재 시각 표시: 200x년 x월 xx일 (x요일) xx시 xx분 xx초
  24.     fmt.Printf("%d년 %d월 %d일 (%s요일) ", t1.Year(), t1.Month(), t1.Day(), weekNames[t1.Weekday()]);     // Hangul
  25.     fmt.Printf("%d시 %d분 %d초\n", t1.Hour(), t1.Minute(), t1.Second());    // Hangul
  26.     /// fmt.Printf("%04d-%02d-%02d (%s) ", t1.Year(), t1.Month(), t1.Day(), t1.Weekday());     // English
  27.     /// fmt.Printf("%02d:%02d:%02d\n", t1.Hour(), t1.Minute(), t1.Second());     // English
  28.     var y1 = t1.Year()
  29.     var t2 = time.Date(y1,1,1,0,0,0, 0, t1.Location());
  30.     var dAfter int = int(math.Floor(t1.Sub(t2).Hours()/24.0)) + 1
  31.     fmt.Printf("올해 몇 번째 날: %d\n", dAfter);     // Hangul
  32.     /// fmt.Printf("Today is the %d-th day in this year.\n", dAfter);     // English
  33. }



컴파일> go build testCTime.go

실행> ./testCTime
UTC: 1339945637초
2012년 6월 18일 (월요일) 0시 7분 217초
올해 몇 번째 날: 170



Posted by Scripter
,

다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을 Go 언어로 구현해 보았다. 조립제법(synthetic division)은 일명 Horner의 방법이라고도 불리우는데, 이는
다항식 p(x)의 x = a 일 때의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 go run 명령을 사용하면 컴파일 과정 없이 그대로 실행된다.
(실행 예:  go run testSyntheticDivision.go 1 2 3 4 5  )


  1. /*
  2.  *  Filename: testSyntheticDivision.go
  3.  *
  4.  *  Purpose:  Find the quotient and remainder when some polynomial is
  5.  *            divided by a monic linear polynomial.
  6.  *
  7.  *  Execute:  go run testSyntheticDivision.go -2 1 3 3 1
  8.  *
  9.  *  or
  10.  *
  11.  *  Compile:  go build testSyntheticDivision.go
  12.  *  Execute:  ./testSyntheticDivision -2 1 3 3 1
  13.  */
  14. package main
  15. import (
  16.     "fmt"
  17.     "os"
  18.     "strconv"
  19.     "math"
  20. )
  21. func print(str string) {
  22.     fmt.Printf("%s", str);
  23. }
  24. func println(str string) {
  25.     fmt.Printf("%s\n", str);
  26. }
  27. // 사용법 표시
  28. func printUsage() {
  29.      /// println("사용법: testSyntheticDivision [수] [피제식의 계수들]");
  30.      /// println("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.");
  31.      println("Usage: testSyntheticDivision [number] [coefficients of dividend]");
  32.      println("Show the result of synthetic division.");
  33. }
  34. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  35. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  36. func simplify(v float64, width int) string {
  37.     var n int
  38.     var slen int
  39.     var t string = "                               ";
  40.     var tmp string = "                               ";
  41.     t = fmt.Sprintf("%g", v);
  42.     n = len(t);
  43.     if (n > 2) && (t[n - 2] == '.') && (t[n - 1] == '0') {
  44.         t = t[0:n-2]
  45.     }
  46.     slen = len(t);
  47.     tmp =  t
  48.     if (slen < width) {
  49.         t = "               "
  50.         t = t[0:width - slen]
  51.         t = t + tmp
  52.     }
  53.     return t
  54. }
  55. // 다항식을 내림차순의 문자열로로 반환하는 함수
  56. func toPolyString(c []float64, size int) string {
  57.     var SIZE int = size;
  58.     var i int;
  59.     var t string = ""
  60.     var tmp string
  61.     var pc string = simplify(c[0], -1);
  62.     var pci string
  63.     if SIZE > 2 {
            if (len(pc) == 1 && pc[0] == '1') {
  64.             t = fmt.Sprintf("x^%d", SIZE - 1);
  65.         } else if (len(pc) == 2 && pc[0] == '-' && pc[1] == '1') {
  66.             t = fmt.Sprintf("-x^%d", SIZE - 1);
  67.         } else {
  68.             t = fmt.Sprintf("%s x^%d", simplify(c[0], -1), SIZE - 1);
  69.         }
  70.     } else if SIZE == 2 {
  71.         if (len(pc) == 1 && pc[0] == '1') {
  72.             t = "x"
  73.         } else if (len(pc) == 2 && pc[0] == '-' && pc[1] == '1') {
  74.             t = "-x"
  75.         } else {
  76.             t = fmt.Sprintf("%s x", simplify(c[0], -1));
  77.         }
  78.     } else if SIZE == 1 {
  79.         t = fmt.Sprintf("%s", simplify(c[0], -1));
  80.     }
  81.     for i = 1; i < SIZE; i++ {
  82.         pci = simplify(c[i], -1);
  83.         if SIZE - 1 - i > 1 {
  84.             if c[i] > 0.0 {
  85.                 if len(pci) == 1 && pci[0] == '1' {
  86.                     tmp = fmt.Sprintf(" + x^%d", SIZE - 1 - i);
  87.                     t += tmp
  88.                 } else {
  89.                     tmp = fmt.Sprintf(" + %s x^%d", simplify(c[i], -1), SIZE - 1 - i);
  90.                     t += tmp
  91.                 }
  92.             } else if c[i] < 0.0 {
  93.                 if len(pci) == 2 && pci[0] == '-' && pci[1] == '1' {
  94.                     tmp = fmt.Sprintf(" - x^%d", SIZE - 1 - i);
  95.                     t += tmp
  96.                 } else {
  97.                     tmp = fmt.Sprintf(" - %s x^%d", simplify(math.Abs(c[i]), -1), SIZE - 1 - i);
  98.                     t += tmp
  99.                 }
  100.             }
  101.         } else if SIZE - 1 - i == 1 {
  102.             if c[i] > 0.0 {
  103.                 if len(pci) == 1 && pci[0] == '1' {
  104.                     t += " + x"
  105.                 } else {
  106.                     tmp = fmt.Sprintf(" + %s x", simplify(c[i], -1));
  107.                     t += tmp
  108.                 }
  109.             } else if c[i] < 0.0 {
  110.                 if len(pci) == 2 && pci[0] == '-' && pci[1] == '1' {
  111.                     t += " - x"
  112.                 } else {
  113.                     tmp = fmt.Sprintf(" - %s x", simplify(math.Abs(c[i]), -1));
  114.                     t += tmp
  115.                 }
  116.             }
  117.         } else if SIZE - 1 - i == 0 {
  118.             if c[i] > 0.0 {
  119.                 tmp = fmt.Sprintf(" + %s", simplify(c[i], -1));
  120.                 t += tmp
  121.             } else if (c[i] < 0.0) {
  122.                 tmp = fmt.Sprintf(" - %s", simplify(math.Abs(c[i]), -1));
  123.                 t += tmp
  124.             }
  125.         }
  126.     }
  127.     return t
  128. }
  129. // 다향식 나눗셈 결과를
  130. //     (피제식) = (제식)(몫) + (나마지)
  131. // 형태로 출력
  132. func printDivisionResult(a float64, c []float64, b []float64, size int) {
  133.     var SIZE int = size;
  134.     var i int
  135.     var r float64
  136.     var monic []float64 = []float64 { 1.0, 0.0 };
  137.     print("  ");
  138.     print(toPolyString(c, SIZE));
  139.     println("");
  140.     print("    = ( ");
  141.     monic[1] = -a;
  142.     print(toPolyString(  monic, 2 ));
  143.     print(" )")
  144.     var pTmpPoly []float64 = make([]float64, SIZE);
  145.     for i = 0; i < SIZE - 1; i++ {
  146.         pTmpPoly[i] = b[i];
  147.     }
  148.     print("( ");
  149.     print(toPolyString(pTmpPoly, SIZE - 1));
  150.     print(" )");
  151.     r = b[SIZE - 1];
  152.     if r > 0.0 {
  153.         print(" + ");
  154.         print(simplify(r, -1));
  155.     } else if (r < 0.0) {
  156.         print(" - ");
  157.         print(simplify(math.Abs(r), -1));
  158.     }
  159.     println("");
  160. }
  161. // 조립제법 계산표 출력 함수
  162. func printSyntheticTable(a float64, c []float64, s []float64, q []float64, size int) {
  163.     var SIZE int = size;
  164.     var i int
  165.     print("       | ");
  166.     print(simplify(c[0], 6));
  167.     for i = 1; i < SIZE; i++ {
  168.         print("  ");
  169.         print(simplify(c[i], 6));
  170.     }
  171.     println("");
  172.     print(simplify(a, 6));
  173.     print(" | "); 
  174.    print("        ");
  175.     print(simplify(s[1], 6));
  176.     for i = 2; i < SIZE; i++ {
  177.         print("  ");
  178.         print(simplify(s[i], 6));
  179.     }
  180.     println("");
  181.     print("       |-");
  182.     for i = 0; i < SIZE; i++ {
  183.         print("--------");
  184.     }
  185.     println("");
  186.     print("         ");
  187.     print(simplify(q[0], 6));
  188.     for i = 1; i < SIZE; i++ {
  189.         print("  ");
  190.         print(simplify(q[i], 6));
  191.     }
  192.     println("");
  193. }
  194. // Go 언어 프로그램의 실행 시작 지점
  195. func main() {
  196.     var i int
  197.     var SIZE = len(os.Args) - 2
  198.     var a float64
  199.     var c []float64 = make([]float64, SIZE + 2)
  200.     var s []float64 = make([]float64, SIZE + 2)
  201.     var b []float64 = make([]float64, SIZE + 2)
  202.     if len(os.Args) < 4 {
  203.         printUsage()
  204.         return
  205.     }
  206.     //////////////////////////////////////////////////////
  207.     // 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  208.     // 제식은 x -  a
  209.     a, _ = strconv.ParseFloat(os.Args[1], 64)
  210.     for i = 0; i < SIZE; i++ {
  211.         c[i], _ = strconv.ParseFloat(os.Args[i + 2], 64)
  212.     }
  213.     //////////////////////////////////////////////////////
  214.     // 조립제법의 주요 부분
  215.     s[0] = 0.0;
  216.     b[0] = c[0];
  217.     for i = 1; i < SIZE; i++ {
  218.         s[i] = b[i-1]*a;
  219.         b[i] = c[i] + s[i];
  220.     }
  221.     //////////////////////////////////////////////////////
  222.     // 몫의 계수와 나머지를 출력한다.
  223.     /// print("몫의 계수는 ");
  224.     print("The coefficients of the quotient are ");
  225.     for i = 0; i < SIZE - 2; i++ {
  226.         print(simplify(b[i], -1));
  227.         print(", ");
  228.     }
  229.     print(simplify(b[SIZE - 2], -1));
  230.     // print(" 이고, 나머지는 ");
  231.     print("\nand the remainder is ");
  232.     print(simplify(b[SIZE - 1], -1));
  233.     /// println(" 이다.");
  234.     println(".");
  235.     println("");
  236.     //////////////////////////////////////////////////////
  237.     // 조립제법 표를 출력한다.
  238.     printSyntheticTable(a, c, s, b, SIZE);
  239.     println("");
  240.     //////////////////////////////////////////////////////
  241.     // (피제식) = (제식) x (몫) + (나머지)
  242.     printDivisionResult(a, c, b, SIZE);
  243. }




실행> go run testSyntheticDivision.go 1 2 3 4 5
The coefficients of the quotient are 2, 5, 9
and the remainder is 14.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14

 

또는

 

컴파일> go build testSyntheticDivision.go

실행> ./testSyntheticDivision 1 2 3 4 5
The coefficients of the quotient are 2, 5, 9
and the remainder is 14.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



 

Posted by Scripter
,

다음은 C 언어로 작성된 소스파일 testForFor.c(참조: 80컬럼 컨솔에 19단표 출력하기 예제 for C and Ch)를 Go 언어용으로 고친 것이다.
(* 한글이 있는 Go 소스파일은 UTF8 인코딩으로 저장해야 한다.)

 

  1. /*
  2.  *  Filename: testForFor.go
  3.  *
  4.  *  Compile:  go build  testForFor.go
  5.  *  Execute:  testForFor
  6.  *
  7.  *  Execute without compiling:  go run  testForFor.go
  8.  *
  9.  *  Date:  2012. 6. 16.
  10.  */
  11. package main
  12. import (
  13.     "fmt"
  14. )
  15. // dan으로 전달된 (구구단의) 한 단의 출력할 내용을
  16. // 스트링으로 만들어 반환하는 함수
  17. func getDan(dan int32) [19]string {
  18.     var sa string
  19.     var sb string
  20.     var sval string
  21.     var j int32
  22.     var t [19] string;
  23.     for j = 0; j < 19; j++ {
  24.         sa = fmt.Sprintf("%d", dan);
  25.         if len(sa) < 2 {
  26.             sa = fmt.Sprintf(" %d", dan);
  27.         }
  28.         sb = fmt.Sprintf("%d", j + 1);
  29.         if len(sb) < 2 {
  30.             sb = fmt.Sprintf(" %d", j + 1);
  31.         }
  32.         sval = fmt.Sprintf("%d", dan*(j + 1));
  33.         if len(sval) < 2 {
  34.             sval = fmt.Sprintf("  %d", dan*(j + 1));
  35.         } else if len(sval) < 3  {
  36.             sval = fmt.Sprintf(" %d", dan*(j + 1));
  37.         }
  38.         t[j] =  sa + " x " + sb + " = " + sval
  39.     }
  40.     return t
  41. }
  42. // 19단표를 모두 80컬럼 컨솔에 출력한다.
  43. func printAllNineteenDan() {
  44.     var d [] int32 = [] int32 {  2, 7, 11, 16 };      // 각 줄단위 블럭의 첫단
  45.     var counter [] int32 = [] int32 { 5, 4, 5, 4 };  // 각 줄단위 블럭에 속한 단의 개수
  46.     var lines[19] string;
  47.     var v [19]string;
  48.     var i int32
  49.     var j int32
  50.     var k int32
  51.     var arr [18][19]string;
  52.     for i = 2; i < 20; i++ {
  53.         v = getDan(i)
  54.         for j = 0; j < 19; j++ {
  55.             arr[i - 2][j] = v[j]
  56.         }
  57.     } 
  58.     for k = 0; k < 4; k++ {
  59.         // 80 바이트 길이의 한 줄씩 완성
  60.         for i = 0; i < 19; i++ {
  61.             lines[i] = arr[d[k]-2][i]
  62.             for j = 1; j < counter[k]; j++ {
  63.                 lines[i] += "   " + arr[d[k]-2+j][i]
  64.             }
  65.         }
  66.         // 80 바이트 길이의 한 줄씩 출력
  67.         for i = 0; i < 19; i++ {
  68.             fmt.Printf("%s\n", lines[i]);
  69.         }
  70.         fmt.Printf("\n");
  71.     }
  72.     fmt.Printf("\n");
  73. }
  74. // Go 언어의 main 함수 : 실행 시작 지점
  75. func main() {
  76.     printAllNineteenDan();    // 객체에 속하는 메소드 printDan()을 호출한다.
  77. }

 


실행> go run testForFor.go 
 
또는

컴파일> go build testForFor.go
실행> ./testForFor

 2 x  1 =   2    3 x  1 =   3    4 x  1 =   4    5 x  1 =   5    6 x  1 =   6
 2 x  2 =   4    3 x  2 =   6    4 x  2 =   8    5 x  2 =  10    6 x  2 =  12
 2 x  3 =   6    3 x  3 =   9    4 x  3 =  12    5 x  3 =  15    6 x  3 =  18
 2 x  4 =   8    3 x  4 =  12    4 x  4 =  16    5 x  4 =  20    6 x  4 =  24
 2 x  5 =  10    3 x  5 =  15    4 x  5 =  20    5 x  5 =  25    6 x  5 =  30
 2 x  6 =  12    3 x  6 =  18    4 x  6 =  24    5 x  6 =  30    6 x  6 =  36
 2 x  7 =  14    3 x  7 =  21    4 x  7 =  28    5 x  7 =  35    6 x  7 =  42
 2 x  8 =  16    3 x  8 =  24    4 x  8 =  32    5 x  8 =  40    6 x  8 =  48
 2 x  9 =  18    3 x  9 =  27    4 x  9 =  36    5 x  9 =  45    6 x  9 =  54
 2 x 10 =  20    3 x 10 =  30    4 x 10 =  40    5 x 10 =  50    6 x 10 =  60
 2 x 11 =  22    3 x 11 =  33    4 x 11 =  44    5 x 11 =  55    6 x 11 =  66
 2 x 12 =  24    3 x 12 =  36    4 x 12 =  48    5 x 12 =  60    6 x 12 =  72
 2 x 13 =  26    3 x 13 =  39    4 x 13 =  52    5 x 13 =  65    6 x 13 =  78
 2 x 14 =  28    3 x 14 =  42    4 x 14 =  56    5 x 14 =  70    6 x 14 =  84
 2 x 15 =  30    3 x 15 =  45    4 x 15 =  60    5 x 15 =  75    6 x 15 =  90
 2 x 16 =  32    3 x 16 =  48    4 x 16 =  64    5 x 16 =  80    6 x 16 =  96
 2 x 17 =  34    3 x 17 =  51    4 x 17 =  68    5 x 17 =  85    6 x 17 = 102
 2 x 18 =  36    3 x 18 =  54    4 x 18 =  72    5 x 18 =  90    6 x 18 = 108
 2 x 19 =  38    3 x 19 =  57    4 x 19 =  76    5 x 19 =  95    6 x 19 = 114

 7 x  1 =   7    8 x  1 =   8    9 x  1 =   9   10 x  1 =  10
 7 x  2 =  14    8 x  2 =  16    9 x  2 =  18   10 x  2 =  20
 7 x  3 =  21    8 x  3 =  24    9 x  3 =  27   10 x  3 =  30
 7 x  4 =  28    8 x  4 =  32    9 x  4 =  36   10 x  4 =  40
 7 x  5 =  35    8 x  5 =  40    9 x  5 =  45   10 x  5 =  50
 7 x  6 =  42    8 x  6 =  48    9 x  6 =  54   10 x  6 =  60
 7 x  7 =  49    8 x  7 =  56    9 x  7 =  63   10 x  7 =  70
 7 x  8 =  56    8 x  8 =  64    9 x  8 =  72   10 x  8 =  80
 7 x  9 =  63    8 x  9 =  72    9 x  9 =  81   10 x  9 =  90
 7 x 10 =  70    8 x 10 =  80    9 x 10 =  90   10 x 10 = 100
 7 x 11 =  77    8 x 11 =  88    9 x 11 =  99   10 x 11 = 110
 7 x 12 =  84    8 x 12 =  96    9 x 12 = 108   10 x 12 = 120
 7 x 13 =  91    8 x 13 = 104    9 x 13 = 117   10 x 13 = 130
 7 x 14 =  98    8 x 14 = 112    9 x 14 = 126   10 x 14 = 140
 7 x 15 = 105    8 x 15 = 120    9 x 15 = 135   10 x 15 = 150
 7 x 16 = 112    8 x 16 = 128    9 x 16 = 144   10 x 16 = 160
 7 x 17 = 119    8 x 17 = 136    9 x 17 = 153   10 x 17 = 170
 7 x 18 = 126    8 x 18 = 144    9 x 18 = 162   10 x 18 = 180
 7 x 19 = 133    8 x 19 = 152    9 x 19 = 171   10 x 19 = 190

11 x  1 =  11   12 x  1 =  12   13 x  1 =  13   14 x  1 =  14   15 x  1 =  15
11 x  2 =  22   12 x  2 =  24   13 x  2 =  26   14 x  2 =  28   15 x  2 =  30
11 x  3 =  33   12 x  3 =  36   13 x  3 =  39   14 x  3 =  42   15 x  3 =  45
11 x  4 =  44   12 x  4 =  48   13 x  4 =  52   14 x  4 =  56   15 x  4 =  60
11 x  5 =  55   12 x  5 =  60   13 x  5 =  65   14 x  5 =  70   15 x  5 =  75
11 x  6 =  66   12 x  6 =  72   13 x  6 =  78   14 x  6 =  84   15 x  6 =  90
11 x  7 =  77   12 x  7 =  84   13 x  7 =  91   14 x  7 =  98   15 x  7 = 105
11 x  8 =  88   12 x  8 =  96   13 x  8 = 104   14 x  8 = 112   15 x  8 = 120
11 x  9 =  99   12 x  9 = 108   13 x  9 = 117   14 x  9 = 126   15 x  9 = 135
11 x 10 = 110   12 x 10 = 120   13 x 10 = 130   14 x 10 = 140   15 x 10 = 150
11 x 11 = 121   12 x 11 = 132   13 x 11 = 143   14 x 11 = 154   15 x 11 = 165
11 x 12 = 132   12 x 12 = 144   13 x 12 = 156   14 x 12 = 168   15 x 12 = 180
11 x 13 = 143   12 x 13 = 156   13 x 13 = 169   14 x 13 = 182   15 x 13 = 195
11 x 14 = 154   12 x 14 = 168   13 x 14 = 182   14 x 14 = 196   15 x 14 = 210
11 x 15 = 165   12 x 15 = 180   13 x 15 = 195   14 x 15 = 210   15 x 15 = 225
11 x 16 = 176   12 x 16 = 192   13 x 16 = 208   14 x 16 = 224   15 x 16 = 240
11 x 17 = 187   12 x 17 = 204   13 x 17 = 221   14 x 17 = 238   15 x 17 = 255
11 x 18 = 198   12 x 18 = 216   13 x 18 = 234   14 x 18 = 252   15 x 18 = 270
11 x 19 = 209   12 x 19 = 228   13 x 19 = 247   14 x 19 = 266   15 x 19 = 285

16 x  1 =  16   17 x  1 =  17   18 x  1 =  18   19 x  1 =  19
16 x  2 =  32   17 x  2 =  34   18 x  2 =  36   19 x  2 =  38
16 x  3 =  48   17 x  3 =  51   18 x  3 =  54   19 x  3 =  57
16 x  4 =  64   17 x  4 =  68   18 x  4 =  72   19 x  4 =  76
16 x  5 =  80   17 x  5 =  85   18 x  5 =  90   19 x  5 =  95
16 x  6 =  96   17 x  6 = 102   18 x  6 = 108   19 x  6 = 114
16 x  7 = 112   17 x  7 = 119   18 x  7 = 126   19 x  7 = 133
16 x  8 = 128   17 x  8 = 136   18 x  8 = 144   19 x  8 = 152
16 x  9 = 144   17 x  9 = 153   18 x  9 = 162   19 x  9 = 171
16 x 10 = 160   17 x 10 = 170   18 x 10 = 180   19 x 10 = 190
16 x 11 = 176   17 x 11 = 187   18 x 11 = 198   19 x 11 = 209
16 x 12 = 192   17 x 12 = 204   18 x 12 = 216   19 x 12 = 228
16 x 13 = 208   17 x 13 = 221   18 x 13 = 234   19 x 13 = 247
16 x 14 = 224   17 x 14 = 238   18 x 14 = 252   19 x 14 = 266
16 x 15 = 240   17 x 15 = 255   18 x 15 = 270   19 x 15 = 285
16 x 16 = 256   17 x 16 = 272   18 x 16 = 288   19 x 16 = 304
16 x 17 = 272   17 x 17 = 289   18 x 17 = 306   19 x 17 = 323
16 x 18 = 288   17 x 18 = 306   18 x 18 = 324   19 x 18 = 342
16 x 19 = 304   17 x 19 = 323   18 x 19 = 342   19 x 19 = 361



 

Posted by Scripter
,

Go 언어에는 while 반복문이 없으므로 for 반복문을 (while 반복문 처럼) 쓰면 된다.

 

소스 파일명: testWhile.go

  1. // Filename: testWhile.go
  2. //
  3. // Execute: go run testWhile.go 625 1000
  4. // or
  5. // Compile: go build testWhile.go
  6. // Execute: ./testWhile 625 1000
  7. package main
  8. import (
  9.     "fmt"
  10.     "os"
  11.     "strconv"
  12. )
  13. // 사용법 표시 함수
  14. func printUsing() {
  15.     fmt.Printf("Using: testWhile [integer1] [integer2]\n");
  16.     fmt.Printf("This finds the greatest common divisor of the given two integers.\n");
  17. }
  18. // main 함수
  19. func main() {
  20.     var val1 int64
  21.     var val2 int64
  22.     var a int64
  23.     var b int64
  24.     var gcd int64
  25.     if len(os.Args) != 3 {
  26.         printUsing();
  27.         return
  28.     }
  29.     // 명령행 인자의 스트링을 가져와서
  30.     // 64비트 정수로 변환하여
  31.     // 변수 val1과 val2에 저장한다.
  32.     val1, _ = strconv.ParseInt(os.Args[1], 10, 64);
  33.     val2, _ = strconv.ParseInt(os.Args[2], 10, 64);
  34.     a = val1
  35.     if a < 0 {
  36.         a = -a
  37.     }
  38.     b = val2;
  39.     if b < 0 {
  40.         b = -b
  41.     }
  42.     if a < b { 
  43.         a, b = b, a
  44.     }
  45.     if b == 0 {
  46.         fmt.Printf("GCD(%d, %d) = %d\n", val1, val2, a);
  47.         return
  48.     }
  49.     // -------------------------------------------
  50.     // Euclidean 알고리즘의 시작 
  51.     // *  Go 언어에는 while 반복문이 없으므로 for 문을 사용한다.
  52.     for a != 0 {
  53.         b, a = a, b % a
  54.     }
  55.     // 나머지가 0이면 그 때 나눈 수(제수) b가 최대공약수(GCD)이다.
  56.     gcd = b
  57.     // 최대공약수(GCD)를 출력한다.
  58.     fmt.Printf("GCD(%d, %d) = %d\n", val1, val2, gcd);
  59. }


 



실행:

Command> go run testWhile.go
Using: testWhile [integer1] [integer2]
This finds the greatest common divisor of the given two integers.

Command> go run testWhile 200 -300
GCD(200, -300) = 100

Command>go run  testWhile 0 -300
GCD(0, -300) = 300

Command> go run testWhile 20 -125
GCD(20, -125) = 5

Command> go run testWhile 121 66
GCD(121, 66) = 11

Command> testWhile -111 -37
GCD(-111, -37) = 37


컴파일:

Command> go build testWhile.go


실행:

Command> testWhile
Using: testWhile [integer1] [integer2]
This finds the greatest common divisor of the given two integers.

Command> testWhile 200 -300
GCD(200, -300) = 100

Command> testWhile 0 -300
GCD(0, -300) = 300

Command> testWhile 20 -125
GCD(20, -125) = 5

Command> testWhile 121 66
GCD(121, 66) = 11

Command> testWhile -111 -37
GCD(-111, -37) = 37

 

Posted by Scripter
,

소스 파일명: testIf.go

  1. // Filename: testIf.go
  2. //
  3. // Execute: go run testIf.go -1.5
  4. // or
  5. // Compile: go build testIf.go
  6. // Execute: ./testIf -1.5
  7. package main
  8. import (
  9.     "fmt"
  10.     "os"
  11.     "strconv"
  12. )
  13. // 사용법 표시 함수
  14. func printUsing() {
  15.     fmt.Printf("Using: testIf [number]\n");
  16.     fmt.Printf("This determines whether the number is positive or not.\n");
  17. }
  18. // main 함수
  19. func main() {
  20.     var val = 0.0
  21.     if (len(os.Args) != 2) {
  22.         printUsing();
  23.         return
  24.     }
  25.     // 명령행 인자의 스트링을 가져와서
  26.     // 배정밀도 부동소수점수로 변환하여
  27.     // 변수 val에 저장한다.
  28.     val, _ = strconv.ParseFloat(os.Args[1], 64);
  29.     // 변수 val에 저장된 값이 양수인지 음수인지 0인지를
  30.     // 판단하는 if...else... 조건문
  31.     if val > 0.0 {
  32.         fmt.Printf("%g is a positive number.\n", val);
  33.     } else if val < 0.0 {
  34.         fmt.Printf("%g is a negative number.\n", val);
  35.     } else  {
  36.         fmt.Printf("%g is zero.\n", val);
  37.     }
  38. }



실행> go run testIf.go
Using: testIf [number]
This determines whether the number is positive or not.

실행> go run testIf.go 1.234
1.234 is a positive number.

실행> go run testIf.go -1.234
-1.234 is a negative number.

실행> go run testIf.go 0
0 is zero.

또는

 


컴파일> go build testIf.go

실행> testIf
Using: testIf [number]
This determines whether the number is positive or not.

실행> testIf 1.234
1.234 is a positive number.

실행> testIf -1.234
-1.234 is a negative number.

실행> testIf 0
0 is zero.


Posted by Scripter
,

Go 소스 파일에 한글이 포함되어 있으면  UTF8 인코딩으로 저장해야 한다.

     소스 파일명: testArguments.go

  1. // Filename: testArguments.go
  2. //
  3. // Execute: go run testArguments.go 1 2 3
  4. // or
  5. // Compile: go build testArguments.go
  6. // Execute: ./testArguments 1 2 3
  7. package main
  8. import (
  9.     "fmt"             // fmt.Printf 함수 사용을 위해
  10.     "os"             // os.Args 사용을 위해
  11.     "strconv"      // strconv.ParseFloat 함수 사용을 위해
  12. )
  13. func main() {
  14.     var sum = 0.0;
  15.     var y = 0.0
  16.     for i, x := range os.Args {
  17.         if i > 0 {
  18.             // 스트링을 배정밀도 부동소수점수로 변환하여 변수 sum에 누적
  19.             y, _ = strconv.ParseFloat(x, 64)
  20.             // fmt.Printf("y = %f\n", y)
  21.             sum += y
  22.         }
  23.     }
  24.     // 명령행 인자(command-line argument) 개수 출력
  25.     fmt.Printf("Count of arguments: %d\n", len(os.Args));
  26.     // 부동소수점수 값을 %g로 출력
  27.     fmt.Printf("The sum of arguments is %g\n", sum);
  28. }



실행> go run testArguments.go 1 2 3 4
Count of arguments: 5
The sum of arguments is 10

실행> go run testArguments.go 1 2 3 4.2
Count of arguments: 5
The sum of arguments is 10.2

 

또는

 

컴파일> go build testArguments.go

실행> testArguments 1 2 3 4
Count of arguments: 5
The sum of arguments is 10

실행> testArguments 1 2 3 4.2
Count of arguments: 5
The sum of arguments is 10.2


 

Posted by Scripter
,