C 언어를 이용한 진수 변환

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍을 사용하여 숫자를 서로 다른 진법으로 변환하는 방법을 배웁니다. 이 실습은 다음 단계를 포함합니다.

  1. 사용자 입력으로 숫자와 목표 진법을 읽습니다.
  2. 나눗셈과 나머지를 사용하여 변환 알고리즘을 구현하여 10 진수를 목표 진법으로 변환합니다.
  3. 변환된 숫자를 출력합니다.

이 실습은 C 로 기수 변환 프로그램을 개발하기 위한 단계별 가이드를 제공하며, 수론 및 이산수학에서 필요한 개념을 다룹니다.

숫자 및 목표 진수 읽기

이 단계에서는 C 프로그래밍에서 숫자와 변환할 목표 진수를 읽는 방법을 배웁니다. 사용자가 10 진수를 입력하고 변환할 진수를 지정할 수 있도록 간단한 프로그램을 만들 것입니다.

먼저 기수 변환 프로그램을 위한 새로운 C 파일을 생성합니다.

cd ~/project
nano base_converter.c

이제 숫자와 목표 진수를 읽는 초기 코드를 작성합니다.

#include <stdio.h>

int main() {
    int number, base;

    // 사용자에게 10 진수 입력을 요청합니다.
    printf("변환할 10 진수를 입력하세요: ");
    scanf("%d", &number);

    // 사용자에게 목표 진수를 입력하도록 요청합니다.
    printf("변환할 목표 진수를 입력하세요 (2-16): ");
    scanf("%d", &base);

    // 진수 입력 유효성 검사
    if (base < 2 || base > 16) {
        printf("잘못된 진수입니다. 2 에서 16 사이의 진수를 입력하세요.\n");
        return 1;
    }

    printf("입력된 숫자: %d\n", number);
    printf("목표 진수: %d\n", base);

    return 0;
}

프로그램을 컴파일하고 실행해 봅시다.

gcc base_converter.c -o base_converter
./base_converter

예시 출력:

변환할 10진수를 입력하세요: 42
변환할 목표 진수를 입력하세요 (2-16): 2
입력된 숫자: 42
목표 진수: 2

코드 설명:

  • scanf()를 사용하여 사용자 입력으로부터 10 진수와 목표 진수를 읽습니다.
  • 진수가 2 와 16 사이인지 확인하여 유효성을 검사합니다 (2 진수에서 16 진수까지 지원).
  • 프로그램은 입력된 숫자와 진수를 다시 출력하여 입력을 확인합니다.

나눗셈과 나머지를 이용한 변환

이 단계에서는 나눗셈과 나머지를 사용하여 10 진수를 다른 진수로 변환하는 핵심 알고리즘을 구현합니다. 이전 프로그램을 수정하여 변환 로직을 추가할 것입니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano base_converter.c

이전 코드를 다음 구현으로 바꿉니다.

#include <stdio.h>
#include <string.h>

// 10 진수를 임의의 진수로 변환하는 함수
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";

    // 0 인 경우 특수 케이스 처리
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // 나눗셈과 나머지를 사용하여 변환
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // 문자열 뒤집기
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

