d라이브러리









BASIC 강좌③ 데이타 입력과 프로그램 구성

프로그램은 입력데이타로 부터 정해진 절차에 따라 원하는 출력데이타를 계산 처리한다. 입력데이타는 프로그램 내부의 문장으로 주어질 수 있으며 프로그램이 실행될 때 외부에서 입력시킬 수 있다. 이번 호에서는 데이타의 입력 방법과 프로그램의 논리적 구성에 기본적으로 사용되는 IF~THEN문을 살펴본다.

원의 면적을 구해보자

간접실행방식(프로그램방식)으로 원의 면적을 계산하기 위해서 면적계산에 필요한 반지름(radius)의 값을 변수 R에 기억시켜야 한다. 원의 면적을 구하는공식은 S=πR²이므로 이것을 프로그램의 대입문 또는 할당문(assignment statement)으로 활용한다. 프로그램은 (그림1)과 같다.

이때 이미 배운 바대로 R=10을 사용하여 반지름의 값으로 10을 입력하고있다.

(그림1)의 20번문을 R=25로 바꾸어 새로운 반지름에 대한 면적을 구하려면20번문을 수정해서 다시 실행시켜야 하는 번거로움이 있다. 따라서 프로그램의 효율적 활용을 위해 반지름의 값을 프로그램이 실행될 때 입력하도록 한다. 프로그램이 실행될때 키보드로부터 입력데이타를 받아들이는문은 INPUT문이다.
 

(그림 1) 원의 면적을 구하는 프로그램


INPUT문의 사용에는 두가지 방법이 있다.

첫째는 입력데이타에 설명을 할 수 있는 문자열 출력형 INPUT문이 있어서 입력 데이타의 의미를 명확하게 해줄 때 사용한다.

또다른 하나는 변수 나열형 INPUT문인데 입력데이타의 의미가 확실하게 알려져 있거나 앞에서 이미 그 의미가 출력되어져 있는 경우 주로 많이 사용한다.

INPUT문은 입력데이타가 입력된후 항상 RETURN키를 눌러야만 입력데이타가 효력을 발생한다.

(그림2)는 INPUT문을 사용한 원의 면적계산 프로그램이다. RUN명령으로 매번 실행시킬 때마다 R의 값을 물어보게된다. R의 값을 입력하고
RETURN을 누르면 입력된 R의 값에 따라 공식의 값이 출력된다.
 

(그림3)은 문자 출력형 INPUT문을 사용하고 있다. 실행결과를 보면 입력데이타를 묻기전에 “INPUT RADIUS:”라는 문자열이 출력되어 컴퓨터가 사용자에게 반지름의 값을 입력하라고 명령하는 것처럼 동작된다.
 

(그림 2) 변수나열형 INPUT문을 사용한 원의 면적계산용 프로그램
 

INPUT문은 프로그램 실행과정에서 입력데이타를 외부로부터 받아들인다. 그러나 계산에 사용되는 반지름의 값들이 일정하면 매번 실행할 때마다 입력하게 되어 시간의 낭비를 초래한다. 이때 READ~DATA문을 사용하면 반지름의 값을 프로그램 내부에 기억해두고 차례대로 읽어내어 처리가 가능하다.
 

(그림 3) 문자열 출력형 INPUT문을사용한 원으 면적계산용 프로그램(APPLEⅡ)


(그림3)을 READ~DATA문으로 바꾸어보면 (그림4)와 같다. DATA문은 프로그램의 어느 위치에 놓여도 좋다. 다만 프로그램의 기술적인 관리를 위해 READ문 바로 뒤에 놓거나 프로그램 맨 마지막부분에 놓는 경우가 많다. DATA문은 복수개 사용될 수 있으며 그 놓여진 순서에 따라 포인터가 하나씩 증가해가면서 데이타가 변수에 기억된다. 데이타를 가리키는 포인터의 제어는 RESTORE에 의해 맨 처음의 데이타로 넘어가서 다시 처음부터 데이타를 읽게된다.
 

(그림 4)RED-DATA문의 활용문 (APPLEⅡ)


(그림4)의 프로그램을 확장하면 5개정도의 반지름에 대해서도 하나의 프로그램으로 처리가 가능하다.
 

(그림 5) 반지름값 5개에 DEAD문이 5회반복되는 프로그램(APPLEⅡ)

 

(그림5)를 변수나열형 INPUT문으로 바꾼다면 (그림6)과 같다.
 

(그림6)의 프로그램은 5개의 반지름에 대해서만 그 결과를 알아볼 수 있게 되어 있다. 좀더 다목적으로 사용하기 위해 반지름의 갯수를 일반화한다. 반지름의 갯수를 N으로 나타내기로 하면 N값 또한 INPUT문을 사용하여 프로그램 실행도중 입력시킬 수 있다. (그림7)은 반지름의 갯수가 정해지고 그 갯수만큼의 반지름에 대한 면적 계산을 해주는 프로그램이다.
 

(그림 6) 5개의 반지름으로부터 각원의 면적을 계산하는 프로그램(APPLEⅡ)


(그림7)은 반지름의 데이타 갯수를 입력해야 하는 번거로움이 있다. 따라서 데이타를 특별하게 사용하면 이러한 단점으로부터 벗어날 수 있다. 맨 마지막 데이타를 트레일러(trailer)라 부르기도 한다. 여기서는 -4로 데이타의 입력을 종료시키도록 한다. 트레일러를 조사하기위해서는 매번 데이타가 입력될 때마다 -4와 비교하여 같지 않으면 원의 면적을 구해주고 그렇지 않으면 프로그램 실행을 종료시키기로 한다. 입력데이타가 -4인지를 조사할 때 IF~THEN~문을 사용한다. IF문은 프로그램의 논리적 흐름을 제어할 수 있는 구조문이다.
 

(그림 7) 데티아 갯수를 알고 그 갯수만큼 면적을 계산하는 프로그램(APPLEⅡ)

IF문에 사용 될 수 있는 연산자들은 다음과 같다.

○산술연산자(arithmetic operators)
○관계연산자(relational operator)
○논리연산자(logical operator)
위 연산자들의 연산우선순위는 산술→관계→논리연산자 순이다.
 

(표 1) BASIC의 연산자


(그림8)은 IF문의 예이다. 연산자의 사용을 주의 깊게 살펴보기 바란다.
 

(그림 8) IF문의 사용 얘
 

IF문은 BASIC인터프리터의 종류에따라 다르겠지만 IF~THEN~문과 IF~THEN~ELSE~문이 있다. 이들 두개의 IF 문은 흐름도(flow chart)상에서 (그림9)처럼 나타난다.
 

(그림 9) IF문의 흐름도


이제 (그림7)의 프로그램에 트레일러를 사용하여 입력데이타의 갯수를 모르더라도 프로그램을 사용할 수 있도록 고쳐보자.

프로그램의 계속적 실행을 위해 맨마지막문에 GOTO문이 사용되고 있다. 아무조건 없이 가야될 문장번호만 주어지기 때문에 무조건 GOTO라 부른다. 될수 있으면 프로그램 작성에 GOTO를 많이쓰지 않는것이 좋다. 따라서 프로그램의 논리적 흐름을 명백히 하고 구조적 설계가 익숙해지도록 많은 예제를 통해 연습을 해야 한다.
 

(그림 8) 트레일러를 사용한 데이타입력의 보기프로그램(APPLEⅡ)


평균과 최대값을 구해 보자

