Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида (P – целое, Q—натуральное): а) сложения; б) умножения; в) сокращения дроби. Дробь представить следующим типом: Type Frac=Record P: Integer; Q: 1..32767 End; Используя этот модуль найти: 1) сумму двух дробей, результат представить в виде несократимой дроби; 2) произведение двух дробей, результат представить в виде несократимой дроби.
unit FractionOperations; interface type Frac = record P: Integer; Q: 1..32767; end; function GCD(a, b: Integer): Integer; procedure Reduce(var F: Frac); function Add(F1, F2: Frac): Frac; function Multiply(F1, F2: Frac): Frac; implementation function GCD(a, b: Integer): Integer; begin if b = 0 then Result := a else Result := GCD(b, a mod b); end; procedure Reduce(var F: Frac); var divisor: Integer; begin divisor := GCD(F.P, F.Q); F.P := F.P div divisor; F.Q := F.Q div divisor; end; function Add(F1, F2: Frac): Frac; var res: Frac; begin res.P := F1.P * F2.Q + F2.P * F1.Q; res.Q := F1.Q * F2.Q; Reduce(res); Result := res; end; function Multiply(F1, F2: Frac): Frac; var res: Frac; begin res.P := F1.P * F2.P; res.Q := F1.Q * F2.Q; Reduce(res); Result := res; end; end.
Пример использования модуля для нахождения суммы и произведения двух дробей:
interface
type
Frac = record
P: Integer;
Q: 1..32767;
end;
function GCD(a, b: Integer): Integer;
procedure Reduce(var F: Frac);
function Add(F1, F2: Frac): Frac;
function Multiply(F1, F2: Frac): Frac;
implementation
function GCD(a, b: Integer): Integer;
begin
if b = 0 then
Result := a
else
Result := GCD(b, a mod b);
end;
procedure Reduce(var F: Frac);
var
divisor: Integer;
begin
divisor := GCD(F.P, F.Q);
F.P := F.P div divisor;
F.Q := F.Q div divisor;
end;
function Add(F1, F2: Frac): Frac;
var
res: Frac;
begin
res.P := F1.P * F2.Q + F2.P * F1.Q;
res.Q := F1.Q * F2.Q;
Reduce(res);
Result := res;
end;
function Multiply(F1, F2: Frac): Frac;
var
res: Frac;
begin
res.P := F1.P * F2.P;
res.Q := F1.Q * F2.Q;
Reduce(res);
Result := res;
end;
end.
Пример использования модуля для нахождения суммы и произведения двух дробей:
program FractionOperationsTest;uses
FractionOperations;
var
F1, F2, Sum, Product: Frac;
begin
F1.P := 1;
F1.Q := 2;
F2.P := 3;
F2.Q := 4;
Sum := Add(F1, F2);
writeln('Sum: ', Sum.P, '/', Sum.Q);
Product := Multiply(F1, F2);
writeln('Product: ', Product.P, '/', Product.Q);
end.