はじめに
この実験では、C 言語を使用して異なる進数間で数値を変換する方法を学びます。この実験では以下の手順がカバーされます。
- ユーザー入力から数値と目標とする進数を読み取ります。
- 除算と剰余を使用した変換アルゴリズムを実装して、10 進数を目標とする進数に変換します。
- 変換後の数値を出力します。
この実験では、C 言語で進数変換プログラムを開発するためのステップバイステップガイドが提供され、数論と離散数学の必要な概念がカバーされます。
この実験では、C 言語を使用して異なる進数間で数値を変換する方法を学びます。この実験では以下の手順がカバーされます。
この実験では、C 言語で進数変換プログラムを開発するためのステップバイステップガイドが提供され、数論と離散数学の必要な概念がカバーされます。
このステップでは、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 進数と目標進数を読み取ります。このステップでは、除算と剰余を使用して 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()
関数は核心的な変換アルゴリズムを実装しています。この最後のステップでは、変換後の数値を表示するためのより包括的な出力と書式設定オプションを追加することで、進数変換プログラムを強化します。
既存のファイルを開き、コードを更新します。
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()
関数を追加しました。この実験では、C 言語で数値とその変換先の目標進数を読み取る方法を学びました。ユーザーが 10 進数を入力し、それを変換したい進数を指定できる簡単なプログラムを作成しました。また、除算と剰余を使用して 10 進数を他の進数に変換するための核心アルゴリズムを実装しました。最後に、変換後の数値を目的の進数で出力する方法を学びました。
この実験からの重要な学習ポイントには、scanf()
関数を使用してユーザー入力を読み取る方法、入力を検証して目標進数が有効な範囲内にあることを確認する方法、および除算と剰余を使用して進数変換ロジックを実装する方法の理解が含まれます。このプログラムは、これらの概念を C 言語で実際に応用した例を示しています。