d라이브러리









문제인식에서 오류수정까지

퍼스널컴퓨터 교실 ②

컴퓨터 프로그램을 작성하는 일은 마치 로케트를 발사하는 것과 같다. 철저한 계획과 무수히 많은 일을 처리할 수 있는 치밀한 조직이 필요한 것이다.
 

지난 호에서는 컴퓨터의 기능과 기능수행의 방법에 대하여 소개하였다. 이제 컴퓨터를 사용하여 문제를 어떻게 해결할 것인지를 생각해 보자. 문제를 해결하기 위하여 컴퓨터를 사용하는 일은 1960년대에 로케트에 사람을 태워서 달나라에 쏘아 올리는 일과 유사하다고 하겠다. 로케트를 발사할 경우 최종의 목표는 단숨에 성취될 수 없으며 아폴로 11호가 발사되기 까지는 치밀한 계획과 무수히 많은 일을 처리할 수 있는 조직적인 힘이 필요하였다.
 

컴퓨터 프로그램을 작성하는 일도 이와 마찬가지로 철저한 계획과 조직이 필요하다. 해결해야 할 처음의 문제로 부터 단숨에 오류가 전혀 없는 프로그램을 작성한다는 것은 거의 있을 수가 없는 일이다. 문제를 해결할 수 있는 최종의 프로그램은 여러 단계의 작업을 거친 후에야 얻을 수가 있는 것이다. 이러한 단계에 관하여 공부하는 것이 이번 호의 주제이다.

 

문제를 명확히 이해해야
 

프로그램으로 작성할 자료(data)를 정의하기 위해서는 주어진 문제를 명확하게 이해해야 한다. 먼저 컴퓨터로 처리하기 위해 입력(input)해야할 자료와 최종으로 받아보고자 하는 출력자료(output)가 무엇인가를 정하며 원하는 결과를 얻기 위해 필요한 자료를 모두 입력했는지 확인해야 한다. 이와같은 최초의 자료정의와 확인에서 오류가 생기면 프로그램을 작성하는 나중 단계에서 매우 어려움을 겪게 되고 때로는 문제해결을 거의 불가능하게 만들 수도 있다.
 

(문제1)

두 수의 합과 평균을 계산하여 인쇄하는 프로그램을 작성하라.
 

(설명)

가) 우선 문제를 명확하게 이해하였는지 확인하고 문제를 해결하기 위해 필요한 입력과 출력자료를 정의한다.

나) 정의한 입력과 출력자료는 자료표에 기록한다
 

● 입력변수 : READ 문으로 값을 읽혀 들이는 변수

● 출력변수 : 문제에서 요구하는 최종의 결과값을 나타내는 변수

● 프로그램 변수 : 프로그램 상수나 중간단계의 계산결과를 나타내는 변수(이 문제에서 프로그램 변수는 없음)
 

다) 자료표는 알고리즘(algorithm)을 개발할 때 뿐 아니라 프로그램에 관한 문서(program documentation)를 작성할 경우에 다시 유용하게 사용되므로 항상 준비하는 것이 좋다.
 

<;자료표(data table)>;


□ 알고리즘(algorithm)의 개발
 

(문제 1)을 명확하게 이해하였으면 문제 해결의 방법을 몇가지 단계로 나누어서 생각해 보자. 문제 해결을 위한 처리방법을 순차적으로 설명한 것을 알고리즘(algorithm)이라고 한다.
 

(문제 1)에 대한 알고리즘

단계 1 변수 N1과 N2에 자료를 읽어 들이고 인쇄한다.

단계 2 N1과 N2 값의 합을 구한 다음 결과를 변수 S에 저장한다.

단계 3 N1과 N2 값의 평균을 구한 다음 결과를 변수 A에 저장한다.

단계 4 변수 S와 A의 값을 인쇄한다.

단계 5 종료한다.
 

알고리즘을 작성하는 목적은 컴퓨터에 의하여 문제를 해결하는 여러 단계의 일을 상세하고 명확하게 설명하기 위한 것이다. 알고리즘을 작성한 후에는 컴퓨터가 알고리즘을 실행할 수 있는 BASIC 명령어로 정확히 표현될 수 있는지를 판단하고 만약 그렇지 못한 경우에는 해당하는 단계의 알고리즘을 보다 구체적으로 나타내야 한다. 만약 위 알고리즘에서 단계3을 좀 더 구체화해야 할 필요가 있다고 생각되면 다시 아래와 같이 상세하게 나타낸다.
 

단계 3.1 합(S에 저장된 값)을 합에 사용한 자료수(2)로 나눈다.
 

이제 (문제1)을 해결하기 위한 각 단계를 BASIC 언어로 작성할 수 있을 만큼 충분한 알고리즘을 정하였다. 그러면 자료표에 나타낸 변수명을 사용하여 알고리즘을 한 단계씩 구현시켜 보자.
 

(그림 1) 문제1에 대한 BASIC프로그램


□ REM 문
 

(그림 1)에서 REM으로 시작되는 문장은 프로그램의 내용에 관하여 설명하고 있다. 번역기(컴파일러 또는 인터프리터)가 프로그램을 번역할 때 이 문장들은 번역하지 않기 때문에 실행되지 않으며 다만 프로그램 문장의 내용을 이해하기 쉽게 설명할 뿐이다. 따라서 프로그램중의 설명이 필요한 곳에 이 REM문을 사용하면 편리하지만 너무 많이 사용하면 실행시간과 기억장치의 용량을 허비하므로 좋지 않다.
 

□ 흐름도(flow diagram)
 

문제가 복잡해짐에 따라 해결방법을 분명하고 간결한 알고리즘으로 표현하기가 어려워진다. 알고리즘을 이해하기 쉽게 표현하는 방법으로 흐름도(flow diagram)가 있는데 이것은 도형으로 나타내기 때문에 훨씬 능률적이다. (그림 1)의 알고리즘을 흐름도로 표시하면 (그림 2)와 같다.

흐름도의 기호는 다음의 의미로 사용된다.
 

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


가) 타원형 : 알고리즘의 시작과 끝

나) 직사각형: 컴퓨터 기억장치 내에서의 자료처리

다) 컴퓨터 카드모양의 사각형(한 구석이 잘린 모양) : 자료를 컴퓨터 내부로 읽어들임.

라) 밑부분의 물결모양인 사각형 : 컴퓨터 기억장치에 저장된 자료를 인쇄

마) 직선 화살표 : 알고리즘의 한 단계에서 다음 단계로 진행되는 흐름.

바) 점선 화살표 : 각 단계를 구체적으로 표현
 

□ 문제해결의 원칙
 

가) 자신이 해결해야 하는 문제를 정확하게 이해한다.

나) 입력자료와 출력자료를 정의한다. 각각의 입력 및 출력자료에 변수의 이름을 정한 다음 자료에 모두 기록한다.

다) 정의한 입력과 출력자료를 사용하여 문제를 분명히 기술하고 문제를 해결하기 위해 필요한 입력자료가 모두 준비되었는가를 확인한다.

라) 입력자료를 처리하여 원하는 출력을 얻기 위해 필요한 각각의 단계를 명확하게 기술한다. 즉, 알고리즘을 개발하여 흐름도로써 나타낸다.

마) 흐름도를 보고 쉽게 프로그래밍할 수 있도록 흐름도를 자세하게 수정한다. 이 때 프로그램 상수로서 필요한 변수가 더 있다면 자료에 추가로 기입해 넣는다.

바) 흐름도를 보고 프로그래밍한다.

 

판단문(decisions)과 반복구조문(loops)
 

□ 판단관계와 조건
 

조건에 대하여 설명하는 알고리즘의 단계를 판단단계(decision step)라고 한다. 가장 간단한 판단단계의 예는 논리적 조건을 판단하는 경우이다. 즉 이때에는 참(true) 또는 허위(false)의 두 가지 중 하나의 값을 갖는다. 논리적 조건은 일반적으로 한 쌍의 변수끼리의 관계 또는 변수와 상수와의 관계를 설명하는데 그 예는 (표1)과 같다.
 

(표1) BASIC 조건의 예


조건을 나타내는 BASIC의 형식은 피연산자(1) 논리연산자 피연산자(2)(피연산자(1)은 보통 변수이며 피연산자(2)는 변수나 상수가 된다) 이며 BASIC에 쓰이는 논리연산자(rerational operator)에 관한 설명은 (표2)와 같다.
 

(표2) BASIC의 논리연산자


(문제2)

근무한 시간과 시간당 임금이 주어졌을때 직원의 총급여액과 순급여액을 계산하라. 만약 직원의 총급여액이 100,000원을 초과하면 세금을 25,000원 공제한다.
 

(설명)
 

<;자료표>;

 

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

판단단계 (3.1)에서는 다음 수행할 단계를 결정하기 위한 논리적 조건(즉 "G는 M보다 더 큰가")을 설명하고 있다. 만약 이 조건의 값이 참이면 다음에는 단계 3.2(세금 T를 공제)를 수행하여 허위이면 단계 3.3(N에 G의 값을 할당한다)을 수행하게 된다. 이와같은 방법으로 단계3을 수행한 다음에는 단계 4를 수행한다.
 

단계 3.1의 바로 다음에 수행할 단계는 그 결과의 값에 따라서 두가지중 하나가 선택되는데 이러한 판단단계를 이중선택 판단단계(double-alternative decision step)라고 한다. 그러나 어떤 경우에는 판단의 결과가 참일때 다음 단계를 선택하여 수행하지만 허위일 경우에는 선택하는 단계없이 그 다음의 단계로 진행하는 수도 있는데 이러한 것을 단일선택 판단단계(single-alternative decision step)라고 한다
 

(그림 4) 이중선택 판단단계 흐름도
 

(그림 5) 단일선택 판단단계 흐름도


□ LOOP 문
 

(문제 3)

2000개의 수의 합과 평균을 계산하는 프로그램을 작성하라.
 

(설명)

이번에는 매우 많은 자료를 읽고 처리해야 하는 새로운 문제이다. 2000개의 자료에 대한 자료표와 흐름도를 그린다는 것은 매우 귀찮고 시간이 많이 걸리는 일이다. 그림 그리기를 좋아하는 어린 아이라도 그렇게 많은 양이라면 짜증이 날 것이다. 이러한 경우 물론 새로운 방법을 사용하여야 한다. 만약 하나의 자료를 읽어서 전체의 합에 누적하는 두 단계의 일을 2000개의 자료에 대해서 똑같이 반복하게 하면 아주 쉽고 이상적으로 해결할 수가 있을 것이다.
 

변수에 하나의 자료가 읽혀 들어와서 합에 누적된 다음에는 더 이상 그 값을 필요로 하지 않는다는 것은 쉽게 이해할 수 있다. 따라서 매번 자료가 읽혀 들여올 때 마다 바로 옆에 읽혀 들어온 자료는 합에 누적된 후 그 변수의 방에서 부서져 없어진다.
 

(문제 3)의 자료표(data table)
 

 

(그림 6) 문제3의 1차 흐름도


(그림 6)에 알고리즘을 흐름도로 표시하였다. 이 흐름도에는 알고리즘의 초기단계(단계 1), 자료처리단계(단계 2, 3), 출력단계(단계 4)로 구성되어 있으며 프로그램을 작성하기 위허여는 단계 2를 좀더 구체적으로 나타내야 한다. 그럼 연속적으로 반복해서 처리하는 단계를 흐름도에 표시하는 방법을 알아야하겠다. 이와같은 처리 형태를 LOOP라고 하는데 (그림 7)과 같다. 이제 그림에서 LOOP를 완전히 끝마쳤음을 컴퓨터가 어떻게 알 수 있을 것인지 의아심이 생긴다.
 

