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

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

        ConvertAtoI(string, radix)
        ConvertItoA(long, radix)

의 구현도 포함되어 있다.

'  Filename: MakeAsciiTableApp.bas
'            Make a table of ascii codes.
'
'  Compile: vbc MakeAsciiTableApp.bas
'  Execute: MakeAsciiTableApp
'
'      Date:  2009/02/14
'    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

Imports System

Namespace MyTestApplication1

    Class MakeAsciiTableApp
        Shared Sub println(s As String)
            Console.WriteLine(s)
        End Sub

        Shared Sub print(s As String)
            Console.Write(s)
        End Sub

        Shared Sub PrintUsage()
            println("Usage: MakeAsciiTableApp")
            println("Make a table of ascii codes.")
        End Sub

        Shared Dim BASE36 As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        Shared Function ConvertItoA(num As Int64, radix As Int32) As String
            Dim tmp As String
            Dim ret As String
            Dim arr As String
            Dim q As Int64
            Dim r As Int64
            Dim isNegative As Boolean = False
            If num < 0L Then
                isNegative = True
                num = -num
            End If
            arr = ""
            q = num
            r = 0L

            While q >= Convert.ToInt64(radix)
                r = q Mod Convert.ToInt64(radix)
                q = Convert.ToInt64(Math.Floor(q / Convert.ToInt64(radix)))
                tmp = Mid(BASE36, Convert.ToInt32(r) + 1, 1)
                arr = arr & tmp
            End While
            tmp = Mid(BASE36, Convert.ToInt32(q) + 1, 1)
            arr = arr & tmp
            If isNegative Then
                arr = arr & "-"
            End If

            ret = ""
            For j As Integer = 0 To arr.Length - 1
               ret = ret & Mid(arr, arr.Length - j - 1 + 1, 1)
            Next
            ConvertItoA = ret
        End Function

        Shared Function ConvertAtoI(s As String, radix As Integer) As Int64
            Dim ret As Int64 = 0L
            Dim isNegative As Boolean = False
            Dim len As Integer = s.Length
            Dim c As char
            Dim i As Integer
            Dim val As Int64 = 0L

            c = s(0)
            If c = "-"c Then
                isNegative = True
            ElseIf c >= "0"c And c <= "9"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("0"c)
            ElseIf c >= "A"c And c <= "Z"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("A"c) + 10L
            ElseIf c >= "a"c And c <= "z"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("a"c) + 10L
            End If
            If (ret >= Convert.ToInt64(radix)) Then
                Console.WriteLine("        Invalid character!")
                ConvertAtoI = ret
               Return ret
            End If

            For i = 1 To len - 1
                c = s(i)
                ret = ret * radix
                If c >= "0"c And c <= "9"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("0"c)
                ElseIf c >= "A"c And c <= "Z"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("A"c) + 10L
                ElseIf c >= "a"c And c <= "z"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("a"c) + 10L
                End If
                If (val >= Convert.ToInt64(radix)) Then
                    Console.WriteLine("        Invalid character!")
                    ConvertAtoI = ret
                   Return ret
                End If
                ret = ret + val    ' numerical addition
            Next

            If isNegative Then
             ret = -ret
            End If
            ConvertAtoI = ret
            return ret
        End Function

       Shared Dim asc() As String = New String() { _
            "NUL", "SOH", "STX", "ETX", "EOT",  _
            "ENQ", "ACK", "BEL", "BS", "HT",  _
            "LF", "VT", "FF", "CR", "SO",  _
            "SI", "DLE", "DC1", "DC2", "DC3",  _
            "DC4", "NAK", "SYN", "ETB", "CAN",  _
            "EM", "SUB", "ESC", "FS", "GS",  _
            "RS", "US", "Spc"  _
        }

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

        Shared Sub MakeTable()
            Dim sbuf As String = ""
            Dim abuf As String = ""
            Dim tbuf As String = ""
            Dim i As Integer
            Dim j As Integer
            Dim c As char

            print("    ")
            For i = 0 To 7
                print("+----")
            Next
            print("+")
            println("")

            print("    ")
            print("| 0- ")
            print("| 1- ")
            print("| 2- ")
            print("| 3- ")
            print("| 4- ")
            print("| 5- ")
            print("| 6- ")
            print("| 7- ")
            print("|")
            println("")

            print("+---")
            For i = 0 To 7
                print("+----")
            Next
            print("+")
            println("")

            For i = 0 To 15
                tbuf = ""
                sbuf = ConvertItoA(i, 16)
                tbuf = tbuf + "| " & sbuf & " "
                For j = 0 To 7
                    If j*16 + i <= 32 Then
                       abuf = String.Format("| {0, -3}", asc(j*16 + i))
                    ElseIf j*16 + i = 127 Then
                        abuf = String.Format("| {0, -3}", "DEL")
                    Else
                        c = Convert.ToChar(j*16 + i)
                        abuf = String.Format("| {0, 2} ", c)
                    End if
                    tbuf = tbuf & abuf
                Next
                tbuf = tbuf & "|"
                println(tbuf)
            Next

            print("+---")
            For i = 0 To 7
                print("+----")
            Next
            print("+")
            println("")
            println("")

            For i = 0 To 15
                sbuf = String.Format("{0, -30}",  control(i))
                tbuf = String.Format("  {0, -34}",  control(i+16))
                print(sbuf)
                println(tbuf)
            Next
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
            If args.Length = 0 Then
                 '
            ElseIf args.Length > 0 And "-h" = args(0) Then
                PrintUsage()
                Environment.Exit(1)
            End If
            MakeTable()
        End Sub
    End Class
End Namespace




컴파일> vbc MakAsciiTableApp.bas

실행> MakeAsciiTableApp

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



크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,

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

         Convert.Int64(str As String,  radix As Integer)

가 이미 있지만, 여기에서는 아예 변환 함수

        ConvertAtoI(string, radix)
        ConvertItoA(long, radix)

를 자체 구현하여 사용하였다.


'  Filename: MakeRadixTableApp.bas
'            Show the radix table with 10-, 2-, 8-, 16-radices.
'
'  Compile: vbc MakeRadixTableApp.bas
'  Execute: MakeRadixTableApp
'
'      Date:  2009/02/14
'    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]

Imports System

Namespace MyTestApplication1

    Class MakeRadixTableApp

        Shared Sub println(s As String)
            Console.WriteLine(s)
        End Sub

        Shared Sub print(s As String)
            Console.Write(s)
        End Sub

        Shared Sub PrintUsage()
            println("Usage: MakeRadixTableApp")
            println("Show the radix table with 10-, 2-, 8-, 16-radices.")
        End Sub

        Shared Dim BASE36 As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        Shared Function ConvertItoA(num As Int64, radix As Int32) As String
            Dim tmp As String
            Dim ret As String
            Dim arr As String
            Dim q As Int64
            Dim r As Int64
            Dim isNegative As Boolean = False
            If num < 0L Then
                isNegative = True
                num = -num
            End If
            arr = ""
            q = num
            r = 0L

            While q >= Convert.ToInt64(radix)
                r = q Mod Convert.ToInt64(radix)
                q = Convert.ToInt64(Math.Floor(q / Convert.ToInt64(radix)))
                tmp = Mid(BASE36, Convert.ToInt32(r) + 1, 1)
                arr = arr & tmp
            End While
            tmp = Mid(BASE36, Convert.ToInt32(q) + 1, 1)
            arr = arr & tmp
            If isNegative Then
                arr = arr & "-"
            End If

            ret = ""
            For j As Integer = 0 To arr.Length - 1
               ret = ret & Mid(arr, arr.Length - j - 1 + 1, 1)
            Next
            ConvertItoA = ret
        End Function

        Shared Function ConvertAtoI(s As String, radix As Integer) As Int64
            Dim ret As Int64 = 0L
            Dim isNegative As Boolean = False
            Dim len As Integer = s.Length
            Dim c As char
            Dim i As Integer
            Dim val As Int64 = 0L

            c = s(0)
            If c = "-"c Then
                isNegative = True
            ElseIf c >= "0"c And c <= "9"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("0"c)
            ElseIf c >= "A"c And c <= "Z"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("A"c) + 10L
            ElseIf c >= "a"c And c <= "z"c Then
                ret = Convert.ToInt64(c) - Convert.ToInt64("a"c) + 10L
            End If
            If (ret >= Convert.ToInt64(radix)) Then
                Console.WriteLine("        Invalid character!")
                ConvertAtoI = ret
               Return ret
            End If

            For i = 1 To len - 1
                c = s(i)
                ret = ret * radix
                If c >= "0"c And c <= "9"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("0"c)
                ElseIf c >= "A"c And c <= "Z"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("A"c) + 10L
                ElseIf c >= "a"c And c <= "z"c Then
                    val = Convert.ToInt64(c) - Convert.ToInt64("a"c) + 10L
                End If
                If (val >= Convert.ToInt64(radix)) Then
                    Console.WriteLine("        Invalid character!")
                    ConvertAtoI = ret
                   Return ret
                End If
                ret = ret + val    ' numerical addition
            Next

            If isNegative Then
             ret = -ret
            End If
            ConvertAtoI = ret
            return ret
        End Function

        Shared Sub MakeTable()
            Dim sbuf As String = ""
            Dim abuf As String = ""
            Dim tbuf As String = ""
            Dim i As Integer
            Dim tab As Char = Chr(9)

            For i = 0 To 3
                print("+-------")
            Next
            print("+")
            println("")

            print("|  Dec")
            print(tab & "|   Bin")
            print(tab & "|  Oct")
            print(tab & "|  Hex  |")
            println("")

            For i = 0 To 3
                print("+-------")
            Next
            print("+")
            println("")

            For i = 0 To 15
                sbuf = String.Format("|   {0, 2}", i)
                abuf = ConvertItoA(i, 2)
                tbuf = String.Format(tab & "|  {0, 4}", abuf)
                sbuf = sbuf & tbuf
                abuf = ConvertItoA(i, 8)
                tbuf = String.Format(tab & "|   {0, 2}", abuf)
                sbuf = sbuf & tbuf
                abuf = ConvertItoA(i, 16)
                tbuf = String.Format(tab & "|    {0, -2} |", abuf)
                sbuf = sbuf & tbuf
                println(sbuf)
            Next

            For i = 0 To 3
                print("+-------")
            Next
            print("+")
            println("")
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
            If args.Length = 0 Then
                 '
            ElseIf args.Length > 0 And "-h" = args(0) Then
                PrintUsage()
                Environment.Exit(1)
            End If
            MakeTable()
        End Sub
    End Class
End Namespace





컴파일> vbc MakeRadixTableApp.bas

실행> MakeRadixTableApp

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

 

Posted by Scripter
,

