Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Прегруженные операторы "+" и "-" в C++

Автор: Saint 10.01.2008 18:02

Вот имеется такая задача:
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--;
}
};