컴퓨터가 사람처럼 반복한 회수를 생각해서 계산하도록 하기 위하여는 반복할 회수가 몇 번이며 어느때 반복을 끝마칠 것인지 미리 알려주어야 한다. 이런 일은 LOOP 제어단계에서 담당한다. 그러므로 여기에다 2000번 반복한다는 내용을 명시해야 하므로 새로운 프로그램 변수가 필요하게 된다. 이 변수는 반복제어변수(repetition counter)라고 할 수 있는데
 

가) 최초 LOOP를 수행하기 전에 초기값는 1이다.

나) LOOP를 한번 수행할 때 마다 1씩 증가한다.

다) 매번 LOOP를 수행하기 전에 2000을 넘는 값인지 조사한다. 만약 2000보다 작거나 같으면 LOOP를 반복해서 수행하고 2000보다 큰 값이면 출구로 빠져 나간다.
 

추가 프로그램 변수

 

(그림 7) LOOP 흐름도
 

(그림 8)은 반복 제어변수를 사용하여 단계 2를 구체화한 흐름도를 보이고 있다.
 

(그림 8) 그림 6의 단계2를 구체화한 것


단계 2.1의 C가 반복 제어변수이다. 따라서 (문제 3)의 흐름도는 (그림 9)와 같이 완성된다.
 

(그림 9)문제3의 처리도
.

FOR LOOP문


(그림 9)의 LOOP문을 수행하게 하는 BASIC 프로그램은 다음과 같이 작성된다.
 

그림 9의 LOOP문을 수행하게 하는 BASIC 프로그램 작성


□ 흐름도 확인
 

흐름도를 작성한 후에는 그것이 원하는 결과를 얻는 알고리즘의 단계를 올바르게 표시하고 있는지 검증하는 일이 중요하다. 검증하는 방법으로 흐름도에 나타난 순서를 따라서 사람이 실제 처리를 실행해 볼 수가 있는데 이것을 모의실험(simulation)이라고 한다. 이와같은 검증을 통하여 흐름도에 포함되어 있는 논리적 오류(logical error)를 많이 찾아낼 수가 있는데 프로그래밍 하기 전에 이러한 오류를 찾아내서 수정하면 프로그램에 의한 결과를 얻기까지 상당한 노력을 감소시킨다. 따라서 흐름도를 검증할 때에는 매우 주의 깊에 성실히 해야 효과를 얻을 수 있다.
 

그럼 (그림 9)의 흐름도를 한번 검증해 보자. 2000개의 자료에 대해 모두 검증할 수는 없으므로 대표적인 자료를 3개 정도만 선정하자. (12.5, 15, -3.5) 이 3가지 경우에 대해 오류없이 처리가 된다면 2000개의 자료에 대해서도 오류가 발생하지 않으리라는 것을 쉽게 가정할 수 있다. 검증표는 (표 3)에 보였다. 단계 오른편의 숫자는 알고리즘 순서에 의해 바뀌는 변수값이며 공란은 값이 변하지 않은 경우를 설명하고 있다. 즉 LOOP문에 처음 들어가면(단계 2.1) C는 처음에 1로 초기화 되고 LOOP문의 제어단계(단계 2.1)가 한번씩 반복될 때 마다 C는 1씩 증가한다. LOOP 문이 마지막 반복될 때에 C의 값은 3이 되며 LOOP 문이 다 수행된 다음에는 단계 3이 수행된다. 단계 3에서는 S의 값(24)을 3으로 나누어서 A에 저장시킨다. 그때까지는 A의 값은 정의되지 않는다. 검증표에서 볼 수 있는 것처럼 LOOP문은 정확히 3번 수행되고 S에 누적된 값은 24이며 A에 저장된 평균은 8임이 검증되었다. 자! 그렇다면 우리의 알고리즘은 틀림이 없다고 안심해도 좋다.

 

(표3) 그림9의 알고리즘 검증표


프로그래밍을 해보자
 