Java 언어에서 많은 것을 빌려온 C# 언어는 Visual Basic과 함수명이나 라이브러리의 클래스명 그리고 이름공간(namespace)을 공유한다. Visual Basic 언어는 본디 객체지향 언어가 아니었던 이전의 (평범한) BASIC 언어에다 객체지향 개념을 입히느라 여러가지 문법을 덧입히고, 또 C/C++/Java 언어 처럼 타입을 엄격히 하기 위해 (변수 선언하는데 쓰는) Dim, Redim을 도입하였다. 그러므로 객체지향 언어의 개념을 배우는데 Visual Basic 언어는 그리 권할 만한 언어는 아니다. 단지 Visual Studio의 기능이 훌륭하여 Visual Studio을 써서 응용 프로그램을 개발하는 과정이 Visual Basic이 너무 쉽고 편하기 때문에 많은 사람들이 Visual Basic을 사용하고 있다.

닷넷(.NET) 응용 프로그램을 개밣하는데는 Visual Basic/Visual C++/Visual C# 등 기타의 방법이 있다. 닷넷은 자바 진영의 자바가상기계(JVM)에 해당하며, 현재 닷넷은 1.0, 1.1, 2.0, 3.0, 3.5 등 여러가지 버전이 있다. 특히 모바일(mobile) 용 닷넷으로는 .NET 3.5 Compact 등이 있다.

프로그래밍 코딩 시에 메소드 이름을 정할 때 Java 언어의 경우 영문 소문자로 시작하는 것이 관습이지만, Visual Basic/C# 언어의 경우에는 영문 대문자로 시작하는 것이 관습이다. (여기서 관습이라고 하는 것은 꼭 지켜야 하는 것은 아니지만 그렇게 습관을 들이면 다른 사람들이 코딩한 소스를 볼 때 이해가 빠르다는 의미이다.)

Java 언어에서 import 구문을 쓰면 다른 클래스를 불러와서 쓸 수 있듯이, C#에서는 using 구문을, Visual Basic 언어에서는 Inports 구문을 통하여 그와 비슷한 일을 한다. Java 언어에는 없지만 Visual Basic/C# 언어에서는 이름 공간(namespace) 개념이 있어서 이를 이용하면 클래스 관리와 타 클래스에 속한 메소드와 속성을 용이하게 불러 쓸 있다.

Java 언어에서

      System.out.println(스트링)
      System.out.print(스트링)

에 해당하는 Visual Basic/C# 언어의 코드는

      System.Console.WriteLine(스트링)
      System.Console.Write(스트링)

이다. 그런데 Visual Basic에서 Imports 구문을 이용한다면

Imports System
................
................
      Console.WriteLine(스트링)
      Console.Write(스트링)

처럼 System. 을 생략하여 쓸 수 있다.



Visual Basic에서  Shared이라는 선언자는 C#/Java 에서 static이라는 선어자와 유사하여, 이 선언자가 붙은 변수나 메소드는 객체 생성 없이 직접 접근/호출항 수 있다. Shared 선언자가 없으면 반드시 생성된 객체를 통해서 접근해야 한다.

Visual Basic의 메소드 정의 구문 양식은 C#/Java 언어의 것과 유사하게 

       [Public/Private 등] [Shared] (Sub|Function) 메소드명(변수명 As 타입) (As 타입)
             block
       End (Sub|Function)

이다.

또 Visual Basic의 for 반복문 양식은 C#/Java 언어의 것과 조금 다르게 

       For 변수명 As 타입 초기값 To 최종값 (Step 값)
             block
       Next

이다.



소스 파일명: ForTest.cs
------------------------------[소스 시작]
Imports System

Namespace MyTestApplication1
    Class ForTest

        ' Shared 메소드로 선언되었으므로 Main 메소드에서 이 메소드를
        ' 객체 생성 없이 직접 호출할 수 있다.
        Shared Sub PrintDan(dan As Integer)
            For i As Integer = 1 To 9
                Console.WriteLine(dan & " x " & i & " = " & (dan*i))
            Next
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
            PrintDan(2)    ' Shared 메소드 PrintDan()을 호출한다.
        End Sub
    End Class
End Namespace

------------------------------[소스 끝]

컴파일> vbc -d ForTest.bas

(참고: 에러 없이 컴파일이 순조롭게 끝나면 현재 디렉토리에 ForTest.exe 라는 실행 파일이 현재 디렉토리에 생길 것이다.)

실행> ForTest
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18



소스 파일명: ForTestObject.bas
------------------------------[소스 시작]
Imports System

Namespace MyTestApplication1

    Class ForTestObject

        ' Shared 메소드가 아니므로 Main 메소드에서 이 메소드를
        ' 직접 ㅎ출하지 못하며, 생성된 객체를 통해서 호출할 수 있다.
        Sub PrintDan(dan As Integer)
            For i As Integer = 1 To 9
                Console.WriteLine(dan & " x " & i & " = " & (dan*i))
            Next
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
         Dim app As ForTestObject = New ForTestObject()
            app.PrintDan(2)    ' (Shared 가 아닌) 인스턴스 메소드 PrintDan()을 호출한다.
        End Sub
    End Class
End Namespace

------------------------------[소스 끝]

컴파일> vbc ForTestObject.bas

(참고: 컴파일이 순조롭게 끝나면 현재 디렉토리에 ForTestObject.exe 라는 실행 파일이 생겨 있을 것이다.)

실행> ForTestObject

(참고: 실행 결과는 ForTest 를 실행한 결과와 같다.)



크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,

 

'  Filename: testStringReverse.bas
'
'  Compile: vbc testStringReverse.bas
'  Execute: testStringReverse
Imports System
Class StringReverseApp
    Shared Sub Main(ByVal args() As String)
        Dim a As String, b As String
        a = "Hello, world!"
        b = "안녕하세요?"
        Dim arr() As Char = a.ToCharArray()
        Array.Reverse(arr)
        Console.WriteLine(New String(arr))
        arr = b.ToCharArray()
        Array.Reverse(arr)
        Console.WriteLine(New String(arr))
    End Sub
