1. Разработать класс "Большое десятичное число" в соответствии со следующим заданием:
Состояние класса -
Целое число определяется его длинной(кол-во цифр в числе, например, до 47) и массивом значений десятичных цифр (типа char).Число со знаком хранится в прямом коде.При выполнении арифметических операций использовать дополнительный код.Память под массив выделяется статистически,во время компиляции, и задается массивом фиксированного предельного размера.
Протокол класса -
Определяет возможности создания и инициализации экземпляров класса и правил их использования(методы класса).
Предусмотреть следующие возможности:
- пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию
- создание экземпляров класса с инициализацией значением целого длинного (типа long)
- создание экземпляров класса с инициализацией значением числа как строки символов
- ввод экземпляров из входного потока и вывод их значений в выходной поток (с помощью перегруженных операторов >> и <<)
- получение дополнительного кода числа ((*) с помощью перегруженного оператора ~)
- выполнение операций сложения и вычитания чисел с учетом знаков чисел (с помощью перегруженных операторов + и - )
- выполнение операций уменьшение числа в 10 раз (деление на 10 нацело)
- выполнение увеличения числа в 10 раз
Очень интересует реализация операторов операторов "+" и "-": как я понял класс хранит не только положительные числа...как правильно реализовать сложение и вычитание чисел с разными знаками данного класса? если бы без класса задача можно было бы использовать сравнение модулей а потом соотвественно из большего вычитать меньшее...можно ли в классе делать такие вещи если условием не оговорено?
Что такое прямой код и дополнительный код?
Я попытался написать класс,но очевидно блин вышел комом, при компиляции ошибок не выдает,но просто огромное кол-во предупреждений,использовал лицензию Visual Studio 2005 C++.
Код
class number{
private: int size;
private: char value[47];
// конструкторы
public:number(long i);
public:number(char *buf);
public:number();
// вывод+ ввод
void operator << (number b){
cout<< b.value << endl;
return;
}
void operator >> (number &b){
long i=0;
char buf[47];
cin>> i
value[0]=0;
sprintf(buf,"%i",i);
if (i>0)
{
value[0]='+';
value[1]=0;
}
strcat(value,buf);
size=strlen(value);
b.size=strlen(b.value);
return;
}
// сложение + вычитание
number operator + (number b){
int i,max;
number c;
bool b1=false;
char strok1[47],strok2[47];
char sign=0;
if (this->size<b.size)
{
max=b.size;
}else
{
max=this->size;
}
strcpy(strok1,value);
strcpy(strok2,b.value);
//это чтобы при сравнении строк убрать знаки
sign=strok1[0];
strok1[0]=1;
strok2[0]=1;
// определим какая строка больше
if (cmp(strok1,strok2)<0)
{
strcpy(strok2,value);
strcpy(strok1,b.value);
sign=strok1[0];
}
invers(strok1);
invers(strok2);
if (b.value[0]==this->value[0]){
for (i=0;i!=max-1;i++)
{
c.value[i]=0;
if (i>=strlen(strok1)-1)
{
strok1[i]='0';
strok1[i+1]=0;
}
if (i>=strlen(strok2)-1)
{
strok2[i]='0';
strok2[i+1]=0;
}
c.value[i]=strok1[i]+strok2[i]-'0';
if (b1==true)
{
c.value[i]=c.value[i]+1;
b1=false;
}
if (c.value[i]-'0'>=10)
{
b1=true;
c.value[i]=c.value[i]-10;
}
}
if (b1==true)
{
c.value[i]='1';
max++;
}
c.value[max-1]=value[0];
c.value[max]=0;
invers(c.value);
c.size=strlen(c.value);
return c;
}else{
// над алгоритмом думал много
for (i=0;i!=max-1;i++){
c.value[i]=0;
if (i>=strlen(strok1)-1)
{
strok1[i]='0';
strok1[i+1]=0;
}
if (i>=strlen(strok2)-1)
{
strok2[i]='0';
strok2[i+1]=0;
}
//int k=0;
c.value[i]=strok1[i]-strok2[i];
if (b1==true)
{
c.value[i]=c.value[i]-1;
b1=false;
}
if (c.value[i]<0)
{
b1=true;
c.value[i]=10+c.value[i]+'0';
}else
{
c.value[i]=c.value[i]+'0';
}
}
if (c.value[i-1]=='0')
{
i--;
}
c.value[i]=sign;
c.value[i+1]=0;
invers(c.value);
c.size=strlen(c.value);
}
return c;
}
number operator - (number b){
// просто поменяем знаки и сложим
if (b.value[0]=='+')
{
b.value[0]='-';
}else
{
b.value[0]='+';
}
return *this + b;
}
void operator = (number b){
strcpy(value,b.value);
size=b.size;
return;
}
void multen(){
value[size]='0';
size++;
value[size]=0;
return;
}
void divten(){
if (size==2)
{
value[size-1]='0';
return;
}
value[size-1]=0;
size--;
}
};