d라이브러리









PC교실⑨ 응용프로그램에서의 문자열처리

응용 프로그램에서는 숫자형 자료(numerical data) 보다도 문자열(character strings)이나 문장형의 (textual) 자료를 더 중요하게 처리하는 경우가 있다. 예를들어 매년 한 번씩 발행하는 전화번호부나 연감(연간 보고서) 따위는 컴퓨터의 문장편집기(text editors)를 이용하면 변경할 필요가 있는 부분만을 수정해서 계속 새로운 책을 만들어 낼 수 있는 것이다.

문자열에 대해서는 약간 소개한 적이 있으며 어떤 프로그램에서는 어느 정도까지 사용하였으므로 여러분에게 벌써 친숙한 내용일 것으로 생각된다.

우리가 프로그램에서 문자열을 인용하였던 곳은 문자형 자료를 저장하는 문자열 변수(A$, T$등)와 문자열 배열(A$(5), T$(10) 등) 그리고 출력보고서의 제목을 인쇄하는 경우 등이 있었다.

이번 호에서는 이러한 문자열을 처리하는 여러가지 형태에 대해서 자세히 공부하기로 하자.

처리의 다양한 형태

문자열 변수(string variable)또는 문자열 배열(string arrays)의 이름을 표시할 때에는 이름뒤에 '$' 부호를 붙여야 한다고 하였다. 복습을 위해서 이것을 다시한번 정리한다면

100 READ T$, F$
110 DATA "TREE, APPLE",
"BANANAS"


이 문장의 결과는 T$, F$에 아래와 같이 문자열을 할당한다.
 

(□:공란) 100DIM S$(80) A$(26)

 


(□ : 공란)
100 DIM S$(80), A$(26)


이 문장은 두개의 문자열 배열(string arrays)을 생성하는데 S$은 문자열을 80개 까지 저장할 수 있는 배열(array)이며 A$은 26개 까지 저장할 수 있는 것이다.

이와같은 문자열 변수나 식에 기억된 문자의 갯수를 알아볼 수 있는 명령어가 LEN이다.

문자열 길이 LEN
형식 : LEN(문자열)
설명 : · 매개변수인 '문자열'내에 포함된 문자의 갯수를 구해준다.
         · 매개변수인 '문자열'은 문자열 변수, 또는 문자열 식 등으로 표시한다.
 

(보기 1)


위 프로그램에서 첫번째 S$="BUTTER"이므로 LEN(S$)은 6의 값을 갖기 때문에 LI=6이다. 두번째 S$="SILLY PUTTY"에서는 공란(blank)이 한개 있으므로 LEN(S$)은 11의 값을 갖고 L2=11이 됨을 주의해야 한다. 또 "MARGARINE"은 9개의 문자이므로 LEN("MARGARINE")은 9의 값을 갖는다.

문자열의 부분선택
형식 : LEFT$(문자열, 길이)
설명 : · 매개변수인 '문자열'은 문자열상수(string constant), 문자열 변수(string variable), 문자 배열의 원소(staring array element)로 표시
         · '길이'는 숫자 또는 숫자식으로 표시
         · '문자열'의 가장 왼쪽 문자로 부터 시작해서 '길이'의 수만큼을 선택한다.
형식 : RIGHT$(문자열, 길이)
설명 : · '문자열'의 가장 오른쪽 문자로부터 시작해서 '길이'의 수만큼을 선택한다.
형식 : MID$(문자열, 위치, 길이)
설명 : · '위치'는 숫자 또는 숫자식으로 표시
         · '문자열'의 '위치'번째 문자로부터 '길이'의 수만큼을 선택한다.


프로그래머가 문자열 중에서 한 부분만이 필요하다면 문자열의 처음부분(LEFT$), 중간부분(MID$), 끝부분(RIGHT$)만을 선택할 수가 있다. 재미있는 것은 이 명령어들의 끝에는 '$'이 붙어있는데 이 명령어들이 가져다 주는 값이 문자열이라는 뜻이다.
 

(보기 2)


위 프로그램은 은행구좌번호를 읽어서 세개의 부분으로(F$,M$,L$) 나누는 것으로서 그림으로 설명하면 다음과 같다.
 

은행구좌번호를 읽어서 세개의 부분으로 나누는 그림.
 

은행구좌번호를 읽어서 세개의 부분으로 나누는 그림2.


(보기3)
이번에는 문자 배열(string array)을 사용해서 문자열의 일부분을 선택하여 저장하는 방법을 알아보자. 전체 문자열에서 선택하는 문자수는 10개씩이다.
 

(보기 3) 그림.


프로그램의 FOR loop는 P$에 저장되어 있는 문자열을 10개의 문자씩 나누어서 배열G$의 원소 4곳에 저장시킨다(140번문). 문자를 나누는 과정은 (그림1)에 설명하였다.
 

(그림 1)I의 값에 따른 문자열의 부분(140번문)


또 150번문은 배열의 각 원소에서 첫째 문자를 인쇄하고 있으며 프로그램의 결과는 JCPG이다
 

(그림 2) 문제1의 흐름도


(문제1)
어떤 한 문장을 입력받아서 그 문장내의 각 단어들을 차례로 나누어서 인쇄할 수 있는 프로그램을 작성해 보라.

(설명)
1) 문장을 입력하기 위해서는 INPUT명령어를 쓴다
2) 현재처리할 단어의 첫자를 지적하기 위해 변수 B로 표시한다.(B의 초기값은 I)
3) 단어의 글자를 한 개씩 조사하기 위해서 FOR loop문과 MID$을 사용한다.
4) 단어중에 공란(blank)을 만나면 현재처리한 단어를 인쇄한다.
5) B의 값을 공란 다음 단어의 첫자를 가리키도록 한다.
 

(그림 3) 문제1의 프로그램과 결과


문자열 연결(concatenation)시키기

문자열 처리에서 재미있는 것은 서로 다른 것끼리 연결시켜서 프로그래머가 원하는 형태로 만들 수 있는 것이다.

형식 : 문자열1 + 문자열2
설명 : · 문자열 2가 문자열 1의 뒤에 연결된다.
         · 연결된 문자열의 길이는 두 개의 길이를 합한 것과 같다.
 

(보기 4) 연결의 사용


ASCII 코드


사람은 문자의 뜻을 이해할 때에 그 모양을 보고 바로 알 수가 있다. 물론 이것은 사람의 지능 때문일 것이다. 그러나 컴퓨터는 지능을 갖고 있지 않기 때문에 문자의 뜻을 이해하기 위해서는 방법이 필요하다. 즉 컴퓨터에게 'A는 65이고 Z는 90이다'라고 부호를 이용해서 미리 가르쳐 준다면 컴퓨터는 문자를 식별할 수가 있을 것이다. 이처럼 컴퓨터가 이해할 수 있도록 영문자 숫자, 특수문자 등을 부호로 정하는 일을 코드화 한다고 하며 개인용 컴퓨터에서 많이 사용하는 코드의 한 종류가 ASCII(American Standard Code for Information Interchange)코드이다.
 

(그림 5) 문제2의 프로그램과 결과


BASIC명령어에는 임의의 문자에 대한 ASCII코드가 무엇인지 알려주는 것과 (ASC), 반대로 ASCII코드에 대한 문자가 무엇인지 알려주는 것이(CHR$)있다.


참고로 (그림4)에 ASCII 코드의 일부를 소개하였다.
 

(그림 4) ASCII 코드
 

형식 : ASC(문자열)
설명 : · '문자열'의 첫번째 문자에 대한 ASCII코드(10진수)를 알려준다.
형식 : CHR$(식)
설명 : · '식'의 값을 ASCII코드를 갖는 한개의 문자를 알려준다(ASC와 반대)
         · '식'은 0 ~ 255 사이의 값이나 이 범위의 값을 갖는 식으로 표시
형식 : STR$(식)
설명 : · '식'의 값을 문자열(string)로 전환시킨다
         · 즉, A=58.5이면 STR$(A)는 문자열 "58.5"라는 뜻이다.
         · A에 대해서는 산술연산(arithmatic operations)을 할 수 있지만 "58.5"에 대해서는 문자열 연산(string operation) 만을 할 수 있다.
         · '식'은 상수 또는 숫자식으로 표시한다.


(보기 5) ASC와 CHR$의 사용
 

(보기 6) STR$의 사용


(문제2)
ASCII코드 33부터 126까지에 해당하는 문자가 무엇인지 알고자 한다. 이것을 보여주는 프로그램을 작성해 보라.

(설명)
1) 33부터 126까지의 반복은 FORloop를 이용한다.
2) ASCII코드를 문자로 변환하는 명령어는 CHR$이다.
 

(보기 7)그림.


(보기7)
다음은 ASCII코드를 문자로 변환시켜서 문장을 작성하는 설명을 보인 것이다. 문번호 100번부터 220번 까지는 필요한 문자 ASCII코드를 선택해서 배열(arrays)에 저장시킨다. FOR loop문에서는 저장된 문자를 다시 차례로 출력하는 것이다.
 

(그림 6) 문제3의 흐름도


(문제3)
전체 문장중에서 몇개의 문자만 변경하여 새로운 문장으로 바꾸는 프로그램도 작성할 수가 있다. 간단한 예로서 "AIN'T"가 들어있는 문장을 "IS NOT"로 바꾸는 프로그램을 작성해 보자.
 

(그림 7) 문제3의 프로그램과 결과


(문제4)
길고 짧은 두개의 문장이 주어졌을때 짧은 문장이 긴 것에 포함되는 것인지 조사할수 있는 프로그램을 서브루틴을 이용해서 작성해 보자.

설명
1) 두개의 문장을 입력받아서 (X$,Y$)서브루틴으로 보낸다(GOSUB)
2) 서브루틴에서는, 짧은 문장이 긴 문장에 포함되면 긴 문장의 몇번째 위치에서 시작 되는지를 (I)알려준다.
3) 만약 포함되지 않으면 I=0의 값을 알려준다.
 

(그림 8) 문제4의 프로그램과 결과
 

1987년 04월 과학동아 정보

  • 전문철

🎓️ 진로 추천

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