搜尋

首頁  >  問答  >  主體

c++ - 我的代码问题出在哪里,为什么不能运行?

#include<iostream>
#include<cstring>
using namespace std;
class INT
{
    char *p_num;
    int len;
public:
    //构造函数
    INT()
    {
        p_num = NULL; len = 0;
    }
    INT(const char *p)
    {
     len = strlen(p)+1;
      p_num=new char[strlen(p)+1];
      strcpy(p_num,p);
    }//拷贝函数
    INT(const INT &s)
    {
        len = s.len;
        p_num=new char[strlen(s.p_num)+1];
           strcpy(p_num,s.p_num);
    }

    //赋值函数
    INT & operator=(const INT &s)
    {
    
        delete[]p_num;
        len = s.len;
        p_num = new char[strlen(s.p_num) + 1];
        strcpy(p_num, s.p_num);
        return *this;
    }
    //析构函数
    ~INT()
    {
        delete []p_num;
        p_num=NULL;
        len = 0;
    }
    //下面三个重载函数实现INT型与int型混合运算
    friend INT operator+(const INT &x1, const INT &x2);
    friend INT operator+(const INT &x, int y);
    friend INT operator+(int y, const INT &x);
    //显示数据
    void display()const
    {
        for (int i = 0; i <len; i++)
        cout << p_num[i];
        cout << endl;
    }
};
INT operator+(const INT &x1, const INT &x2)
{
    INT temp;
    temp.p_num = new char[x1.len+x2.len+2];
    if (x1.len>=x2.len)
    {
    
        for (int i = temp.len-1; i >= 0; i--) { temp.p_num[i] = '0'; }
        for (int i = x2.len-1; i >= 0; i--)
        {
            temp.p_num[i] = temp.p_num[i] + x1.p_num[i] + x2.p_num[i] - '0';
            if (temp.p_num[i] - '0' > 10)
            {
                temp.p_num[i] -= 10; temp.p_num[i - 1] += 1;
            }
        }
        for (int i = temp.len-x2.len-1; i >= 0; i--)
        {
            temp.p_num[i] +=x1.p_num[i];
        }
    }
    else
    {
        for (int i = temp.len-1; i >= 0; i--) { temp.p_num[i] = '0'; }
        for (int i = x1.len-1; i >= 0; i--)
        {
            temp.p_num[i] = temp.p_num[i] + x1.p_num[i] + x2.p_num[i] - '0';
            if (temp.p_num[i] - '0' > 10)
            {
                temp.p_num[i] -= 10; temp.p_num[i - 1] += 1;
            }
        }
        
        for (int i = temp.len-1; i >= 0; i--)
        {
            
            temp.p_num[i] += x2.p_num[i];
        }
       }
    return temp;
}
int main()
{
    INT x,y,z;
    x = "123456789";
    y = "12";
    z=x+y;
    z.display();
    system("pause");
    return 0;
}
怪我咯怪我咯2804 天前525

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 13:34:52

    如果沒有報錯訊息, 基本上沒人會幫你debug.
    如果沒有報錯訊息, 基本上沒人會幫你debug.
    如果沒有報錯訊息, 基本上沒人會幫你debug .

    送你一篇提問的智慧

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:34:52

    建議題主能夠先描述下您這個程式的目的,具體執行時遇到的是什麼樣的錯。例如INT類別應該是內部使用字串表示的BigInterger實現,運行時實際上發現呼叫z.display()沒有任何的輸出(期望應該是印出整數內容)。這樣可以為真正願意幫助你的人節省不少的時間,對自己也是一個運動。

    首先你需要修改字串的表達方式,在記憶體中,你應該使用如下的方式來儲存整數,這樣才能比較簡單的做加法對齊:

    程式的問題在於重載加法函數的實作。

    首先在進行temp變數初始化,沒有正確的設定temp.len的值:

    INT temp;
    // initialize temp INT object
    temp.len = x1.len + 1; // you don't need to add x1 and x2 size, actually just the large one's length + 1 is enough
    temp.p_num = new char[temp.len];
    

    其次你的在各位的操作上也有問題,我不方便一一解釋,這邊貼上我寫的一個樣例實現(注意在該實現中,字符串存儲是逆序的),請注意比較兩者的差異:

    INT operator+(const INT& x1, const INT& x2)
    {
        if(x1.len < x2.len) {
            return x2 + x1;
        }
    
        INT temp;
        // initialize temp INT object
        temp.len = x1.len + 1; // save for extra increment
        temp.p_num = new char[temp.len];
        /* replace this loop with a memset call to be more efficient and readable
        for(int i = temp.len - 1; i >= 0; i--) {
            temp.p_num[i] = '0';
        }*/
        memset(temp.p_num, '0', temp.len);
        temp.p_num[temp.len - 1] = '
    void display() const
    {
        for(int i = len - 2; i >= 0; --i)
            if (p_num[i] != '
    123456801
    ') cout << p_num[i]; cout << endl; }
    '; for(int i = 0; i < x1.len - 1; ++i) { temp.p_num[i] += (x1.p_num[i] - '0') + ((i < x2.len - 1) ? (x2.p_num[i] - '0') : 0); if(temp.p_num[i] - '0' >= 10) { temp.p_num[i] -= 10; temp.p_num[i + 1] += 1; } } // truncate extra byte of 0 if (temp.p_num[temp.len - 2] == '0') temp.p_num[temp.len - 2] = 'rrreee'; return temp; }

    當然你的display函數實作也要做對應的修改:

    rrreee

    程式運作結果如下:

    rrreee

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:34:52

    //赋值函数
    INT & operator=(const INT &s)
    {
        delete[] p_num;
        //...
     

    這裡沒有 考慮 p_num == NULL的情況

    回覆
    0
  • 取消回覆