End Class
' ===================
' Expected result:
' !dlrow ,olleH
' ?요세하녕안
' ===================


 

크리에이티브 커먼즈 라이선스
Creative Commons License

 

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

'  Filename: TestCTimeApp.bas
'
'  Compile: vbc TestCTimeApp.bas
'  Execute: TestCTimeApp

Imports System

Namespace MyTestApplication1

    Class TestCTimeApp
        Shared Dim weekNames() As String = New String() { _
                      "일", "월", "화", "수", "목", "금", "토"  _
                  }

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
            Dim now As DateTime = DateTime.Now
            Dim StartOfEpoch As DateTime = New DateTime(1970, 1, 1)

            ' 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
            ' Console.WriteLine("UTC: " & (now.ToUniversalTime / 1000L) + "초")
            ' Console.WriteLine("UTC: " & DateTime.UtcNow + "초")
            ' Console.WriteLine("UTC: " & TimeZoneInfo.ConvertTimeToUTC(now) + "초")
            ' Console.WriteLine("UniversalTime  :" & System.TimeZone.CurrentTimeZone.ToUniversalTime(now))
            ' Console.WriteLine("UniversalTime  :" & (DateTime.UtcNow - StartOfEpoch).TotalMilliseconds)
            Console.WriteLine("UTC: " & Convert.ToInt64((DateTime.UtcNow - StartOfEpoch).TotalMilliseconds / 1000L) & "초")


            ' 현재 시각 표시: 20xx년 xx월 xx일 (x요일) xx시 xx분 xx초
            Console.Write(now.Year & "년 ")
            Console.Write(now.Month & "월 ")   ' Not 1 + now.Month !!
            Console.Write(now.Day & "일 ")
            Console.Write("(" + weekNames(Int(now.DayOfWeek)) & "요일) ")
            Console.Write(now.Hour & "시 ")
            Console.Write(now.Minute & "분 ")
            Console.WriteLine(now.Second & "초")

            ' 1월 1일은 1, 1월 2일은 2
            Console.Write("올해 몇 번째 날: " & now.DayOfYear & ", ")

            ' True 이면 서머타임 있음
            Dim tmp As String
            If Not now.IsDaylightSavingTime() Then tmp = "안함" Else tmp = "함"
            Console.WriteLine("서머타임 적용 여부: " & tmp)
        End Sub
    End Class
End Namespace




컴파일> vbc TestCTimeApp.bas

실행> TestCTimeApp
UTC: 1234542427
2009년 2월 14일 (토요일) 1시 27분 6초
올해 몇 번째 날: 45, 서머타임 적용 여부: 안함



크리에이티브 커먼즈 라이선스
Creative Commons License

 



Posted by Scripter
,


 

'  Filename: TestWhileLoop.bas
'
'  Purpose:  Example using the while loop syntax
'                while ....
'
'  Compile: vbc TestWhileLoop.bas
'  Execute: TestWhileLoop -200 300

Imports System

Namespace MyTestApplication1

    Class TestWhileLoop

        ' 사용법 표시
        Shared Sub PrintUsage()
            Console.WriteLine("Using: TestWhileLoop [integer1] [integer2]")
            Console.WriteLine("This finds the greatest common divisor of the given two integers.")
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args() As String)
            If args.Length <> 2 Then
                PrintUsage()
                Environment.Exit(1)
            End If

            ' ---------------------------------------------
            ' 명령행 인자의 두 스트링을 가져와서
            ' 긴정수(Long) 즉 Int64 타입으로 변환하여
            ' 변수 val1과 val2에 저장한다.
            Dim val1 As Int64 = Convert.ToInt64(args(0))
            Dim val2 As Int64 = Convert.ToInt64(args(1))
            Dim a As Int64
            Dim b As Int64
            Dim q As Int64    ' q는 몫
            Dim r As Int64    ' r은 나머지
            Dim gcd As Int64

            ' a는 |val1|, |val2| 중 큰 값
            a = Math.Abs(val1)
            b = Math.Abs(val2)
            If a < b Then
                a = Math.Abs(val2)
                b = Math.Abs(val1)
            End If

            If b = 0 Then
                Console.WriteLine("GCD(" & val1 & ", " & val2 & ") = " & a)
                Environment.Exit(1)
            End If

            ' ------------------------------------
            ' Euclidean 알고리즘의 시작
            '
            ' a를 b로 나누어 몫은 q에, 나머지는 r에 저장
            q = Int(a / b)
            r = a Mod b

            ' --------------------------------------------------------
            ' Euclidean 알고리즘의 반복 (나머지 r이 0이 될 때 까지)
            While r <> 0L
                a = b
                b = r
                q = Int(a / b)
                r = a Mod b
            End While

            ' 나머지가 0이면 그 때 나눈 수(제수) b가 최대공약수(GCD)이다.
            gcd = b

            ' 최대공약수(GCD)를 출력한다.
            Console.WriteLine("GCD(" & val1 & ", " & val2 & ") = " & gcd)
        End Sub
    End Class
End Namespace




컴파일> vbc -d . TestWhileLoop.bas

실행> TestWhileLoop
Using: TestWhileLoop [integer1] [integer2]
This finds the greatest common divisor of the given two integers.

실행> TestWhileLoop 200 300
GCD(200, 300) = 100

실행> TestWhileLoop 50 -20
GCD(50, -20) = 10

실행> TestWhileLoop -30 0
GCD(-30, 0) = 30



크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,

 

'  Filename: TestForForApp.bas
'
'  Compile:  vbc TestForForApp.bas
'  Execute:  TestForForApp
'
'  Date:  2009. 2. 14.
 
