본문 바로가기
c언어

c언어 여러 가지 연산자를 이용하여 코딩 실력 늘리기(거스름돈 계산하기, 윤년 판단하기, 10진수를 2진수로 출력하기, xor을 이용하여 암호화 하기, 화씨온도를 섭씨온도로 계산하기)

by 개발자 L 2022. 12. 2.
반응형

c언어 여러 가지 연산자를 이용하여 코딩 실력 늘리기(거스름돈 계산하기, 윤년 판단하기, 10진수를 2진수로 출력하기, xor을 이용하여 암호화 하기, 화씨온도를 섭씨온도로 계산하기)

네 안녕하세요, 이번 포스팅에서는 여러가지 연산자들을 이용하여 여러 가지 문제들을 풀어보면서 코딩 실력을 향상하는 시간을 가져보려 합니다.

지금까지 배웠던 여러가지 연산자들에 대한 포스팅을 한 번 읽어보시고 하시면 더 잘 푸실 수 있으리라 생각이 됩니다.

그럼 지금부터 시작하도록 하겠습니다.

 

1. 거스름돈 계산하기(산술 연산자)

제일 첫 문제는 거스름돈을 계산해주는 프로그램을 만들 것입니다.

사용하는 연산자는 기본적인 산술 연산자를 씁니다.

그리고 우리가 여기서 사용을 해야 하는 변수의 이름은 물건의 값, 사람이 낸 돈, 거스름돈,

그리고 거스름돈으로 반환되는 여러 가지 지폐들과 동전의 개수를 나타낼 때 쓸 변수명이 필요합니다.

그럼 그것들을 이용하여 한 번 만들어보겠습니다.

#include <stdio.h>

int main()

{
    int customer, change = 0;
    int price, chg5000, chg1000, chg500, chg100;

    printf("물건 값을 입력하세요 : ");
    scanf("%d", &price);

    printf("소비자가 낸 돈 : ");
    scanf("%d", &customer);

    change = customer - price;

    chg5000 = change / 5000;
    change = change % 5000;

    chg1000 = change / 1000;
    change = change % 1000;

    chg500 = change / 500;
    change = change % 500;

    chg100 = change / 100;
    change = change % 100;

    printf("오천원권 : %d장\n", chg5000);
    printf("일천원권 : %d장\n", chg1000);
    printf("오백원권 : %d장\n", chg500);
    printf("일백원권 : %d장\n", chg100);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

우리가 받을 지폐와 동전의 수를 계산할 때는 먼저 받는 지폐와 동전의 개수를 정해야 하기 때문에

먼저 각각의 동전과 지폐가 나타내는 값만큼 거스름돈을 나눠주고,

그 후에 거스름돈을 받을 때는 거스름돈을 해당 값으로 나눈 나머지를 출력을 해야 정상적인 결과가 나옵니다.

그럼 결과 화면을 같이 보도록 하겠습니다.

물건 값을 입력하세요 : 10000
소비자가 낸 돈 : 15000
오천원권 : 1장
일천원권 : 0장
오백원권 : 0장
일백원권 : 0장

이렇게 결과가 잘 나온 것을 볼 수가 있습니다.

 

2. 윤년 판단하기(논리 연산자)

이번에는 윤년을 판단하는 프로그램을 만들어보도록 하겠습니다.

사실 이 문제는 다음에 배우게 될 조건문인 if문을 쓰면 정말 깔끔하게 나타낼 수 있는데,

현재 이걸 보고 계신 여러분들은 아직 if문에 대하여 배우지 않으셨다는 가정 하에 if문을 쓰지 않고 나타내는 방법으로 문제를 같이 풀어보도록 하겠습니다.

일단 우리가 윤년이 있는 날을 보게 되면 정확히 365일로 떨어지지 않습니다.

그래서 태음력에는 큰 달과 작은 달이 존재하며,

태양력에서는 4년마다 한 번씩 2월 29일이 존재합니다.

그래서 이를 판단하기 위해서는 논리 연산자를 쓰고, 그 조건에 맞아서 값이 떨어지면 평년, 값이 떨어지지 않으면 윤년이 나오는 프로그램을 한 번 짜 보도록 할 겁니다.

그리고 윤년이 나오는 조건은 이렇습니다.

  • 연도가 4로 나누어 떨어진다.
  • 100으로 나누어 떨어지는 연도는 제외시킨다.
  • 400으로 나누어 떨어지는 연도는 4의 배수이므로 윤년에 해당한다.

이렇습니다.

그래서 이를 하나의 논리식으로 표현을 하여 계산을 할 것입니다.

그럼 지금부터 작성을 해보겠습니다.

#include <stdio.h>

int main()

{
    int year, result;

    printf("연도를 입력하세요 : ");
    scanf("%d", &year);

    result = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);

    printf("result = %d\n", result);

    return 0;
}

이렇게 한 번 작성을 해봤고, 조건이 3가지여서 두 가지로 묶어서 이러한 논리식을 만들었습니다.

연도가 4로 나누어 떨어지지만 100으로는 나누어 떨어지지 않는 연도 또는 400으로 나누어 떨어지는 연도 

그래서 and 연산자와 or 연산자를 써서 연결을 해줬습니다.

그리고 나누어 떨어지는 지에 대한 여부에 따라서 나누어 떨어지면 ==, 나누어 떨어지지 않는다면 !=를 썼습니다.

그럼 결과 화면을 같이 봅시다.

먼저 윤년의 경우입니다.

연도를 입력하세요 : 2012
result = 1

2012년은 윤년입니다.

그래서 결과값이 1이 나왔습니다.

다음은 평년의 경우입니다.

연도를 입력하세요 : 2011
result = 0

2011년은 평년입니다.

그래서 결과값은 0이 나왔습니다.

이런 식으로 if문을 쓰지 않고도 판별을 할 수가 있습니다.

반응형

 

3. 10진수를 2진수로 출력하기(비트 연산자, 삼항 연산자)

10진수를 2진수로 출력을 할 때는 비트 연산자를 씁니다.

그 이유는 10진수는 사람들이 쓰는 자연어이고,

2진수는 컴퓨터가 쓰는 디지털 언어이기 때문입니다.

그래서 자연어를 비트 단위의 디지털 언어로 변환을 시켜서 출력을 해줘야 합니다.

그리고 이 역시도 for문과 while문이라는 반복문을 이용하여 쓸 수 있지만,

아직 그걸 배우지 않았다는 설정 하에 작성을 해보도록 하겠습니다.

그래서 비트 연산자와 추가로 삼항 연산자를 여러 번 써서 나타낼 것입니다.

그럼 바로 보여드리도록 하겠습니다.

#include <stdio.h>

int main()

{
    unsigned int num;

    printf("10진수를 입력하세요 : ");
    scanf("%d", &num);

    unsigned int mask = 1 << 7; // mask = 10000000
    printf("2진수로 변환 : ");

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    mask = mask >> 1;

    ((num & mask) == 0) ? printf("0") : printf("1");
    printf("\n");

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

우리가 2진수를 보통 입력을 할 때는 8자리의 숫자 내에서 입력을 합니다.

그래서 mask라는 것을 씁니다.

이는 ip주소를 사용할 때도 마스킹이라는 것을 하는데,

그때도 사용이 되는 겁니다.

그래서 이 mask와 연산을 해주고,

변환이 되는 과정에서 자리를 계속 조정해줘야 해서 비트 이동 연산자를 넣어줬고,

모든 것은 한 번에 다 이루어져야 해서 and 연산을 시켰습니다.

그럼 결과 화면을 한 번 보도록 하겠습니다.

10진수를 입력하세요 : 30
2진수로 변환 : 00011110

이렇게 잘 나왔음을 볼 수가 있습니다.

 

4. xor을 이용하여 암호화 하기(비트 연산자)

그리고 비트 연산자를 이용하여 암호화와 복호화도 가능합니다.

암호화를 하는 방법에는 정말 많은 방법이 있지만, 그중에 하나가 바로 비트 연산자인 xor 연산자를 이용하여 만드는 방법입니다.

그리고 xor 암호화의 큰 특징은 암호화를 하게되면 수가 반전이 된다는 것이고,

복호화를 할 때는 수가 원래대로 돌아온다는 것입니다.

그래서 암호화되어 나온 수를 알거나 암호화가 되기 전의 수 중 하나를 안다면 암호화를 풀어낼 수 있지만,

그러는 것이 쉽지가 않기 때문에 알아내기가 힘듭니다.

그럼 이어서 한 번 코드를 작성해보도록 하겠습니다.

#include <stdio.h>

int main()

{
    char data = 'a';
    char key = 0xff;
    char encrypted_data;

    encrypted_data = data ^ key;

    printf("암호화된 문자 = %c\n", encrypted_data);

    char original_data;

    original_data = encrypted_data ^ key;
    
    printf("원래의 데이터 = %c\n", original_data);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

그러면 결과는 어떻게 나오는지 한 번 보도록 하겠습니다.

암호화된 문자 = 
원래의 데이터 = a

이렇게 암호화가 된 문자는 공개를 하지 않는 모습을 볼 수가 있습니다.

이 말은 다시 말하면 암호화에 성공을 했다는 의미이기도 합니다.

그래서 그냥 봐서는 암호를 절대 알아내기가 힘듭니다.

 

5. 화씨 온도를 섭씨온도로 바꾸기(산술 연산자)

다음으로 화씨 온도를 섭씨온도로 변환을 시켜주는 프로그램을 작성을 해보도록 하겠습니다.

여기에서 필요한 것은 섭씨 온도를 선언할 때 쓸 변수명, 화씨온도를 선언할 때 쓸 변수명,

그리고 화씨 온도를 섭씨온도로 바꾸어주는 변환식을 알아야 합니다.

그리고 화씨 온도와 섭씨온도의 관계식은 이렇습니다.

섭씨온도 = 5 / 9 * (화씨온도 - 32)

이렇게 준비를 하면 모든 것은 끝이 납니다.

그럼 한 번 코드를 작성을 해보겠습니다.

#include <stdio.h>

int main()

{
    double f_tem;
    double c_tem;

    printf("화씨 온도를 입력하세요 : ");
    scanf("%lf", &f_tem);

    c_tem = 5 / 9 * (f_tem - 32);

    printf("섭씨 온도는 %lf 입니다.\n", c_tem);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

그러면 결과는 어떻게 나오는지 한 번 같이 보실까요?

화씨온도를 입력하세요 : 33
섭씨온도는 0.000000입니다.

이렇게 잘 나온 것을 보실 수가 있습니다.

그리고 깨알 상식으로 화씨 33도는 섭씨 0도입니다.

그래서 한 번 33으로 입력을 해봤습니다.

이제 여러분들은 연산자를 자유롭게 사용을 할 수 있게 되었습니다.

 

여기까지 여러 가지 연산자들을 이용하여 문제들을 해결해봤습니다.

다음 포스팅부터는 본격적으로 코딩에 살을 입히는 조건문에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~

반응형

댓글