首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

面向對象 vs 面向過程設計思想對比與魔方矩陣、Set 類 C++ 實現

     編輯:程式設計綜合問答

問答題

1. 面向對象 vs 面向過程

維度面向過程 (POP)面向對象 (OOP)
核心單元函數/過程對象 (數據+行為封裝)
思維方式自頂向下,步驟分解自底向上,對象協作
代碼復用複製修改/函數庫繼承/組合/多態
維護擴展牽一髮動全身高內聚低耦合,易擴展
適用場景簡單、線性、算法型任務複雜、業務建模、長期演進系統

2. OOP 三大特性詳解

  • 封裝:隱藏內部實現,暴露公共接口。優勢:降低耦合、保護數據完整性、便於修改實現不影響調用者。
  • 繼承:子類復用父類屬性方法,建立 IS-A 關系。優勢:代碼復用、多態基礎、層次化建模。
  • 多態:同一接口不同實現,運行時綁定。優勢:靈活替換實現、開閉原則、解耦調用者與具體類。

編程題 1:奇數階魔方矩陣 (C++ 實現)

算法:Siamese 方法(從第一行中間列開始,向右上斜向填數,衝突則下移一行)。

#include 
#include 
using namespace std;

vector> magicMatrix(int n) {
    vector> a(n, vector(n, 0));
    int r = 0, c = n / 2;
    for (int v = 1; v <= n * n; v++) {
        a[r][c] = v;
        int nr = (r - 1 + n) % n;
        int nc = (c + 1) % n;
        if (a[nr][nc] != 0) nr = (r + 1) % n, nc = c; // 衝突下移
        r = nr; c = nc;
    }
    return a;
}

int main() {
    int n; cout << "Please input an odd positive integer: "; cin >> n;
    if (n % 2 == 0) return 1;
    auto m = magicMatrix(n);
    cout << "Find " << n << "*" << n << " magic matrix\n";
    for (auto &row : m) {
        for (int v : row) cout << v << ' ';
        cout << '\n';
    }
}

編程題 2:Set 類設計 (C++ 實現)

#include 
#include 
#include 
using namespace std;

class Set {
    vector elems; // 有序無重複
    void sort_unique() {
        sort(elems.begin(), elems.end());
        elems.erase(unique(elems.begin(), elems.end()), elems.end());
    }
public:
    Set() {}
    Set(const vector& v) : elems(v) { sort_unique(); }
    Set(const Set&) = default;
    ~Set() = default;

    void add(int x) { if (!contains(x)) elems.push_back(x), sort_unique(); }
    void remove(int x) { elems.erase(remove(elems.begin(), elems.end(), x), elems.end()); }
    void display() const { for (int v : elems) cout << v << ' '; cout << '\n'; }
    int size() const { return elems.size(); }
    bool contains(int x) const { return binary_search(elems.begin(), elems.end(), x); }

    // 運算符重載
    Set operator+(const Set& o) const { // 並集
        Set r = *this; for (int v : o.elems) r.add(v); return r;
    }
    Set operator-(const Set& o) const { // 差集
        Set r; for (int v : elems) if (!o.contains(v)) r.add(v); return r;
    }
    Set operator*(const Set& o) const { // 交集
        Set r; for (int v : elems) if (o.contains(v)) r.add(v); return r;
    }
};

int main() {
    Set A({1,2,3,3}), B({3,4,5});
    (A + B).display(); // 1 2 3 4 5
    (A - B).display(); // 1 2
    (A * B).display(); // 3
}

掌握 OOP 核心思想與經典算法實現,是程序設計基本功。

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