4-4-다.switch 실습

다음 예제는 두 수, 10과 5의 가감승제 4가지 연산을 하되 사용자에게 연산의 종류를 선택하도록 한다. +, -, *, / 네 가지 문자 중 하나를 입력하면 이 문자에 따라 다중 분기하여 입력된 연산의 수행 결과를 출력한다. 연산대상인 10과 5도 물론 사용자에게 입력받아 사용할 수 있다.

 

: switchcalc

#include <Turboc.h>

 

void main()

{

     char op;

     int a=10, b=5;

    

     printf("10과 5의 연산을 선택하십시오(+-*/) : ");

     scanf("%c",&op);

 

     switch (op) {

     case '+':

          printf("10 %c 5 = %d\n",op,a+b);

          break;

     case '-':

          printf("10 %c 5 = %d\n",op,a-b);

          break;

     case '*':

          printf("10 %c 5 = %d\n",op,a*b);

          break;

     case '/':

          printf("10 %c 5 = %d\n",op,a/b);

          break;

     default:

          printf("+-*/ 중 하나를 선택해 주십시오.\n");

          break;

     }

}

 

연산의 종류는 문자형의 op로 입력받았는데 문자형은 1바이트의 정수형과 같으므로 switch문에 사용할 수 있다. 이때 case문에는 입력된 문자의 코드값을 직접 쓰거나 아니면 홑따옴표를 사용하여 문자 상수를 적어야 한다. '+'가 입력되었으면 a와 b의 합을 출력하고 '*'가 입력되었으면 두 수의 곱을 출력했다. 만약 허용된 4가지 연산 + - * /가 아닌 엉뚱한 문자, 예를 들어 %나 ^같은 문자가 입력되었다면 default에서 에러 메시지를 출력하도록 했다.

다음은 switch문으로 점수에 따른 평가를 내려 보도록 하자. 100점 만점의 점수로부터 수우미양가를 판별하여 그 결과를 출력하고자 한다. 이 문제는 점수의 범위를 다루어야 하기 때문에 switch문으로 처리할 수 없는 것처럼 보인다. 90~100점 사이의 점수를 수, 80~89까지를 우로 평가해야 하는데 switch문은 정수 상수로 다중 분기를 할 수 있을 뿐 범위로는 분기를 할 수 없기 때문이다.

그러나 문제를 잘 관찰해 보면 범위를 값으로 단순화할 수 있는 방법이 있다. 각 평가는 10점 단위로 구분되기 때문에 점수를 10으로 나누면 10자리의 점수만 구할 수 있고 이 값을 기준으로 수우미양가를 매기면 된다. 결과는 다음과 같다.

 

: switchscore

#include <Turboc.h>

 

void main()

{

     int Score;

 

     printf("성적을 입력하시오 : ");

     scanf("%d",&Score);

 

     switch (Score/10) {

     case 10:

     case 9:

          printf("수입니다.\n");

          break;

     case 8:

          printf("우입니다.\n");

          break;

     case 7:

          printf("미입니다.\n");

          break;

     case 6:

          printf("양입니다.\n");

          break;

     default:

          printf("가입니다.\n");

          break;

     }

}

 

입력받은 점수 Score를 10으로 나눈 값으로 다중 분기하면 80~89사이는 8이 되므로 우로 평가되고 70~79사이는 미로 평가될 것이다. 단, 한가지 예외 처리가 필요한데 다른 평가와는 달리 수는 90~99사이가 아니라 90~100사이이므로 100점인 경우는 특별히 수에 포함시켜야 한다. 그래서 case 10다음에 break문을 두지 않고 case 9와 같이 처리하도록 했다.

이 예제는 점수간의 간격이 일정하다는 점을 이용하여 switch문으로 범위를 다루었다. 만약 각 평가의 범위가 불규칙적이라면 예를 들어 수는 92~100사이, 우는 85~91사이, 미는 71~84사이 이런 식이라면 switch문을 사용할 수 없다. 이럴 때는 범위를 다룰 수 있는 if else문을 사용해야 한다. switch는 형식이 일정하고 case를 추가하기 쉽다는 장점이 있지만 범위를 다룰 수 없고 실수값도 평가할 수 없기 때문에 if else문보다는 융통성이 떨어진다.