Imports System

Namespace MyTestApplication1

    Class TestForForApp

        ' Shared 선언자가 없으므로 이 메소드는 인스턴스 메소드이다.
        ' 인스턴스 메소드는 Shared 메소드에서는 직접 호출되지 않는다.
        ' 반드시 생성된 객체를 거쳐서 호출되어 진다.
        Function GetDan(dan As Integer) As String()
            Dim t(19) As String
            Dim sa As String
            Dim sb As String
            Dim sval As String
            For j As Integer = 0 To 18
                sa = "" & dan
                If sa.Length < 2 Then
                    sa = " " & sa
                End If
                sb = "" & (j + 1)
                If sb.Length < 2 Then
                    sb = " " & sb
                End If
                sval = "" & (dan*(j + 1))
                If sval.Length < 2 Then
                    sval = "  " & sval
                ElseIf sval.Length < 3 Then
                    sval = " " & sval
                End If
                t(j) = sa & " x " & sb & " = " & sval
            Next
            GetDan = t
        End Function

        ' 19단표를 모두 80컬럼 컨솔에 출력한다.
        '
        ' (static 선언자가 없는) 인스턴스 메소드이므로,
        ' 반드시 생성된 객체를 거쳐서 호출되어 진다.
        Sub PrintAllNineteenDan()
            Dim arr()() As String = New String(18)()  {}  ' not [18][19] but [18][] in C#
            For i As Integer = 2 To 19
                arr(i - 2) = GetDan(i)
            Next
            Dim d() As Integer = New Integer() { 2, 7, 11, 16 }        ' 각 줄단위 블럭의 첫단
            Dim Counter() As Integer = New Integer() { 5, 4, 5, 4 }    ' 각 줄단위 블럭에 속한 단의 개수
            Dim lines(19) As String

            For k As Integer = 0 To d.Length - 1
                ' 8-바이트 길이의 한 줄씩 완성
                For i As Integer = 0 To 18
                    lines(i) = arr(d(k)-2)(i)
                    For j As Integer = 1 To Counter(k) - 1
                        lines(i) = lines(i) & "   " & arr(d(k)-2+j)(i)
                    Next
                Next

                ' 80 바이트 길이의 한 줄씩 출력
                For i As Integer = 0 To 18
                    Console.WriteLine(lines(i))
                Next
                Console.WriteLine()
            Next
        End Sub

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args As String())
            Dim app As TestForForApp = new TestForForApp()  ' 객체를 생성한다.
            app.PrintAllNineteenDan()    ' 객체에 속하는 메소드 printDan()을 호출한다.
        End Sub
    End Class
End Namespace



컴파일> vbc TestForForApp.bas
실행> TestForForApp
 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



크리에이티브 커먼즈 라이선스
Creative Commons License

Posted by Scripter
,

소스 파일명: TestArguments.vbs

Imports System

Namespace MyTestApplication1

    public class TestArguments

        ' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
        Shared Sub Main(ByVal args As String())
            Dim sum As Double = 0.0    ' 초기화

            ' 명령행 인자(command-line argument) 개수 출력
            Console.WriteLine("Count of arguments: " & args.Length)

            For i As Integer = 0 To args.Length - 1
                ' 스트링을 배정밀도 부동소수점수로 변환하여 누적
                sum = sum + Convert.ToDouble(args(i))
            Next

            ' 출력 값이 ".0"으로 끝나는 경우 꼬리 제거하기
            Dim strSum As string = "" & sum
            If strSum.EndsWith(".0") Then
                strSum = Mid(strSum, 0, strSum.Length - 2)
            End If

            ' 누적된 값을 출력한다.
            Console.WriteLine("The sum of arguments is " & strSum)
        End Sub

    End Class
       
End Namespace

 

컴파일> vbc TestArguments.bas

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

실행> TestArguments 1 2.1 3 4.5
Count of arguments: 4
The sum of arguments is 10.6


크리에이티브 커먼즈 라이선스
Creative Commons License

Posted by Scripter
,

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

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

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

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


' ---------------------------------------------------------
'  Filename: TestSyntheticMethod.bas
'
'  Purpose:  Find the quotient and remainder when some polynomial is
'            divided by a monic polynomial of the first degree.
'
'  Compile: vbc TestSyntheticMethod.bas
'
'  Execute: TestSyntheticMethod -2 1 3 3 1
' ---------------------------------------------------------

Imports System

