본문 바로가기

Studying/Computer Programs

C언어 프로그래밍 기초 : 조건문과 관계 연산자

여기서는 C언어 또는 C++ 프로그램의 특정 연산문을 실행하기 위한 조건을 설정하는 방법과, 이를 위해 필요한 관계 연산자 (relational operator)에 대해서 알아봅시다. 특정한 조건이 만족되면 실행되는 조건문은 복잡하고 다양한 기능을 구현하기 위해 필수적입니다.

 

반응형

 

관계 연산자는 대상이 되는 두 개의 변수에 저장된 값들을 비교하는 과정을 포함하고 있습니다. 따라서 변수와 자료형의 개념에 대해서 먼저 익숙해질 필요가 있는데요. 여기에 대한 더 자세한 내용은 다음 포스팅에 소개되어 있습니다.

 

 

C언어 프로그래밍 기초 : 변수와 자료형

여기서는 C언어로 프로그램을 작성하는데 있어서 가장 기본적인 요소들 중 하나라고 할 수 있는 변수 (variable)에 대해서 알아봅시다. 변수들의 종류를 지정하기 위한 다양한 자료형 (data type)들이

swstar.tistory.com

 

변수의 값을 지정하거나 사칙연산을 하는 등의 연산문의 개념에 대해서도 미리 알아두면 좋습니다. 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.

 

 

C언어 프로그래밍 기초 : 연산문과 사칙연산

이번 포스팅에서는 C언어 또는 C++ 프로그램에 등장하는 변수들의 값을 바꾸기 위한 연산문들에 대해 알아봅시다. 여러 개의 연산문들을 순차적으로 실행함으로써, 궁극적으로는 원하는 기능을

swstar.tistory.com

 

일반적으로 프로그래밍에서의 조건문은 특정한 조건을 만족시켰을때만 명령문들이 실행되도록 하는 구문을 이야기합니다. C언어나 C++ 프로그램에서 사용할 수 있는 조건문으로는 ifelse 구문이 있는데요. 기본적인 형식은 다음과 같습니다.

 

if ([조건]) {
    // 조건이 참일 때 실행
    [명령문1]
    [명령문2]
    ...
} else {
    // 조건이 거짓일 때 실행
    [명령문3]
    [명령문4]
    ...
}

 

if 뒤의 괄호 안에 조건이 들어갑니다. 그리고 해당 조건이 참 (true)이 될 때 실행시키고자 하는 명령문들을 중괄호 ({ })안에 순차적으로 입력해줍시다. 만약 조건이 거짓 (false)이 될 때 실행시키고자 하는 명령문들이 있다면, else 구문을 추가해서 그 뒤에 중괄호를 새로 열고 명령문들을 순차적으로 입력해주면 됩니다. 만약 조건이 거짓이 될 때 아무것도 하지 않는 경우에는 else 구문은 생략할 수 있습니다.

 

여러개의 조건들이 있는 더 복잡한 조건문을 위해서 else if 구문을 사용할 수 있습니다.

 

if ([조건1]) {
    // 조건1이 참일 때 실행
    [명령문1]
    ...
} else if ([조건2]) {
    /* 조건1이 거짓이고,
     * 조건2가 참일 때 실행 */
    [명령문2]
    ...
} else if ([조건3]) {
    /* 조건1과 2가 거짓이고,
     * 조건3이 참일 때 실행 */
    [명령문3]
    ...
} else {
    /* 조건1, 2, 3이
     * 모두 거짓일 때 실행 */
    [명령문4]
    ...
}

 

else if 뒤에도 괄호 안에 조건이 들어가는데요. 앞에 나온 조건들이 모두 거짓이고 else if 구문에 나온 조건이 참이 될 때 중괄호 안의 명령문들이 순차적으로 실행됩니다. 열거된 모든 조건들이 거짓일 때는 맨 마지막의 else 뒤의 중괄호 안에 있는 명령문들이 순차적으로 실행되죠.

 

조건을 설정하기 위한 구체적인 방법을 살펴봅시다. 이를 위해서 두 변수의 값을 비교하는 관계 연산자를 사용하게 됩니다. 두 변수의 값이 서로 같은지의 여부 등을 가려낼 수 있고 여기에 따라 참 혹은 거짓이 결정됩니다. C/C++ 프로그램에서 다음과 같은 관계 연산자들을 사용해서 조건을 설정할 수 있습니다.

 

  • a == b
    변수 ab에 저장된 값이 서로 같을때 참이 되고, 그렇지 않으면 거짓이 됩니다.
  • a != b
    == 연산자와는 반대로, 변수 ab에 저장된 값이 서로 다를 때 참이 됩니다. 값들이 서로 같으면 거짓이 되죠.
  • a < b
    변수 a에 저장된 값이 b에 저장된 것보다 작을 때 참이 됩니다. a의 값이 b와 같거나 b보다 더 크다면 거짓이 됩니다.
  • a <= b
    < 연산자와 비슷하지만, 변수 a에 저장된 값이 b와 같을 때에도 참이 됩니다. a의 값이 b보다 클 때에만 거짓이 됩니다.
  • a > b
    변수 a에 저장된 값이 b에 저장된 것보다 클 때 참이 됩니다. a의 값이 b와 같거나 b보다 작으면 거짓이 됩니다.
  • a >= b
    > 연산자와 비슷하지만, 변수 a에 저장된 값이 b와 같을 때에도 참이 됩니다. a의 값이 b보다 작을 때에만 거짓이 됩니다.

 

