Программирование (фото с сайта pixabay.com)

Программа «Перевод из системы в систему» (язык C++)

Примеры

Вариант решения задачки №8 (программа «Перевод из системы в систему») на языке C++. Пока текст программы, а пояснения, возможно, появятся со временем.

// Программа "Перевод числа из одной системы счисления в другую"
#include <iostream>

using namespace std;

// Словари символов для позиционных систем счисления
const char lex_uc[] = "0123456789ABCDEF";
const char lex_lc[] = "0123456789abcdef";

int str_len(char*);   // Функция возвращает длину строки
int power(int, int);  // Функция возведения в степень

// Функция обращает строку (меняет порядок символов на противоположенный)
void reverse_str(char*);

// Функция возвращает числовое соответствие символа
int sym2num(const char*, const char*, char);

// Функция возвращает символ, соответствующий числу
char num2sym(const char*, int);

int str2num(char*, int);  // Функция перевода строки в число
void num2str(char*, int, int);  // Функция перевода числа в строку

int main()
{
    // Сроки для ввода и вывода представления числа
    char input_str[100];
    char output_str[100];

    // Основания входящей и выходящей систем счисления соответственно
    int input_base, output_base;

    // Значение переводимого числа
    int value;

    // Вводим исходные данные
    cout << "Введите строковое представление числа и основания с.сч.: ";
    cin >> input_str >> input_base >> output_base;

    // Преобразуем строку в число
    value = str2num(input_str, input_base);

    // Преобразуем число в строку
    num2str(output_str, value, output_base);

    // Выводим результат
    cout << "Число в " << output_base << "-ой с.сч.: " << output_str << endl;

    return 0;
}

// Функция возвращает длину строки
int str_len(char str[])
{
    int i;
    for (i=0; str[i]; i++) {}
    return i;
}

// Функция возведения в степень
int power(int num, int pow)
{
    switch (pow) {
        case 0:
            return 1;
        case 1:
            return num;
        default:
            return num * power(num, pow-1);
    }
}

// Функция обращает строку (меняет порядок символов на противоположенный)
void reverse_str(char str[])
{
    int len = str_len(str);
    char tmp;
    for (int i=0; i < len/2; i++) {
        tmp = str[i];
        str[i] = str[len-i-1];
        str[len-i-1] = tmp;
    }
}

// Функция возвращает числовое соответствие символа
int sym2num(const char lexu[], const char lexl[], char sym)
{
    int i;
    for (i=0; lexu[i]; i++) {
        if (sym == lexu[i] || sym == lexl[i])
            return i;
    }
    return -1;
}

// Функция возвращает символ, соответствующий числу
char num2sym(const char lexu[], int num)
{
    return lexu[num];
}

// Функция перевода строки в число
int str2num(char str[], int base)
{
    int len = str_len(str);
    int num = 0;
    for (int i=0; i<len; i++) {
        num = num + power(base, i) * sym2num(lex_uc, lex_lc, str[len-i-1]);
    }
    return num;
}

// Функция перевода числа в строку
void num2str(char str[], int num, int base)
{
    int i = 0;
    while (num >= base) {
        str[i++] = num2sym(lex_uc, num % base);
        num = num / base;
    }
    str[i] = num2sym(lex_uc, num);
    str[i+1] = 0;
    reverse_str(str);
}

Добавить комментарий

Ваш адрес email не будет опубликован.