프로그램에는 많은 명령들이 포함되어 있는데 이 명령들은 물 흐르듯이 위에서 아래로 순서대로 실행된다. 컴퓨터는 한 번에 한가지 일 밖에 하지 못하기 때문에 주어진 명령을 순서대로 실행할 수 밖에 없다. 다음 프로그램을 보자.

 

a=3;

b=4;

c=a+b;

printf("%d\n",c);

 

a에 3을 먼저 대입하고 b에 4를 대입한 후 c에 a와 b의 합을 계산한다. 그리고 c의 값을 화면으로 출력한다. 3과 4를 더해 그 결과를 출력했으므로 7이 출력되는데 지극히 당연하고 상식적이다. 그러나 프로그램이 이런 식으로 명령을 나열하기만 한다면 어떤 일을 하는데 무수히 많은 명령들이 필요할 것이다. 상황에 따라 다르게 처리해야 할 경우도 있고 비슷한 명령을 여러 번 반복하는 것이 효율적인 경우도 있다. 다음 프로그램은 1~100까지의 합을 구해 출력한다.

 

: comedycode

#include <Turboc.h>

 

void main()

{

     int sum;

 

     sum=1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+

          21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+

          38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+

          55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+

          72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+

          89+90+91+92+93+94+95+96+97+98+99+100;

 

     printf("1에서 100까지의 합=%d\n",sum);

}

 

 

컴파일도 되고 실행도 되고 결과도 제대로 나오므로 목적은 달성한 셈이지만 사람이 컴퓨터를 위해 연산식을 일일이 입력하는 무식한 방법을 사용했다. 이런 코드는 일단 결과가 나오기는 하지만 유지 확장이 불가능한 구조이므로 제대로 된 프로그램이라고 할 수 없다. 만약 요구를 바꾸어 1~1000까지 합을 구하라거나 1~100까지의 짝수의 합만 구하라고 한다면 어떻게 되겠는가? 다행히 컴퓨터는 주어진 명령을 순서대로 실행하는 것뿐만 아니라 조건을 판단하여 적절한 명령을 선택할 수 있는 능력이 있다.

제어문이란 프로그램의 이런 순차적인 흐름을 통제하는 명령이며 조건, 반복, 선택, 점프문 등이 있다. 조건에 따라 다른 명령을 실행한다거나 또는 비슷한 명령을 여러 번 반복한다거나 명령의 흐름을 바꾸는 것이 바로 제어문이다. 제어 구조를 잘 설계해야 프로그램이 튼튼해지고 간결해진다. 이 장에서 다루는 제어문은 입문자에게 특히 중요하므로 책을 뒤적거리지 않고도 원하는 제어 구조를 능숙하게 만들 수 있도록 숙달될 필요가 있다. 함수 때문에 책이나 도움말을 뒤적거리는 일은 많고 누구나 그렇게 하고 있지만 적어도 제어문을 몰라서 책을 다시 읽어야 하는 일은 없어야 한다.

4-1.조건문

4-1-가.if문

조건문이란 주어진 조건에 따라 명령의 실행 여부를 결정하는 문장이다. 프로그램이란 항상 동일한 결과만 출력하는 것이 아니라 다양한 상황을 판단하여 다르게 동작하기도 한다. 이런 판단의 상황은 우리의 실생활에도 흔히 만나게 되는데 다음은 어느 백수의 일일 생활 순서도이다.

순서도에서 사각형은 동작을 나타내며 마름모는 조건 판단을 나타낸다. 마름모 안에 있는 문장이 조건인데 조건에 따라 특정 동작을 할 것인지 말것인지를 결정할 수 있다. 프로그램도 이와 마찬가지로 여러 가지 조건에 따라 상황을 판단하여 명령의 수행 여부를 결정한다. C언어의 조건문은 키워드 if를 사용하며 다음과 같은 형식을 가진다.

 

if (조건) 명령;

 

괄호안에 조건을 쓰고 이 조건이 만족할 때 실행할 명령을 괄호 뒤에 작성한다. 괄호는 조건과 명령문을 구분하기 위해 존재하며 생략할 수 없다. 베이직 언어의 조건문은 "if 조건 then 명령"으로 조건과 명령 사이에 키워드 then이 있는데 괄호나 then이나 모두 어디까지가 조건이고 어디부터 명령인지를 구분하는 역할을 한다. 조건은 주로 변수의 값을 비교하는 연산식인데 이때 다음과 같은 비교 연산자가 사용된다.

 

연산자

조건

==

좌변과 우변이 같다.

!=

좌변과 우변이 다르다.

>

좌변이 우변보다 크다.

<

좌변이 우변보다 작다

>=

좌변이 우변보다 크거나 같다.

<=

좌변이 우변보다 작거나 같다.

 

수학에서 쓰는 등호, 부등호와 거의 유사하다. 단, 같다라는 조건은 =를 쓰지 않고 = 기호를 두 번 써서 ==로 표현한다. 그리고 다르다는 표현은 !=이라는 점을 주의하도록 하자. 부등 비교 연산자는 수학에서 ,≥로 표기하지만 이런 문자가 키보드에 없기 때문에 >=, <=로 표기하는데 =>, =<가 아님도 주의하도록 하자. "크거나 같다"라고 하지 "같거나 크다"라고는 하지 않으므로 자연어의 순서에 맞게 부등호가 먼저 온다고 외워 두면 헷갈리지 않을 것이다. 다음은 비교 연산자를 사용한 조건문의 예이다.

 

if (i == 5)           // i가 5이면

if (i != 5)            // i가 5가 아니면

if (i > 5)            // i가 5보다 크면

 

if 다음의 괄호안에 원하는 비교 연산자를 사용하여 조건문을 작성한다. 다음 예제는 조건문을 사용하는 가장 간단한 예이다.

 

: if

#include <Turboc.h>

 

void main()

{

     int i;

 

     printf("정수를 입력하세요 : ");

     scanf("%d",&i);

     if (i == 7)

          printf("7을 입력했습니다.\n");

}

 

키보드로 정수값 하나를 입력받은 후 이 값이 7인지 검사해 보고 7이면 7을 입력했다는 메시지를 출력한다. 만약 7이 아닌 6이나 8이 입력되었다면 조건이 거짓이 되므로 printf문은 실행되지 않고 무시된다. if문은 조건과 명령이 하나의 문장이므로 설사 두 줄에 걸쳐 쓰더라도 조건 다음에 ;을 붙이지 말아야 한다.

 

     if (i == 7);                                            // 여기에 ;을 붙이지 않는다.

          printf("7을 입력했습니다.\n");              // 문장의 끝에만 ;을 붙인다.

 

조건 다음에 세미콜론이 있어도 에러는 발생하지 않지만 조건과 명령이 별개의 문장이 되므로 printf가 조건에 상관없이 무조건 실행된다. 이 프로그램의 순서도를 그려 보면 다음과 같다.

사용자가 입력한 변수 i의 값이 7인가 아닌가의 조건에 따라 printf 명령의 실행 여부가 달라진다. if 문 자체가 자연어와 유사하기 때문에 어렵지 않게 이해가 될 것이다.