C 言語での進数間の数値変換

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C 言語を使用して異なる進数間で数値を変換する方法を学びます。この実験では以下の手順がカバーされます。

  1. ユーザー入力から数値と目標とする進数を読み取ります。
  2. 除算と剰余を使用した変換アルゴリズムを実装して、10 進数を目標とする進数に変換します。
  3. 変換後の数値を出力します。

この実験では、C 言語で進数変換プログラムを開発するためのステップバイステップガイドが提供され、数論と離散数学の必要な概念がカバーされます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/strings("Strings") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/operators -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/for_loop -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/strings -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/math_functions -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/user_input -.-> lab-435169{{"C 言語での進数間の数値変換"}} c/output -.-> lab-435169{{"C 言語での進数間の数値変換"}} end

数値と目標進数の読み取り

このステップでは、C 言語で数値とその変換先の目標進数を読み取る方法を学びます。ユーザーが 10 進数を入力し、それを変換したい進数を指定できる簡単なプログラムを作成します。

まず、進数変換プログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano base_converter.c

次に、数値と目標進数を読み取る初期コードを書きましょう。

#include <stdio.h>

int main() {
    int number, base;

    // ユーザーに 10 進数の入力を促す
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // ユーザーに目標進数の入力を促す
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // 進数入力の検証
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    printf("Number entered: %d\n", number);
    printf("Target base: %d\n", base);

    return 0;
}

プログラムをコンパイルして実行しましょう。

gcc base_converter.c -o base_converter
./base_converter

出力例:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Number entered: 42
Target base: 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 ビット + ヌル終端文字

    // ユーザーに 10 進数の入力を促す
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // ユーザーに目標進数の入力を促す
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // 進数入力の検証
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // 変換して結果を出力
    convertToBase(number, base, result);

    printf("Decimal %d in base %d is: %s\n", number, base, result);

    return 0;
}

プログラムをコンパイルして実行します。

gcc base_converter.c -o base_converter
./base_converter

出力例:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Decimal 42 in base 2 is: 101010

Enter a decimal number to convert: 255
Enter the target base (2-16): 16
Decimal 255 in base 16 is: 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--- Number Conversion Details ---\n");
    printf("Original Number (Decimal): %d\n", decimal);
    printf("Target Base: %d\n", base);
    printf("Converted Number: %s\n", converted);

    // 追加の進数表記
    printf("\nBase Representations:\n");
    printf("  Decimal:    %d\n", decimal);

    // 2 進数表記
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binary:     %s\n", binaryResult);
    }

    // 16 進数表記
    if (base!= 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  Hexadecimal: %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // 最大 32 ビット + ヌル終端文字

    // ユーザーに 10 進数の入力を促す
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // ユーザーに目標進数の入力を促す
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // 進数入力の検証
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // 数値を変換する
    convertToBase(number, base, result);

    // 詳細な変換情報を出力する
    printConversionInfo(number, base, result);

    return 0;
}

プログラムをコンパイルして実行します。

gcc base_converter.c -o base_converter
./base_converter

出力例:

Enter a decimal number to convert: 42
Enter the target base (2-16): 16

--- Number Conversion Details ---
Original Number (Decimal): 42
Target Base: 16
Converted Number: 2A

Base Representations:
  Decimal:    42
  Binary:     101010
  Hexadecimal: 2A

コードの説明:

  • 詳細な変換出力を提供する printConversionInfo() 関数を追加しました。
  • 元の 10 進数、目標進数、および変換結果を表示します。
  • 追加の進数表記(2 進数と 16 進数)を含みます。
  • 冗長性を避けるために、条件付きで代替の進数表記を出力します。
  • より情報量が多く、教育的な出力を提供します。

まとめ

この実験では、C 言語で数値とその変換先の目標進数を読み取る方法を学びました。ユーザーが 10 進数を入力し、それを変換したい進数を指定できる簡単なプログラムを作成しました。また、除算と剰余を使用して 10 進数を他の進数に変換するための核心アルゴリズムを実装しました。最後に、変換後の数値を目的の進数で出力する方法を学びました。

この実験からの重要な学習ポイントには、scanf() 関数を使用してユーザー入力を読み取る方法、入力を検証して目標進数が有効な範囲内にあることを確認する方法、および除算と剰余を使用して進数変換ロジックを実装する方法の理解が含まれます。このプログラムは、これらの概念を C 言語で実際に応用した例を示しています。