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

C++ 簡易分數類別實作:約分與基本運算封裝

     編輯:關於C語言

設計目標

實作一個 Fraction 類別,支援分子分母存儲、約分(最大公約數)、顯示與基本建構/賦值操作,作為 C++ 類別設計入門練習。

類別定義與實作

#include <iostream>
using namespace std;

class Fraction {
private:
    int m; // 分子
    int d; // 分母
public:
    Fraction() : m(0), d(1) { cout << "Fraction()" << endl; }
    Fraction(int m, int d) : m(m), d(d) { cout << "Fraction(int, int)" << endl; }
    
    void set(int m, int d) { this->m = m; this->d = d; }
    
    // 約分:求最大公約數 (GCD)
    void frac() {
        int g = (m > d) ? m : d; // 簡易版:從較大者遞減找公因數
        for (int i = g; i > 0; --i) {
            if (m % i == 0 && d % i == 0) {
                m /= i; d /= i;
                break; // 找到最大公約數即可跳出
            }
        }
    }
    
    void show() { cout << "m=" << m << ", d=" << d << endl; }
    ~Fraction() { cout << "~Fraction" << endl; }
};

int main() {
    Fraction f1(10, 20), f2;
    f1.frac(); f1.show(); // 輸出 m=1, d=2
    
    f2.set(3, 4);
    f2.frac(); f2.show(); // 輸出 m=3, d=4
    system("pause");
    return 0;
}

改進建議

  1. GCD 演算法優化:使用輾轉相除法(Euclidean Algorithm),O(log min(m,d)) 取代 O(max(m,d))。
    int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
  2. 建構子自動約分:在建構子與 set 中呼叫 frac(),保證物件恆為最簡形式。
  3. 運算子多載:多載 + - * /、<<、>> 等,提供直觀介面。
  4. 分母非零檢查:斷言或拋出異常防止除零錯誤。
  5. 負號規範化:統一將負號放在分子。

總結

分數類別是練習 C++ 類別封裝、建構/解構、運算子多載、不變量維護的經典範例。從簡易版出發,逐步引入演算法優化與現代 C++ 語法,能深入理解資料抽象與類別設計精髓。

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