C// 조건에 따른 흐름의 분기
흐름의 분기가 필요한 이유!
사칙연산이 가능한 계산기 프로그램을 구현한다고 가정해보자. 물론 이 프로그램은 사칙연산이 모두 가능해야 한다.
단 선택적 실행이 가능해야 한다. 예를 들어서 이 프로그램을 사용하는 사람은 자신의 필요에 따라서 덧셈 혹은 곱셈을 선택적으로 실행할 수 있어야 한다.
if문
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include<stdio.h> int main() { int n1=5,n2=3; if(n1>n2) { printf("n1이 n2보다 큽니다.\n"); printf("%d > %d \n",n1,n2); } return 0; } |
n1이 n2보다 큽니다.
5 > 3
위의 문장에서 n1이 n2보다 큰 경우에만 if문의 중괄호에 삽입된 두 개의 printf함수 호출문이 실행된다.
ex)
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 | #include<stdio.h> int main() { int num=0; printf("정수입력:"); scanf("%d",&num); if(num <0) // num이 0보다 작으면 실행 { printf("입력한 값은 0보다 작다.\n"); } if(num >0) // num이 0보다 크면 실행 { printf("입력한 값은 0보다 크다.\n"); } if(num==0) // num이 0이면 실행 { printf("입력한 값은 0과 같다.\n"); } return 0; } |
3을 입력하면 14행의 if문이 실행, -3을 입력하면 9행의 if문이 실행, 0을 입력하면 19행의 if문이 실행된다.
if~else
ex)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<stdio.h> int main() { int num1=2 , num2 = 3; if(num1>num2) // num1>num2 가 참이면 if블록을 실행 { printf("num1이 num2보다 큽니다.\n"); printf("%d > %d \n",num1,num2); } else // num1>num2이 거짓이면 else블록을 실행 { printf("num1이 num2보다 크지 않습니다.\n"); printf("%d <= %d \n",num1,num2); } return 0; } |
if절의 조건이 참이면 if블록을 실행하고, 거짓이면 else블록을 실행하게 된다.
if~ else if ~ else 문
if else문의 경우 두개의 블록 중 하나를 선택해서 실행하는 구조였는데, 이번 if~else if ~ else문은 셋 이상의 블록 중 하나를 선택해서 실행하는 구조이다.
if(조건1)
{
//조건 1 만족 시 실행
}
else if(조건2)
{
//조건 2 만족 시 실행
}
else if(조건3)
{
//조건 3 만족 시 실행
}
else
{
//모두 불만족 시 실행
}
else if는 무한대로 추가할 수 있다. 또 중요한 점은 하나라도 조건이 만족되어 해당 블록을 실행하고 나면, 마지막에 있는 else까지도 그냥 건너 뛴다는 점이다. 예를들어 조건1이 거짓이고 조건2가 참이다. 그럼 조건 2의 블록을 실행한 후에 else다음으로 건너 뛰게 되는 것이다.
조건 연산자 : 피 연산자가 세 개인 '삼 항 연산자'
if ~ else문을 일부 대체할 수 있는 조건 연산자
(n1 > n2) ? (n1) : (n2)
위 문장에서 앞에 (n1 > n2) 이것이 조건이다.
이것이 참이라면 뒤에 맨처음 나오는 (n1)이 반환되고, 거짓이면 나중에 나오는 (n2)가 반환된다.
ex)절댓값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include<stdio.h> int main() { int n1,abs; printf("정수 입력:"); scanf("%d",&n1); abs = n1>0 ? n1 : n1*(-1); printf("절댓값:%d\n",abs); return 0; } |
정수 입력:-43
절댓값:43
10행의 n1이 0보다 크다면(참이라면), n1이 반환되어 출력 될 것이고, 그게 아니라면 n1*(-1)이 반환되어 출력 될 것이다.
continue와 break!
break는 반복을 빠져나갈 때, 사용하는 키워드이다. 가장 가까이 감싸고 있는 반복문 하나를 빠져나간다.
ex)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include<stdio.h> int main() { int sum=0, num=0; while(1) { sum += num; if(sum>5000) break; // 반복 탈출! num++; } printf("%d\n",sum); printf("%d\n",num); return 0; } |
출력결과
5050
100
while문이 돌다가 sum이 5000이 넘는 순간 break문이 실행되었다. 여기서 break문이 if문과 함께 쓰였다고 해서 if문을 빠져 나오는 것으로 오해하면 안된다.
break문은 자신을 감싸는 가장 가까운 위치의 반복문 하나를 빠져나가게 되는데 사용된다.
continue
반복문 안에서 사용하고, continue 문장을 실행하게 되면, 실행중인 위치에 상관없이 반복문의 조건검사 위치로 이동을 한다.
ex)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> int main() { int n1; printf("start"); for(n1=1;n1<20;n1++) { if(n1 % 2 == 0 || n1 % 3 == 0) continue; printf("%d ",n1); } printf("end\n"); return 0; } |
start 1 5 7 11 13 17 19 end
위의 예제는 1이상 20미만의 정수를 출력하되, 2와 3의 배수를 출력에서 제외시키는 프로그램이다. n1이 2,3의 배수일 때, continue를 만나, 반복문의 처음으로 돌아가게 된다.
switch문
ex)
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 | #include<stdio.h> int main() { int n1; printf("1이상 5이하의 정수 입력:"); scanf("%d",&n1); switch(n1) { case 1 : printf("1은 ONE\n"); break; case 2 : printf("2는 TWO\n"); break; case 3 : printf("3은 THREE\n"); break; case 4 : printf("4는 FOUR\n"); break; case 5 : printf("5는 FIVE\n"); break; default: printf("I don't know\n"); } return 0; } |
사용자로부터 1이상 5이하의 정수를 입력받으면 switch문 안에 있는 case에 맞는 코드블록이 실행이 된다.
다시 말해, switch(n1) 에서 n1에 저장된 값에 따라서 실행할 영역이 결정이 된다. n1이 1이면 case1 n1이 2이면 case2가 실행이 된다.
중간에 있는 break문이 없다고 가정하고, n1에 4가 저장되었다. 그럼 case 4의 코드블록 이후의 코드블록들이 모두가 실행이 된다. case 5, default까지 말이다. 물론 break문이 없다고 하였을 때! 이것이 switch문의 기본 동작방식이다.
ex)
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 | #include<stdio.h> int main() { char sel; printf("M 오전, A 오후, E 저녁\n"); printf("입력:"); scanf("%c",&sel); switch(sel) { case 'M': case 'm': printf("Morning\n"); break; case 'A': case 'a': printf("Afternoon\n"); break; case 'E': case 'e': printf("Evening\n"); break; } return 0; } |
출력결과
M 오전, A 오후, E 저녁
입력:M
Morning
대문자 M을 입력하면 break가 없기 때문에 그 밑의 코드문인 소문자 m까지 이어서 출력을 하게 된다. 이것이 switch 문의 동작방식의 유용한 경우이다.