Viết hàm toán tử so sánh phân số

Cho mình hỏi cách code hàm toán tử >, <, ==, != giữa hai phân số trong cấu trúc struct phân số với, mình mới bắt đầu học về c++ phần đa năng hóa toán tử mà tới đây thì bí mất.

Không biết anh bí chỗ nào nhỉ. Anh nói chỗ đó ra để mọi người cùng giải đáp được không.
Nếu chưa biết bắt đầu từ đâu thì từ khoá cho anh google là nạp chồng toán tử hoặc operator overloading nhé :wink:.

2 Likes

mình đang bí phần xây dựng hàm cho các toán tử trên, mình đang tìm nhưng cho mình hỏi với toán tử > thì code vầy đúng ko?

bool phanso::operator > (phanso &r)
{
    int ts1, ms1;
    ts1 = a*r.b - b*r.a;
    ms1 = b * r.b;
    return (ts1*ms1 > 0);
}
1 Like

Đầu tiên là xét dấu hai vế, nếu cùng dấu rồi mới quy đồng :smiley: giảm đc 1 trường hợp.

Tiếp theo là vấn đề tràn mẫu dù đã chia cho ước chung. Ví dụ như \frac{1}{65535}\frac{3}{197537}.

5 Likes

Nếu làm bài tập thì cách này ổn nhất. Nhưng nếu làm thực tế
Chia quách tử số cho mẫu số có phải nhanh hơn không.

double phanso::getGiatri(){
    return (double)a / (double)b; //static_cast<double>(a) 
}
bool phanso::operator > (phanso &r)
{
    double ps1 = this.getGiatri();
    double ps2 = r.getGiatri();
    return ps1 > ps2;
}
4 Likes

Sao bạn không tự chạy thử nhỉ?

4 Likes

à mình hỏi để sửa rồi thêm vào chứ bt là nguyên 1 ct thực hiện 1 loạt thao tác vừa hàm vừa nạp chồng toán tử nên sợ đưa vào sửa 1 hồi lại lỗi thì mệt

Cho hai phân số hơn kém nhau 2^{-25} :smiley:

\frac{3751}{9782}, \frac{3802}{9915}
5 Likes

cho mình hỏi với toán tử > thì code vầy đúng ko?

Đúng.

Mình có nói khi làm bài tập thì có thể theo cách quy đồng mẫu số.
Còn làm thực tế, thì chia tử cho mẫu vì nhanh, gọn hơn, sai số nhỏ có thể bỏ qua.
Vậy nên không cần kiên trì bắt bẻ đâu.
BTW,

double a, b, c, d;    
a = 3751;
b = 9782;
c = 3802;
d = 9915;
std::cout.precision(17);
std::cout << std::fixed << a/b << std::endl; // 0.38345941525250460       
std::cout << std::fixed << c/d << std::endl; // 0.38345940494200709
std::cout << std::scientific <<std::numeric_limits<double>::min() << std::endl; 
// 2.22507385850720138e-308 ~ 2^-1024
3 Likes

Cái này là corner case :smiley: nếu bạn dùng float thì khỏi phân biệt luôn ấy.

double cũng giới hạn thôi.

2 Likes

cho mình hỏi thêm 1 thứ là với toán tử một ngôi là ++ và – thì trong cấu trúc và class thì kiểu trả về có gì khác không ạ, mình trả về kiểu void thì trong main x++ lại sai nhưng trả về kiểu date giống trong class thì lại sai từ đó, mình có tìm thử nhưng trên mạng chỉ có hàm theo kiểu class còn trong bt lại yêu cầu theo struct nên không biết làm thế nào =(( vd trong x++ thì x.day+=1 sau đó phải xem xét để tăng cả x.month và x.year lên thêm 1 nên không biết trả về kiểu gì.

https://en.cppreference.com/w/cpp/language/operators

trong này có chỉ cách khai báo báo đủ các kiểu toán tử luôn nè :V

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