2003 Spring C++ 程式作業三:
一個實用的大整數類別

整數類別

這個程式要大家寫的東西還是很熟悉的應用, 就是用一個類別來表示整數的物件, 這個類別的物件需要能夠處理到十進位 100 位數的整數, 這樣子的類別在金融系統中處理鉅額的款項時需要用到, 這樣子的類別在近代密碼學裡也是一個基礎的工具。

一個很大的整數不能夠用 C/C++ 裡的 int 或是 long 或是 double 型態來表示, 因為 int 或是 long 型態有上限, 大約到達 10 的 9 次方左右, 不能夠表示更大的數字了, 而 double 類型雖然可以表示到 10 的 300 次方的數字, 但是在表示這樣的數字時卻有大約 10 的 285 次方的誤差, 這樣的誤差在應用程式中是沒有辦法容忍的。

因此你必須設計自己的資料結構來表示一個大的整數, 例如用字元陣列或是整數陣列來表示, 每一個元素儲存十進位的一個位數, 請你用一個類別把你所喜歡的實作方法包裝起來, 並且實作 operator overloading, 實作一些你所熟悉的整數加減乘除的動作, 讓一些基本的運算可以像是在使用基本型態時一樣地使用。

這個程式希望大家能夠練習下列:

  1. operator overloading 的技術與一般的參數傳遞習慣 (熟悉 Reference, const 的使用方法)

  2. 整數加減乘(除)的演算法

  3. 請務必撰寫類別的單元測試函式

  4. 有了單元測試的程式以後,你可以練習如何做簡單的 refactoring

  5. 請注意記憶體的配置與釋放

基本程式要求

  1. 整數需要考慮正負號

  2. 整數類別需要有下列的 operator
    1. binary +
    2. binary -
    3. binary *
    4. binary ==
    5. unary prefix ++
    6. unary postfix ++

  3. operator overload 時請使用 member function 的形式, 所以你還是用不到 friend function, 如果你用到了,最好要給自己找一個好理由

  4. 需要有下列的建構元:
    1. default constructor
    2. 由 C/C++ 字元陣列建構一個整數
    3. 由 string 類別建構一個整數
    4. 由一個 int 型態的變數建構一個大整數
    注意:由於上面三個建構元的存在, 在你的單元測試裡一定要測 intObj + "1234", intObj + 1234

  5. 輸入與輸出:
    1. 你的應用程式 main 中需要做一個迴圈要求使用者 選擇所要做的運算以及運算所需要的資料, 例如:
        請選擇你希望測試的運算
        1. 由字元陣列建構
        2. 由整數建構
        3. binary +
        4. binary -
        5. binary *
        6. unary prefix ++
        7. unary postfix ++
        8. 完整單元測試
        9. 結束
        3
        請輸入第一個數字
        12345678901234567890
        請輸入第二個數字
        -23084753209485940893245893245
        結果為 -23084753197140261992011325355
        
        請選擇你希望測試的運算
        1. 由字元陣列建構
        2. 由整數建構
        3. binary +
        4. binary -
        5. binary *
        6. unary prefix ++
        7. unary postfix ++
        8. 完整單元測試
        9. 結束
        1
        請輸入數字
        0010834589324583253
        建構出來的數字為 10834589324583253
        
        請選擇你希望測試的運算
        1. 由字元陣列建構
        2. 由整數建構
        3. binary +
        4. binary -
        5. binary *
        6. unary prefix ++
        7. unary postfix ++
        8. 完整單元測試
        9. 結束
        9
        
    2. 請在 Integer 類別內撰寫 print() 函式,並且撰寫一個 ostream & operator<<(ostream &out, Integer &src); 來擴充 中 ostream 的功能

  6. 請使用 assert() 函式建構單元測試的函式, 並且在書面報告上說明你設計了哪些測試

  7. 如果你有用到動態記憶體配置的話, 請撰寫 copy ctor, assignment operator, 以及 dtor

基礎要求

以下的要求為嚴格的要求, 如果不符合的話請不要繳交過來

  1. 請不要用全域 (global) 的變數

  2. 類別內請不要用 public 的資料成員

  3. 你應該還是沒有機會用 friend class 或是 friend function

  4. 請用 new/delete, new[]/delete[] 取代 free/malloc

  5. 請盡量以 const reference 傳遞函式的參數

  6. 請以 MFC debugger 的功能自行檢查是否有 memory leakage

  7. 請以 VC 6.0 撰寫, 使用文字介面

進一步增加程式功能:

以下僅為建議功能, 所有增加的功能請在書面報告中註明以便評分參考

  1. 以十的羃次建構,例如 Integer x("123E70");

  2. 除法以及餘數

  3. 最大公因數以及最小公倍數

  4. 指數

  5. 進位制改變 (例如: 8 進位或是 16 進位列印)

  6. 序列化 (serialization): 物件內容的存檔與讀檔函式

  7. 圖形化介面: 請嘗試下載IntegerUI_1920512b.rar, 並且依照上課 demo 的方法把自己的 Integer 類別結合進去

  8. 其它你自己想到的功能

Matin Fowler 在 Refactoring 一書中提到

程式碼的臭味有下列: