2012-01-30 96 views
1

我正在为学校做一个项目,我需要创建一个bigint类,并且它迄今有4个需求。运算符==超载

1.)写一个写一个bigint的方法,每行最多打印80个数字。

2.)编写一个方法来比较两个bigint是否相等。它应该返回一个布尔值。

3.)编写一个方法来初始化一个bigint为你提供的int值[0,maxint]。

4.)编写一个方法来初始化bigint到char []。

我认为我有2和3是正确的,但我在比较两个bigint时遇到了麻烦,我希望有人能够在正确的方向上引导我如何将打印限制为每行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); 
    } 

顺便说一句,我不是要得到答案我我刚刚在一小时前开始的作业。我一整天都在努力工作,最后我投入并寻求帮助。

+5

A)请正确格式化您的代码,而不是道歉。编辑并不难以掌握B)这真的不是一个“为我工作”的网站;让你的帖子可读后,解释你已经尝试了什么,或者至少说明你目前的思路。如果提供了这两件事情,人们更愿意提供帮助。 – 2012-01-30 06:19:20

+1

哦,而operator ==总是返回true。问题在于: if(num1.digit == num1.digit) 还有其他问题 - 我的第一个问题是:“数字”数组的表示是什么?更具体地说,“digit [0]”是最重要的数字还是最不重要的数字? – 2012-01-30 06:34:44

回答

1

operator==内部循环的内容不起作用。你正在做的是比较digit阵列(技术上是指针)num1digit阵列指针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两个对象中都是相同的,那么在仅检查第一个数字后,使用equal将使函数返回true

0

嗯,我觉得你比较的实现是不正确的(我也许错了,因为你没有指定什么比较的条件,所以这是我的假设),因为:

您在比较两个数字同样通过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; 
} 

所以,因为这是家庭作业,我不会给精确解,但对方法,通过数字比较的数字,看看this操作符重载,它应该帮助。阅读,尝试和学习。

对于第二个问题,您需要打印每行80个数字,因此对所有字符从头到尾运行一个循环,并且当循环计数器达到80(或79是从0开始)时,输出一个换行符。这是一个解决方案。

并提出要求下次更清晰。

1

您的代码有许多问题。已经指出最直接的一个 :在==运算符 两侧的表达式是相同的,所以自然该函数返回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[]。你需要决定你的内部表示是 big-endian还是little-endian。 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; 
    // ... 
} 

效果很好,但是

+0

谢谢大家!你的信息。真的有帮助。 – Neil 2012-02-03 03:04:15