Задача: Системы исчисление [перевод из системы в систему dec,hex, 4-на

  • Автор темы -
  • Дата начала
Статус
Закрыто для дальнейших ответов.

Гость
#1
Привет тем кто это читает...

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

помогите пожалуйста,просить больше некого...думаю для вас это не слишком тяжелая задача...
 

Гость
#2
как ты хранишь шестнадцатеричные цифры?
переполнение чего?
в каком формате нужно представить результат - сохранить в переменную или просто вывести на экран?
Задача действительно очень простая, перевод из системы в систему - один из обязательных примитивов.
Ответь на вопросы - кину набросок кода
 

DarkKnight

Well-Known Member
01.08.2010
653
0
#4
C++:
/*Cложить/вычесть два числа в шестнадцатиричной ссч,а вывод результата должен быть в четверичной системе!!!*/

/*
codeby.net
Autor: DarkKnight125
*/
#include <iostream>

using namespace std;

class Overflow{}; 
const char SS_16[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
const char SS_4[] = {'0','1','2','3'};

int tranclate16to10 (char *ch)
{
int Iter = 1; //Множитель
int Result = 0; //Результат
for (int i=strlen(ch)-1; i >= 0; i--)
{
bool isGood = false; //Если символ входит в 16-ый диапозон 0..F
for (int j=0; j < strlen(SS_16); j++)
{
if (ch[i] == SS_16[j])
{
Result += Iter * j;
Iter*=16;
isGood = true;
break;
}
}
if (!isGood) return -1; //Вернем -1 если какой то из символов не входит в 16-ый диапозон
}
return Result;
}

char* tranclate10to4(int Value)
{
char* buffer = new char[65];
memset(buffer,0,65);
char* tmp = buffer;

while (int(Value / 4) != 0)
{
*tmp = SS_4[Value%4];
tmp++;
Value = (int)Value/4;
}
*tmp = SS_4[Value%4];

char* Result = new char[65];
memset(Result,0,65);
tmp = Result;
for (int i=strlen(buffer)-1; i >= 0; i--)
{
*tmp = buffer[i];
tmp++;
}
delete[] buffer;
return Result;
}
void main(void)
{
setlocale(LC_ALL,"Russian");
char ch1[9];
char ch2[9];

int a = 0,b = 0, Result = 0;
cout<<"Введите 1-ое число (16-системе счислений) : ";
cin.getline(ch1,8);
cout<<"Введите 2-ое (16-системе счислений) : ";
cin.getline(ch2,8);
a = tranclate16to10(ch1);
b = tranclate16to10(ch2);

if (a == -1 || b == -1)
{
cout<<endl<<"Error : Ошибка ввода шестнацатиричного числа"<<endl;
return;
}

cout<<endl<<"1. Сложение"<<endl<<"2. Вычитание"<<endl<<endl
<<"Сделайте выбор : ";
int Input;
cin>>Input;
switch (Input)
{
case 1: 
try{
Result = a+b;
if (Result < 0)
throw Overflow();

}
catch(Overflow)
{
cout<<endl<<"Error : Ошибка переполнение"<<endl;
return;
}; break;
case 2:
Result = a - b; 
if (Result<0)
{
cout<<endl<<"Error : Ошибка отрицательный результат"<<endl;

return;
}
break;
default:
cout<<endl<<"Error : Ошибка при выборе операции"<<endl;
return;
}

cout<<endl<<endl<<"Результат"<<endl;
cout<<tranclate10to4(Result)<<" (четверичной системе)"<<endl;
cout<<Result<<" (Десятичная система)";

}
 
Статус
Закрыто для дальнейших ответов.