d라이브러리









BASIC강좌⑪ 어떻게 데이타를 처리할 것인가

퍼스널컴퓨터에서 사용하는 BASIC 언어는 크게 ROM-BASIC과 DISK-BASIC으로 분류된다. 업무에 활용되는 BASIC은 주로 DISK-BASIC이며 데이타를 디스크에 기록하는 방식으로 자료를 처리한다. 디스크에 데이타를 기억시키고 이를 프로그램으로 처리하기 전에 파일(Flie)에 대해 살펴 보자.

 

(그림1) 파일의 분류


파일이란 무엇인가?
 

파일은 디스크에 기록되는 프로그램이나 데이타를 말하며 디스크에 기록될 때는 하나의 이름을 갖게 된다. 디스크에 기록된 데이타나 프로그램의 이름을 디렉토리(Directory)에 등록한다. 보통파일의 종류는 2가지이며 프로그램 파일과 데이타 파일이라 각각 부른다.
 

데이타 파일은 프로그램 파일과는 달리 일정한 양식을 갖게 되는 데이타의 묶음으로 구성된다. 반복되는 데이타 양식을 레코드(Record)라 한다. 그리고 각 레코드는 여러 항목을 갖게 되며 이를 항목(Item) 또는 구간(Field)이라 부른다.
 

데이타 파일은 기록 방식에 따라 순차편성(順次編成)형 파일(Sequential Flie)과 임의지정(任意指定)형 파일(Random Flie)로 나눈다. 임의지정형 파일은 레코드 단위로 기억 위치를 임의로 지정하는 것이다.
 

(그림 1)은 파일의 분류를 보여준다.
 

(그림2) 순차편성형 파일과 임의 지정형 파일


프로그램의 실행도중에 데이타 파일의 내용을 입력하거나 출력하여 원하는 결과를 얻을 수 있어야 한다. 일단 순차편성형과 임의지정형 파일의 장단점을 비교하여보자. 효율적인 자료 처리및 유지관리를 위해서는 임의지정형 데이타파일은 사용해야겠지만 디스크의 용량을 최대한 활용할 수 없다는 단점이 있다. (그림2)는 순차편성형 파일과 임의지정형 파일을 표로 비교해 놓은 것이다.
 

(그림3) 매상표의 양식

 

순차편성형 파일
 

매상표를 작성하려면 먼저 매상표에 기재되는 항목을 명시해야 한다. 본 연재에서는 (그림3)과 같은 레코드의 양식을 사용하기로 한다.
 

상품 하나하나마다 코드와 수량 및 단가를 입력하여 금액을 계산하는 데이타 파일을 만들도록 한다. 디스크에 데이타 파일을 만들려면 먼저 OPEN문을 사용하여 입출력지정과 사용 버퍼(buffer)번호를 지정해주어야 한다.
 

데이타 파일을 디스크에 생성시키는 경우이므로 데이타가 출력으로 지정된다. 즉 다음과 같이 출력 데이타 파일을 지정하면 된다. OPEN "화일이름" FOR OUTPUT AS#1
 

일단 작성하려는 데이타 파일이 지정되면 PRINT#문으로 디스크의 데이타 파일에 데이타가 기록된다. PRINT#문의 양식은 다음의 여러 예를 통해 살펴보자.
 

(예1) PRINT#1,A$;",";B$;",";S;T

(예2) PRINT#1,A;B;C

(예3) PRINT#1,A;B$;",";C

(예4) PRINT#1,A,B,C
 

(예1)과 (예3)의 출력 데이타 중에서 문자열 부분은 항상 ","을 사용하여 문자열이 뒤따라 오는 데이타와 분리되도록 한다. 그리고 (예2)와 (예4)의 차이점은 ;과 ,의 사용인데 디스크에 기록되는 데이타의 양식은 화면에 출력되는 것과 같으므로 ,을 사용하는 것보다 ;을 사용하는 것이 디스크에 기록되는 데이타의 압축률을 높일 수 있다.
 

위에서 다룬 예제에서 #1을 사용하여 버퍼의 번호를 지정하였으며 데이타 파일의 전부 작성되어지면 CLOSE #1로 파일 생성 작업을 종료시킨다.
 

(그림4) 순차편성형 파일(Sequential File)의 생성 프로그램


(그림4)는 (그림3)과 같은 데이타 파일 양식에 따라 디스크에 데이타 파일을 만들 수 있는 프로그램의 예이다.

(그림5)는 실행한 결과이며 생성하려는 파일의 이름은 donga로 하였다.
 

(그림5) 그림 4의 프로그램을 실행한 결과


(그림4)의 프로그램에 의해 생성된 "donga"라는 데이타 파일의 내용으로부터 원하는 매상표를 출력시켜 보도록 하자. 파일을 사용하기 위해 OPEN문으로 입력 지정과 함께 사용하려는 버퍼의 번호를 정한다. 다시 말하면 OPEN F$ FOR INPUT AS #1으로 F$에 기억된 파일 이름으로 부터 디스크에 파일 사용권을 획득한다. 다음에 INPUT #1, (변수리스트)와 같은 양식으로 사용되는 파일 데이타 입력문에 의해 데이타를 입력시켜 원하는 데이타 처리를 할 수 있다. INPUT #1문에 열거되는 변수들의 순서는 순차편성형 파일을 생성할 때의 순서와 일치시켜야 한다. 이 때 각 변수의 데이타 형도 일치시켜야 한다.
 

(그림6)


(그림6)은 순차편성형 파일을 사용하여 데이타를 입력하고 출력시키는 프로그램이다. 110번 문에서 사용한 EOF(1)은 사용하고 있는 파일이 더이상 읽을 수 없는 상태임을 확인할 수 있는 함수로 임의지정형 파일에 대해서도 사용 가능하다.
 

(그림7)


(그림7)은 (그림6)의 프로그램을 실행한 예이다. 데이타 출력이 ","의 사용에 의해 지정된 열(列)에서 시작하고 있다. 출력 양식 지정을 USING에 의해 바꾸어 보면 (그림8)과 같이 된다. 77번 문은 명세표의 각 항목의 이름을 표기하기 위해 사용하고 100~103번 문까지가 출력되는 자리를 지정하기 위해 사용된 문장들이다.
 

(그림8)


(그림9)의 실행 결과를 보면 금액 표시부분에 ,로 3자리씩 끊어져 있다. 이러한 출력을 이용하려면 PRINT USING "#######,"문을 사용하면 된다. 여기서 #는 표시되는 최대 자리수를 나타내기 위해 최대 자리수 만큼의 #를 반복시키면 된다.
 

(그림9)


이제 매상표의 금액을 전부 합한 총액을 계산하여 출력하여 보자. 각 레코드에 하나씩 입력할 때마다 금액을 합해가면 된다. 총액을 합해가기 위해 변수 TOTAL#를 사용했다. 105번 문에서 금액이 하나씩 합해진다. 그리고 150번 문에서 매상의 금액들이 합해진 총액을 매상표 하단에 출력한다.
 

(그림10)


(그림10)은 총액을 계산하여 매상표를 출력하는 프로그램이며 (그림11)은 실행 결과이다.
 

(그림11)

 

임의지정형 파일의 처리
 

순차편성형 파일과는 달리 임의지정형 파일은 각 레코드에 적용되는 입/출력 양식을 미리 지정해주어야 한다. 또한 파일의 사용권을 획득하기 위한 OPEN문에서는 입출력을 지정할 필요가 없고 단지 버퍼의 번호만 지정해주면 된다.
 

OPEN문 사용예

OPEN "파일이름" AS #1
 

레코드의 양식지정은 할당된 문자수와 지정된 변수명에 의해 결정된다. 레코드 양식지정에 사용된 변수명은 프로그램내의 다른 변수들과는 달리 사용되므로 주의를 해야한다. 즉 레코드 변수명에 기억된 값을 곧바로 프로그램내에서 사용할 수 없고 일반 변수에 그 값을 넘겨 주어야 한다. 반대로 임의지정형 파일을 생성할 때도 마찬가지로 일반 변수의 값을 레코드 양식지정용 변수에 넘겨주어야만 한다. 레코드 양식지정은 다음 프로그램과 같이 FIELD문을 이용한다.
 

10 OPEN "TEST.DAT" AS #1

20 FIELD #1,20 AS NAM$, 15 AS HW$

20 INPUT "NAME" ; N$:INPUT "KIND" ; H$

30 RSET NAM$=N$

40 RSET HW$=H$

50 PUT #1

70 CLOSE #1

80 END
 

행번호 20의 FILED문은 파일 버퍼1에 대응하는 곳에서 최초의 20 문자를 NAME용으로 확보하고 다음의 15자를 HW$용으로 확보한다. 행번호 40의 RSET문은 N$의 값이 NAM$필드의 오른쪽으로 밀착되어 기억된다. 그리고 행번호 50의 RSET문도 H$의 내용울 우로 밀착시켜 기억한다.
 

