d라이브러리









BASIC강좌⑥ 응용의 첫걸음

이제까지는 BASIC으로 프로그램을 작성할 때 필요한 구문을 다루었다. 이번 호는 예제를 통해 BASIC언어의 응용력을 기르도록 한다. 지금부터는 단순히 프로그램의 구조를 배운다는 생각보다는 프로그램의 의미를 파악하여야 할 것이다. 따라서 프로그램의 입력과 출력양식을 명확하게 이해한 다음 어떻게 처리할 것인가를 다루는 알고리즘적 측면을 많이 다룰 것이다.

 

콤마(,)의 사용예


BASIC프로그램에서 자주사용되는 기호로 콤마(,)가 있다. 프로그램에서 콤마 하나가 빠져 태양계탐사를 수행해야할 무인우주선이 영원한 우주의 미아가 되어버릴수도 있다. 콤마는 프로그램을 이루는 기호이지만 사용장소에 따라 그 의미가 달라진다. (그림1)에서 처럼 PRINT문에서 사용되면 일정한 간격으로 각 변수의 값을 출력시킨다. 이때의 콤마는 명령으로 해석된 것이다.
 

(그림1) 콤마를 사용한 변수값의 출력


콤마는 ASCII(American Standard Codes for Information Interchange)로 44(10진수)이다. 즉 콤마를 프로그램상에서 기억시킬때는 44란 값으로 기억시킨다. 프로그램을 구성하는 모든 문자는 ASCII코드로 기억되는 것이 대부분이고 ASCII코드는 1바이트(8비트)로 표현된다. 따라서 ","에 대한 16진수값은 2C이다. BASIC언어에는 문자에 대한 ASCII값을 출력하는 함수가 있고 10진수값을 16진수값으로 변환해주는 함수도 있기 때문에 (그림2)와 같이 사용하면 원하는 문자의 해당 ASCII값을 알 수 있다.
 

(그림2) ","에 대한 ASCII값의 출력예
 

","가 반복되는 문자열을 구성하려면 A$=", , , ,"와 같이 할 수 있으나 반복되는 횟수가 많으면 불편하기 때문에 BASIC에서 이를 위한 함수를 제공하고 있다. STRING$라는 함수는 임의의 문자나 문자열을 지정된 반복횟수 만큼 반복결합시켜서 새로운 문자열을 만들어 낸다. 이 함수는 도표 작성에 유효하게 사용되며, 특히 막대그래프를 출력시킬 때에도 자주 사용된다.
 

(그림3) STRING$함수의 응용


숫자의 출력에도 ","를 사용하는 경우가 있는데 금액을 표시할 때 자주 볼 수 있다.
 

(그림4)는 ","가 찍혀나오는 위치를 지정해주면서 숫자를 출력시키는 예이다.
 

","의 사용은 위에서 설명한 예제 이외에도 배열선언문, 변수나열형 INPUT문과 READ문, 그리고 DATA문의 데이타 분리용으로 사용된다.

 

(그림4) 숫자출력시","의 사용


세미콜론( ; )의 사용예

 

세미콜론( ; )도 콤마(,)와 마찬가지로 PRINT문에 사용될 수 있다. 그러나 출력형태가 다르다. ","가 분리용으로 사용되는 반면 " ; "는 밀착용으로 사용된다. (그림5)는 " ; "기호가 밀착을 의미하는 명령으로 사용됨을 보이는 예이다.
 

(그림5) ";"를 사용한 숫자의 출력예


(그림1)의 출력결과와 비교해 보면 훨씬 떨어진 거리가 줄어들었음을 확인할 수 있을 것이다. " ; "기호가 밀착을 의미한다는 것을 직관적으로 알 수 있는 예로 (그림6)을 들었다. 숫자를 출력하는 경우 바로뒤에 밀착되지 않는 이유가 부호표시 때문이다.
 

(그림6) ";"를 사용한 문자열의 출력예


배열의 형태로 기억된 데이타를 가로로 밀착시켜서 출력시켜 보자. 이때 배열에 기억되는 값은 INPUT문에 의해 입력되도록 한다. 사용자와 대화식으로 데이타를 입력시키기 위해 문자열 출력형 INPUT문을 사용하는데 출력되는 문자열과 입력되는 데이타를 기억하는 변수는 " ; "으로 분리된다. 배열에 기억된 데이타를 밀착시켜 출력하기 위해 " ; "을 사용하였으나 " ; "기호가 PRINT문의 제일 뒤에 있어서 금방 의미가 파악되지 않을 수 있다. 이 때의 " ; " 기호의 의미는 "다음에 찍히는 모든 것들은 내 꽁무니에 밀착시켜라"이다. 즉
 

