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.
Viết hàm toán tử so sánh phân số
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é .
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);
}
Đầu tiên là xét dấu hai vế, nếu cùng dấu rồi mới quy đồng 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} và \frac{3}{197537}.
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;
}
Sao bạn không tự chạy thử nhỉ?
à 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}
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
Cái này là corner case 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.
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