Thắc mắc: Class và hướng đối tượng trong C++

Vẫn không đáng. Lấy thêm 1 byte của bạn nữa là được hẳn 63 bit rồi.

Mình có Code thế này cho bạn tham khảo

PhanSo.h

class PhanSo {
public:
    PhanSo();
    PhanSo(int, int);
    virtual ~PhanSo();
    void nhapPhanSo();
    void xuatPhanSo();
    void rutGonPhanSo();
    void dinhdangPhanSo();
    PhanSo friend operator +(PhanSo, PhanSo);
    PhanSo friend operator *(PhanSo, PhanSo);

private:
    int tuso, mauso;
};

PhanSo.cpp

#include "PhanSo.h"
#include <iostream>
#include <cstdlib>

using namespace std;

PhanSo::PhanSo() {
    //Vi minh dung de tinh ca phep nhan nen dat mac dinh la 1
    this->tuso = 1;
    this->mauso = 1;
}

PhanSo::PhanSo(int a, int b) {
    this->tuso = a;
    this->mauso = b;
}

PhanSo::~PhanSo() {
}

void PhanSo::nhapPhanSo() {
    this->tuso = rand() % 21 - 10;
    do {
        this->mauso = rand() % 21 - 10;
    } while (this->mauso == 0);
}

void PhanSo::xuatPhanSo() {
    if (this->tuso == 0 ||this->mauso == 1)
        cout << this->tuso << endl;
    else cout << this->tuso << "/" << this->mauso << endl;
}

void PhanSo::rutGonPhanSo() {
    int a = abs(this->tuso);
    int b = abs(this->mauso);
    int uc;
    if (a * b == 0)
        uc = a + b;
    int r = a % b;
    while (r != 0) {
        a = b;
        b = r;
        r = a % b;
    }
    uc = b;
    this->tuso = this->tuso / uc;
    this->mauso = this->mauso / uc;
}
void PhanSo::dinhdangPhanSo() {
    if (this->mauso < 0) {
        this->tuso = -this->tuso;
        this->mauso = -this->mauso;
    }
    if (this->tuso == 0)
        this->mauso = 1;
}
PhanSo operator +(PhanSo obj1, PhanSo obj2) {
    int a = obj1.tuso * obj2.mauso + obj1.mauso * obj2.tuso;
    int b = obj1.mauso * obj2.mauso;
    PhanSo result(a, b);
    result.rutGonPhanSo();
    return result;
}
PhanSo operator *(PhanSo obj1, PhanSo obj2) {
    int a = obj1.tuso * obj2.tuso;
    int b = obj1.mauso * obj2.mauso;
    PhanSo result(a, b);
    result.rutGonPhanSo();
    return result;
}

main.cpp

#include "PhanSo.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#define MAX 100

using namespace std;

int main() {
    PhanSo obj[MAX];
    int i, n;
    do {
        cout << "Nhap so luong phan tu: ";
        cin >> n;
    } while (n < 1 || n > MAX);
    srand(time(NULL));
    for (i = 0; i < n; i++) {
        obj[i].nhapPhanSo();
        obj[i].dinhdangPhanSo();
        obj[i].rutGonPhanSo();
    }
    for (i = 0; i < n; i++)
        obj[i].xuatPhanSo();
    PhanSo s1, s2;
    //s.tuso = 0;
    for (i = 0; i < n; i++) {
        s1 = s1 + obj[i];
        s2 = s2 * obj[i];
    }
    s1 = s1 + PhanSo(-1, 1);
    cout << "Tong cua day phan so:";
    s1.xuatPhanSo();
    cout << "Tich cua day phan so:";
    s2.xuatPhanSo();
    //system("pause");
    return 0;
}

Loay hoay mãi mà không Format Code theo dạng Code CPP được. MOD or ai đó làm giúp mình nhé

1 Like

Bỏ qua những thứ về toán không liên quan đến oop thì mình thấy có vài điểm sau:

  • Khi tạo 1 class trong C++, bạn cần phải tuân thủ rule of three. Từ c++11 trở đi thì là rule of five ( hay rule of four and a half ). Nhưng bạn mới học thì cứ quan tâm đến rule of three đã không lại tẩu hỏa nhập ma.
  • Cái hàm rút gọn, sao lại có tham số ? Thật ngớ ngẩn. Chắc chắn ở trên đã có ng giải thích tại sao rồi.
  • Hàm cộng, một lần nữa, tại sao lại có đến 2 tham số ? Cả hàm rút gọn và cộng của bạn, mang tiếng là hàm thành viên, nhưng lại chẳng liên quan gì đến đối tượng cả. Hơn nữa hàm cộng, tên là “cộng” thì nó chỉ nên làm đúng công việc ấy thôi, sẽ chẳng ai nghĩ rằng nó lại in ra kết quả cả. Nếu muốn in thì bạn nên sửa tên thành cong_va_in, và khi in tại sao không dùng hàm xuat() ? OOP được tạo ra cũng là để tối ưu việc sử dụng lại code, vậy nếu đã mất công định nghĩa cái hàm ấy rồi thì tại sao lại không dùng ? Nhưng mà như thế cũng thật ngớ ngẩn đúng không ? Chả nhẽ mỗi lần muốn cộng 2 ps ta lại phải in nó ra, dù cho có cần thiết hay không. Và cũng chẳng thể sử dụng được kết quả của phép cộng ấy, bởi nó chẳng trả về cái gì cả. Cái này bạn tham khảo thêm bộ nguyên tắc SOLID.

Còn về việc nạp chồng toán tử, cá nhân mình nghĩ đó là một kiến thức hay nhưng nó không ảnh hưởng đến logic của OOP, nó chỉ làm đoạn code C++ của bạn trông thống nhất và thuận logic hơn thôi. Sau này bạn có thể thêm vào sau cũng được. Các ngôn ngữ khác không có tính năng này. Nếu bạn muốn tìm hiểu sâu về tư tưởng OOP thì java hoặc C# có lẽ là sự lựa chọn tốt hơn, ở đó mọi thứ đều là 1 đối tượng, bản thân chương trình cũng là 1 đối tượng.

1 Like

Cảm ơn các anh nhiều ạ :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?