Преобразование чисел между системами счисления на языке C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии (lab) мы научимся преобразовывать числа из одной системы счисления в другую с использованием языка программирования C. В рамках лабораторной работы будут выполнены следующие шаги:

  1. Считывание числа и целевой системы счисления из пользовательского ввода.
  2. Реализация алгоритма преобразования с использованием деления и нахождения остатков для перевода десятичного числа в целевую систему счисления.
  3. Вывод преобразованного числа.

В лабораторной работе дается пошаговое руководство по разработке программы для преобразования систем счисления на языке C, охватывающее необходимые концепции из теории чисел и дискретной математики.

Считывание числа и целевой системы счисления

На этом шаге мы научимся считывать число и целевую систему счисления для преобразования в программировании на языке 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--- 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);

    // Представление в двоичной системе счисления
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binary:     %s\n", binaryResult);
    }

    // Представление в шестнадцатеричной системе счисления
    if (base!= 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  Hexadecimal: %s\n", hexResult);
    }
}

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);

    // Вывести подробную информацию о преобразовании
    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() для предоставления подробного вывода о преобразовании.
  • Отображает исходное десятичное число, целевую систему счисления и преобразованный результат.
  • Включает дополнительные представления числа в других системах счисления (двоичной и шестнадцатеричной).
  • Условно выводит альтернативные представления числа в других системах счисления, чтобы избежать избыточности.
  • Предоставляет более информативный и образовательный вывод.

Резюме

В этом лабораторном занятии (lab) мы научились считывать число и целевую систему счисления для преобразования в программировании на языке C. Мы создали простую программу, которая позволяет пользователям вводить десятичное число и указывать систему счисления, в которую они хотят преобразовать это число. Мы также реализовали основной алгоритм преобразования десятичного числа в другую систему счисления с использованием деления и нахождения остатков. Наконец, мы научились выводить преобразованное число в целевой системе счисления.

Основные моменты, которые нужно запомнить из этого лабораторного занятия, включают понимание того, как использовать функцию scanf() для считывания пользовательского ввода, проверку ввода, чтобы убедиться, что целевая система счисления находится в допустимом диапазоне, и реализацию логики преобразования систем счисления с использованием деления и нахождения остатков. Программа демонстрирует практическое применение этих концепций в программировании на языке C.