Public Class SyntheticMethod

        ' 사용법 표시
        Shared Sub PrintUsage()
             Console.WriteLine("사용법: TestSyntheticMethod [수] [피제식의 계수들]")
             Console.WriteLine("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.")
        End Sub

        ' 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
        Shared Function Simplify0(v As Double) As String
            Dim t As String = "" & v
            If t.EndsWith(".0") Then
                t = Mid(t, 0, Len(t) - 2)
            End If
            Simplify0 = t
        End Function

        ' 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
        ' 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
        Shared Function Simplify(v As Double, width As Integer) As String
            Dim t As String = "" & v
            If t.EndsWith(".0") Then
                t = Mid(t, 1, t.Length - 2)
            End If
            Dim len As Integer = t.Length
            if (len < width)
                t = Mid("               ", 1, width - len) & t
            End If
            Simplify = t
        End Function

        ' 다항식을 내림차순의 스트링 표현으로 반환
        Shared Function ToPolyString(ByVal c() As Double) As String
            Dim t As String = ""
            Dim i As Integer
            If c.Length > 2 Then
                If Simplify0(c(0)) = "1" Then
                    t = t & "x^" & (c.Length-1)
                ElseIf Simplify0(c(0)) = "-1" Then
                    t = t & "-x^" & (c.Length-1)
                Else
                    t = t & Simplify0(c(0)) & " x^" & (c.Length-1)
                End If
            ElseIf c.Length = 2 Then
                If Simplify0(c(0)) = "1" Then
                    t = t & "x"
                ElseIf Simplify0(c(0)) = "-1" Then
                    t = t & "-x"
                Else
                    t = t & Simplify0(c(0)) + " x"
                End If
            ElseIf c.Length = 1 Then
                t = t & Simplify0(c(0))
            End If

            For i = 1 To c.Length - 1
                If c.Length - 1 - i > 1 Then
                    If c(i) > 0.0 Then
                        If Simplify0(c(i)) = "1" Then
                            t = t & " + " & "x^" & (c.Length - 2 - i)
                        Else
                            t = t & " + " & Simplify0(c(i)) & " x^" & (c.Length - 2 - i)
                        End If
                    ElseIf c(i) < 0.0 Then
                        If Simplify0(c(i)) = "-1" Then
                            t = t & " - " & "x^" & (c.Length - 2 - i)
                        Else
                            t = t & " - " & Simplify0(Math.Abs(c(i))) & " x^" & (c.Length - 2 - i)
                        End If
                    End If
                ElseIf c.Length - 1 - i = 1 Then
                    If c(i) > 0.0 Then
                        If Simplify0((i)) = "1" Then
                            t = t &  " + " & Simplify0(c(i)) & "x"
                        Else
                            t = t &  " + " & Simplify0(c(i)) & " x"
                        End If
                    ElseIf c(i) < 0.0 Then
                        If Simplify0(c(i)) = "-1" Then
                            t = t &  " - " & "x"
                        Else
                            t = t &  " - " & Simplify0(Math.Abs(c(i))) & " x"
                        End If
                    End If
                ElseIf c.Length - 1 - i = 0 Then
                    If c(i) > 0.0 Then
                        t = t & " + " & Simplify0(c(i))
                    ElseIf c(i) < 0.0 Then
                        t = t & " - " & Simplify0(Math.Abs(c(i)))
                    End If
                End If
            Next
            ToPolyString = t
        End Function


        ' 다항식 나눗셈 결과를
        '     (피제식) = (제식)(몫) + (나마지)
        ' 형태로 출력
        Shared Sub PrintDivisionResult(a As Double, c() As Double, b() As Double)

            Console.WriteLine("  " & ToPolyString(c))
            Console.WriteLine()
            Console.Write("    = ( " & ToPolyString( New Double() {1.0, -a} ) & " )")

            Dim tmp(b.Length -  2) As Double
            For i = 0 To tmp.Length - 1
                tmp(i) = b(i)
            Next
            Console.Write("( " & ToPolyString(tmp) & " )")

            Dim r As Double = b(b.Length - 1)
            If r > 0.0 Then
                Console.Write(" + " & Simplify0(r))
            ElseIf r < 0.0 Then
                Console.Write(" - " & Simplify0(Math.Abs(r)))
            End If

            Console.WriteLine()
        End Sub

        ' 조립제법 계산표 출력 메쏘드
        Shared Sub PrintSyntheticTable(a As Double, c() As Double, s() As Double, q() As Double)
            Console.Write("       | ")
            Console.Write(Simplify(c(0), 6))
            For i = 1 To c.Length - 1
                Console.Write("  " & Simplify(c(i), 6))
            Next
            Console.WriteLine()

            Console.Write(Simplify(a, 6) & " | ")
            Console.Write("        ")
            Console.Write(Simplify(s(1), 6))
            For i = 2 To s.Length - 1
                Console.Write("  " & Simplify(s(i), 6))
            Next
            Console.WriteLine()

            Console.Write("       |-")
            For i = 0 To q.Length - 1
                Console.Write("--------")
            Next
            Console.WriteLine("")

            Console.Write("         ")
            Console.Write(Simplify(q(0), 6))
            For i = 1 To q.Length - 1
                Console.Write("  " & Simplify(q(i), 6))
            Next
            Console.WriteLine()
        End Sub


        ' Java 언어의 main 메소드에 해당하는 Visual Basic 언어의 Main
        Shared Sub Main(ByVal args As String())
            If args.Length < 3 Then
                PrintUsage()
                Return
            End If

            ' ----------------------------------------------------
            '  피제식은 c_0 x^n +  c_1 x^(n -1) + &. + c_n
            '  제식은 x -  a
            Dim a As Double = Convert.ToDouble(args(0))
            Dim c(args.Length-2) As Double
            Dim s(args.Length-2) As Double
            Dim b(args.Length-2) As Double
            For i = 0 To c.Length - 1
                c(i) = Convert.ToDouble(args(i+1))
            Next

            ' ----------------------------------------------------
            ' 조립제법의 주요 부분
            s(0) = 0.0
            b(0) = c(0)
            For i = 1 To c.Length - 1
                s(i) = b(i-1)*a
                b(i) = c(i) + s(i)
            Next i

            ' -----------------------------------------
            ' 몫의 계수와 나머지를 출력한다.
            Console.Write("몫의 계수는 ")
            For i = 0 To b.Length - 3
                 Console.Write(Simplify0(b(i)) & ", " )
            Next
            Console.Write(Simplify0(b(b.Length - 2)))
            Console.WriteLine(" 이고, 나머지는 " & Simplify0(b(b.Length - 1)) & " 이다.")
            Console.WriteLine()

            ' -----------------------------------------
            ' 조립제법 표를 출력한다.
            PrintSyntheticTable(a, c, s, b)
            Console.WriteLine()

            ' -----------------------------------------
            ' (피제식) = (제식) x (몫) + (나머지)
            PrintDivisionResult(a, c, b)
       End Sub