논리 연산자 (logical operator)들을 통해 두 개의 조건이 모두 참일때만 실행하거나, 두 개의 조건 중 하나만 참이 될 때에도 실행되는 조건문을 구성할 수 있습니다.

 

  • AND 연산자
    [조건1] && [조건2]
    첫번째 조건과 두번째 조건이 모두 참일때만 참이 되고, 그렇지 않으면 거짓이 됩니다. 예를 들어서 a == b && a != c 라는 조건이 있다면, 이는 변수 a의 값이 b와는 같고 c와는 다를때만 참이 됩니다.
  • OR 연산자
    [조건1] || [조건2]
    두 조건 중 한개 이상이 참이면 참이 됩니다. 두 조건이 모두 거짓일때만 거짓이 됩니다. 예를 들어서 a > b || a > c 라는 조건이 있다면, 변수 a의 값이 b 또는 c보다 크다면 참이 됩니다.

 

3개 이상의 조건을 논리 연산자를 통해 조합하는 경우, 괄호를 사용해서 우선순위를 정할 수 있습니다.

 

조건문의 또 다른 종류로서 switch 구문이 있습니다. 문자나 정수형 변수를 하나 지정하고, 그 값에 따라 서로 다른 명령문들을 실행하는 것인데요. 다음과 같은 형식을 가지고 있습니다.

 

switch ([변수 이름]) {
  case [변수 값1] :
    [실행문 1]
    ...
  case [변수 값2] :
    [실행문 2]
    ...
  case [변수 값3] :
    [실행문 3]
    ...
  default :
    [실행문 4]
    ...
}

 

switch 구문 바로 뒤에 관심사가 되는 변수의 이름을 괄호 안에 넣어줍니다. 그 다음에 변수의 값에 따른 시나리오들을 중괄호 안에 넣어주면 됩니다. 각각의 경우에 대해 case 다음에 변수의 값과 콜론 (:)을 입력하고, 실행문들을 순차적으로 적어줍시다. case를 사용할 수 있는 경우의 수에는 제한이 없으므로 필요한 만큼 넣어주면 됩니다. 만약 변수의 값이 그 어떤 케이스와도 일치하지 않을 때 실행하고자 하는 명령문이 있다면, default 뒤에 콜론을 붙이고 명령문들을 나열해주면 되겠습니다.

 

지금까지 알아본 내용들을 토대로, 대학교 학점을 숫자 점수로 변환하는 간단한 프로그램을 만들어볼 수 있습니다. 알파벳이 포함된 학점 표기하고 이를 숫자로 변환하는 방식은 대학교마다 다릅니다만, 제가 다녔던 학교에서는 A, B, C, D 학점 뒤에 +, - 또는 0이 붙는 방식이 사용되었습니다. A, B, C, D는 각각 4, 3, 2, 1점에 대응됩니다. 알파벳 뒤에 + 또는 -가 붙으면 0.3점만큼 올라가거나 내려가죠. 만약 알파벳 뒤에 0이 붙으면 자연수 그대로 점수가 나옵니다. 그 이외에 F학점이 있는데요. 이는 낙제를 의미하며, 수강한 것으로 인정되지 않고 0점이 주어집니다.

 

C언어 소스 코드입니다.

 

#include<stdio.h>

int main(int argc, char *argv[]) {

    char grade_str[3];

    printf("\n");
    printf("Give me a grade : ");
    /* 알파벳 학점을 문자열로 입력받아
     * grade_str에 저장 */
    scanf("%2s", grade_str);

    /* 점수로 변환된 학점을 저장하는 변수
     * 소수점을 가지고 있으므로,
     * 자료형은 float */
    float grade_num;

    /* 알파벳에 따른 switch 구문
     * grade_str의 첫번째 문자를
     * 서로 다른 알파벳들과 비교 */
    switch (grade_str[0]) {
      case 'A' :
        grade_num = 4.;
        break;
      case 'B' :
        grade_num = 3.;
        break;
      case 'C' :
        grade_num = 2.;
        break;
      case 'D' :
        grade_num = 1.;
        break;
      case 'F' :
        grade_num = 0.;
        break;
      default :
        grade_num = -1.;
    }

    printf("\n");
    if (grade_num < 0.5) {
        if (grade_num > -0.5 &&
            grade_str[1] == '\0') {
            // F학점
            printf("%c corresponds to %.1f\n",
                   grade_str[0], grade_num);
            printf("\n");
            return 0;
        } else {
            // 잘못 입력된 학점
            printf("Invalid grade\n");
            printf("\n");
            return 1;
        }
    }

    /* 알파벳 학점 다음에 오는 기호에 따른 if-else문
     * grade_str의 두번째 문자에 따라
     * 최종 점수 결정 */
    if (grade_str[1] == '+') {
        grade_num += 0.3;
    } else if (grade_str[1] == '-') {
        grade_num -= 0.3;
    } else if (grade_str[1] != '0' &&
               grade_str[1] != '\0') {
        printf("Invalid grade\n");
        printf("\n");
        return 1;
    }

    // 변환된 점수 출력
    printf("%s corresponds to %.1f\n",
           grade_str, grade_num);
    printf("\n");

    return 0;
}

 

먼저 scanf 함수를 통해 사용자로부터 입력받은 학점을 grade_str이라는 문자열에 저장합니다. 문자열의 첫번째 글자인 grade_str[0]을 알파벳 대문자 A, B, C, D, F와 비교하기 위해 switch문이 사용되었는데요. 알파벳에 따라 실수형 변수 grade_num에 서로 다른 숫자를 저장하고 있습니다. 만약 일치하는 알파벳이 없을 경우 grade_num-1이 저장되는 것을 볼 수 있고, 이렇게 되면 학점을 잘못 입력했다는 의미에서 "Invalid grade"라는 메시지가 출력되고 프로그램이 종료됩니다.

 

학점의 두번째 글자인 grade_str[1]의 값에 따라 0.3점을 더하거나 빼는 것이 ifelse문을 통해 구현되어 있는것을 볼 수 있습니다. 두번째 글자가 +이거나 -인 경우, 0.3점을 더하거나 빼게 되죠. 만약 두번째 글자가 +, -, 0 또는 문자열의 끝을 알리는 \0 중에 그 무엇과도 같지 않다면, 이것 역시 학점을 잘못 입력한 것으로 간주되어 "Invalid grade"라는 메시지를 출력합니다.

 

학점을 숫자로 변환하는데 문제가 없다면, 이를 출력하고 프로그램을 종료합니다. 코드를 컴파일하고 실행시켜보면 다음과 같은 결과들을 얻을 수 있죠.

 

screenshot of terminal console, showing the results of an example program to convert a grade to number

 


 

예제 프로그램에서 printfscanf라는 함수를 호출했는데요. 이들은 표준 입출력 라이브러리에 포함되어 있는 함수들로서, 문자열을 화면에 출력하거나 사용자로부터 값을 입력받아 변수에 저장하는데 사용할 수 있습니다. C언어나 C++ 프로그램에서 함수를 정의하거나 사용하는 방법에 대한 더 자세한 내용은 다음 포스팅에 소개되어 있습니다.

 

 

C언어 프로그래밍 기초 : 함수와 라이브러리

이번 포스팅에서는 C언어 혹은 C++를 이용해서 복잡하면서도 규모가 큰 프로그램을 작성하는데 필수적인 요소인 함수 (function)와 라이브러리 (library)에 대해서 알아봅시다. 함수를 정의하고 호출

swstar.tistory.com

 

조건문과 관계 연산자를 사용하면 특정 구문을 반복적으로 실행하는 프로그램도 만들 수 있습니다. 반복문을 위해서 for이나 while문 등을 사용할 수 있으며, 다음 포스팅에 더 자세한 내용이 소개되어 있습니다.

 

 

C언어 프로그래밍 기초 : 반복문 (for, while)

여기서는 C언어나 C++ 프로그램을 작성할 때 특정한 구문들을 반복해서 실행하는 반복문 (loop)에 대해서 알아봅시다. 반복문의 종류와 더불어 반복을 위한 조건을 설정하는 방법에 대해서도 살펴

swstar.tistory.com

 


 

C언어나 C++ 소스 코드를 가지고 실행이 가능한 프로그램을 만드는 과정은 다음 포스팅에 더 자세하게 소개되어 있습니다.

 

 

C/C++ 코드가 프로그램이 되는 과정

여기서는 C언어 또는 C++로 작성된 소스 파일, 헤더 파일의 개념과 이들을 빌드하여 하나의 프로그램을 만드는 과정에 대해 간략하게 짚어보겠습니다. 여러 개의 소스, 헤더 파일들로 이루어진

swstar.tistory.com