/*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<<" (Десятичная система)";
}