用 C 语言在不同进制之间转换数字

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将学习如何使用C语言编程在不同进制之间转换数字。本实验涵盖以下步骤:

  1. 从用户输入中读取数字和目标进制。
  2. 使用除法和余数实现转换算法,将十进制数转换为目标进制。
  3. 打印转换后的数字。

本实验提供了一个逐步指南,用于开发C语言中的进制转换程序,涵盖了数论和离散数学中的必要概念。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) 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语言编程中读取一个数字及其用于转换的目标进制。我们将创建一个简单的程序,允许用户输入一个十进制数,并指定要将其转换到的进制。

首先,让我们为我们的进制转换程序创建一个新的C文件:

cd ~/project
nano base_converter.c

现在,让我们编写读取数字和目标进制的初始代码:

#include <stdio.h>

int main() {
    int number, base;

    // 提示用户输入十进制数
    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()从用户输入中读取十进制数和目标进制
  • 我们验证进制,以确保它在2到16之间(支持二进制到十六进制)
  • 程序会回显输入的数字和进制,以确认输入

使用除法和余数进行转换

在这一步中,我们将实现使用除法和余数将十进制数转换为其他进制的核心算法。我们将修改之前的程序以添加转换逻辑。

打开现有文件并更新代码:

cd ~/project
nano base_converter.c

用以下实现替换之前的代码:

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

// 函数:将十进制转换为任意进制
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位 + 空终止符

    // 提示用户输入十进制数
    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>

// 函数:将十进制转换为任意进制
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("原始数字(十进制):%d\n", decimal);
    printf("目标进制:%d\n", base);
    printf("转换后的数字:%s\n", converted);

    // 其他进制表示
    printf("\n进制表示:\n");
    printf("  十进制:    %d\n", decimal);

    // 二进制表示
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  二进制:     %s\n", binaryResult);
    }

    // 十六进制表示
    if (base!= 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  十六进制: %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // 最多32位 + 空终止符

    // 提示用户输入十进制数
    printf("输入要转换的十进制数:");
    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

示例输出:

输入要转换的十进制数:42
输入目标进制(2 - 16):16

--- 数字转换详情 ---
原始数字(十进制):42
目标进制:16
转换后的数字:2A

进制表示:
  十进制:    42
  二进制:     101010
  十六进制: 2A

代码解释:

  • 添加了 printConversionInfo() 函数以提供详细的转换输出
  • 显示原始十进制数、目标进制和转换后的结果
  • 包括其他进制表示(二进制和十六进制)
  • 有条件地打印其他进制表示以避免冗余
  • 提供更丰富且有教育意义的输出

总结

在本实验中,我们学习了如何在C语言编程中读取用于转换的数字及其目标进制。我们创建了一个简单的程序,允许用户输入一个十进制数,并指定要将其转换到的进制。我们还实现了使用除法和余数将十进制数转换为其他进制的核心算法。最后,我们学习了如何以所需的进制打印转换后的数字。

本实验的关键学习要点包括理解如何使用scanf()函数读取用户输入、验证输入以确保目标进制在有效范围内,以及使用除法和余数实现进制转换逻辑。该程序展示了这些概念在C语言编程中的实际应用。