본문 바로가기
  • Welcome.
:: C_ 🚩/기초

[C언어] #03 -if, else if, else/ switch, case, break, default-

by EunBird 2021. 2. 14.

Keyword

 

제어문 -->  - 1. 조건문

                - 2. 반복문

 

if

else if

else

 

switch

case

default

 

return


제어문 조건문 반복문으로 표현할 수 있다.

조건문과 반복문을 사용하는 경우는 서로 차이가 존재한다.

 

조건문: 분기점 / 양자택일

반복문: N회, x번, 조건을 만족할때까지 계속, 영원히
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

먼저, 조건문에 대해 알아보겠다. 

조건문에서는 if  switch를 사용하는데,

if 에 대해서 먼저 알아보자. 

 

ㅡㅡㅡㅡㅡ

if (1 혹은 0) {

  1이면 수행할 문장;

}

else if (1 혹은 0) {

  1이면 수행할 문장;

}

else {

  위의 조건이 모두 0이라면 수행할 문장;

}
 ㅡㅡㅡㅡㅡ

기본적으론 이런 꼴 이다.

 

즉, ( ) 안에는 조건문이 들어가고,

그것이 참(1) 이라면 

{ }블록구간 수행되며

거짓(0) 이라면 { }블록구간 수행되지 않고 

다음 단계인 else if  else 로 넘어간다. 

 

**C언어에서는 참과 거짓은 1 과 0 으로 표현된다.**

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

다음 예시를 통해 알아보겠다.

ㅡㅡㅡㅡㅡ

int num;   //num라는 정수공간 생성.
printf("정수입력: ");   
scanf("%d", &num);   //입력한 수를 num에 저장.

if (num % 6 == 0) { 

           //num를 6으로 나눈 나머지가 0이라면, 참(1)이므로 { }블록구간 수행, 

           //나머지가 0이 아니라면, 거짓(0)이므로 { }블록구간 수행하지않고 else if 로 이동.
printf("6의 배수\n");
}
else if (num % 2) {   

           //num를 2로 나눈 나머지가 1이면 참으로 인식되어 {}블록구간을 수행.

           //나머지가 0이면 거짓으로 인식되어 {}블록구간을 수행하지 않고 else로 이동.
printf("홀수\n");
}
else {   

           // 6으로 나누었을 때 나머지가 0이 아니고 2로 나누었을 때는 나머지가 0이므로 "짝수"이다.

           // --> "짝수를 출력하게 한다." 
printf("짝수\n");
}

ㅡㅡㅡㅡㅡ

12를 입력한 경우

 

11을 입력한 경우

4를 입력한 경우

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번엔 거꾸로 

ㅡㅡㅡㅡㅡ

정수 2개 입력 : 1 10
10이 1보다 더 큽니다.

정수 2개 입력 : 10 1
10이 1보다 더 큽니다.

정수 2개 입력 : 10 10
두수는 같습니다.

ㅡㅡㅡㅡㅡㅡ

라고 출력할 수 있는 문장을 만들어 보자.

 

두수를 a와 b 라고 한다면, 

1. a가 더 큰 경우

2  b가 더 큰 경우

3. a = b

이렇게 3가지 경우가 존재 한다.

 

따라서 if, else if, else 를 사용하여 만들어 보겠다.

ㅡㅡㅡㅡㅡ

int a, b;   // 정수공간 a와 b생성.
printf("정수2개입력: ");
scanf("%d%d", &a, &b);   //입력한 두개의 정수를 각각 a와 b에 저장.

if (a > b) {   

/* a가 b보다 크면 1이 출력되어서 {}블록구간이 수행되고,

그렇지않다면 0이 출력되어 {}블록구간이 수행되지 않고,  else if 로 넘어간다. */
printf("%d이 %d보다 더 큽니다.\n", a, b);
}
else if (a < b) {   

/* a가 b보다 작다면 1이 출력되어 {}블록구간이 수행되고, 

그렇지않다면 a와 b가 같은 경우 뿐이므로 

else로 넘어가 "두수는 같습니다."라고 출력된다.

*/
printf("%d이 %d보다 더 큽니다.\n", b, a);
}
else {
printf("두수는 같습니다.\n");

}

ㅡㅡㅡㅡㅡ

10 20 을 입력한 경우

20 10 을 입력한 경우

10 10 을 입력한 경우

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번엔 시험성적을 입력하면

그 점수에 따라

어떤 학점인지 알려주는 시스템을 만들어 보겠다.

기준:

0~60점: C학점

61~80점: B학점

81~100점: A학점

나머지: F학점, "잘못된 입력입니다." 가 출력되도록 한다. 

ㅡㅡㅡㅡㅡ

int score;   //score 이라는 정수공간 생성.
printf("시험성적: ");
scanf("%d", &score);   //입력한 정수를 score에 저장.
char grade='F'; // grade라는 문자공간 생성 후 F를 저장. 이를 '초기화' 라고 한다.


if (score < 0 || 100 < score) {   

 

/*score이 0보다 작거나 100보다 크면 {}블록구간 수행.

그렇지 않다면 {}블록구간을 수행하지 않고_ else if 로 이동*/
printf("잘못된입력입니다.\n");
}
else if (score <= 60) {   

 

/*score이 60이하라면 {}블록구간 수행. 

그렇지 않다면 {} 블록구간 수행하지 않고_ 다음 else if로 이동*/

grade = 'C';
}
else if (score <= 80) {

 

/*80이하 라면 {}블록구간 수행,

그렇지않다면 {}블록구간 수행하지 않은 채_ 다음 else 로 이동*/

grade = 'B';
}
else {   // 남은 조건은 81점에서 100점인 경우 뿐이므로 "A" 출력.
grade = 'A';
}

printf("%c학점입니다.\n", grade);  //학점 출력

ㅡㅡㅡㅡㅡ

-10 입력

50입력

70입력

90입력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

그런데, 위의 경우와 다르게 표현할 수 도 있다.

ㅡㅡㅡㅡㅡ

int score;   
printf("시험성적: ");
scanf("%d", &score);
char grade='F'

//여기까진 위와 동일하다.

 

if (0 <= score && score <= 60) {   //조건: 0이상 이고 60이하인 경우.
printf("C학점입니다.\n");
}
else if (61 <= score && score <= 80) {   //조건: 61이상 이고 80이하인 경우
printf("B학점입니다.\n");
}
else if (81<=score && score<=100) {   //조건: 81 이상 이고 100이하인 경우
printf("A학점입니다.\n");
}
else  // 유효성 검사 (그 밖의 경우)
printf("잘못된입력입니다.\n");
}

ㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번엔 나이를 입력하면

나이에 따라 달라지는 버스요금을 알려주는 시스템을 만들어 보겠다.

ㅡㅡㅡㅡㅡ

int age;   //age라는 정수 공간  생성.
printf("나이입력: ");
scanf("%d", &age);   //입력한 숫자를 age에 저장.

 

int price = 0;   // price라는 정수공간 생성 후 0 저장. (초기화, 유효성 검사)
if (8 < age && age < 20) {   //조건문: price가 8초과 이고 20미만 인가? 
price = 800;
}
else if (19 < age && age < 65) {   //조건문: price가 19초과 이고 65미만 인가?
price = 1300;
}
printf("버스요금: %d원입니다.\n",price);  //버스요금 출력.

 

ㅡㅡㅡㅡㅡ

15입력

45입력

90입력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

제어문의 특성 중 한가지에 대해 얘기해보겠다.

 

"제어문은 중첩이 가능하다."

 

무슨 말일까??

 

다음 예시를 통해 알아보겠다.

 

다음은 세개의 정수를 입력했을 때 

가장 큰 정수를 알려주는 시스템이다.

ㅡㅡㅡㅡㅡ

int a, b, c;
printf("정수3개입력: ");
scanf("%d%d%d", &a, &b, &c);

printf("가장큰 정수는 ");

 

if (a > b && a > c) {
printf("%d\n", a);
}
else if (b > a && b > c) {
printf("%d\n", b);
}
else {
printf("%d\n", c);

ㅡㅡㅡㅡㅡ

위 시스템으로도 충분히 제대로 출력할 수 있다.

그러나 위 시스템에서는 중첩이 없다.

이번엔 중첩을 활용하여 시스템을 작성해보겠다.

 

ㅡㅡㅡㅡㅡ

int a, b, c;
printf("정수3개입력: ");
scanf("%d%d%d", &a, &b, &c);

//여기까진 같다.

if (a > b) {
         if (a > c) {
              printf("%d\n", a);
      }  
        else {
              printf("%d\n", c);
      }
}

 

else {
        if (b > c) {
              printf("%d\n", b);
       }  
        else {
              printf("%d\n", c);
}

ㅡㅡㅡㅡㅡ

즉, if else문이 각각 if 와 else에 각각 하나씩 들어있는 것이다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번엔 덧셈 뺄셈을 계산해주는 계산기를 

만들어 보겠다.

 

다시말해, 사용자가 2개의 숫자와 +와 - 중 하나를 입력하면 

계산 결과를 출력해주는 것이다.

ㅡㅡㅡㅡㅡ

int num1, num2;  //정수 공간 생성.
char op;    //문자 공간 생성.
printf("정수 2개 입력: ");
scanf("%d%d", &num1, &num2);   //입력한 숫자 저장.
printf("연산자 입력: ");
scanf(" %c", &op);   //입력한 문자 저장

if (op == '+') {   

//조건문: op에 저장된 기호가 '+' 인가?
printf("%d\n", num1 + num2);
}
else if (op == '-') {   

//조건문: op에 저장된 기호가 '-'인가?

printf("%d\n", num1 - num2);
}
else {   

//'+' , '-' 이외의 문자나 기호가 입력된 경우.
printf("해당하는 연산자가 없습니다!\n");
}

ㅡㅡㅡㅡㅡ

5, 10, + 입력

5, 10, - 입력

5, 10, = 입력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번엔 R, r, Y, y, G, g (색깔)에 따라 달라지는 신호등의 문구를 표현해 보겠다.

ㅡㅡㅡㅡㅡ

char color;   //color라는 문자공간 생성.
printf("색입력: ");
scanf(" %c", &color);   //입력하는 문자를 color에 저장.

if (color == 'R' || color=='r') {   

//조건문: color가 'R' 이거나 'r' 인가?
printf("정지!\n");
}
else if(color == 'Y' || color == 'y') {

//조건문: color가 'Y' 이거나 'y' 인가?
printf("주의!\n");
}
else if (color == 'G' || color=='g') {

//조건문: color가 'G' 이거나 'G' 인가?
printf("진행!\n");
}
else {    //그 이외의 문자인 경우.
printf("해당액션은 없습니다.\n");
}

ㅡㅡㅡㅡㅡ

r 입력

y 입력

g 입력

a 입력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

switch

지금부턴 switch문에 대해 알아보겠다.

 

if문은 조건문의 참(1), 거짓(0)  수행여부가 달라졌다면,

switch문은 문자 그 자체에 따라 수행여부가 달라진다.

 

다음예시를 통해 알아보자.

다음 시스템은 숫자를 한글로 번역하는 시스템이다.

ㅡㅡㅡㅡㅡ

int num;   
printf("정수입력: ");
scanf("%d", &num);

switch (num) {  // --> (변수,값)
     case 1:
          printf("하나\n");
          break  //break을 만나면 해당 블록구간을 빠져나간다.
     case 2:
          printf("둘\n");
          break;
     case 3:
          printf("셋\n");
          break;
     default:    // else와 유사 (유효성 검사, 초기화) -->1, 2, 3 중 하나에도 해당되지 않는 경우.
          printf("해당없음\n");

}

ㅡㅡㅡㅡㅡ

1 입력

2 입력

3 입력

13 입력

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

앞서 만들었던 짝수, 홀수 판별 시스템도 switch문을 이용해서 만들 수 있다.

쉽게 이해할 수  있을 것이다.

ㅡㅡㅡㅡㅡ

int num;
printf("정수입력: ");
scanf("%d", &num);
switch (num%2) {
  case 0:
     printf("짝수\n");
     break;
  case 1:
     printf("홀수\n");
     break;

ㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이것도 앞서 만든 덧셈, 뺄셈 계산기 시스템을 switch문을 이용해서 만든 것이다.

 

int num1 = 10, num2 = 5;
char op;
printf("연산자입력: ");
scanf(" %c", &op);
switch (op) {
case '+':
printf("%d\n", num1 + num2);
break;
case '-':
printf("%d\n", num1 - num2);
break;
default:
printf("해당연산자없음\n");

ㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

다음 시스템도 앞서 만든 신호등시스템을 switch문을 사용하여 다시 만든 것이다.

ㅡㅡㅡㅡㅡㅡ

char color;
printf("신호등입력: ");
scanf(" %c", &color);
switch (color) {
case 'R':
case 'r':
printf("정지!\n");
break;
case 'Y':
case 'y':
printf("주의!\n");
break;
case 'G':
case 'g':
printf("진행!\n");
break;
default:
printf("색없음\n");

ㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

=================================================

이번엔 시간과 분을 입력하면,

그 시간의 1시간 20분 전을 출력해주는 시스템을 만들어보겠다.

단, 오전과 오후를 구분하지 않으며, 

예를 들어) 1시 10분을 입력한 경우에는 11시 50분이 출력되어야 한다.

ㅡㅡㅡㅡㅡㅡ

#include<stdio.h>
void main() {

/*경우의 수:  먼저 간단히 정리해보자.
시 ==1 and 분==20~60  -->시:12시   분: 분-20
  시 !=1 and 분==20~60  -->시:시-1   분: 분-20
시 ==1 and 분==0~19   -->시:12시   분: 60+분-20 = 분+40
시 !=1 and 분==0~19   -->시:시-1   분: 분+40
*/


int si;    //si라는 정수공간 생성.
printf("시간:");
scanf("%d", &si);   //입력하는 수를 si에 저장.

int boon;   //boon이라는 정수공간 생성. 
printf("분:");    
scanf("%d", &boon);   //입력하는 수를 boon에 저장. 

if (si == 1) {    //조건문: si가 1 인가?
     if (boon >= 20 && boon <= 60) { //조건문: boon이 20이상 이고 60이하인가?
          boon -= 20;    //boon에서 20을 빼고 저장.
          si = 12;    //si가 1이므로 1뺀값을 12로 저장. (이 {}블록구간은 si가 1이고 boon은 20~60인 경우에 수행한다.)
     }
     else {    // 이 {}블록구간은 si는 1이지만 boon은 0~19인 경우에 수행한다.
          boon += 40;    //'분' 만 생각하면 [1시 0~19분]에서 1시간 20분을 빼면 '분'에는 +40을 해줘야 한다. 
          si = 11;    //'시' 만 생각하면 [1시 0~19분]은 1시간 20분을 빼면 '시' 는 무조건 11시가 된다.
     }
}
else if (si>=2 && si<=12 ) {   //조건문: si가 2이상 이고 12이하인가?
     if (boon >= 20 && boon <= 60) {  //조건문: boon이 20이상이고 60이하 인가?
          boon -= 20;  //boon에서 20분을 뺌.
          si -= 1;    //si에서 1시간을 뺌.   (이 {}블록구간은 si가 2~12이고 boon이 20~60인 경우 수행한다.)
     }
     else {   //이 {}블록구간은 si가2~12이고 boon이 0~19인 경우에 수행한다.
          boon += 40;   //'분'이 0~19인 경우는 1시간 20분을 빼면 '분'은 +40분을 해야한다.
          si -= 2;    //[2~12시 0~19분]에서 1시간 20분을 빼면 '시'에는 -2시간을 해야한다.
     }
}
printf("1시간 20분 전은 %d시 %d분 입니다.", si, boon);  //1시간 20분 뺀 시간대 출력.

}

ㅡㅡㅡㅡㅡ

다음과 같이 제대로 출력됨을 알 수 있다.

1시 10분 입력

1시 40분 입력

4시 10분 입력

4시 40분 입력


728x90

댓글