d라이브러리









지난 호에서는, 한 IF문 내에서 또다른 IF를 여러번 중첩해서 쓰거나 한 loop문 내에서 다른 loop를 중첩해서 사용하는 경우를 공부하였고 여러가지의 경우 중에서 한 가지를 선택할 때는 어떻게 프로그래밍하는지 그 방법을 배웠다.

응용에는 인내가 필요
 

(그림1) 서브루틴 수행과정


지금까지 본 PC교실을 통하여 공부한 내용을 잘 이해하고 꾸준히 익힌 사람은 이제 프로그래밍에 필요한 기본적인 기법을 대부분 배웠다고 할 수 있다. 어쩌면 자신이 원하는 프로그램을 직접 작성할수도 있을 것이다. 그러나 프로그램을 작성하는 일은 공학(engineering)의 한 분야로서 기술의 향상을 위해서는 끊임없는 노력을 필요로 하기 때문에 아직 자신이 생기지 않았다고 할지라도 계속해서 인내와 용기를 갖고 공부하기를 바란다. 이번호에서는 서브루틴의 사용방법을 완전히 익히고 함수정의문과 논리연산자에 대해서 살펴보기로 하자.

앞에서 우리는 서브루틴에 대해서 자세히 배웠으므로 이것을 사용하기 위해서는 GOSUB문과 RETURN이 필요하다는 것을 알고 있다. 복습을 위해서 서브루틴이 무엇이며 어떻게 사용하는 것인지 다시 정리해 보자.

서브루틴 정의
● GOSUB문에 의해서 연결되어 수행되고 RETURN문에 의해서 수행이 종료되는 BASIC 문장의 군 (group)
● GOSUB 문번호
주(main)프로그램으로부터 서브루틴의 시작문장으로 연결시킨다.
● RETURN
서브루틴 수행 후 주프로그램내의 GOSUB문 바로 다음 문장으로 제어(control)를 이동시킨다.

앞에서 우리는 서브루틴에 대해서 자세히 배웠으므로 이것을 사용하기 위해서는 GOSUB문과 RETURN이 필요하다는 것을 알고 있다. 복습을 위해서 서브루틴이 무엇이며 어떻게 사용하는 것인지 다시 정리해 보자.

(문제1) 볼링게임관리 프로그램
볼링은 한 게임당 10회(frames)로 구성된다. 공을 굴려서 넘어뜨리는 기둥이 10개인 게임에서는 1~9회까지는 매회마다 2회의 공을 굴리고 10회에서는 2개 또는 3개를 굴린다. 매 회마다 점수는 다음의 규칙에 따라서 계산한다.

가. 스트라이크(Strike)
매회 첫번째 굴린 공이 10개의 기둥을 한꺼번에 넘어뜨리면 점수는 10+(다음 두개의 공에 의한 점수), 10개의 기둥이 모두 넘어졌으므로 이번 회의 다른 공은 더 굴리지 않는다.
나. 스페어(Spare)
매회 마다 굴린 2개의 공으로 넘어진 기둥이 합해서 10개이면 10+(다음 한개의 공에 의한 점수)
다. 노 마크(no mark)
2개의 공으로 넘어진 기둥이 합하여 10개 이하이면 점수는 넘어진 기둥의 수와 같다.

공의 수(N)와 각각의 공으로 넘어뜨린 기둥의 수를 입력으로 주어 게임당 득점을 계산하는 프로그램을 작성해보자.
출력은 매회마다 그 회의 점수 및 누적된 점수의 합을 프린트한다.

(설명)
한 게임이 10회이므로 매회의 처리를 구분하기 위해서는 우선 loop를 써야하겠으며, 이 loop를 제어하는 변수로 F를 정하였다. 또 매회마다 점수를 저장하기 위해서 배열 S를 사용한다. 각각의 공에 의해 넘어진 기둥의 수는 입력으로 주어지는데 이것을 배열 P에 저장하고 I 를 사용해서 몇번째 원소인가를 구별하자. 예를 들어 P가 다음과 같이 되어있다면,
 

볼링게임관리 프로그램 설명


맨 처음의 공에 의해서 넘어진 기둥은 10개, 두번째에 의해서는 7개… 임을 나타낸다. 또 이것을 처리하는 내용의 설명은 아래와 같다.
 

맨 처음의 공에 의해서 넘어진 기둥은 10개, 두번째에 의해서는 7개… 임을 설명


P(I)=10이므로 1회에서는 스트라이크가 발생하였고, 점수는 10+P(2)+P(3)이다. 이때 I는 2로 변한다.
 

<;자료표>;


2회에서는 2개의 공으로 10개 기둥을 넘어뜨렸으니 (P(2)+P(3)=10) 점수는 10+P(4)이며 I=4가 된다.
 

(그림2) 문제1의 수준(level) 1과 2흐름도


GOSUB문과 비슷한 것으로 ON-GOSUB문이 있다고 하였다.
 

(그림3) 단계2,3을 구체화 시킨 것


이것은 ON 뒤에 있는 식의 값에 따라 서브루틴문의 번호가 정해진다. 예를들면 ON E GOSUB 1000, 2000, 3000에서 E=1이면 1000번으로, 2이면 2000번으로, 3이면 3000번으로 연결되는 것이다.

 

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

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


(문제2) ON-GOSUB 응용
X를 INPUT명령으로 받아들여서 X의 범위에 따라 다음의 Y값을 구하는 프로그램을 작성해 보라.
X=-1000이면 종료한다.
 

(문제2) ON-GOSUB 응용


SGN
형식 : SGN(A) (A는 상수, 변수, 또는 식)
설명 : ● A<;0이면 SGN(A)=-1
   ● A=0이면 SGN(A)=0
   ● A>;0이면 SGN(A)=+1
 

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