이제 자료의 수가 2000개가 아니라 20,000개 라고 한다면 어떻게 하겠는가? 또 99,999개 또는 99개 등 자료의 수가 일정치 않은 경우라면 어떻게 해결하면 좋을까? 물론 이 문제도 앞의 알고리즘으로 해결할 수가 있지만 알고리즘을 매번마다 수정해야한다.
 

그러므로 프로그램은 어떤 특정한 경우에만 적용되게 하는것보다 일반적인 어떤 경우라도 다 처리할 수 있게 작성해야 좋은 프로그램이라고 할 수 있다. (문제3)으로 부터 자료의 수에 상관없이 처리할 수 있는 일반적인 알고리즘을 작성하면 (그림10)과 같이 된다.
 

(문제 3)의 일반적인 경우의 자료표(data table)
 

(그림10) 문제3에 대한 일반적인 경우의 흐름도


(그림 10)의 알고리즘을 프로그램한 것이 (그림 11) 이다.

 

(그림 11) 일반적인 합과 평균을 구하는 프로그램


프로그램 오류수정
 

지금까지 우리는 문제를 해결하기 위하여 알고리즘을 개발하고 그것에 의하여 프로그램을 작성하였다. 그러나 오류가 하나도 없이 단번에 원하는 결과를 얻기는 매우 어려운 일이며 대부분은 그 오류를 찾아 고치는데에 많은 시간을 소모하게 된다. 이 일을 오류수정(debugging)이라고 한다. 프로그램을 실행시킬때 발생하는 오류는 일반적으로 세가지 종류로 나눌 수가 있다.
 

□ 문법오류(syntax errors)
 

프로그램의 문법을 지키지 않았을 경우에 컴파일러(또는 인터프리터)가 찾아내는 오류이다. 프로그램 작성시 철자법을 잘못 입력함으로써 생기는 경우도 많다. 이때 컴파일러(또는 인터프리터)는 ILLEGAL STATEMENT AT LINE 280 등과같은 오류통보문을 내보내고 프로그램을 정지시킨 뒤 바로 잡아야 한다.
 

□ 실행오류(run-time errors)
 

이것은 프로그래머 부주의에 의하여 발생하는 것이다. 예를 들면 어느 변수(variable)를 정의하지 않고 그 변수를 사용하고자 할 때에 생기는 오류나 필요한 자료를 다 입력해 주지 않을 때이다.
 

□ 논리오류(logic errors)
 

논리오류는 프로그램 문장의 논리적인 구성을 잘못한 경우에 발생한다. 문법오류나 실행오류가 있을 경우에는 그 내용을 알리는 통보문이 출력되기 때문에 잘못된 곳을 고칠 수가 있다. 그러나 논리오류는 컴파일러 등의 번역 등이 번역할 때에 발견되지 않은채 프로그램이 실행되고 그릇된 결과를 출력시키는 것이다. 또한 그 오류를 찾아내는 일도 쉽지가 않다. 만약 프로그램에 논리오류가 있다고 판단되면 먼저 흐름도로 거슬러 올라가서 수정한후 알고리즘을 반복해서 검증해야 한다. 그러나 알고리즘의 한 부분을 수정할 경우, 그것 때문에 또 다른 부분이 영향을 받아서 틀려지는 수가 많기 때문에 전체적으로 검증하는 일은 매우 중요하다. 앞에서 설명한 알고리즘 및 프로그램 작성 단계를 처음부터 충실히 그대로 따라서 수행한다면 프로그램을 작성한 후에 소모해야 하는 오류수정의 시간과 노력을 상당히 감소시킬 수가 있는 것이다.
 

지금까지 컴퓨터에 의하여 문제를 해결하기 위한 문제의 분석방법과 알고리즘을 개발하여 해결하는 방법을 공부하였다. 다음 호에서는 계속하여 BASIC 프로그램의 여러가지 제어문 구조(control structure)에 관해서 알아보자.

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

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

1986년 09월 과학동아 정보

  • 전문철

🎓️ 진로 추천

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