Показать сообщение отдельно

  #697  
Старый 06.10.2008, 22:28
Larionich
Новичок
Регистрация: 21.09.2008
Сообщений: 16
Провел на форуме:
249855

Репутация: 52
По умолчанию

Цитата:
Товарищи, нужна помощь, нужен код на С++ переводящий Сиситемы Счисления.
Тоесть как бы из Любой в любую (до 20-ричной) не на прямую, а через десятичную... буду благодарен
Сам бы ты точно не написал... А я осилил ^^
Фича моего кода такая, допустим надо перевести из 2-ной в 16-ную, сначала переводим в из 2-ной в десятичную, потом из десятичной в 16-ную (собственно, как ты и просил). 3 функции, только последняя возвращяет массив символов, первые две возвращают вещественное число. Комментарии я написал, пример использования функций тоже. ^^
Код:
/*переводит дробное число из одной СС в другую
(основание которой меньше 36)*/
#include <iostream>
#include <math.h>
char rezA[255];//буффер под вывод шестнадцатеричной СС
/*переводит из любой СС в десятичную (основание СС, указатель на строку,
с начальным числом*/
double perevod10(int num, char* base)
{
    int n1=0,n2=0,i=0,rez1=0;
    double rez2=0;
    while ( base[++n1] != '.') { }
    for (i=0; i<=n1-1; ++i)
    {
        if ((int)base[i] <= (int)'9')
        {
            rez1+=((int)base[i] - (int)'0') * (int)pow(num,n1-1-i);
        }
        else
        {
            rez1+=((int)base[i] - (int)'A' + 10) * (int)pow(num,n1-1-i);
        }
    }
    while ( base[n1+1+(++n2)] != NULL) { }
    for (i=n1+1; i<=n1+n2; ++i)
    {
        if ((int)base[i] <= (int)'9')
        {
            rez2+=((int)base[i] - (int)'0') * pow(num, -1-(i-n1-1));
        }
        else
        {
            rez2+=((int)base[i] - (int)'A' + 10) * pow(num, -1-(i-n1-1));
        }
    }
    return rez1+rez2;
}
/*переводит из десятичной в СС, основание которой мешьше 10*/
double perevod2 (int num, double base)
{
    const double e=0.01;
    long base_temp1=(long)base,rez1=0,p=1;
    double base_temp2=base - (long)base,rez2=0;
    while (base_temp1!= 0)
    {
        rez1=rez1+ (base_temp1%num)*p;
        base_temp1=base_temp1/num;
        p=p*10;
    }
    while ((base_temp2) > e)
    {
        base_temp2*=num;
        rez2=(rez2 + (long)base_temp2)*0.1;
        base_temp2=base_temp2- (long)base_temp2;
    }
    return rez1+rez2;
}
/*переводит из десятичной в СС, основание которой больше 10*/
char* perevodA (int num, double base)
{
    const double e=0.01;
    char temp;
    long base_temp1=(long)base,rez1=0,k=0,i=0;
    double base_temp2=base - (long)base,rez2=0;
    while (base_temp1!= 0)
    {
        if (base_temp1%num <= 9)
        {
            rezA[i]=(char)(base_temp1%num + (int)('0'));
        }
        else
        {
            rezA[i]=(char)(base_temp1%num + (int)'A' -10);
        }

        base_temp1=base_temp1/num;
        ++i;
    }
    for (k=0; k<i/2; ++k)
    {
        temp=rezA[k];
        rezA[k]=rezA[i-1-k];
        rezA[i-1-k]=temp;
    }
    rezA[i]='.'; ++i;
    while ((base_temp2) > e)
    {
        base_temp2*=num;
        if (base_temp2 <= 9)
        {
            rezA[i]=(char)(base_temp2 + (int)('0'));
        }
        else
        {
            rezA[i]=(char)(base_temp2 + (int)'A' -10);
        }
        base_temp2=base_temp2- (long)base_temp2;
        ++i;
    }
    rezA[i]=NULL;
    return rezA;
}

int main()
{
	std::cout << perevod10(2, "1100.011") << "\n"; //из двоичной в десятичную
    std::cout << perevod10(16, "FF.8") << "\n";//из шестнадцатеричной в десятичную
    std::cout << perevod2(2, 1.625) << "\n";//из десятичной в двоичную
    std::cout << perevodA(16, 255.5) << "\n";//из десятичной в шестнадцатеричную
	return 0;
}
 
Ответить с цитированием