(설명)
문번호30 :  X<1이면 SGN(X-1)=-1 이므로 N=1
     X=1이면 SGN(X-1)=0 이므로 N=2
     X>;1이면 SGN(X-1)=1 이므로 N=3
   40 :  N=1과 2이면 100번으로, N=3이면 200번문으로 연결된다

 

함수정의문

BASIC에서는 하나의 문제를 해결할 때에 처리하기 쉽고 다루기 쉬운 작은 부분으로 분할하는 기능이 있는데 서브루틴, 함수정의문(user defined functions)등이 이에 속한다.

BASIC에서 제공하는 함수인 COS(코사인값), TAN(탄젠트값), ABS(절대값), INT(정수값), SQR(양의 제곱근) 등에 대해서는 벌써 공부하였는데 이 함수들은 미리 컴퓨터 내에 내장되어 프로그램할 때에 인용하기만 하면 된다는 것을 여러분은 알고 있을 것이다. 즉 100 Y=SQR(25)라고 프로그램하면 Y에는 자동으로 5가 할당되는 것이다. 그러나 함수정의문은 프로그램하는 사람이 임의로 함수의 기능을 정할 수 있다는 점이 다르다. 즉,

100 DEP FNT(X) = X+100
 :         :
190 S =FNT(50)
 :        :


라고 프로그램하면 190번 문에서 함수 FNT를 호출하는데 이때 50이 100번 문의 X자리에 대신 들어가서 계산된후에 결과 150이 S에 할당된다.

함수정의문

형식 :  DEF FNX=식

   또는 DEF FNX(매개변수)=식
설명 : ● FNX는 함수명이며 X는 임의의 영문자 이다.
   ● 함수가 호출되면 식이 계산된 후에 값을 돌려 보낸다.
   ● 함수에 매개변수가 사용되는 경우에는 실제변수의 값을 매개변수의 자리에 대입시킨다.
   ● 배열(arrays)은 매개변수로 쓸 수 없다.

(문제3)
원금 P를 매년 복리로 이자를 계산해서 합한 총액은 A=P${(1+r)}^{n}$ (r:이자율, n:년수) 이다. n, 2n , 3n년 후의 총액을 구하는 프로그램을 함수정의문을 써서 작성해 보라. (P=10,000원 r=6.5%, n=5년)

(설명)
함수 FNA가 호출되었을때(문번호 160) P와 R의 값은 READ문(문번호 130)으로 읽어들이고 (P=10,000 R=0.065)이 값들은 문번호 160에 표시한 세 개의 계산에서 똑같이 사용된다. 이와 같이 함수정의문 밖에서 정의되는 변수를 전체적 변수(grobal variables)라고 한다.
또 N은 함수의 매개변수로 쓰인 한편(120 번문), 함수의 밖에서도 정의되고 있다.(130, 155, 160번 문). 첫번째FNA가 호출될 때 N에는 5가 대입되고(160번문) 두번째는 10(2*N), 세번째는 15(3*N)가 대입된다.
 

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


매개변수(parameters)와 전체적변수(global variables)
● 함수정의문에서 사용되지만 매개변수에 포함되어 있지 않은 변수를 전체적 변수라고 한다. 이 변수는 함수정의문 밖에서 똑같은 이름으로 사용되는 변수와 같은 것이다. (예: 문제1의 P, R)
● 함수의 매개변수는 함수정의문 밖에서 똑같은 이름으로 사용되는 변수와 별개의 것이다. (예: 문제1의 N)

(문제4)
배열 X에 있는 N개의 자료중에서 가장 큰 수를 찾는 알고리즘을 함수정의문을 써서 작성해보자.
 

(그림7) 문제 2의 알고리즘


(설명)
이 알고리즘을 구현하는 함수정의문을 FNL이라고 하자. 함수정의문에 입력되는 자료의 수가 몇개인지 나타내기 위해서 매개변수가 1개(N) 필요할 것이다. 또 현재까지의 최대수를 저장해두기 위해서 변수L을 사용하자. 완성된 함수정의문과 주프로그램(main program)은 (그림8)에 보였다.

● 문번호 280-330 : 입력자료를 N과 배열 X에 읽어들임.
● 550 : 함수 FNL이 호출됨
● 560 : 결과 인쇄


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


논리 연산자 AND OR


논리 연산자 AND OR


판단문(IF문)에서 조건(conditions)을 시험할 경우에는 조건이 단 하나인 때보다 두개 이상인 경우도 많이 있다. 예를들면 아래 그림의 설명처럼 21세 이하이고 남자인 직원에 대해서만 이름(N$)을 인쇄하려고 한다고 하자.

이때에는 두 가지 조건이 참인지를 동시에 시험할 수 있는 표현을 사용하면 편리하다.

IF M$='남' AND A<;21

AND는 조건1(M$="남")과 조건2(A<;21)가 모두 참(true)일때에 참의 값을 갖는다. 한편 OR는 조건1과 2중 하나만 참이면 참의값을 갖는다. 즉 IF M$="남" OR A <; 21에서는 모든 남자 또는 여자라도 21세 이하이면 참이다.

논리연산자 AND, OR
형식 : 조건1 AND 조건2
설명 : ● 조건1과2가 모두 참일때 참(true)
   ● 조건1과2중 하나가 허위이면 허위(false)
형식 : 조건1 OR 조건2
설명 : ● 조건1과2중 하나가 참이면 참.
   ● 조건1과2중 모두 허위일때 허위.
 

(그림9) AND OR의 설명
 

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

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

1987년 03월 과학동아 정보

  • 전문철 연구원

🎓️ 진로 추천

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