End Class






컴파일> vbc TestSyntheticMethod.bass
실행> TestSyntheticMethod 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 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




크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Scripter
,
{\rtf1\ansi \deff0\deflang1033{\fonttbl

{\rtf1\ansi\ansicpg949 \deff0\deflang1033{\fonttbl

오늘은 위 두 줄의 차이 때문에 엄청 삽질한 하루였다.

참고로 \ansicpg1252는 Windows-1252를 의미하며
iso-8859-1 즉 서유럽어(Windows) 문자인코딩을 의미한다.
다음은 HelloHangul.java를 컴파일, 실행하여 얻은 RTF 파일의 내용이다.

{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\froman\fcharset0 Times New Roman;}{\f1\froman\fcharset0 unknown;}{\f2\froman\fcharset0 Arial;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;}{\stylesheet {\style\s2 \ql\fi0\li0\ri0\f2\fs28\b\i\cf0 heading 2;}{\style\s3 \ql\fi0\li0\ri0\f2\fs26\b\cf0 heading 3;}{\style\s1 \ql\fi0\li0\ri0\f2\fs32\b\cf0 heading 1;}{\style\s0 \ql\fi0\li0\ri0\f2\fs24\cf0 Normal;}}{\*\listtable}{\*\listoverridetable}{\*\generator iText 2.1.4 (by lowagie.com)}{\info}\paperw11907\paperh16840\margl720\margr720\margt720\margb720\pgwsxn11907\pghsxn16840\marglsxn720\margrsxn720\margtsxn720\margbsxn720\pard\plain\s0\fi0\li0\ri0\plain\f1 Hello, \u-10916?\u-20992?!\par}



참고로,
http://msdn.microsoft.com/en-us/library/aa140277.aspx 에는 좀 낡은 것이기는 하지만
RTF 1.6 스펙을 볼 수 있으며, 위키백과 http://en.wikipedia.org/wiki/Rich_Text_Format 에는 RTF에 관한 많은 정보를 볼 수 있다.

또,
http://www.java2s.com/Tutorial/VB/0260__GUI/LoadtxtfiletoRichTextBox.htm
를 방문하면 RichTextBox를 이용하여 RTF 파일을 컨트롤하는 어러가지 비베(Visual Bascic)를 여러개 볼 수 있다.

<그림> 비베로 작성된 RTF Reader and Writer의 실행 장면



소스 파일명: testReadWriteRTF.bas

Option Strict On
Imports System.IO

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms

Imports System.Text
Imports Microsoft.VisualBasic


public class RichTextBoxSaveReadFile
   public Shared Sub Main
        Application.Run(New Form1)
   End Sub
End class


Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
    Friend WithEvents Panel1 As System.Windows.Forms.Panel
    Friend WithEvents RichTextBox1 As System.Windows.Forms.RichTextBox
    Friend WithEvents ColorDialog1 As System.Windows.Forms.ColorDialog
    Friend WithEvents FontDialog1 As System.Windows.Forms.FontDialog
    Friend WithEvents SaveFileDialog1 As System.Windows.Forms.SaveFileDialog
    Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog
    Friend WithEvents btnChangeColor As System.Windows.Forms.Button
    Friend WithEvents btnChangeFont As System.Windows.Forms.Button
    Friend WithEvents btnSaveRTF As System.Windows.Forms.Button
    Friend WithEvents btnOpenRTF As System.Windows.Forms.Button
    Friend WithEvents btnWriteControls As System.Windows.Forms.Button
    Friend WithEvents btnReadControls As System.Windows.Forms.Button
    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
    Friend WithEvents TextBox2 As System.Windows.Forms.TextBox
    Friend WithEvents TextBox3 As System.Windows.Forms.TextBox

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Text = "RTF Reader and Writer"
        Me.Panel1 = New System.Windows.Forms.Panel()
        Me.RichTextBox1 = New System.Windows.Forms.RichTextBox()
        Me.ColorDialog1 = New System.Windows.Forms.ColorDialog()
        Me.FontDialog1 = New System.Windows.Forms.FontDialog()
        Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog()
        Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
        Me.btnChangeColor = New System.Windows.Forms.Button()
        Me.btnChangeFont = New System.Windows.Forms.Button()
        Me.btnSaveRTF = New System.Windows.Forms.Button()
        Me.btnOpenRTF = New System.Windows.Forms.Button()
        Me.btnWriteControls = New System.Windows.Forms.Button()
        Me.btnReadControls = New System.Windows.Forms.Button()
        Me.TextBox1 = New System.Windows.Forms.TextBox()
        Me.TextBox2 = New System.Windows.Forms.TextBox()
        Me.TextBox3 = New System.Windows.Forms.TextBox()
        Me.Panel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'Panel1
        '
        Me.Panel1.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnReadControls, Me.btnWriteControls, Me.btnOpenRTF, Me.btnSaveRTF, Me.btnChangeFont, Me.btnChangeColor})
        Me.Panel1.Dock = System.Windows.Forms.DockStyle.Bottom
        Me.Panel1.Location = New System.Drawing.Point(0, 222)
        Me.Panel1.Name = "Panel1"
        Me.Panel1.Size = New System.Drawing.Size(656, 64)
        Me.Panel1.TabIndex = 0
        '
        'RichTextBox1
        '
        Me.RichTextBox1.Location = New System.Drawing.Point(16, 8)
        Me.RichTextBox1.Name = "RichTextBox1"
        Me.RichTextBox1.Size = New System.Drawing.Size(336, 176)
        Me.RichTextBox1.TabIndex = 1
        Me.RichTextBox1.Text = "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they w" & _
        "ere perfectly normal, thank you very much."
        '
        'btnChangeColor
        '
        Me.btnChangeColor.Location = New System.Drawing.Point(24, 24)
        Me.btnChangeColor.Name = "btnChangeColor"
        Me.btnChangeColor.Size = New System.Drawing.Size(88, 32)
        Me.btnChangeColor.TabIndex = 0
        Me.btnChangeColor.Text = "Change Color"
        '
        'btnChangeFont
        '
        Me.btnChangeFont.Location = New System.Drawing.Point(128, 24)
        Me.btnChangeFont.Name = "btnChangeFont"
        Me.btnChangeFont.Size = New System.Drawing.Size(88, 32)
        Me.btnChangeFont.TabIndex = 1
        Me.btnChangeFont.Text = "Change Font"
        '
        'btnSaveRTF
        '
        Me.btnSaveRTF.Location = New System.Drawing.Point(232, 24)
        Me.btnSaveRTF.Name = "btnSaveRTF"
        Me.btnSaveRTF.Size = New System.Drawing.Size(88, 32)
        Me.btnSaveRTF.TabIndex = 2
        Me.btnSaveRTF.Text = "Save RTF"
        '
        'btnOpenRTF
        '
        Me.btnOpenRTF.Location = New System.Drawing.Point(336, 24)
        Me.btnOpenRTF.Name = "btnOpenRTF"
        Me.btnOpenRTF.Size = New System.Drawing.Size(88, 32)
        Me.btnOpenRTF.TabIndex = 3
        Me.btnOpenRTF.Text = "Open RTF"
        '
        'btnWriteControls
        '
        Me.btnWriteControls.Location = New System.Drawing.Point(440, 24)
        Me.btnWriteControls.Name = "btnWriteControls"
        Me.btnWriteControls.Size = New System.Drawing.Size(88, 32)
        Me.btnWriteControls.TabIndex = 4
        Me.btnWriteControls.Text = "Write Controls"
        '
        'btnReadControls
        '
        Me.btnReadControls.Location = New System.Drawing.Point(544, 24)
        Me.btnReadControls.Name = "btnReadControls"
        Me.btnReadControls.Size = New System.Drawing.Size(88, 32)
        Me.btnReadControls.TabIndex = 5
        Me.btnReadControls.Text = "Read Controls"
        '
        'TextBox1
        '
        Me.TextBox1.Location = New System.Drawing.Point(400, 24)
        Me.TextBox1.Name = "TextBox1"
        Me.TextBox1.Size = New System.Drawing.Size(232, 20)
        Me.TextBox1.TabIndex = 2
        Me.TextBox1.Text = "TextBox1"
        '
        'TextBox2
        '
        Me.TextBox2.Location = New System.Drawing.Point(400, 68)
        Me.TextBox2.Name = "TextBox2"
        Me.TextBox2.Size = New System.Drawing.Size(232, 20)
        Me.TextBox2.TabIndex = 3
        Me.TextBox2.Text = "TextBox2"
        '
        'TextBox3
        '
        Me.TextBox3.Location = New System.Drawing.Point(400, 112)
        Me.TextBox3.Name = "TextBox3"
        Me.TextBox3.Size = New System.Drawing.Size(232, 20)
        Me.TextBox3.TabIndex = 4
        Me.TextBox3.Text = "TextBox3"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(656, 286)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox3, Me.TextBox2, Me.TextBox1, Me.RichTextBox1, Me.Panel1})
        Me.Panel1.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub

#End Region


    Private Sub btnSaveRTF_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnSaveRTF.Click
        SaveFileDialog1.InitialDirectory = Application.ExecutablePath
        SaveFileDialog1.DefaultExt = "rtf"
        SaveFileDialog1.FileName = "NewFile"
        SaveFileDialog1.Filter = "Rich Text Files (*.rtf)|*.rtf|All Files (*.*) | *.*"
        SaveFileDialog1.ShowDialog()
        RichTextBox1.SaveFile(SaveFileDialog1.FileName)

    End Sub

    Private Sub btnOpenRTF_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnOpenRTF.Click
        OpenFileDialog1.InitialDirectory = Application.ExecutablePath
        OpenFileDialog1.DefaultExt = "rtf"
        OpenFileDialog1.FileName = "NewFile"
        OpenFileDialog1.Filter = "Rich Text Files (*.rtf)|*.rtf|All Files (*.*) | *.*"
        OpenFileDialog1.ShowDialog()

        RichTextBox1.LoadFile(OpenFileDialog1.FileName)
    End Sub

    Private Sub btnChangeFont_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnChangeFont.Click
        Dim theFont As System.Drawing.Font
        FontDialog1.ShowDialog()
        theFont = FontDialog1.Font

        btnChangeFont.Font = theFont
        RichTextBox1.SelectionFont = theFont
    End Sub

    Private Sub btnChangeColor_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnChangeColor.Click
        Dim theColor As System.Drawing.Color
        ColorDialog1.AllowFullOpen = True
        ColorDialog1.AnyColor = True
        ColorDialog1.ShowDialog()
        theColor = ColorDialog1.Color

        btnChangeColor.ForeColor = theColor
        RichTextBox1.SelectionColor = theColor
    End Sub
End Class



컴파일은 Visual Studio 명령행에서

        vbc testReadWriteRTF.bas

하면 되고, 실행은

       testReadWriteRTF

하면 된다.


크리에이티브 커먼즈 라이선스
Creative Commons License

 

Posted by Scripter
,