đây là class phân số do mình viết: #include<iostream.h> #include<conio.h> #include<math.h> class PhanSo { private: int Tu; int Mau; public: void operator ++(); bool operator >=(PhanSo); bool operator <(PhanSo); void RutGon(); PhanSo operator +(PhanSo); PhanSo operator *(PhanSo); void operator <<(); void operator >>(); } void PhanSo::operator ++() { Tu=Tu+Mau; return(void); } bool PhanSo::operator >=(PhanSo P) { return(((Tu*P.Mau-Mau*P.Tu)*Mau*P.Mau)<0); } bool PhanSo::operator <(PhanSo P) { return!(*this>=P); } void PhanSo::RutGon() { int x,y,ucln; x=Tu; y=Mau; while(x==y) { if(x>y) x=x-y; else if(x<y) y=y-x; } ucln=x; Tu=Tu/ucln; Mau=Mau/ucln; } PhanSo PhanSo::+(PhanSo P) { PhanSo Q; Q.Tu=Tu*P.Mau+Mau*P.Tu; Q.Mau=Mau*P.Mau; Q.RutGon(); return(Q); } PhanSo PhanSo::*(PhanSo P) { PhanSo T; T.Tu=T.Tu*P.Tu; T.Mau=T.Mau*P.Mau; T.RutGon(); return(T); } void PhanSo::operator >>() { cout<<Tu<<"/"<<Mau; } void PhanSo::operator <<() { while(Mau!=0) cin>>Tu;cout<<"/";cin>>Mau; if(Mau<0) { Tu=Tu*(-1); Mau=Mau*(-1); } } main() { PhanSo A,B,Tong,Tich; cout<<"hay nhap vao hia phan so: \n"; cout<<"phan so thu 1: ";A<<;cout<<"\n"; cout<<"phan so thu 2: ";B<<;cout<<"\n"; cout<<"Tong hai phan so: "; Tong=A+B; Tong>>; cout<<"\n"; cout<<"Tich hai phan so la: "; Tich=A*B; Tich>>; cout<<"\n"; if(A>=B) cout<<"phan so thu 1 lon hon phan so thu 2"; else cout<<"phan so thu 1 nho hon phan so thu 2"; } khi compile thì nó báo tới 19 lỗi như sau(mình dùng dev C++): D:\Dev-Cpp\bin\PhanSo.cpp:17: error: `void PhanSo::operator<<()' must take exactly one argument D:\Dev-Cpp\bin\PhanSo.cpp:18: error: `void PhanSo::operator>>()' must take exactly one argument D:\Dev-Cpp\bin\PhanSo.cpp:22: error: new types may not be defined in a return type D:\Dev-Cpp\bin\PhanSo.cpp:22: error: two or more data types in declaration of `operator++' D:\Dev-Cpp\bin\PhanSo.cpp:22: error: prototype for `PhanSo PhanSo::operator++()' does not match any in class `PhanSo' D:\Dev-Cpp\bin\PhanSo.cpp:11: error: candidate is: void PhanSo::operator++() D:\Dev-Cpp\bin\PhanSo.cpp:22: error: `PhanSo PhanSo::operator++()' and `void PhanSo::operator++()' cannot be overloaded D:\Dev-Cpp\bin\PhanSo.cpp:54: error: expected unqualified-id before '+' token D:\Dev-Cpp\bin\PhanSo.cpp:54: error: expected init-declarator before '+' token D:\Dev-Cpp\bin\PhanSo.cpp:54: error: expected `,' or `;' before '+' token D:\Dev-Cpp\bin\PhanSo.cpp:63: error: expected `)' before "P" D:\Dev-Cpp\bin\PhanSo.cpp:63: error: expected init-declarator before "P" D:\Dev-Cpp\bin\PhanSo.cpp:63: error: expected `,' or `;' before "P" D:\Dev-Cpp\bin\PhanSo.cpp:73: error: `void PhanSo::operator>>()' must take exactly one argument D:\Dev-Cpp\bin\PhanSo.cpp:78: error: `void PhanSo::operator<<()' must take exactly one argument D:\Dev-Cpp\bin\PhanSo.cpp: In function `int main()': D:\Dev-Cpp\bin\PhanSo.cpp:92: error: expected primary-expression before ';' token D:\Dev-Cpp\bin\PhanSo.cpp:93: error: expected primary-expression before ';' token D:\Dev-Cpp\bin\PhanSo.cpp:96: error: expected primary-expression before ';' token D:\Dev-Cpp\bin\PhanSo.cpp:100: error: expected primary-expression before ';' token các bạn chỉ giúp mình các lỗi với, mình kém tiếng anh nên ko bít,nếu được thì sửa luôn giúp mình . ___________Auto Merge________________ . sorry vì mình ko biêt cách post code lên nên, các dòng nó hơi bị lộn xộn, thông cảm nha
Tớ xem rồi. Và không thể xem hết được. Xin lỗi vì không giúp được bạn. Nhưng mình nghĩ mọi người đều thế ::(
19 lỗi mới sợ chứ bài này làm chắc được thi lại đó bạn. Ngoài 19 lỗi kia còn 1 số lỗi sau. Bạn check nhé. À góp ý mốt viết thì nhớ sài cái pointer this cho nó rõ nghĩa nhìn nhức đầu quá. operator viết thành perator Mã: void PhanSo:perator ++() { Tu=Tu+Mau; return(void); } ---> hàm này sai cú pháp, ngoài ra nếu trả về void thì khi viết như vầy: Mã: PhanSo ps1(10,20),ps2; ps2=++ps1 ----> báo lỗi nhé --->viết tầm bậy khúc này Mã: PhanSo operator +(PhanSo); PhanSo operator *(PhanSo); --->phải là như vầy PhanSo operator +(const PhanSo &ps); PhanSo operator *(const PhanSo &ps); --->hàm rút gọn viết tầm sàm bá láp, viết lại như vầy. Mã: void PhanSo::RutGon() { int x,y; x=abs(this->Tu); y=abs(this->Mau); while(x==y) { if(x>y) x=x-y; else if(x<y) y=y-x; } this->Tu/=x; this->Mau/=x; } Mã: void operator <<(); void operator >>(); ---> tới đây nhìn là mệt rùi, thui viết lại nguyên bài cho bạn luôn cho rùi nhìn cái này là cúm gà rùi.
File PS.h Mã: #ifndef PS_H #define PS_H #include <iostream.h> class PS { int t,m; void ToiGian(); public: PS(int t=0,int m=1); PS operator * (const PS &ps); PS operator / (const PS &ps); PS operator +(const PS &ps); PS operator -(const PS &ps); friend ostream & operator <<(ostream & os, const PS &ps); friend istream & operator >>(istream & is, PS &ps); }; #endif file PS.cpp Mã: #include "PS.h" #include <math.h> PS::PS(int t, int m) { this->t=t; this->m=m; ToiGian(); } ostream & operator <<(ostream & os, const PS &ps) { os<<ps.t; if(ps.m!=1) os<<"/"<<ps.m; return os; } istream & operator >>(istream & is, PS &ps) { int a,b; char t; cout<<"Nhap Phan So (t/m):"; is>>a>>t>>b; if(b==0) { is>>ps; } else { ps.m=b; ps.t=a; ps.ToiGian(); } return is; } PS PS::operator * (const PS &ps) { return PS(this->t*ps.t,ps.m*this->m); } PS PS::operator / (const PS &ps) { return PS(this->t*ps.m,ps.t*this->m); } PS PS::operator +(const PS &ps) { return PS(this->t*ps.m+ps.t*this->t,ps.m*this->m); } PS PS::operator -(const PS &ps) { return PS(this->t*ps.m-ps.t*this->t,ps.m*this->m); } void PS::ToiGian() { if(this->m!=1) { int a=abs(this->t); int b=abs(this->m); while(a!=b) { if(a>b) a=a-b; if(a<b) b=b-a; } this->t/=a; this->m/=b; if(this->m<0) { this->m=-this->m; this->t=-this->t; } } } viết vầy thi dc 5 điểm đó
à quên , bạn có thể giải thích ho mình ý nghĩa của mấy cái ostream ,instream, và tại sao phải để const PhanSo &ps mình chưa rõ lắm(quên thật ko cố ý spam:
const PhanSo &ps ---> dấu "&" khi truyền thì truyền tham số cho hàm thì lấy chính bản thân vùng nhớ của của biến có kiểu Phân Số, không tốn chi phí tạo bản sao vì như vậy sẽ làm chuơng trình chạy chậm hơn, const truyền bằng hằng không cho sửa chữa. Khi cần overload 2 cái << và >> thì phải dùng 2 cái em OStream, và ISTream tạm dịch ra tiếng việt Ostream--> luồng xuất, istream là luồng nhập