배열 변수를 사용하면 동일이름으로 여러개의 데이타를 기억할 수 있다. INPUT문에서도 이 배열변수를 사용하여 배열 원소의 값을 읽어들일 수 있다. 사용하는 배열의 이름및 크기는 DIM으로선언한다. 배열변수를 프로그램에서 사용할 때는 첨자의 범위에 주의해야 한다. 특히 BASIC에서는 첨자가 0부터 시작됨을 주의한다. 일부BASIC에서는 첨자를 1부터 사용할수 있도록 선언해두는 것도 있다.

다음은 첨자를 사용한 배열 변수에 대한 INPUT문들이다.
 

배열 변수에 사용한 INPUT문


INPUT문에 나열된 배열변수들이 3~4개일 경우에는
INPUT A(1), A(2), A(3)
와 같이 처리할 수 있으나 그 갯수가 많아지면 INPUT문 하나로는 처리가 불가능해진다. 이를 해결하기 위해서 인덱스를 사용하여 첨자를 변화시켜가면서 INPUT문을 다음과 같이 FOR~NEXT문으로 중복 실행시켜 나간다.
 

FOR∼NEXT문으로 중복실행시키기


위와같은 배열처리기법을 응용하여 10개의 데이타를 배열로 입력하고 이들의 평균을 구하고 최대값을 구해보자.

배열의 첨자가 10까지만 사용된다면 DIM을 사용하여 그 크기를 꼭 선언해줄 필요가 없으나 편의상 선언해놓기로 한다.
 

(그림9) 평균과 최대값을 구하는 프로그램 예제


(그림9)는 평균과 최대값을 구하는 프로그램이다. 프로그램에서 FOR~NEXT루프를 3번 사용하고 있으나 1번으로 줄일 수 있다. (그림10)이 그 결과이다.

(그림9)의 프로그램을 실행시키면 데이타 입력은 물음표가 출력되고 난 후부터 가능하다. 그러나 아무 의미없는물음표에 의미를 주기위해서 현재 입력되려는 데이타가 어디에 기억되는지 그 기억배열원고를 출력시켜 보자. 여기서 문자열 나열형 INPUT문을 쓰게 되면 몇번째 원고인가를 나타내기에 불가능하므로 INPUT문에 문자열로 출력하지 않고 INPUT문 실행전에 PRINT문으로 출력시킬 문자열을 표시하면 된다.
 

(그림 10) 평균과 최대값을 구하는 프로그램의 압축된 결과


삽입할 부분의 문장번호를 35로 하고 LIST명령으로 출력시켜 보면 (그림11)과 같고 RENUM명령으로 각 문장의 번호를 다시 정돈하여 놓은 것이 (그림12)이다.
 

(그림 11) 새로운문장의 삽입(IBM-PC)

(그림 12) RENUM명령으로 문장번호를 정돈한 결과(IMP-PC)


배열의 데이타가 프로그램내에서 DATA문으로 주어진다면 INPUT문은 사용될수 없다. DATA문으로 주어진 데이타는 READ문에 의해서만 읽혀진다. 즉(그림9)의 40번 문을 READ A(I)로 바꾸고 10개의 데이타가 기록된 DATA문을 만들면 된다. INPUT문은 데이타가 입력될 때 RETURN키를 사용하지만 READ문은 프로그램에 의해 자동적으로 데이타 포인터가 다음에 읽을 데이타로 이동되어 처리되기 때문에 RETURN을 누를 필요가 없다.

(그림12)는 배열데이타의 입력에 READ-DATA문을 사용하여 본 예제프로그램이다.
 

(그림 12) READ-DATA문을 사용한 배열의 입력


IF~THEN~ELSE~문을 IF~THEN~문으로 바꾸기

BASIC인터프리터에 따라서는 IF~THEN~ELSE~문이 처리가 않되는 것이 있다. 이러한 경우 어쩔 수없이 IF~THEN~문으로 변환을 해주어야 한다.

다음 프로그램에 나타난 IF~THEN~ELSE~문을 예로써 변환해보자.
 

IF∼THEN∼ELSE∼ 문을 변환해보는 예

 

1986년 11월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

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