cộng trừ nhân chia phân số trong pascal

Đề bài: viết chương trình nhập vào 2 phân số a/b , c/d với a/b lớn hơn c/d và không âm. Hãy tính các phép toán cộng, trừ, nhân, chia và xuất ra màn hình.

Lưu ý: kết quả phải tối giản.

Lời giải cộng trừ nhân chia phân số trong pascal

– Cơ sở đề mình viết các phép tính là do tính chất của toán học, xem hình để dễ hiểu hơn…

– ở code dưới đây mình sẽ ko chặn các trường hợp input cho ra kết quả vô nghĩa nên các bạn tự cải tiến nếu cần.

– ở phép tính chia, thật ra chỉ cần gọi procedure nhân rồi nghịch đảo lại là được, nhưng do xuất kết quả ở trong procedure luôn nên nó sẽ hiện dấu nhân, vì vậy mình sẽ viết lại cái khác.

– Để phân số có tính tối giản thì chỉ cần chia tử và mẫu cho ước chung lớn nhất của tử và mẫu.

– Nếu kết quả tu/mau có dạng tu/1 thì chỉ cần xuất tử. vì phân số có mẫu là 1 vô nghĩa.

….. còn ở phép nhân và chia, chỉ cần tử bằng 0 thì kết quả sẽ bằng 0.

 

Code cộng, trừ, nhân chia trong pascal

var
        a,b,c,d:longint;

function ucln(a,b:longint):longint;
var     r:longint;
begin
        while a mod b <>0 do
                begin
                        r:=a mod b;
                        a:=b;
                        b:=r;
                end;
        exit(b);
end;

procedure cong(a,b,c,d:longint);
var     tu, mau,UC:longint;
begin
        tu:=a*d+b*c;
        mau:=b*d;
        UC:=ucln(tu,mau);
        tu:=tu div uc;
        mau:=mau div uc;
        if mau=1 then
                writeln(a,'/',b,' + ',c,'/',d,' = ',tu)
        else
                writeln(a,'/',b,' + ',c,'/',d,' = ',tu,'/',mau);
end;

procedure tru(a,b,c,d:longint);
var     tu, mau,UC:longint;
begin
        tu:=a*d-b*c;
        mau:=b*d;
        UC:=ucln(tu,mau);
        tu:=tu div uc;
        mau:=mau div uc;
        if mau=1 then
                writeln(a,'/',b,' - ',c,'/',d,' = ',tu)
        else
                writeln(a,'/',b,' - ',c,'/',d,' = ',tu,'/',mau);
end;

procedure nhan(a,b,c,d:longint);
var     tu, mau,UC:longint;
begin
        tu:=a*c;
        mau:=b*d;
        UC:=ucln(tu,mau);
        if tu=0 then
                begin
                        writeln(a,'/',b,' * ',c,'/',d,' = ',0);
                        exit;
                end;
        tu:=tu div uc;
        mau:=mau div uc;
        if mau=1 then
                writeln(a,'/',b,' * ',c,'/',d,' = ',tu)
        else
                writeln(a,'/',b,' * ',c,'/',d,' = ',tu,'/',mau);
end;

procedure chia(a,b,c,d:longint);
var     tu, mau,UC:longint;
begin
        tu:=a*d;
        mau:=b*c;
        UC:=ucln(tu,mau);
        if tu=0 then
                begin
                        writeln(a,'/',b,' : ',c,'/',d,' = ',0);
                        exit;
                end;
        tu:=tu div uc;
        mau:=mau div uc;
        if mau=1 then
                writeln(a,'/',b,' : ',c,'/',d,' = ',tu)
        else
                writeln(a,'/',b,' : ',c,'/',d,' = ',tu,'/',mau);
end;

begin
        read(a,b,c,d);
        cong(a,b,c,d);
        tru(a,b,c,d);
        nhan(a,b,c,d);
        chia(a,b,c,d);
        readln;
        readln;
end.

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *