Mình đã mất rất nhiều thời gian với bài nảy! Mong những ai đọc nó hãy góp ý giúp mình … cảm ơn các bạn!
Mình có hàm nạp chồng so sánh như sau::
int PhanSo::operator>(PhanSo *M)
{
float i, j;
i = float(this->tuso);
j = float(M->tuso);
if(float(i/mauso) > float(j/(M->mauso)) )
return 1;
else
return 0;
}
Sau đó mình sử dụng nó trong hàm này::
void SapXep()
{
PhanSo *a, *b;
float i,j;
a = first;
b = NULL;
while(a!=NULL)
{
b = a->lnext();
while(b!=NULL)
{
if(a>b)
Doi(a, b);
b = b->lnext();
}
a = a->lnext();
}
}
Kết quả là Doi(a, b) trong hàm SapXep() không bao giờ xảy ra??? Nhưng nếu sửa thành::
void SapXep()
{
PhanSo *a, *b;
float i,j;
a = first;
b = NULL;
while(a!=NULL)
{
b = a->lnext();
while(b!=NULL)
{
i = float(a->tuso);
j = float(b->tuso);
if(float(i/(a->mauso)) > float(j/(b->mauso) ))
Doi(a, b);
b = b->lnext();
}
a = a->lnext();
}
}
thì bài code run tốt! Vậy lỗi là do đâu?? Với cách gọi if(a>b) thì trình biên dịch có vấn đề gì làm Doi(a, b) ko thực thi được??
ĐÂY LÀ TOÀN BÀI CODE CỦA MÌNH:::
#include<iostream.h>
#include<conio.h>
class PhanSo
{
private:
int tuso;
int mauso;
PhanSo *next;
public:
PhanSo()
{
next = NULL;
tuso = 0;
}
void ltuso(int tuso)
{
this->tuso = tuso;
}
void lmauso(int mauso)
{
this->mauso = mauso;
}
friend istream& operator>>(istream &in, PhanSo *&M);
friend ostream& operator<<(ostream &out, PhanSo *&M);
friend int USCLN(PhanSo *M);
friend void SapXep();
friend void Doi(PhanSo *M, PhanSo *N);
int operator>(PhanSo *M);
PhanSo* operator+(PhanSo *M);
void dnext(PhanSo *M){ this->next = M; }
PhanSo* lnext(){ return this->next; }
};
PhanSo *first, *last, *p;
char c;
int PhanSo::operator>(PhanSo *M)
{
float i, j;
i = float(this->tuso);
j = float(M->tuso);
if(float(i/mauso) > float(j/(M->mauso)) )
return 1;
else
return 0;
}
PhanSo* PhanSo::operator+(PhanSo *M)
{
PhanSo *a;
a->tuso = this->tuso*M->mauso + M->tuso*this->mauso;
a->mauso = this->mauso*M->mauso;
return a;
}
istream& operator>>(istream &in, PhanSo *&M)
{
cout<<"Nhap vao phan so: ";
in>>M->tuso>>c>>M->mauso;
return in;
}
ostream& operator<<(ostream &out, PhanSo *&M)
{
if(M->tuso == M->mauso)
out<<"1"<<endl;
else
{
if(USCLN(M) == M->mauso)
out<<M->tuso/USCLN(M)<<endl;
else
out<<M->tuso/USCLN(M)<<"/"<<M->mauso/USCLN(M)<<endl;
}
return out;
}
int USCLN(PhanSo *M)
{
int temp;
int i;
if(M->tuso < M->mauso)
temp = M->tuso;
else
temp = M->mauso;
for(i=temp; i>=1; --i)
{
if(M->tuso % i ==0 && M->mauso % i ==0)
break;
}
return i;
}
void Nhap()
{
do
{
p = new PhanSo;
cin>>p;
if(first == NULL)
{
first = p;
last = p;
}
else
{
last->dnext(p);
last=p;
}
cout<<"Ban co muon nhap tiep khong?? c/k";
c = getch();
cout<<endl;
}while(c!='k');
}
void Xuat()
{
PhanSo *a;
a = first;
while(a!=NULL)
{
cout<<a;
a = a->lnext();
}
}
void Doi(PhanSo *M, PhanSo *N)
{
int temp;
temp = M->tuso;
M->ltuso(N->tuso);
N->ltuso(temp);
temp = M->mauso;
M->lmauso(N->mauso);
N->lmauso(temp);
}
void SapXep()
{
PhanSo *a, *b;
float i,j;
a = first;
b = NULL;
while(a!=NULL)
{
b = a->lnext();
while(b!=NULL)
{
if(a>b)
Doi(a, b);// ĐOẠN NÀY ĐÂY??
}
a = a->lnext();
}
}
main()
{
first = NULL;
Nhap();
SapXep();
Xuat();
getch();
}