50 FOR I=1 TO 5

60 PRINT A(I) ;

70 NEXT I
 

와같은 기능은
 

PRINT A(1) ; A(2) ; A(3) ; A(4) ; A(5) ;
 

와 같다.
 

(그림7)은 배열원소를 입력시켜서 " ; "을 사용하여 밀착시켜 출력하는 예이다.
 

(그림7) PRINT문 마지막에 사용한";"의 응용 예


(그림7)의 프로그램을 변형시켜 똑같은 출력 형태로 숫자가 나열되도록 하여 보자. FOR~NEXT문의 인덱스를 1부터 5까지하고 J를 1부터 5까지 변화시켜 배열A의 각 원소를 출력시키는 것이다. 그러나 출력된 결과에서 알 수 있듯이 원하는 출력이 나오질 않고 마지막에서 에러까지 출력된다.


여기서 중요한 사실을 이해하고 넘어가야 한다. FOR~NEXT문에 사용되는 인덱스는 FOR~NEXT문을 빠져나올때 인덱스가 증가된 상태로 빠져 나온다. 결과적으로 80번 문을 실행할 때의 I의 값은 6이다. 90번문에서 에러를 출력하고 있는데 이 에러는 배열의 첨자를 잘못 사용하였을 때 출력된다. 에러가 발생한 이유는 90번 문의 PRINT A(I+J) ; 가 PRINT A(6+5) ; 로 해석될때이다. A(11)의 원소는 정의되어 있지 않았기 때문이다. (그림8) 에서 출력된 에러를 제거시키기 위해서 J의 변위구간을 0에서 4까지하면 원하는 출력 결과를 얻을 수 있다. (그림9)가 원하는 프로그램이다.
 

(그림8) FOR~NEXT문을 이용한";"의 응용예


FOR~NEXT문 속에 있는 PRINT문의 맨마지막에 ";"을 사용하면 계속 밀착되어 출력되기 때문에 이를 해제시키는 명령이 필요한 경우가 있다. 특별한 명령이 있지 않고 PRINT문 하나로 이를 처리할 수 있다.
 

(그림9) 에러를 제거시킨 프로그램과 실행예


(그림9)에 있는 프로그램을 (그림10)처럼 변경시켜 놓으면 된다. 75번에 PRINT만 삽입시켜 놓았다. 출력에서 알 수 있듯이 2행에 걸쳐 5개씩 데이타가 출력된다.

(그림10) ";"기호에 의한 밀착 기능의 해제


PRINT문에 아무것도 출력시키지 않으면 다음에 출력시키는 모든 데이타를 행을 넘겨서 출력시켜 버린다. 즉 한 행을 넘기는 명령으로 처리된다. (그림10)의 프로그램을 더욱더 간소화시키기 위해 (그림11)처럼 재구성하여 보았다. 60번 문에서 "I=6이면 즉 6번째 찍히는 데이타라면, 행을 넘겨라"에 해당하는 IF I=6 THEN PRINT를 사용하고 있다. 6번째의 데이타를 출력시킬때 미리 밀착기능을 해체시켜 놓은 것이다.

 

(그림11) ";"에의한 밀착기능을 해제시키는 프로그램의 실행예


이제 2차원 배열에 기억된 원고들을 2차원 형태로 출력시켜보자. 2차원 배열에 기억되는 데이타는 READ~DATA문에 의해 입력되도록 한다. (그림12)는 2차원 데이타의 입력과 출력을 위한 프로그램으로 130번 문에서 PRINT를 사용하여 행 넘기기를 하고 있다. 130번 문의 PRINT를 삭제하고 실행시켜 보면 그 효과를 눈으로 확인할 수 있을 것이다.
 

(그림12) 2차원 배열원소 입출력을 보인 프로그램

 

콜론( : )의 사용예


(그림12)에서 사용한 " : "의 의미를 설명해보자. 70번과 80번에 " : "표시가 되어있다. : 표시는 문장과 문장을 구분해주는 기호인 데 여기에서처럼 단독으로 사용되면 빈 문장(null statement)을 의미한다. 따라서 70, 80번 문장은 실행할 것이 없다를 나타낸다. 70, 80의 ":"기호는 프로그램의 구성에 시각적 효과를 주어 기능단위로 프로그램을 분할할 수 있는 방법을 제공한다.

 

(그림13) 연속된 2개의 NEXT문의 처리 예


(그림13)은 연속된 2개의 NEXT문의 처리 예를 보여준다. (그림12)의
 

50 NEXT J

60 NEXT I
 

를 다음과 같이 하나의 문장으로 바꿀 수 있다.
 

50 NEXT J, I
 

인덱스는 ","로 분리된다. 인덱스의 나열 순서는 제일 왼쪽에 있는 것이 가장 내부에 포함되어있는 FOR~NEXT문의 인덱스이며 차례로 외부 FOR~NEXT문의 인덱스를 ","로 분리해가면서 나열시키면 된다. (그림13)에 그 결과를 보였으며 실행후 결과는 변화가 없다.
 

50 NEXT J, I


문 마저도
 

50 NEXT : NEXT
 

로 바꾸어 쓸 수 있다.
 

BASIC에서는 NEXT 다음에 인덱스를 사용하지 않아도 된다.
 

(그림14)에 50번문장을 NEXT : NEXT로 바꾸어 실행시킨 결과를 나타내었다. 출력에는 아무런 변화가 없다. 여기서 NEXT와 NEXT 사이에 " : "을 사용하였는데 " : "의 원래 기능인 문장 분리의 의미로 사용하고 있다.
 

(그림14) 인덱스를 사용하지않은 NEXT문의 이용예

 

TAB함수에의한 출력 형태 지정


TAB함수는 정해진 위치부터 데이타를 출력시키는 함수로 (그림15)에서 알수 있듯이 데이타의 출력 장소를 괄호속에 숫자로 나타내 주면 원하는 곳에 출력시킬 수 있다. (그림15)에서 A와 B의 값이 TAB(10)에 의해 어떻게 출력되는가를 보여준다.
 

(그림15) TAB함수를 이용한 숫자데이타의 출력 예
 

또한 (그림16)에서는 문자열 데이타를 출력할 경우 TAB함수를 조합해서 사용한 프로그램의 예를 보인다.


(그림16) 문자열데이타출력에 사용한 tab

 

데이타의 출력에 있어서 칸맞추기


데이타를 출력시킬 때 좌로 밀착을 시켜야 하는 경우도 있겠지만 대부분 우로 밀착을 시킨다. BASIC의 출력은 아무 명령을 하지 않으면 무조건 정해진 자리에서 좌로 밀착(left-justified)을 한다.
 

(그림18) 우로 밀착된 데이타의 출력예


(그림17)의 경우를 보자. 30번 PRINT문에서 TAB(10)으로 10번째칼럼(행)부터 N값을 출력하도록 하고 있다. 출력된 결과는 좌로 밀착되어 있다. 이를 우로 밀착(right-justified)시켜 보려면 출력양식 지정명령인 USING "####"등을 사용하면 된다. (그림18)은 우로밀착시켜 출력한 예이다.

(그림18) 우로 밀착된 데이타의 출력예

 

SPC함수를 사용한 데이타의출력


SPC함수는 TAB함수와는 달리 상대적으로 칸 벌리기를 한다. 반대로 TAB함수는 제일 왼쪽칸을 기준으로하여 칸 벌리기를 한다. (그림19)에 있는 프로그램중 30번문장에서 SPC함수를 사용하고 있다. 데이타의 출력형태는 USING"####"을 사용하고 있기 때문에 우로 밀착되어 출력된다.
 

(그림19) SPC함수를 이용한 우로 밀착형의 출력예
 

30번문의 SPC(10)은 10칸의 빈문자(blank)를 출력하라는 명령으로 해석된다. 따라서 이와 같은 기능으로 프로그램을 다시 작성하려면 30번문장을
 

30 PRINT "˽˽˽˽˽˽˽˽˽˽" ; USING "####" ; N


으로 하거나
 

30 PRINT STRING$(10, "˽") ; SING "####" ; N


으로 하면 된다.

(그림20)은 빈문자(blank)가 찍혀나올자리에 "="문자를 출력시켜본 예이다.
 

(그림20) STRING$함수를 이용한 데이타의 출력 예

 

(그림21)에서는 지금까지 배운 STRING$, TAB, SPC함수를 사용하여 원하는 패턴을 출력하고 있다. 실행시킨 결과를 보고 프로그램을 분석해보면 사용된 함수들의 기능을 쉽게 이해할 수 있을것이다. (그림21)의 프로그램에서 나타난 " ; "은 생략하여도 무방하나 프로그램의 의미파악을 위해 사용하는 것이 좋다.
 

(그림21) 문자열로 이루어진 패턴을 출력시켜본 예
 

이 기사의 내용이 궁금하신가요?

기사 전문을 보시려면500(500원)이 필요합니다.

1987년 02월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

  • 컴퓨터공학
  • 소프트웨어공학
  • 정보·통신공학
이 기사를 읽은 분이 본
다른 인기기사는?