Bài tập C++ – Lớp Phân số

Đề bài:

Xây dựng lớp Phân số với tử số và mẫu số nguyên và các hàm thành viên sau:

+ Cấu tử mặc định

+ Cấu tử có tham số

+ Toán tử nhập xuất

+ Toán tử cộng, trừ và nhân hai phân số

+ Rút gọn phân số

+ So sánh hai phân số: ==, !=, >, <, >=, <=.

Nhập vào một mảng các phân số: tính và in ra:

+ Phân số lớn nhất, phân số nhỏ nhất

+ Tổng và tích của các phân số đã nhập vào.

+ Sắp xếp các phân số theo thứ tự tăng dần.

Bài làm:

#include <iostream>
using namespace std;
int ucln(int a, int b)
{
int tam = a;
while(!(a%tam==0&&b%tam==0&&tam>0))
tam –;
return tam;

}
class Phanso
{
int ts, ms;
public:
Phanso();
Phanso(int ts1, int ms1);
friend istream & operator >> (istream &, Phanso &);
friend ostream & operator << (ostream &, Phanso &);
Phanso operator + (Phanso &);
Phanso operator – (Phanso &);
Phanso operator * (Phanso &);
void rutgon();
bool operator == (Phanso &);
bool operator != (Phanso &);
bool operator > (Phanso &);
bool operator < (Phanso &);
bool operator >= (Phanso &);
bool operator <= (Phanso &);
};
Phanso::Phanso()
{
ts = 0;
ms =1;
}
Phanso::Phanso(int ts1, int ms1)
{
ts = ts1;
ms = ms1;
}
ostream & operator << (ostream &os, Phanso &r)
{
os << r.ts << “/” << r.ms;
return os;
}
istream & operator >> (istream &is, Phanso &r)
{
cout << “Nhap tu so:”;
is >> r.ts;
cout << “Nhap mau so:”;
is >> r.ms;
return is;
}
Phanso Phanso::operator+(Phanso &r)
{
int ts1, ms1;
ts1 = ts*r.ms + ms*r.ts;
ms1 = ms * r.ms;
int uc = ucln(ts1, ms1);
ts1 = ts1/uc;
ms1 = ms1/uc;
return Phanso(ts1, ms1);
}
Phanso Phanso::operator-(Phanso &r)
{
int ts1, ms1;
ts1 = ts*r.ms – ms*r.ts;
ms1 = ms * r.ms;
int uc = ucln(ts1, ms1);
ts1 = ts1/uc;
ms1 = ms1/uc;
return Phanso(ts1, ms1);
}
Phanso Phanso::operator*(Phanso &r)
{
int ts1, ms1;

ts1 = ts*r.ts;
ms1 = ms * r.ms;
int uc = ucln(ts1, ms1);
ts1 = ts1/uc;
ms1 = ms1/uc;
return Phanso(ts1, ms1);
}
bool Phanso::operator > (Phanso &r)
{
int ts1, ms1;
ts1 = ts*r.ms – ms*r.ts;
ms1 = ms * r.ms;
return (ts1*ms1>0);
}
bool Phanso::operator == (Phanso & r)
{
if(!(*this>r) && !(r>*this))
return true;
return false;
}
bool Phanso::operator != (Phanso & r)
{
if(!(*this==r))
return true;
return false;
}
bool Phanso::operator < (Phanso & r)
{
if(r>*this)
return true;
return false;
}
void Phanso::rutgon()
{
int uc = ucln(ts, ms);
ts = ts/uc;
ms = ms/uc;
}
void sapxep(Phanso a[], int n)
{
Phanso tam;
int i, j;
for (i=0;i<n;++i)
for(j=i+1;j<n;++j)
if(a[j]<a[i])
{
tam = a[i];
a[i] = a[j];
a[j] = tam;
}
}
int main()
{
Phanso * a;
int n, i;
Phanso tong, tich(1,1);
int m1, m2;
cout << “Nhap n=”;
cin >> n;
a = new Phanso[n];
for(i=0;i<n;++i)
{
cout << “Nhap phan so thu ” << i << endl;
cin >> a[i];
}
cout << “Mang cac phan so vua nhap vao:\n”;
for(i=0;i<n;++i)
cout << a[i] <<endl;
m1 = m2 = 0;
for(i=0;i<n;++i)
{
tong = tong + a[i];
tich = tich * a[i];
if(a[i]>a[m1])
m1 = i;
if(a[i]<a[m2])
m2 = i;
}
cout << “Phan so tong:” << tong << endl;
cout << “Phan so tich:” << tich << endl;
cout << “Phan so Lon nhat:” << a[m1] << endl;
cout << “Phan so Nho nhat:” << a[m2] << endl;
sapxep(a, n);
cout << “Mang sau khi sap xep:” << endl;
for(i=0;i<n;++i)
cout << a[i] << endl;
delete [] a;
system(“pause”);
return 0;
}

12 Responses to “Bài tập C++ – Lớp Phân số”

  1. Nguyễn Văn Để Says:

    Sao cái hàm tìm ucln kì kì vậy bác!

  2. 4fire Says:

    Cái hàm đó chỉ để cho đúng chức năng mà thôi, chưa sử dụng thuật toán tìm UCLN của hai số nguyên tốt nhất. Cũng không kiểm tra điều kiện thực hiện của thuật toán.

  3. Nguyễn Văn Để Says:

    Nhưng sao mình copy vào cho chạy nó cứ báo lỗi ah`!

  4. 4fire Says:

    Impossible. Bạn gửi thông báo lỗi đi, tôi sẽ sửa cho

  5. Nguyễn Văn Để Says:

    Ở cái hàm ucln đó, sao lại là “tam-“, mình nghĩ là “tam- -” chứ nhĩ!

  6. 4fire Says:

    Đúng vậy, là tam–; nhưng khi copy sang word bị chuyển, lại copy từ Word sang WordPress nên nó mới thế.

  7. 4fire Says:

    Bạn nên dùng DevCpp, hoặc nếu không thì là Visual Studio 2008.

  8. Thọ Says:

    các member tử và mẫu trong class phân số mặc định là private nên toán tử >> sẽ ko nhập vào đc dâu bạn

  9. quý Says:

    Hàm tìm ước chung lớn nhất nè:
    if(a<b)
    {
    for(i=2;i<=a;i++)
    {
    if(a%i==0&&b%i==0)
    {
    if(max<i)
    max=i;
    }
    }
    }
    else
    {
    for(i=2;i<=b;i++)
    {
    if(a%i==0&&b%i==0)
    {
    if(max<i)
    max=i;
    }
    }
    }

    • 4fire Says:

      Vâng, xin cám ơn bạn. Nhưng mục đích của tôi không phải là đưa ra một hàm tìm ước chung tốt nhất (thuật toán của bạn đưa ra ở đây cũng vậy), mà là tập trung vào việc xây dựng lớp phân số.

  10. Long Nguyễn Công Says:

    rất là hay !!!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: