30/09/2018, 16:35

Mọi người giúp em bài toán Phân Số

Bài toán tính tổng hiệu tích thương 2 Phân số.Khi em nhập phân số thứ 2 > ps 1 thì không tính được.Tìm giúp em lỗi với ạ.Em cảm ơn !!! @ltd @david15894

#include<iostream>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
//#include<stdio.h>
using namespace std;
struct SPhanSo
{
    int iTuSo;
    int iMauSo;
};
void NhapPhanSo(SPhanSo &PS,int n)
{
    cout << "Nhap phan so thu "<<n<<" : "<<endl;
    cout << "Nhap tu so : ";
    cin >> PS.iTuSo;
    do
    {
        cout << "Nhap mau so khac 0 : ";
        cin >> PS.iMauSo;
        if(PS.iMauSo == 0)
            cout << "Vui long nhap mau so khac 0 "<<endl;
    }
    while(PS.iMauSo == 0);
}

int TinhUocChungLonNhat(int iA,int iB)
{
    int UCLN;
    while( iA != iB )
    {
        if(iA > iB)
            iA = iA - iB;
        else
            iB = iB - iA;
    }
    UCLN = iA;
    return UCLN;
}
int TinhBoiChungNhoNhat(int iA,int iB)
{
    int UCLN = TinhUocChungLonNhat(iA,iB);
    int BCNN = iA * iB / UCLN;
    return BCNN;
}
void RutGonPhanSo(SPhanSo &PS)
{
    int u = TinhUocChungLonNhat(PS.iTuSo,PS.iMauSo);
    PS.iTuSo = PS.iTuSo / u;
    PS.iMauSo = PS.iMauSo / u;
}
SPhanSo TongHaiPhanSo(SPhanSo PS1,SPhanSo PS2)
{
    SPhanSo Tong;
    int b = TinhBoiChungNhoNhat(PS1.iMauSo,PS2.iMauSo);
    Tong.iTuSo = (PS1.iTuSo *(b / PS1.iMauSo))+ (PS2.iTuSo * (b / PS2.iMauSo));
    Tong.iMauSo = b;
    RutGonPhanSo(Tong);
    return Tong;
}
SPhanSo HieuHaiPhanSo(SPhanSo PS1,SPhanSo PS2)
{
    SPhanSo Hieu;
    int b = TinhBoiChungNhoNhat(PS1.iMauSo,PS2.iMauSo);
    Hieu.iTuSo = (PS1.iTuSo * b / PS1.iMauSo) - (PS2.iTuSo * b / PS2.iMauSo);
    Hieu.iMauSo = b;
    RutGonPhanSo(Hieu);
    return Hieu;
}
SPhanSo TichHaiPhanSo(SPhanSo PS1,SPhanSo PS2)
{
    SPhanSo Tich;
    Tich.iTuSo = PS1.iTuSo * PS2.iTuSo;
    Tich.iMauSo = PS1.iMauSo * PS2.iMauSo;
    RutGonPhanSo(Tich);
    return Tich;
}
SPhanSo ThuongHaiPhanSo(SPhanSo PS1,SPhanSo PS2)
{
    SPhanSo Thuong;
    Thuong.iTuSo = PS1.iTuSo * PS2.iMauSo;
    Thuong.iMauSo = PS1.iMauSo * PS2.iTuSo;
    RutGonPhanSo(Thuong);
    return Thuong;
}

int main()
{
    SPhanSo PS1;
    SPhanSo PS2;
    NhapPhanSo(PS1,1);
    NhapPhanSo(PS2,2);
    system("cls");
    SPhanSo Tong = TongHaiPhanSo(PS1,PS2);
    SPhanSo Hieu = HieuHaiPhanSo(PS1,PS2);
    SPhanSo Tich = TichHaiPhanSo(PS1,PS2);
    SPhanSo Thuong = ThuongHaiPhanSo(PS1,PS2);
    cout << "Tong 2 phan so la : "<<Tong.iTuSo<<"/"<<Tong.iMauSo<<endl;
    cout << "Hieu 2 phan so la : "<<Hieu.iTuSo<<"/"<<Hieu.iMauSo<<endl;
    cout << "Tich 2 phan so la : "<<Tich.iTuSo<<"/"<<Tich.iMauSo<<endl;
    cout << "Thuong 2 phan so la : "<<Thuong.iTuSo<<"/"<<Thuong.iMauSo<<endl;
    getch();
    return 0;
}
Gió viết 18:36 ngày 30/09/2018

Bị lỗi là do khi ps1 < ps2 thì ps1 - ps2tử số <=0 || mẫu số <=0 do đó hàm TinhUocChungLonNhat sẽ chạy vô hạn.

####Sửa lại:

int TinhUocChungLonNhat(int iA,int iB)
{
    int UCLN;
   
    if(iA<0) iA=-iA;
    if(iB<0) iB=-iB;
    if(iA==0) return iB;
    if(iB==0) return iA;
    while( iA != iB )
    {
        if(iA > iB)
            iA = iA - iB;
        else
            iB = iB - iA;
    }
    UCLN = iA;
    return UCLN;
}

Nguyễn Anh Dũng viết 18:50 ngày 30/09/2018

có thể đặt lại
iA=abs(iA);
iB=abs(iB);
trông code nó gọn hơn

Gió viết 18:44 ngày 30/09/2018

####edited: à trong c thì hàm abs là của int còn cpp nó lại chỉ áp dụng cho số thực. Nếu dùng thì phải gọi std::abs(int) trong thư viện cstdlib thì phải.

Bài liên quan
0