d라이브러리









퍼스널컴퓨터 교실④ 슈퍼마켓 고객관리 프로그래밍

지난 호까지 우리는 할당문(assignment statements)을 중심으로한 BASIC문의 실행에 관하여 공부하였는데 그것들은 모두 연산자(operator:+, -, *, /)를 한개만 사용하여 숫자를 처리하는 내용이었다.

그러나 BASIC에서는 여러개의 연산자와 괄호를 포함하는 복잡한 산술식을 표현할 수 있을뿐 아니라 문자에 대해서도 처리할 수가 있다. 이번 호에서는 복잡한 산술식과 문자열(character string)을 다루는 방법에 대해서 공부하자.

복잡한 연산

할당문에 대해서는 벌써 공부하였지만 다시 한번 일반적인 형식을 정리해 보자.
 

BASIC 할당문(assignment statement)
LET 변수=식

설명 : 연산자‘=’의 우측 ‘식’의 값을 ‘=’의 좌측 ‘변수’에 할당한다.(LET생략가능)
 

할당문에 의해 변수에 저장할 값을 구하는 식을 작성할 때 지금까지는 기본적인 4가지의 산술연산자(+, -, *, /)만 사용하였다. 그러나 이외에도 지수(제곱수)를 표시할때 사용하는 ‘↑’이 있는데 계산식에 Z=X↑2에서 X↑2는 X²를 BASIC으로 표현한 것이며 X의 값이 5이면 Z에는 25가 할당된다.

BASIC 언어에도 문법이나 표현방식이 약간씩 다른 몇 가지 형태가 있는데 그에 따라 ‘↑’대신에 ‘∧’이나 ‘**’을 사용하는 경우도 있다. 물론 이외의 다른 연산자나 문법에 있어서도 다소의 차이점이 있을수 있지만 여기에서는 BASIC의 표준형을 기준으로 설명하고 있으므로 여러분이 사용하는 컴퓨터에서 운영되는 BASIC시스템에 따라 이 점을 참조하여 공부하기 바란다.

계산식 X/Y*Z은 (X/Y)*Z, 또는 X/(Y*Z)는 어느 순서로 계산될까? 우리가 프로그램에서 원하는 결과를 얻기 위해서는 계산식이 어떤 순서로 계산되는지 이해해야 할 필요가 있다.

(표1) 산술계산식의 계산순서

(1) 괄호안의 식을 가장 먼저 계산한다. 괄호가 중복된 경우에는 가장 안쪽의 괄호를 먼저 하고 안에서 바깥쪽 괄호의 순서로 계산한다.
 

(보기 1)


(2) 동일한 순서를 갖는 계산식 내의 연산자는 다음 순서를 따른다.
↑ 가장 먼저
*,/ 그 다음
+,- 맨 나중
 

(보기 2)


(3)동일한 순서를 갖는 연산자 끼리는 왼쪽에서 오른쪽의 순서로 계산한다.
 

(보기 3)

(보기 4)


위의 몇 가지 보기에서 볼 수 있는 것처럼 복잡한 계산식을 BASIC으로 작성 하는데에 특히 3가지를 주의해야 한다. 첫째는 곱셈을 표시하는 경우이다. 즉 일반적으로 두 수의 곱은 연산자를 생략하여 a=bc 형태로 나타내지만 BASIC에서는 반드시 ‘*’의 연산자를 사용하여 A=B*C와 같이 표시하여야 한다.

둘째는 나눗셈의 경우인데
m=$\frac{y-b}{x-a}$
와 같은 분수도 BASIC에서는 한 줄에 표시해야 하며 계산의 순서도 틀려서는 안된다. 이 때는 괄호를 다음과 같이 적절히 사용해서 해결한다.
M=(Y-B)/(X-A)
세째는 두개 이상의 연산자를 한꺼번에 붙여서 쓸 수 없다는 것이다.

즉 f=${g}^{-h}$과 같은 식을 작성할 때

F=G↑-H은 틀린 표기법이며
F=G↑(-H)와 같이 표기해야 한다.

문자열 변수(string variables)

프로그램 내의 변수는 숫자 뿐만 아니라 하나 또는 연속적으로 이어진 문자를 값으로 가질 수가 있다.

숫자를 값으로 갖는 변수(숫자 변수)에 대응하여 문자열(string)을 값으로 갖는 변수를 문자열 변수(string variables)라고 하며 A$, C$, S$, 등과 같이 변수명 뒤에 ‘$’의 기호를 붙여서 쓴다.

또 문자열 변수에 할당하는 문자열(string)이나 PRINT문 등에서 사용하는 문자열은 따옴표(“ ”)안에 표시하여야 한다.
 

(보기)READ 문의 효과


그러나 문자열로 표시한 자료로서 산술 계산은 할 수 없으나 서로 비교를 할 수는 있다. 예를 들어,

IF C$=“Yes” THEN 400 IF
IF A$ <; >; S$ THEN 500
등과 같은 비교가 가능하다.
문자열의 순서를 비교할 경우 매우 주의해야 할 사항은 알파벳의 순서 또는 숫자의 크기에 따라서 결과가 결정된다는 것이다. 즉 아래의 경우는 항상 참의 값을 갖는다.

“BART” <; “BARTH”
“HARP” <;= “HART”(<;도 성립)
“K” <; “E”
“1234” >;= “1222”(>;도 성립)
“56” >; “55”

프로그램 연습

(문제1) 수퍼마켓 고객관리

우리동네 슈퍼마켓은 규모가 크고 친절하기 때문에 주위에 있는 주민들이 많이 이용하고 있다. 거래가 빈번하고 신용이 좋은 고객에 대해서는 고객번호, 성명, 주소, 전화번호를 컴퓨터 내에 등록한 후에 특별 서비스를 제공한다.

담당자는 김동준, 장민석, 신요철 3사람인데 업무를 효율적으로 처리하기 위해서 고객의 성이 ‘가’에서 시작하여 ‘바’사이이면 김동준이, ‘바’에서 시작하여 ‘카’사이이면 장민석이, ‘카’이상이면 신요철이 담당하기로 하였다.

매일 한 번씩 특별 고객들의 자료를 입력해서 고객번호, 성명, 주소, 전화번호, 담당자를 인쇄하고 담당자별 고객수를 인쇄할 수 있는 프로그램을 작성해 보라.

(설명)
(문제1)에 대한 자료표는 아래에 설명되었으며 흐름도는 (그림1)과(그림2)에 보였다. 자료표의 N1, N2, N3는 3사람의 담당자에게 각각 할당되는 고객수이며 초기에는 0의값(초기값)을 갖는다(그림 1의 단계 2). 단계 3을 보다 상세히 분할하면 3.1-3.4와 같이 되는데 3.3은 다시 상세히 세분해야 할 필요가 있다. 이는 (그림2)와 같이 나타낼 수 있다.
 

(문제 1)에 대한 자료표(data table(

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

(그림 2)그림 1의 단계 3.3 을 구체화 한 것

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


내장기능(built-in functions)

산술계산을 할 때 자주 사용하는 연산에 대해서는 컴퓨터가 스스로 계산해주고 프로그래머는 그것을 가져다 쓰기만 하면 되는 매우 유용한 기능이 있는데 컴퓨터에 내부적으로 내장되어 있기 때문에 내장기능이라고 부를수있다. 예를들면 SQR은 임의의 양수의 제곱근을 계산하는 기능을 제공해 준다.

Y=5.5+SQR(20.25)에서 SQR(20.25)에 의해서 값은 4.5이며 5.5와 덧셈을 한후 Y에 10의 값을 할당한다.

이와같은 기능들을 사용할 때에는 위의 보기와 같이 그이름 다음의 괄호 안에 매개변수(argument)를 지정해 주어야 하는데 상수 또는 숫자의 값을 갖는 변수를 매개변수로 쓸 수 있다.

BASIC에서 제공하는 이러한 기능들의 몇가지 사용예를 살펴 보기로 하자(보기1).
 

(보기 1)제곱근(SQR), 절대값(ABS), 부호(SGN), 정수값(INT) 사용의 프로그램


프린트 된 출력의 각줄(line)에는 X의 값과 X에 대하여 네가지 수학적 계산을 한 값을 보이고 있다. 문번호 160에서 PRINT문 내에 수학적기능을 포함시킬 수 있음을 알 수 있다. 또 SQR(ABS(X))와 같이 기능명(ABS(X))을 매개변수(SQR에 대한)로 쓸 수 있다는 것을 보여준다. INT에 대하여 설명하면, INT(20.25)=20이지만 매개변수가 음수일 경우에는 주의하여야 한다. 즉 INT(-6.3)=-7인 것이다.
 

(보기 2) SIN, COS 사용의 프로그램


삼각함수 기능에 대한 매개변수는 라디안(호도)으로 표시해야 함을 주의해야한다. 각도를 라디안으로 바꾸려면 우리가 잘 알고 있는 아래 공식을 적용한다(보기2).
 

(표 2) BASIC의 수학적 계산기능

 

1도=$\frac{π}{180}$라디안 ∴x도 = x×$\frac{π}{180}$라디안
위 프로그램 내에서 변수 P는 π를 의미하고 있으며 문번호 180에서는 매개변수로 사용될 수 있는 새로운 점을 설명하고 있다.

또 한가지 중요한 기능으로 TAB이 있다. 이것은 PRINT문에서 자주 사용되는데 출력내용의 간격을 적절하게 조정하여 준다. 다음의 첫 번째 PRINT문은 A1을 첫째 자리에 A2를 11번째 자리, A3을 21번째 자리에 10자리씩 간격을 두고 인쇄한다. 두번째 PRINT문은 N의 값에 따라서 위치가 결정된다.

PRINT A1 ; TAB(11) ; A2 ; TAB(21) ; A3
PRINT A1 ; TAB(N) ; A2 ; TAB(2*N) ; A3

(문제2) 소수구하기
정수N에 대하여 1과 그 수 자신 이외의 약수를 모두 찾아서 인쇄하는 프로그램을 작성하라.

만약 약수가 하나도 없을 경우에는 “N은 소수이다.”라는 통보문(message)을 인쇄한다.

(설명)
소수란 1과 그 수 자신 이외는 약수가 없는 정수이다. 이 문제에서 INT의 기능을 사용하여 약수를 찾아내는 방법을 익히고 프로그램 신호기(program flag)의 개념을 공부하기 바란다. 문제를 해결하기 위해서 2와 N-1까지의 모든 정수를 검토해서 약수인가를 확인해가는 방법을 사용한다.
 

(문제 2)에 대한 자료표


흐름도는 (그림4)에 보였으며 프로그램은 (그림5)에 작성하였다.
 

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

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


변수 P$는 N이 소수인지를 알려주기 위해 사용되는데(단계1.2) 처음값은 “소수”로 초기화(initialization)되었다가 loop 내에서 각각의 D의 값이 N의 약수인지를 시험하면서 약수가 발견되면 “소수가 아님”으로 바뀐다(단계2.4).이와 같은 P$을 프로그램 신호기(program flag)라고 하는데 프로그램의 어느 한 부분에서 수행된 결과를 다른 부분에 알리기 위해서 사용하는 변수이다. N을 나머지 없이 나누는 약수를 찾기 위해서 INT(N/D)*D의 식을 사용하였는데 만약 D가 N의 약수가 아니라면 INT(N/D)는 N/D을 계산한 나머지를 잘라 버리므로 그 결과에 D를 다시 곱하면 N과 정확하게 같은 수를 얻지 못한다. 즉 N=9, D=2이라면 INT(9/2)*2=4*2=8 반면에 N=9, D=3이라면 INT(9/3)*3=3*3=9가 되기 때문에 3은 9의 약수임을 알 수 있다.

1986년 11월 과학동아 정보

  • 전문철

🎓️ 진로 추천

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