首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 複數計算機專案實戰:運算子多載與進制轉換完整實作

     編輯:關於C++

本專案實作一款功能完整的複數計算機,支援多複數四則運算、模長比較,並內建十進位實數任意進制轉換功能。專案展示 C++ 核心特性:運算子多載、輸入輸出流多載、命名空間封裝、選單驅動架構 等工程化實踐。

一、功能規格

  1. 複數運算:支援多個複數 (含純實數) 連續加、減、乘、除,以 0 (0+0i) 為終止條件。
  2. 模長比較:比較兩複數模長大小 (|z| = sqrt(Re²+Im²))。
  3. 進制轉換:十進位實數 (含負數) 轉換為任意基數 (2~36),採「輾轉相除法」配合字元映射 (0-9, A-Z)。
  4. 互動介面:文字選單驅動,支援重複操作直到選擇退出。

二、核心類別設計:CCom

1. 資料成員與建構子

namespace NameCCom {
class CCom {
public:
    double Real, Image; // 實部、虛部
    CCom(double real = 0, double image = 0) : Real(real), Image(image) {}
    // ...
};
}

2. 運算子多載全集

運算子功能回傳型別
operator>>輸入流解析 a+bi 格式istream&
operator<<輸出流格式化 (智慧隱藏 0 虛部)ostream&
operator+, operator-, operator*, operator/四則運算 (回傳新物件)CCom
operator+=, operator-=, operator*=, operator/=複合指派 (修改自身)CCom&
operator>, operator<模長比較int (0/1)
operator==, operator!=實部/虛部逐值比較 (含 EPS 容差)int

3. 輸入解析邏輯 (operator>>)

採字元流掃描,支援 3+4i, -2.5-3.1i, 5 (純實數), 2i (純虛數) 等格式:

  • 逐字元辨識數字、正負號、i。
  • 遇非法字元輸出 error 並重置物件。
  • 末字元非 i 視為純實數。

4. 輸出格式化邏輯 (operator<<)

  • 虛部絕對值 < EPS (1e-5) → 僅輸出實部。
  • 虛部 > 0 → Real+Imagei。
  • 虛部 < 0 → Real-Imagei (自動處理負號)。

5. 數學運算實作

CCom CCom::operator+(const CCom& c) { return CCom(Real + c.Real, Image + c.Image); }
CCom CCom::operator-(const CCom& c) { return CCom(Real - c.Real, Image - c.Image); }
CCom CCom::operator*(const CCom& c) {
    return CCom(Real*c.Real - Image*c.Image, Real*c.Image + Image*c.Real);
}
CCom CCom::operator/(const CCom& c) {
    double denom = c.Real*c.Real + c.Image*c.Image;
    return CCom((Real*c.Real + Image*c.Image)/denom,
                (Image*c.Real - Real*c.Image)/denom);
}
double CCom::mod() const { return std::sqrt(Real*Real + Image*Image); }

三、進制轉換演算法

函數 Jinzhi() 實作十進位整數轉任意基數 (2~36):

  1. 處理負號,記錄符號並取絕對值。
  2. 迴圈 n % base 取餘數存入陣列,n /= base,直到商為 0。
  3. 餘數 ≥ 10 映射為大寫字母 ('A'+rem-10)。
  4. 逆序輸出陣列內容。

四、主程式架構與流程控制

void output() { // 印出選單
    std::cout << "\t*---------- Hpioneer Calculator Menu ---------*\n"
              << "\t| 1: Multi Complex Add (end with 0)          |\n"
              << "\t| 2: Multi Complex Sub (end with 0)          |\n"
              << "\t| 3: Multi Complex Mul (end with 0)          |\n"
              << "\t| 4: Multi Complex Div (end with 0)          |\n"
              << "\t| 5: Complex Compare                         |\n"
              << "\t| 6: Base Conversion                         |\n"
              << "\t| 0: Exit                                    |\n"
              << "\t*---------------------------------------------*\n";
}

int main() {
    using namespace NameCCom;
    int choice;
    do {
        output();
        std::cin >> choice;
        switch (choice) {
            case 1: Add(); break;
            case 2: Sub(); break;
            case 3: Mul(); break;
            case 4: Div(); break;
            case 5: Compare(); break;
            case 6: Jinzhi(); break;
            case 0: std::cout << "Thank you for using!\n"; break;
            default: std::cout << "Invalid option.\n";
        }
    } while (choice != 0);
    return 0;
}

五、關鍵工程細節

  • 命名空間隔離:NameCCom 避免全域污染。
  • 常數定義:#define EPS 1e-5 統一浮點比較容差。
  • 使用者結構體:struct User { char szName[20]; } 預留登入擴充。
  • 螢幕清除:system("cls") (Windows) 保持介面整潔。
  • 迴圈終止條件:各運算函數以輸入 0+0i 判斷結束,符合直覺。

六、擴充建議

  1. 移植跨平台:將 system("cls") 替換為 ANSI 轉義碼或 ncurses。
  2. 錯誤處理:除法分母為零、輸入格式異常拋出異常而非靜默重置。
  3. 單元測試:引入 GoogleTest 驗證運算子正確性與邊界條件。
  4. GUI 版本:Qt/QML 重寫介面,保留核心 CCom 邏輯不變。

此專案以約 300 行程式碼完整呈現 C++ 物件導向設計、運算子多載藝術與工程化選單架構,是掌握 C++ 進階語法與專案組織的優秀練習範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved