자주 사용되는 공식이나 함수들은 프로그램 내에서 함수정의문을 사용하여 미리 정해놓고 필요할 때마다 편리하게 이용할 수 있다. 이번 호에서는 함수 정의문의 사용법과, 정의된 함수를 이용한 예제 프로그램으로 부터 그래프 그리는 법과 난수(ramdom number)를 발생시켜 활용하는 방법 등을 다뤄 본다.그리고 문자열 처리에 자주 사용된는 문지열처리 함수를 설명한다.
f(X)=x²를 정의하여 보자
BASIC에서는 자주 사용되는 공식이나 함수들은 함수이름을 갖게되며 함수이름은 프로그램 작성자가 마음대로 작성할 수 있다. 주어진 함수 f(x)=x²에 대해 BASIC의 한수 정의문으로 정의하면
DEF FNF(X)=X*X
와 같다. 이때 DEF FN은 DEFINE FUNCTION을 의미한다. 그리고 정의하려는 함수는 F(X)=X*X로 표시됨을 알 수 있을 것이다. 만약 함수이름은 SEOUL로 바꾸고 싶다면 다음과 같이 표현하면 된다.
DEF FNSEOUL(X)=X*X
함수 이름의 오른쪽에는 괄호를 사용하여 함수값 계산에 이용되는 변수들은 나열시켜 놓아 프로그램 내에서 정의된 함수를 사용할 때 계산에 필요한 값을 이들 변수를 통해 넘겨 준다.
(그림1)은 f(x)=x²함수를 정의한 다음 x=0 x=1 x=2 x=3 x=4 x=5에 대한 함수 값을 구하는 프로그램이다. 변수 Ⅰ는 0부터 5까지 FOR~NEXT문을 사용하여 변화시키고 있다. 변수 Ⅰ의 증가분이 1이기 때문에 FOR~NEXT문의 STEP 1부문이 생략되었다.
두수의 평균을 구하는 공식을 함수 정의문으로 정의해 보자
어느 두 수의 평균을 구하는 공식은 (X+Y)/2이다. 여기서 X와 Y는 주어진 두수이다. 이 공식을 BASIC의 함수 정의문으로 표현하여 보면 다음과 같다.
DEF FNAVG(X,Y)=(X+Y)/2
AVG는 임의로 정한 이름으로 다른 이름이 사용될 수도 있다. 함수 정의문을 사용할 때 주의할 점은 함수가 사용되기 전에 미리 정의되어야 한다는 것이다. 그리고 프로그램 내에서 여러개의 함수들은 DEF FN문을 각각 사용하여 정의될 수 있다.
(그림2)는 AVG(X,Y)=(X+Y)/2 함수를 프로그램에서 정의하고 사용한 예이다.
내장된 함수를 이용한 함수정의
BASIC에서는 별도의 선언없이 바로 사용할 수 있는 내장된 함수들이 있다(SIN, COS, TAN, ATN, LOG, EXP, SQR, LEN, LEFT$, RIGHT$ 등). 프로그램 내에서 정의 할 함수에서 내장된 함수를 이용하면 과학계산에 필요한 여러 함수까지도 정의할 수 있다.
f(x)=${e}^{-χ}$. sin(x)와 같이 지수함수와 삼각함수가 혼용된 함수에 대해 설명해보겠다. (그림3)은 내장된 함수를 사용한 함수정의 문의 사용예를 보인 것이다.
DEF FNF(X)=EXP(-X)*SIN(X)
로 함수를 정의했고 X를 0부터 10까지 1씩 증가시켜 가면서 함수값을 계산해 출력 시켜고 있다. 출력되는 함수 값은 TAB(10)으로 지정된 자리에 찍히도록 하였다.
함수값을 계산할 때는 사용자가 지정한 함수이름을 사용하는 것이 아니라 함수이름 앞에 FN을 붙여서 사용해야 한다. 만약 FN을 붙이지 않으면 BASIC에서 배열 변수로 처리되기 때문에 조심해야 한다.
함수 정의문을 이용한 그래프 그리기
f(x)=x²의 그래프를 -5≦x≦5인 구간에서 그려보자. (그림4)는 -5부터 5까지 x를 변화시켰을 때 계산된 값을 출력시키는 프로그램이다. 계산된 값을 숫자로 출력시키면 값의 상대적 비교가 쉽지 않기 때문에 그래프를 이용하여 본다. (그림5)는 계산된 함수값의 크기가 TAB이라는 함수에 의해 화면상에서 그 크기가 표현된다.
그래프를 그릴 때 화면 좌표와 실제 함수의 좌표계가 일치하지 않기 때문에 좌표의 확대, 축소, 평행이동, 축변환 등을 고려해야 한다. 일반적으로 화면의 스크롤(scroll)방향 혹은 프린터 용지의 진행 방향을 X축으로 잡으면 가로축이 Y축으로 지정되므로 그래프의 표현이 쉽다.
보다 복잡한 그래프의 출력은 다음 기회로 미루기로 하고 여기서는 가장 간단한 방법을 택하기로 한다. TAB(10+FNF(I)))는 사실상 TAB(10+X*X)로 처리된다. 숫자 10은 좌표 변환을 위해 평행이동 값으로사용된 값이다. -5≦I≦5이므로 0≦FNF(I)≦25이다. FNF(I)의 그래프를 원하는 위치에 그리기 위해서 오른쪽으로 10칸 이동시켜보면 10≦10+FNF(I)≦35이 된다.
따라서 그래프는 10칸째부터 35칸째까지 그 사이에서 표현된다.
이제 함수 f(x)=x³의 그래프를 출력시켜 보자. X의 구간을 -2에서 2까지로 정한 다음 그 구간내에서의 함수값을 출력시켜 보는 것이다. 여기서도 마찬가지로 평행이동을 시키기 위해 30을 함수값에 더한다음 TAB함수로 그래프를 출력시켰다. 세로축이 X축으로 지정되어 있으니까 출력된 그래프를 반시계 방향으로 90˚ 돌려서 보면 f(x)=x³의 그래프 모양을 발견할 수 있을 것이다.
(그림6)은 f(x)=x³의 그래프를 그리는 프로그램이다. 삼각함수를 사용한 그래프에 대해서도 똑같은 방법을 적용시킬 수 있다. 단 삼각함수 SIN(x)의 절대값은 1이하이기 때문에 f(x)=sin(x)의 그래프를 그리려면 확대하여 화면좌표계에 표시할 수 있어야 한다. (그림7)의 30번 문장에 있는 30+20*FNF(I)에서 20이란 숫자가 함수값에 곱해져 있는데 이는 함수값을 화면좌표에 옮기기 위해 곱해진 확대비이다.그리고 30을 더해준 것은 좌표를 평행이동시켜 원하는 위치에 그래프가 출력되도록 하기 위한 것이다.
난수 발생 함수를 이용한 주사위 던지기 흉내 내기
주사위는 정육면제의 각 면에 1부터 6까지의 눈을 그려서 만들고 한번 던져서 각 숫자가 나올 확륙은 $\frac{1}{6}$이다. BASIC 에는 자동적으로 난수를 만들어 내는 함수RND가 있다. 난수 X는 0≦x<1의 값을갖게 된다. 따라서 난수의 구간이 일정하므로 우리가 원하는 구간의 난수를 발생시키기 위해서는 구간을 확대하고 이동해야한다. 일반적으로 1≦x≦N 구간의 자연수 x의 난수는 다음식에 의해 발생시킬 수 있다.
INT(RND(8)*N)+1
다음은 위식의 값이 어떻게 구해지는가를 보여주는 식이다.
0≦RND(8)<1
0≦RND(8)<N<N
0≦INT(RND(8)*N)≦N-1
1≦INT(RND(8)*N)+1≦N
(그림8)은 주사위를 10회 던져서 나온 숫자를 출력하는 프로그램이다. RUN명령으로 프로그램을 실행시키면 10회 주사위가 던져서 매회 나온 숫자가 출력될것이다. 그리고 다시 RUN명령을 실행시켜보자. 나오는 숫자가 일정한 순서로 나올 것이다. 이유는 난수의 초기값이 일정하기 때문이다. 프로그램을 실행시킬 때마다 일정한 난수를 필요로 하는 경우도 있겠지만 프로그램을 매번 실행시킬 때마다 난수출력이 다르게 나오기를 원하면 RANDOMIZE라는 명령을 사용한다. RANDOMIZE를 실행하면 난수의 초기값을 바꿀 수 있기 때문에 난수발생을 더욱더 효율적으로 이용할 수 있다.
RANDOMIZE에 의한 화면출력은 다음과 같다. (APPLEⅡ 에서는 사용할 수 없다)
Random number seed(-32768to32767)?
주사위의 각 숫자는 나올 확률이 $\frac{1}{6}$이다 따라서 6백회 던져서 1이 나온 횟수를 조사하면 1백회 정도가 되어야 할 것이다. 이 결과를 확인하기 위해 프로그램상에서 1백회 시행을 하여 각 숫자가 나온 횟수를 출력해보기로 하자. 각 숫자에 대해 출현 빈도수를 기억하기 위해서 배열변수 COUNT를 사용하기로 한다. 배열변수 COUNT는 DIM COUNT(6)로 선언된다. 즉 3이 나온 횟수는 COUNT(3)에 기억시키는것이다. (그림10)은 주사위를 1백번 던져서 각 숫자가 나온 횟수를 출력시키는 프로그램이다.
(그림11) 은 주사위를 1천번 던졌을때 나온 각 숫자의 횟수를 출력한 것이다. 던지는 횟수를 늘려가면 갈수록 각 숫자의 횟수는 던진 횟수X$\frac{1}{6}$에 접근할 것이다.
문자열 처리를 위한 함수의 사용
문자열 데이타는 산술연산이 불가능하고 단지 분해 결합만 가능하다. 특수하게 숫자가 문자로 표현되어 있는 경우 이를 수치 데이타로 변환한 다음 원하는 산술 연상 등이 가능하다. (그림12)는 함수정의문에 문자열 데이타를 사용한 경우이다. FN HELLO$(X$)="HELLO"+X$는 X$에 지정되는 문자열을 입력함으로써 "HELLO"라는 문자열을 그 바로 앞에 결합시키는 함수이다. 문자열 처리에 자주 사용되는 내장함수는 다음과 같다.
LEN ←문자열을 구성하고 있는 문자의 갯수(빈칸도 문자로 취급한다)
LEFT$ ←문자열을 왼쪽에서 부분적으로 취한다.
RIGHT$←문자열을 중간에서 부분적으로 취한다.
MID$ ←문자열을 오른쪽에서 부분적으로 취한다.