int main() {
    int number, base;
    char result[33];  // 최대 32 비트 + null 종결자

    // 사용자에게 10 진수 입력을 요청합니다.
    printf("변환할 10 진수를 입력하세요: ");
    scanf("%d", &number);

    // 사용자에게 목표 진수를 입력하도록 요청합니다.
    printf("변환할 목표 진수를 입력하세요 (2-16): ");
    scanf("%d", &base);

    // 진수 입력 유효성 검사
    if (base < 2 || base > 16) {
        printf("잘못된 진수입니다. 2 에서 16 사이의 진수를 입력하세요.\n");
        return 1;
    }

    // 변환 결과 출력
    convertToBase(number, base, result);

    printf("10 진수 %d를 %d진수로 변환한 결과: %s\n", number, base, result);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc base_converter.c -o base_converter
./base_converter

예시 출력:

변환할 10진수를 입력하세요: 42
변환할 목표 진수를 입력하세요 (2-16): 2
10진수 42를 2진수로 변환한 결과: 101010

변환할 10진수를 입력하세요: 255
변환할 목표 진수를 입력하세요 (2-16): 16
10진수 255를 16진수로 변환한 결과: FF

코드 설명:

  • convertToBase() 함수는 핵심 변환 알고리즘을 구현합니다.
  • 나눗셈과 나머지를 사용하여 오른쪽에서 왼쪽으로 자릿수를 추출합니다.
  • 미리 정의된 숫자 집합을 사용하여 2 에서 16 까지의 진수를 지원합니다.
  • 0 인 경우 특수 케이스를 처리합니다.
  • 결과 문자열을 뒤집어 올바른 자릿수 순서를 얻습니다.
  • 나머지를 해당 진수 문자로 매핑하기 위해 숫자 배열을 사용합니다.

변환된 숫자 출력

이 마지막 단계에서는 변환된 숫자를 표시하기 위한 더욱 포괄적인 출력 및 서식 지정 옵션을 추가하여 기수 변환 프로그램을 향상시킬 것입니다.

기존 파일을 열고 코드를 업데이트합니다.

cd ~/project
nano base_converter.c

개선된 출력 및 서식 지정으로 코드를 업데이트합니다.

#include <stdio.h>
#include <string.h>

// 10 진수를 임의의 진수로 변환하는 함수
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";
    int original = number;  // 표시를 위해 원래 숫자 저장

    // 0 인 경우 특수 케이스 처리
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // 나눗셈과 나머지를 사용하여 변환
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // 문자열 뒤집기
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

// 자세한 변환 정보를 출력하는 함수
void printConversionInfo(int decimal, int base, const char *converted) {
    printf("\n--- 숫자 변환 세부 정보 ---\n");
    printf("원래 숫자 (10 진수): %d\n", decimal);
    printf("목표 진수: %d\n", base);
    printf("변환된 숫자: %s\n", converted);

    // 추가적인 진수 표현
    printf("\n진수 표현:\n");
    printf("  10 진수:    %d\n", decimal);

    // 2 진수 표현
    if (base != 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  2 진수:     %s\n", binaryResult);
    }

    // 16 진수 표현
    if (base != 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  16 진수: %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // 최대 32 비트 + null 종결자

    // 사용자에게 10 진수 입력을 요청합니다.
    printf("변환할 10 진수를 입력하세요: ");
    scanf("%d", &number);

    // 사용자에게 목표 진수를 입력하도록 요청합니다.
    printf("변환할 목표 진수를 입력하세요 (2-16): ");
    scanf("%d", &base);

    // 진수 입력 유효성 검사
    if (base < 2 || base > 16) {
        printf("잘못된 진수입니다. 2 에서 16 사이의 진수를 입력하세요.\n");
        return 1;
    }

    // 숫자 변환
    convertToBase(number, base, result);

    // 자세한 변환 정보 출력
    printConversionInfo(number, base, result);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc base_converter.c -o base_converter
./base_converter

예시 출력:

변환할 10진수를 입력하세요: 42
변환할 목표 진수를 입력하세요 (2-16): 16

--- 숫자 변환 세부 정보 ---
원래 숫자 (10진수): 42
목표 진수: 16
변환된 숫자: 2A

진수 표현:
  10진수:    42
  2진수:     101010
  16진수: 2A

코드 설명:

  • 자세한 변환 출력을 제공하는 printConversionInfo() 함수를 추가했습니다.
  • 원래 10 진수, 목표 진수 및 변환된 결과를 표시합니다.
  • 추가적인 진수 표현 (2 진수 및 16 진수) 을 포함합니다.
  • 중복을 피하기 위해 조건부로 대체 진수 표현을 출력합니다.
  • 더욱 정보가 풍부하고 교육적인 출력을 제공합니다.

요약

이 실험에서는 C 프로그래밍에서 숫자와 변환 대상 진수를 읽는 방법을 배웠습니다. 사용자가 10 진수를 입력하고 변환할 진수를 지정할 수 있는 간단한 프로그램을 만들었습니다. 또한, 나눗셈과 나머지를 사용하여 10 진수를 다른 진수로 변환하는 핵심 알고리즘을 구현했습니다. 마지막으로 원하는 진수로 변환된 숫자를 출력하는 방법을 배웠습니다.

이 실험에서 얻은 주요 학습 내용은 사용자 입력을 읽기 위해 scanf() 함수를 사용하는 방법, 대상 진수가 유효 범위 내에 있는지 확인하기 위해 입력을 검증하는 방법, 그리고 나눗셈과 나머지를 사용하여 기수 변환 논리를 구현하는 방법입니다. 이 프로그램은 C 프로그래밍에서 이러한 개념의 실제 적용 사례를 보여줍니다.