Оператор == перегрузка - PullRequest
       15

Оператор == перегрузка

1 голос
/ 30 января 2012

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

1.) Напишите метод написания бигинта, который печатает не более 80 цифр в строке.

2.) Напишите метод для сравнения, если два больших числа равны. Должен вернуть bool.

3.) Напишите метод для инициализации bigint значением int, которое вы предоставляете [0, maxint].

4.) Напишите метод для инициализации bigint для символа [].

Я думаю, что у меня 2 и 3 правильно, но у меня возникают проблемы со сравнением двух больших чисел, и я надеялся, что кто-то может привести меня в правильном направлении, как ограничить печать до 80 цифр в строке.

Вот мой код:

.h файл

class bigint
{
public:

bigint(); //default constructor

bool operator==(const bigint& num1); 

bigint( int n);

bigint(char new_digits[]);


private:
    int digit[MAX];
    int digitb[MAX];

};

вот файл реализации:

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


//default constructor
bigint::bigint()
{
     for (int i = 0; i < MAX; i++) 
     {
    digit[i] = 0;
     }

     }


     bigint::bigint( int n )
     {
    int i = 0;



      while(n > 0)
    {
       digit[i] = n % 10;
       n = n /10;
       ++i;
break;
     }


  for(i; i< MAX; ++i)
      digit[i] = 0;


     }

 bool bigint::operator==(const  bigint& num1)
     {

       for(int i = 0; i < MAX; i++)
          {
        if (num1.digit == num1.digit)
              return true;
          }
        return false;

      }


   bigint::bigint(char new_digit[])
      {
     int i = 0;

         //Reads the characters of numbers until it is ended by the null symbol

            while(new_digit[i] != '\0')
             ++i;

             --i;

       //Converts the characters into int values and puts them in the digit array
         while( i >= 0)
    {
            digit[i] = new_digit[i] - '0';
            --i;
    }


}


}



int main()
  {

     #include<iostream>

using namespace std;
using PROJECT_1::bigint;

bigint a(0);

assert(a == 0);
  }

Кстати, я не пытаюсь получить ответы на мою домашнюю работу, которую я только что начал час назад. Я работал над этим весь день и наконец сдался и попросил помощи.

Ответы [ 3 ]

1 голос
/ 30 января 2012

Есть ряд проблем с вашим кодом.Было указано на самое непосредственное: выражение с обеих сторон оператора == идентично, поэтому, естественно, функция возвращает true.Наиболее идиоматический способ написания этой функции на C ++:

return std::equals( 
    std::begin( digit ), std::end( digit ), std::begin( num1.digit ) );

В профессиональном коде я бы счел что-либо еще плохим программированием.В задании sudent это менее очевидно, поскольку одна из целей может заключаться в том, чтобы научиться самостоятельно писать такие вещи, и вам может быть запрещено использовать стандартные алгоритмы в таких случаях.Однако я бы все же использовал тот же базовый подход, используя «итераторы», а не индексы:

int const* current = std::begin( digit );
int const* other   = std::begin( num1.digit );
int const* end     = std::end( digit );
while ( current != end && *current == *other ) {
    ++ current;
    ++ other;
}
return current == end;

Что касается остального кода:

  • operator== определенно должно быть const;в противном случае даже что-то простое, например myBigInt == 0, не будет работать.

  • На самом деле, operator==, вероятно, не должен быть членом.Мне нравится иметь функцию-член isEqual и вызывать ее operator==operator!=), но сделать ее friend также вполне допустимым вариантом.

  • Не уверен, что digitb должен делать.

  • Ваш конструктор, использующий int, не совместим с тем, который использует char[].Вы должны решить, является ли ваше внутреннее представление порядком байтов или порядком байтов.Little-endian, вероятно, проще для арифметических операций, но это означает, что вам придется обрабатывать цифры в обратном порядке в BigInt( char[] ).Фактически, вы начинаете так, как будто собираетесь обрабатывать символы в обратном порядке, но в итоге вы идете назад по обоим массивам, никогда не инициализируя конец digit и не меняя порядок.(Вам также необходимо проверить, что каждый char действительно является цифрой - используя стандартную функцию isdigit.)

В общем, вы должны использовать стандартные функции всякий раз, когда они выполняютработа (и ваше назначение позволяет).Например, в BigInt::BigInt( char[] ) new_digit + strlen( new_digit ) даст вам «итератор» для '\0'.(Использовать итератор для возврата назад немного сложнее, чем идти вперед, потому что вы не можете уменьшить его за пределы массива. Однако что-то вроде:

const const* source = new_digits + strlen( new_digits );
while ( source != new_digits ) {
    -- source;
    //  ...
}

работает хорошо.

1 голос
/ 30 января 2012

Содержимое цикла внутри operator== не работает.Вы сравниваете массив digit (который технически является указателем) num1 с указателем массива digit num1.Это всегда будет правдой.Вы должны сравнивать каждый индекс в this->digit с соответствующим индексом в num1.digit.как-то так:

bool bigint::operator==(const  bigint& num1)
{
    for(int i = 0; i < MAX; i++)
    {
        if (digit[i] != num1.digit[i])
            return false;
    }
    return true;
}

Как видите, я также изменил сравнение с равного на неравное.Это связано с тем, что в противном случае, если только первая цифра одинакова в обоих bigint объектах, использование равных приведет к возврату функции true после проверки только первой цифры.

0 голосов
/ 30 января 2012

Ну, я думаю, что ваша реализация сравнения не верна (возможно, я ошибаюсь, потому что вы не определили, каково условие сравнения, поэтому я предполагаю), потому что:

Вы сравниваете два числав том же переданном bigint, смотрите это:

bool bigint::operator==(const  bigint& num1)
{
    for(int i = 0; i < MAX; i++)
    {
        if (num1.digit == num1.digit) // it'll be always true
        return true;
    }
    return false;
}

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

Для второго вопроса вам нужно напечатать 80 цифр в строке, поэтому запустите цикл, от начала до конца для всех символов, и когда счетчик цикла достигнет 80 (или 79 это выначинаются с 0), выведите символ новой строки.Это одно из решений.

И в следующий раз упомяните требования яснее.

...