C 프로그래밍
<제어의 흐름 : if문, if_else문>
1. 개 요
프로그램의 실행에서 제어는 명시적으로 제어의 흐름을 변화시키지 않는 한 한 문장 한 문장 순서로 진행된다. 일반적으로 프로그램에서 문장은 보통 순서대로 한 번에 한 문장씩 실행되는데 컴퓨터가 특정 문장을 실행할 때 우리는 그 문장이 그 순간에 컴퓨터의 제어 하에 있다고 생각한다. 예를 들어 if 문은 관계, 동치, 논리연산식에 의존하여 프로그램 문장들이 다음 실행 순서를 결정한다. 제어의 흐름은 또한 몇 개의 문장들을 하나의 복합문으로 묶음으로써 조정될 수 있다. 대부분의 프로그램은 제어의 정상적 순서의 흐름에 대한 변경이 필요하다. while 및 for문은 루핑 기법을 제공하고, if 및 if-else문은 전형적으로 논리적 표현식의 평가에 근거한 동작을 취한다.
이번 보충학습을 통해서는 실행될 다음 문장을 선택하는 if 문과 if_else 문의 의미와 사용법을 위주로 살펴 보고자 한다.
2. 관계, 동치 및 논리연산자
어떤 식의 값이 참(true)인지 거짓(false)인지를 판단하기 위해서는 연산 식에 사용되는 아래와 같은 연산자들이 요구된다.
관계연산자들 |
< : 보다 작다. > : 보다 크다. <= : 보다 작거나 같다. >= : 보다 크거나 같다. |
동치연산자들 |
== : 같다. != : 같지 않다. |
논리연산자들 |
! : 역(단일 연산자) && : 논리적 AND || : 논리적 OR |
위에서 !연산자는 단일 연산자로 한 개의 피연산자를 갖는다. 그외 모든 다른 관계, 동치, 논리연산자들은 이진연산자 즉 두 개의 피연산자를 갖는 연산자이다.
3. if 문, if_else 문
if문 및 if-else문은 제어의 흐름에 영향을 미치는데, 일반적으로 두 가지 구조가 있다. if문의 형식은
if (식)
문장
만일 식이 참(true)이면 문장이 실행된다. 그렇지 않으면 건너 뛴다.
예로서 다음의 코드를 생각해 보자.
b = 5;
if (a == 7)
b = 8;
printf("%d", b);
조건은 a의 값이 7인지 검사한다. 만일 그렇다면 b는 값 8로 치환되고, printf() 문으로 제어가 이동된다. b의 값이 8이므로 이 값이 프린트된다. 그러나 a의 값이 7이 아니면 문장
b = 8;
는 생략되고 제어는 직접 printf() 문으로 전달된다. b의 값이 5이므로 이 값이 프린트된다. 복합문은 여러 개의 동작을 제어하기 위해 단순문장의 위치에 이용될 수 있다.
여기에서 a가 값 7을 가지면 두 개의 치환문이 실행된다. 만약 a가 값 7을 가지지 않으면 문장을 뛰어넘어 printf("%d", b); 만을 수행하게 된다.
if-else문의 형식은 아래와 같다.
if (식)
문장1
else
문장2
여기에서 식의 조건이 참이면 문장1을 수행하고 거짓이면 문장2를 수행한다.
다음 문장이 뒤따른다고 가정해 보자.
if (식)
문장1
else
문장2
다음 문장
만약 식이 참이면 문장1은 실행되고, 문장2는 건너뛰며, 제어는 다음 문장으로 전달된다. 예를 들어 코드
if (i == 10) {
x = 3;
y = 5;
z = 7;
}
else {
x = 11;
y = -5;
z = -7;
}
printf("%d", x+y+z);
는 i가 10의 값을 가질 때 15가 인쇄된다. 그렇지 않은 경우에는 -1이 인쇄된다.
다음의 프로그램은 정수가 기록된 파일에서 최대값과 최소값을 구하기 위해 if문을 사용한 것이다.
main()
{
int min, max, x;
scanf("%d", &x);
min = max =x;
while(scanf("%d", &x) == 1) {
if (min > x)
min = x;
if (max < x)
max = x;
}
printf("\n최소값 = %d\n", min);
printf("\n최대값 = %d\n", max);
}
매번 입력 스트림으로부터 x의 새로운 값이 취해진다. 조건은 min의 현재값이 x보다 큰가 검사한다. 만일 그렇다면 min은 이 값으로 재조정 시킨다. 변수 max에 대해서도 유사한 동작이 수행된다. 이것을 수행하는 코드는 while의 루프의 몸체이다. 위의 while문에서 사용된 scanf("%d", &x)==1의 의미는 scanf() 함수가 정상적으로 입력이 이루어지면 1이라는 값을 반환하게 되므로 만일 입력될 데이터가 없다면 1이 반환되지 않게 되어 while문 안에 있는 식은 거짓이 된다.
위의 프로그램에서 min값은 항상 max의 값보다 작거나 같으므로 코드를 약간 개선해서 다음과 같이 작성할 수 있다.
while(scanf("%d", &x) == 1)
if(min > x)
min = x;
else if (max < x)
max = x;
두 개의 if문을 구성하는 복합문은 하나의 if-else문으로 변경되었다. 이때 else부분의 문장부분은 또 하나의 if문이다. 하나의 문장이 while루프의 제어하에 있으므로 중괄호는 더 이상 필요하지 않다. 식 min > x이 참일 때 식 max < x는 거짓이어야 하며, 조건을 검사할 필요가 없다. 다음 프로그램에서는 이러한 변경사항을 구조화하고 입력이 없는 경우에 대해서 보다 허용한도를 높여 다루었다. 이 프로그램은 실수의 파일을 처리하고 프로그램이 진행되는 과정에 중간결과의 자료를 프린트하는 것이다.
/*** 최대, 최소, 합계, 평균계산 ***/
main()
{
int i;
double x, min, max, sum, avg;
if (scanf("%lf", &x) != 1)
printf("\n입력 데이터가 없다.\n\n");
else{
printf("\n실행 데이터:\n%5s%12s%12s%12s%12s%12s\n",
"개수“, "항목”,
“최소”, “최대”, “합계”, “평균”);
mix = max = sum = avg = x;
printf("\n%5d%12.1f%12.1f%12.1f%12.3f%12.3f",
1, x, min, max, sum, avg);
for(i = 2; scanf("%lf", &x) == 1; ++i) {
if (min > x)
min = x;
else if (max < x)
max = x;
sum += x;
avg = sum / i;
printf("\n%5d%12,1f%12.1f%12.1f%12.3f%12.3f",
i, x, min, max, sum, avg);
}
printf("\n\n");
}
}
이 프로그램을 컴파일하여 파일 minmax에 실행가능코드를 기록하고
2 3 1 -44.1 0.0111e1
등의 수를 파일 data에 수록하였다고 가정해 보자. UNIX 명령어
minmax < data
이 주어진다면 실행결과는 다음과 같다.
실행 데이터:
개수 항목 최소 최대 합계 평균
1 2.0 2.0 2.0 2.000 2.000
2 3.0 2.0 3.0 5.000 2.500
3 1.0 1.0 3.0 6.000 2.000
4 -44.4 -44.4 3.0 -38.400 -9.600
5 0.1 -44.4 3.0 -38.289 -7.658
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
[C언어] C언어 선행처리기 (0) | 2009.03.17 |
---|---|
[C언어] C언어 자료의 입/출력 (0) | 2009.03.17 |
[C언어] C언어 반복문' (0) | 2009.03.17 |
[C언어] C언어 문자 입/출력 (0) | 2009.03.17 |
[C언어] C언어 함수 (0) | 2009.03.17 |