REST과 LEST문은 FIELD문이 먼저 실행되어 있어야만 사용이 가능하다. 만약 필드에 기억되는 문자의 갯수가 지정된 값보다 크면 문자열의 우축이 잘려져 버린다. 그리고 특히 주의할 점은 숫자(실수, 정수) 데이타를 RSET, LSET, MKS$, MKD$의 각 함수를 사용하여 문자열로 변환해 두는 것이다.
 

다음 프로그램은 임의지정형 파일을 사용할때 이용하는 문이 전부 사용되는 예이다.
 

10 OPEN "SAMPLE" AS #1

20 FIELD #1,20 AS L$,20 AS R$

30 LSET L$="LSET SAMPLE"

40 RSET R$="RSET SAMPLE"

50 PUT #1,1

60 GET #1,1

70 PRINT L$

80 PRINT R$

90 CLOSE #1

100 END
 

PUT, GET에서 사용한 번호#1은 파일은 OPEN할 때에 지정한 번호이다. ,1로 주어지는 PUT, GET은 레코드의 번호를 나타내며 사용되지 않는 경우는 바로 앞에서 사용되었던 레코드 번호의 다음 번호를 택한다. 레코드 번호의 값은 1에서 32767까지이다.
 

임의지정형 파일에서 읽혀들인 데이타(실수, 정수)는 문자열로 표현되어 있기 때문에 CVI, CVS, CVD와 같은 함수를 사용하여 실제적인 값으로 환원시켜야 한다. CVI함수는 2바이트의 문자열을 정수로 바꾸어 주고 CVS함수는 4바이트의 문자열을 단정도(Single Precision) 형식의 실수로 바꾸고, 또한 CVD함수는 8바이트의 문자열을 배정도(Double Precision) 형식으로 바꾼다.
 

(그림12) 임의지정형 파일의 사용에 관한 함수나 문장의 사용


다음 CVD함수의 사용예에서 알수 있듯이 문자열로 입력되는 실수도 처리 가능하다.
 

10 A$="abcd"

20 X=CVS(A$)

30 PRINT A$, X (여기서 A$="abcd"이고 X=3.308877E―09이다)
 

LSET, RSET문에 의해 임의지정형 파일이 설정되는 정수나 실수는 MKI$, MKS$, MKD$ 함수를 사용해서 문자열로 바꾸어 준다. MKI$는 정수를 2바이트의 문자열로 바꾸고 MKS$ 함수는 단정도형식의 실수를 4바이트의 문자열로 바꾸고 MKD$함수는 배정도 실수를 8바이트의 문자열로 바꾼다.
 

다음은 MKI$, MKS$, MKD$ 함수의 사용예이다.
 

10 OPEN "FILE" AS #1

20 FIELD #1,10 AS A$, 10 AS B$, 10 AS C$

30 RSET A$=MKI$(123)

40 RSET B$=MKS$(12.3)

50 RSET C$-MKD$(0.00001#)

60 PUT #1, 1

70 CLOSE #1

(그림12)는 임의지정형 파일의 사용에 관한 함수나 문장의 사용을 보여준다.
 

(그림13) 임의지정형 파일의 생성 프로그램의 예


(그림13)은 임의지정형 파일을 생성하는 프로그램의 예이다. 버퍼의 각 필드에 LSET이 사용되고 있으나 RSET을 사용하여도 무방하다. S, T변수가 단정도실수이므로 FIELD문에서 적어도 4바이트 이상을 잡아주어야 한다.


(그림 14) 그림 13의 실행예


그리고 K$의 자릿수는 8자리 이상이 되어야 하므로 10으로 하였다. (그림13)의 프로그램을 실행시키면 생성할 파일의 이름을 물어보며 원하는 파일 이름을 입력하면 레코드 번호와 함께 데이타들이 파일에 기록되게 되었다.


(그림15) 임의지정형 파일의 사용예


(그림14)는 (그림13)의 실행예이다. 임의지정형 파일이 만들어졌기 때문에 이제는 임의지정형 파일에 기억된 데이타를 입력하여 보자.


(그림16) 그림 15의 실행예


(그림15)와 같이 임의지정형 파일을 처리할 수 있다. 실행예는 (그림16)이다.


(그림17) 임의지정형 파일의 데이타 수정용 프로그램의 예


임의지정형 파일은 입력및 출력에 대해 동인한 OPEN문을 사용하기 때문에 레코드 단위의 데이타 수정이 가능하다.

 

(그림18) 그림17의 실행 예


(그림17)과 (그림18)은 각각 레코드단위의 수정용 프로그램과 그 실행 예를 보여준다.

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

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

1987년 07월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

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