Бигинт +оператор

Я делаю проект bigint и не понимаю, почему мой оператор сложения не работает должным образом в тестовом примере.

Я исключаю файл .h, потому что он, вероятно, не нужен.

bigint.cpp

#include "bigint.h"
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cassert>



bigint::bigint()
{                           //Default constructor that sets digit to ZERO
   for (int i = 0; i < MAX; i++) 
   {
     digits[i] = 0;
   }
 }


bigint::bigint(int n)
{

for(int i = 0; i < MAX; ++i)       //Sets the digit to ZERO
    digits[i] = 0; 

    for (int i = 0; n != 0 ; ++i) 
{
    digits[i] = (n % 10);       //
           n = n / 10;
}


}


bigint::bigint(const char new_digits[])  
{
int null = 0;
int temp = 0;

for(int i = 0; i < MAX; ++i)
{
    digits[i] = 0;
}

while(new_digits[null] != '\0')
    ++null;
    --null;
temp = null;

for(int j = 0; j < MAX && temp >= 0; ++j)
{
    digits[j] = new_digits[temp] - '0';
    temp -= 1;
}
}


bool bigint::operator==(const bigint& equal) const
{
int i = 0;

while(i < MAX)
{
    if(digits[i] != equal.digits[i])
    {
        return false;
    }

    ++i;
}
return true;
}


std::ostream& operator<<(std::ostream& output, const bigint& source)
{

int sub1 = MAX - 1; //subtracts 1 from the maximum size 

while(source.digits[sub1] == 0)
{
    --sub1;                            //EMPTY
}

while(sub1 > -1)
{
    output << source.digits[sub1]; 
    --sub1;
}

std::cout << std:: endl;

return output; 
}

std::istream& operator>>(std::istream& in, bigint& source)
{
char getdata[MAX];
char user_input;
int i = 0;



    in.get(user_input);
    while(!in.eof() && user_input != ';')
{
    in.get(user_input);
    source.digits[i] = user_input;
    ++i;
}

    source = bigint(getdata);

    return in;
}

char bigint::operator[](const int i)
{
return digits[i];
}

bigint bigint::operator+(const bigint rhs)
{
   bigint result;
    int i = 0;

    for( ; i < MAX; ++i) 
    {

        if((digits[i] + rhs.digits[i]) > 9)
        {
             digits[i+1] = digits[i+1] + 1 ;


        }

               result.digits[i] = (digits[i] + rhs.digits[i]);
               result.digits[i] = result.digits[i] % 10;
     }

    return result;




}

Main.cpp (тестовый пример)

int main()
{
          // Setup fixture
    bigint left("1");
    bigint right("9");
    bigint result;

    // Test 
    result = (left + right);

     Verify
   assert(left   == "1");
   assert(right  == "9");
   assert(result == "10");

}

В этом тестовом примере программа прерывается на assert(result == "10");

но если у меня тот же тестовый пример, за исключением утверждения (результат == 10); программа работает.

Кто-нибудь может сказать, почему?


person Neil    schedule 06.02.2012    source источник
comment
как насчет форматирования кода?   -  person ObscureRobot    schedule 06.02.2012
comment
Вы тестируете слишком много сразу. Сделайте отдельные тесты для оператора сравнения, сложения и конструктора bigint(char[]).   -  person Alexander Gessler    schedule 06.02.2012


Ответы (1)


Во-первых, вы должны реализовать bigint::operator=(const bigint&), оператор присваивания.

Теперь, в operator+, вы изменяете содержимое левого объекта в этом коде:

if((digits[i] + rhs.digits[i]) > 9)
{
     digits[i+1] = digits[i+1] + 1 ;
}

Это не хорошо. Например, если вы запустили этот код:

bigint x("5");
bigint y("6");

x+y;
x+y;

Вы бы закончили тем, что x было бы 17.

Затем вы передаете значение для bigint::operator аргументов, где вам, вероятно, следует передать ссылку (&).

Наконец, ваш отступ здесь активно вредоносен:

while(new_digits[null] != '\0')
    ++null;
    --null;

Что здесь находится в теле цикла? Правильно, не третья строчка. Пожалуйста, не делайте таких отступов в коде, от этого котята плачут. Программирование котят, по крайней мере.

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

person Borealid    schedule 06.02.2012
comment
Для тех, кто не верит в программирование котят: elistmania.com/images /articles/117/Оригинал/LOLCODE.jpg - person R. Martinho Fernandes; 06.02.2012