[파일명: TestSortApp.bas]------------------------------------------------
Imports System
Imports System.Collections
Imports System.Collections.Generic
Namespace MyTestApplication1
Public Class TestSortApp
' Java 언어의 main 메소드에 해당하는 Visual Basic의 Main
Shared Sub Main(ByVal args As String())
Dim arr(args.Length) As String
Dim i As Integer
For i = 0 To args.Length - 1
arr(i) = args(i)
Next i
Array.Sort(arr)
PrintArray(arr)
End Sub
Shared Sub PrintArray(arr As Object())
Dim i As Integer
Console.Write("[")
For i = 1 To arr.Length - 2
Console.Write("{0}, ", arr(i))
Next i
If arr.Length > 0 Then
Console.Write("{0}", arr(arr.Length - 1))
End If
Console.WriteLine("]")
End Sub
End Class
End Namespace
------------------------------------------------
컴파일> vbc TestSortApp.bas
실행> TestSortApp one two three four five
[five, four, one, three, two]
[파일명: TestSort.scala]------------------------------------------------
object TestSort {
def quickSort(arr: Array[String], start: Int, end: Int) {
var i: Int = start
var k: Int = end
var pivot: String = ""
if (end - start >= 1) {
pivot = arr(start)
while (k > i) {
while (arr(i) <= pivot && i <= end && k > i) {
i += 1
}
while (arr(k) > pivot && k >= start && k >= i) {
k -= 1
}
if (k > i) {
swap(arr, i, k)
}
}
swap(arr, start, k)
quickSort(arr, start, k - 1)
quickSort(arr, k + 1, end)
}
}
void quickSort(char array[20][80], int start, int end); void swap(char array[20][80], int x, int y); void printArray(char array[20][80], int start, int end); void exit(int n);
int main(int argc, char* argv[]) { char* pbuf; int i; if (argc > 1 && argc < 22) { for (i = 0; i < argc - 1; i++) { if (strlen(argv[i+1]) > 79) { printf("Caught: strlen(\"%s\") = %d, which is too long.\n", argv[i+1], strlen(argv[i+1])); exit(1); } sprintf(SBUF[i], argv[i+1]); } quickSort(&SBUF[0], 0, argc - 2); printArray(SBUF, 0, argc - 2); } else if (argc > 21) { printf("Given too many items. (The counter of items should be less then 20.)\n"); exit(1); } return 0; }
void quickSort(char array[20][80], int start, int end) { int i = start; int k = end; char pivot[80];
if (end - start >= 1) { strcpy(pivot, array[start]); while (k > i) { while (strcmp(array[i], pivot) <= 0 && i <= end && k > i) i++; while (strcmp(array[k], pivot) > 0 && k >= start && k >= i) k--; if (k > i) { swap(array, i, k); } } swap(array, start, k);
quickSort(array, start, k - 1); quickSort(array, k + 1, end); } else { return; } }
void swap(char array[20][80], int x, int y) { strcpy(TBUF, array[x]); strcpy(array[x], array[y]); strcpy(array[y], TBUF); }
void printArray(char array[20][80], int start, int end) { int i; printf("["); for (i = start; i < end; i++) { printf("%s, ", array[i]); } if (end >= start) printf("%s", array[end]); printf("]\n"); } ------------------------------------------------
컴파일> cl testSort.c 또는 컴파일> bcc32 testSort.c 또는 컴파일> gcc -o testSort testSort.c
실행> testSort 하나 둘 셋 넷 [넷, 둘, 셋, 하나]
실행> ./testSort one two thee four [four, one, three, two]
을 출력하는 Boo 소스 코드를 작성해 보자. 이런 소스 코드의 작성은 학원이나 학교에서 프로그래밍 입문자에게 과제로 많이 주어지는 것 중의 하나이다. 코끼리를 보거나 만진 사람들이 저마다 그 생김새를 말할 때 제각기 다르게 표현할 수 있듯이 이런 소스 코드의 작성도 알고 보면 얼마든지 많은 방법이 있을 것이다. 여기서는 쉬운 코드 부터 작성해 보고 차츰차츰 소스를 바꾸어 가면서 Boo 프로그래밍의 기초부분을 터득해 보기로 한다.
Boo 언어는 프로그래밍은 다음 두 가지를 숙지하고 있으면 배우기 쉽다.
(1) 우선 Boo 언어의 문법과 구문 몸체는 Python의 것을 따른다. 그러므로 들여쓰기 규칙을 Python 언어에서 처럼 꼭 지켜야 한다.
(2) 그 다음 Boo 언어는 닷넷 상에서 동작하는 만큼 (개념이나 함수 라이브러리 등) 내부적으로 C#의 것을 많이 따른다.
모든 소스 코드에서는 삼각형 출력 부분 담당 함수 printTriange()를 별도로 구현하였다.
우선 첫번 째 예제는 Boo의 컨솔 출력 매크로(함수) print의 사용법만 알면 누구나 코딩할 수 있는 매우 단순한 소스 코드이다. (파일 확장자만 py 대신 boo로 한 것이지 그 외에는 Python의 것과 완전 동일하다.)
삼각형 출력 예제 1 # Filename: printTriangle1.boo # Print a triangle on console. # # Execute: booi printTriangle1.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
위의 소스 코드는 아무 알고리즘도 없는 너무 단순한 코드이다. 이런 코드를 작성했다간 출력 모양이나 크기를 변경해야 하는 상황을 맞이하면 워드프로세서로 문서 만드는 것 이상으로 많은 수작업을 하거나 아니면 포기하는 지경에 이를 수도 있다. 그래서 다음 처럼 좀 더 나은 소스 코드를 작성하였다. 빈칸을 출력할 것인지 별문자를 출력한 것인지를 결정하여 한 개의 문자씩 컨솔에 출력한다. 그런데 Boo 언어의 print 문은 Python 언어의 것 처럼 스트링을 출력 후 새 줄 문자(newline, '\n')을 추가한다. 그리고 끝에 콤마를 추가한
print string,
문은 (Python 언어에서는 지원되자만) Boo 언어에서는 지원되지 않는다. Python 언어에서 sys.ㄴstdout.write(스트링) 에 해당하는 Boo 언어의 코드는 System.Console.Write(스트링) 이다.
따라서 Python 언어에서는
import sys sys.stdout.write(string)
라고 코딩할 것을 Boo 언어로는
import System Console.Write(string)
라고 코딩하였다.
아래의 소스 코드는 파일 확장자가 py 대신 boo로 바꾼 것 이외에, Python용 소스 코드에서
import sys
def write(s): sys.stdout.write(s)
라고 했던 것을 Boo용 소스 코드
import System
def write(s): Console.Write(s)
로 바꾼 것이 전부이다.
삼각형 출력 예제 2 # Filename: printTriangle2.boo # Print a triangle on console. # # Execute: booi printTriangle2.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
import System
def write(s): Console.Write(s)
def printTriange(): for i in range(0, 8): for k in range(0, 8-i): write(" ") for k in range(0, 2*i+1): if k == 0 or k == 2*i: write("*") else: write(" ") for k in range(0, 8-i): write(" ") print
for i in range(0, 17): write("*") print
printTriange()
위의 소스 코드는 Boo의 컨솔 출력 매크로 print 와 System.Console.Write() 그리고 for 반복 구문을 적절히 사용하여 구현되었다. 숫자 몇 곳만 수정하면 출력되는 삼각형의 크기를 바꿀 수 있다. 한 줄에 출력될 문자를 구성하는 알고리즘은 위의 예제와 근본적으로 같지만 print, System.Console.Write() 를 사용하지 않고, 그대신 문자의 리스트를 만들어 한 즐씩 출력하는 소스 코드를 다음 예제와 같이 작성해 보았다. 또 빈칸 17개의 문자로 구성된 리스트를 생성하기 위한 구문은
whites = [" "]*17
이다. (string*number 또는 list*number 의 구문은 Python, Groovy, Ruby 언어에서도 지원된다.)
Python용 소스코드와 다른 것은 배열을 출력하는 Python 용 구문
print "".join(line2)
대신 Boo용 코드
print join(line2, "")
로 고친 곳이 두 곳이다.
리스트의 데이터들을 문자열로 연결하여 표현하기: Python용 소스 코드: 연결스트링.join(리스트) Boo용 소스 코드: join(리스트, 연결스트링)
삼각형 출력 예제 3 # Filename: printTriangle3.boo # Print a triangle on console. # # Execute: booi printTriangle3.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
def printTriange(): line2 = [" "]*17 for i in range(0, 8): line2 = [" "]*17 line2[8-i] = '*' line2[8+i] = '*' print join(line2, "")
line2 = [" "]*17 for i in range(0, 17): line2[i] = '*' print join(line2, "")
printTriange()
별(*) 문자를 이용하여 삼각형을 출력하는 일은 빈칸 문자와 별 문자응 적당한 좌표(위치)에 촐력하는 일이다. 출력될 한 줄의 스트링을 완성한 후 하나의 print 구문으로 출력하는 기법으로 소스 코드를 작성해 보았다. 소스 코드 중에
whites = " "*17 stars = "*"*17
은 지정된 개수(여기서는 17) 만큼 string을 중복 연결하는 구문이다.
Python 언어로 작성되었던 곳과 비교하면 형식화된 문자열 출력을 위해 Python 언어용 구문
line2 = 포맷 % 데이터들
대신 Boo 언어용 구문(즉 C#에서 빌려온 구문)
import System line2 = String.Format(포맷, 데이터들)
로 한 것이 다르다.
삼각형 출력 예제 4 # Filename: printTriangle4.boo # Print a triangle on console. # # Execute: booi printTriangle4.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
def itoa(num as long, radix as int): ............. .............
로 작성되었고, 또 리스트에 데이터를 추가하는 함수가 Python 소스 코드로는
리스트.append(데이터)
이지만, Boo 소스 코드에서는
리스트.Add(데이터)
이다.
삼각형 출력 예제 7 # Filename: printTriangle7.boo # Print a triangle on console. # # Execute: booi printTriangle7.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def itoa(num as long, radix as int): isNegative = false if num < 0: isNegative = true num = -num arr = [] q, r = num, 0 while q >= radix: r = q % radix q = q / radix arr.Add(BASE36[r]) arr.Add(BASE36[q]) if isNegative: arr.Add("-") return join(reversed(arr), '')
def printTriange(): start = 0x100 total = 0 val = start data = "" for k in range(0, 8): val = (start << k) | (start >> k) data = itoa(val, 2) s = "" for i in range(0, 17 - len(data)): s += " " for i in range(0, len(data)): if "" + data[i] == '0': // dara[i] is a type of char s += " " else: s += "*" print s total += val
val = (start << 8) | (start >> 8) total += val data = itoa(total, 2) s = "" for i in range(0, 17 - len(data)): s += " " for i in range(0, len(data)): if data[i] == '0': s += " " else: s += "*" print s
printTriange()
기본적인 원리는 위의 소스 코드와 같지만 이진법수의 한 비트 마다 한 문자씩 츨력하는 대신에 출력될 한 줄의 string을 완성하여 이를 print 구문으로 출력하는 기법으로 재작성한 것이 다음의 소스 코드이다. anotherString = string.replace(원본, 타겟) 을 이용하여 모든 0을 빈칸으로, 모든 1을 별(*) 문자로 바꾸었으며, 별(*) 문자만으로 이루어진 마지막 줄 출력을 위해 변수 total을 준비하였다. for 반복 구문의 블럭 내에서 구문
total |= val
이 하는 일이 무엇인지 이해할 수 있으면 좋겠다.
스트링을 역순으로 변환하는 함수 reverse()는 printTriangle6.boo 에서 작성된 것을 그대로 가져왔고, 정수를 지정된 진법(radix)의 스트링으로 변환하는 함수 itoa()는 printTriangle8.boo 에서 작성된 것을 그대로 가져왔다. 그리고 printTriangle()의 구현부에서는 Python용 소스 printTriangle8.py 에 있던 것에서 스트링 치환 메소드 string.replace(oldString, newString) 대신 string.Replace(oldString, newString) (즉, 소문자 r을 대문자 R)로 바꾼 것만 다르다.
삼각형 출력 예제 8 # Filename: printTriangle8.boo # Print a triangle on console. # # Execute: booi printTriangle8.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
def itoa(num as long, radix as int): isNegative = false if num < 0: isNegative = true num = -num arr = [] q, r = num, 0 while q >= radix: r = q % radix q = q / radix arr.Add(BASE36[r]) arr.Add(BASE36[q]) if isNegative: arr.Add("-") return join(reversed(arr), '')
def printTriange(): zeros = "00000000" start = 0x100 total = 0 val = start line = "" data = "" for k in range(0, 8): val = (start << k) | (start >> k) data = itoa(val, 2) line = zeros[0:17-len(data)] + data line = line.Replace("0", " ") line = line.Replace("1", "*") print line total |= val
val = (start << 8) | (start >> 8) total |= val line = itoa(total, 2) line = line.Replace("0", " ") line = line.Replace("1", "*") print line
printTriange()
소스 코드가 처음 것 보다 매우 복잡해졌지만, Boo의 리스트를 이용해서 구현해 보았다. Boo 언어 외에 Python, Groovy, Ruby 언어 같은 스크립팅 언어에서도 리스트와 맵은 매우 중요하게 취급되며, 구문에서도 이를 위한 문법을 제공하고 있다. 별(*) 문자만으로 구성된 마지막 줄 출력을 위해 리스트 타입의 변수 last를 준비하였다. 또 리스트에 속한 모든 item을 출력하는 Boo 소스 코드
print join(data, "")
는 Python 소스 코드에서는
print "".join(data)
로 작성되었던 것을 Boo용으로 수정한 것이다.
삼각형 출력 예제 9 # Filename: printTriangle9.boo # Print a triangle on console. # # Execute: python printTriangle9.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
def printTriange(): start = 8 data = [" "]*17 last = [" "]*17
(x + y - 8 == 0) or (y - x + 8 == 0) or (y - 8 == 0)
가 참이 되는 위치에 별(*) 문자를 표시하는 기법으로 작성된 소스 코드이다.
Python용 소스 코드에서는
sys.stdout.write(스트링)
이라고 작성했던 것을 Boo용 소스 코드에서는
System.Console.Write(스트링)
이라고 작성한 것이 다르다.
삼각형 출력 예제 10 # Filename: printTriangle10.boo # Print a triangle on console. # # Execute: booi printTriangle10.boo # # Date: 2009/04/08 # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
import System
def printTriange(): for y in range(0, 9): for x in range(0, 17): if (x + y - 8 == 0) or (y - x + 8 == 0) or (y - 8 == 0): a = '*' else: a = ' ' Console.Write(a) print