d라이브러리









우리는 지금까지 숫자형자료(numerical data)와 문자형 자료(String data)를 처리하는 프로그램을 많이 작성해 보았다. 또한 같은 형태의 자료들이 집합되어 있는 것 중에서 원하는 자료만을 선택해서 처리할 수 있는 자료구조(data structure)인 배열(arrays)에 관해서도 공부하였다. 배열은 서로 관계가 있는 자료들을 기억장치(memory)에 저장해 두고 각 배열의 원소(elements)를 선택할 때에 배열명과 첨자(subscripts)를 사용하는 것으로서 프로그래밍의 매우 중요한 기법임을 알았다.
 

이번 호에서는 지금까지 배운 내용을 종합적으로 응용하여 배열을 2차와 3차까지 확장해서 공부해보자. 그동안 본 PC교실에서 공부한 내용을 체계있게 정리하고 자신의 것으로 소화시키는 일에 충실했던 사람은 이제 자신이 원하는 좋은 프로그램을 작성할 수 있을 것으로 생각한다.
 

앞으로도 기술을 계속 갈고 닦아서 컴퓨터의 프로그래밍에 자신을 갖게 되기를 바란다.

 

2차배열 이란
 

우리는 이미 배열에 대해서 공부하였으므로 그 용도나 사용방법을 익히 알고 있다. 즉 DIM X(8)으로 선언하면 배열명이 X인 원소가 연속적으로 8개 생성되며, 몇 번째 원소를 선택할 것인가는 ( )안에 숫자로써 표시하는데 이 숫자를 첨자(subscripts)라고 했다. 이처럼 원소가 일렬로 연속 늘어서 있는 구조를 1차 배열(one-dimensional arrays)이라고 한다. 그러나 원소가 일렬로 맞춰서 구성되고 있는 것 대신에 가로열과 세로열을 맞춰서 구성되어 있는 구조가 있는데 이것을 2차배열이라고 한다.
 

1차와 2차배열을 쉽게 알 수 있도록 (그림1)에 설명하였다. 배열은 2차 뿐 아니라 3차 이상 사용할 수 있으며 그것들의 개념은 2차와 유사하다.
 

(그림 1) 1차와 2차배열

 

2차 배열 선언

형식:DIM 배열명(행의 범위, 열의 범위)

설명:'행(row)의 범위' '열(column)의 범위'는 각각 행과 열의 수로써 허용할 수 있는 배열의 첨자(subscripts) 범위를 정수로 표시한다.

 

(보기1) DIM S(3,3), R(7,5)

S는 행과 열이 각각 1, 2, 3의 첨자를 가지므로 3 X 3 = 9개의 원소를 갖는 2차 배열이다. (단 첨자를 0부터 시작하는 BASIC시스팀에서는 4 X 4 = 16개의 원소를 갖는다.)

R은 첨자의 범위가 행이 7, 열이 5이므로 7 x 5 = 35개의 원소를 갖는 2차 배열이다. (단 첨자를 0부터 시작하는 경우는 8 X 6 = 48개)

 

2차 배열 첨자

형식: 배열명(${S}_{1}$,${S}_{2}$)

설명: 1) 첨자 ${S}_{1}$,${S}_{2}$는 산출식으로 표시할 수 있다.

2) 필요한 경우 첨자는 반올림한다.

예: (19.5≤첨자<10.5)는 10번째 원소

3) 어떤 BASIC 시스팀은 첨자를 반올림하지 않고 소수점 이하를 생각한다. 따라서 첨자는 정수를 사용하는 것이 좋다.

4) 0을 첨자로 사용하는 BASIC 시스팀도 있다.(본 설명에서는 0의 사용을 제외함) 예: 배열명(0)

 

(보기2) DIM W(3, 3)

이 선언문에 의해서 생성되는 2차 배열은 다음 그림과 같은 모양의 구조를 갖는다.
 

보기 2에 의해 생성된 2차배열


또 W(1, 2) = 6 W(2, 2) = 2 W(3, 1) = 1 으로 프로그래밍하면 그림에 표시된 것과 같이 해당하는 원소의 방에 자료(data)가 저장되는 것이다.

(보기3)

A대학에서는 여름방학 특강으로 5가지 과정의 강의를 개설하였다. 강의를 신청한 학생들은 1, 2, 3학년으로서 각 강의별, 학년별로 신청학생수를 입력시킨다음 전체학생수와 2과정에 신청한 학생수를 출력할 수 있도록 프로그램하고자 한다.

(설명)

5가지 과정과 3개의 학년을 각각 행과 열의 범위로 정하여서 DIM E(5, 3)으로 선언하면 아래와 같이 배열이 생성된다.

 

5가지 과정과 3학년 DIM E배열


또 각 과정에 신청한 학생수를 입력하고 전체 학생수를 계산하기 위해서는 FOR loop문을 상요하면 된다.

(프로그램 문번호 110~150, 190~230)

 

(그림 2) 보기 3의 프로그램과 같다


3차 배열
 

3차 배열은 첨자를 3개 사용하여 자료를 저장하고 찾아내는 것으로서 그 기능은 1차, 2차 배열과 같다. 다만 배열의 구조가 다를 뿐이다.

즉 DIM C (4, 3, 3)이라고 선언하면 아래와 같은 구조의 배열이 생성되는것이다.

 

3차배열 DIM C배열


행렬 연산
 

행렬(matrix)이란 여러 개의 수를 가로열과 세로열에 맞춰서 늘어 놓은 직사각형 배열을 말한다. 즉,
 

행렬의 여러가지 수의 가로열과 세로열


과 같은 형태로서 수평 배열을 행(row), 수직배열을 열(column)이라고 한다.

또 어떤 행렬이 m행과 n열로 되어있으면 m X n행렬이라고 하는데 그림으니 예는 4 X 3행렬이다. 이와같은 행렬에 대한 연산은 2차원 배열을 사용하면 손쉽게 할 수가 있다.

먼저 행렬 F의 각 원소에 임의의 상수를 곱하는 경우를 생각해 보자.
 

mxn 행렬에 임의상수를 곱한 경우

 

F의 각 원소에 공통으로 3을 곱한 결과를 얻는데 이것을 프로그래밍하면(그림4)와 같이 된다. 앞에서는 설명하였지만 여러 개의 행과 열을 처리할 때는 FOR loop문(문번호 110~150, 170~220)을 사용한다는 점에 착안하기 바란다
 

(그림 4) 행렬 X상수

 

행과 열의 수가 서로 같은 행렬에 대해서는 크기가 서로 같다고 말하는데 이때에는 두 행렬을 더할 수 있다. 즉
 

 

행과 열의 수가 서로 같은 경우 예일때 행과 열의 수가 같을 때 덧셈
 

이와같은 요령으로 행렬의 덧셈을 3차 배열을 써서 프로그래밍 해 보자. 이 것을 그림으로 표시하면 다음과 같다.
 

행렬의 덧셈 3차 배열

 

(그림5) 행렬의 덧셈


a X b 행렬과 c X d행렬을 곱하면 결과는 a X d 행렬이 된다. 예를 들면
 

a xb행렬과 cxd 행렬이라고 할때

 axb 행렬과 cxd 행렬과정결과값이다.
 

그러면
    결과값 행렬

H X R을 프로그래밍 해보자.
 

H xR 행렬으 곱셈


이번에는 3차 배열을 써서 각 원소끼리 곱하는 경우를 생각해 보자.


3차 배열  S T W

(그림 7) 행렬 원소끼리의 곱셈


문제1)

어떤 상인은 3개의 가게를 갖고 있는데, 다같이 5가지의 동일한 상품을 판매한다. 그는 금년의 매 분기(3개월)마다 각 가게에서 판매한 각 상품별 수량을 기록해 놓고 있다. 이제 각 가게별로 연간 판매한 금액과 전체 가게의 판매 총액을 계산하려고 한다. 이것을 프로그래밍 해 보라.
 

설명)

매 분기별 판매금액은 3 X 5 행렬 Q에 입력시키고, 3 X 5 행렬 A에다 누적시키다. Q(i, j)에는 어느 한 분기동안 i가게에서 j상품을 판매한 수량을 저장하고 있다. 행렬 A의 최종 내용은 각 가게에서 각각의 상품을 판매한 수량이다. 연간 이 행렬에다 각 상품의 가격(P(5))을 곱해서 가게별 판매 총액을 (V(3))계산한다. 그리고 전체 총액(G)을 구하기 위해서는 V(3)을 합계하면 된다.
 

(자료표)
 

입력변수와 출력변수


최초의 행렬 Q와 P의 값을 생각해 보자.


행렬 Q와 P값

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

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

 

2차 배열이나 행렬의 사용방법을 보다 잘 이해하기 위해서 이것을 주로 사용하는 프로그래밍을 다시 해 보자.
 

(문제2)

명성 호텔은 3층으로 각층마다 크기가 다른 5개의 객실이 있다. 고객번호와 손님이 원하는 방의 크기를 입력시키면 알맞은 방을 찾아서 알려주는 프로그램을 작성해 보라. 해당하는 객실이 없을 경우에는 “할당가능한 객실 없음”이란 통보문(message)을 내보낸다.

(설명)

(1) 3개의 층과 층마다 5개씩 있는 객실의 용적을 표현하려면 2차 배열이 필요하다. (C(3,5))

(2) 각 손님의 요구에 맞는 방의 번호는 2차 배열의 첨자를 이용하면 쉽다. 즉, C(2,4)는 2 X 100 + 4 = 204호(2층4호)

(3) 주(main)프로그램에서 호출하는 서브루틴은 2개(PRINTC, PROCESS)이며, PROCESS는 다시 다른 서브루틴(ASSIGN)을 호출한다.
 

<;자료표>;
 

문제2에 대한 자료표

 

(그림 10) 문제2의 흐름도와 프로그램 관련도

(그림 11) 주프로그램

(그림 12) PRINTC 서브루틴


■주프로그램에서 호출하는 서브루틴

PRINTC : 초기의 객실용적표(C(3,5))인쇄

PROCESS : 고객번호와 원하는 방의 크기를 읽어서 할당할수 있는 방의 번호를 결정. 고객번호, 고객이 원하는 방의 크기, 방의 번호, 할당된 방의 크기를 인쇄

 

(PROCESS의자료표)


주프로그램에서 호출하는 PROCESS의 자료표

(그림 13) PROCESS의 흐름도

(그림 14) 서브루틴PROCESS


■PROCESS에 의해 호출되는 서브루틴

ASSIGN : 객실용적표(C)를 조사하여 고객이 요구한 방의 크기 또는 그보다 큰 것을 찾는다. 만약 적합한 방을 찾은 경우에는 할당한 객실의 F(층수)와N(호수)를 되돌려 보낸다(return).

 

(ASSIGN의 자료표)


ASSIGN의 자료표


사용자가 요구한 방의 크기(S)와 유사한 것을 찾기 위해서는 다음과 같은 방법을 사용한다.

(1) 만약 S와 똑같은 크기의 방을 만나면 이것을 선택하고(가장 적합한 경우) 찾는 일을 마친다.

(2) 만약 첫번째 찾은 방의 크기가 S보다 크면, 이것을 임시로 선택하고 그 다음에 선택된 것과 비교하여 보다 작은 쪽을 택한다.

(3) 일단 선택된 방은 다시 선택되지 않아야 하므로 방의 용적을 나타내는 값을 음수로 바꿈으로써 구별한다.



(그림 16) 서프루틴 ASSIGN

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

흐름도

 

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

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

1987년 05월 과학동아 정보

  • 전문철 연구원

🎓️ 진로 추천

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